首页 > 系统相关 >DeepFashion2 的多进程处理代码(带进度条)

DeepFashion2 的多进程处理代码(带进度条)

时间:2023-07-03 19:24:05浏览次数:47  
标签:进度条 代码 jpg json DeepFashion2 path os image dir

import json
from PIL import Image, ImageDraw
import os
from tqdm import tqdm
import multiprocessing
from functools import partial

def convert_rgba_to_rgb(image, output_path):
	# 转换为 RGB 模式
	rgb_image = image.convert('RGB')

	# 保存为 JPEG 格式
	rgb_image.save(output_path)

def save_bounding_box(image, bounding_box, save_path):
	cropped_image = image.crop(bounding_box)
	cropped_image.save(save_path)

def save_segmentation(image, segmentation):
	mask_image = Image.new('L', image.size)
	for polygon in segmentation:
		polygon_points = [(polygon[i], polygon[i+1]) for i in range(0, len(polygon), 2)]
		ImageDraw.Draw(mask_image).polygon(polygon_points, fill=255)
		masked_image = Image.new('RGBA', image.size)
		masked_image.paste(image, mask=mask_image)

	return masked_image

def crop_object_region(image, output_path):
	# 转为灰度图像
	gray_image = image.convert('L')

	# 获取非零区域的边界框
	bbox = gray_image.getbbox()

	if bbox is not None:
		# 切割出非零区域
		object_region = image.crop(bbox)

		# 保存切割后的图像
		# 将 RGBA 图像转换为 RGB 并保存为 JPEG
		convert_rgba_to_rgb(object_region, output_path)
		# print("Object region saved to:", output_path)
	else:
		print("No object region found in the image.")

def create_directory(path):
	if not os.path.exists(path):  # 判断目录是否存在
		os.makedirs(path)  # 递归创建目录
		print("Directory created:", path)
	# else:
	#     print("Directory already exists:", path)

def detect_seg(json_file, image_dir, out_dir, category_id_dict):
	# 获取 JSON 文件名
	json_filename = os.path.basename(json_file)

	# 构建对应的 JPG 文件路径
	jpg_filename = os.path.splitext(json_filename)[0] + '.jpg'
	jpg_file = os.path.join(image_dir, jpg_filename)

	if os.path.exists(jpg_file):
		# 读取 JSON 文件
		with open(json_file, 'r') as file:
			json_data = json.load(file)

		# 处理 JSON 数据,找到对应的 JPG 文件
		# TODO: 在这里添加你的逻辑,根据需要处理 JSON 数据并处理对应的 JPG 文件
		# print("Found:", json_file, jpg_file)

		# 遍历每个 item
		for item in json_data:
			# 处理每个 item
			# TODO: 在这里添加你的逻辑,根据需要处理 item  

			if 'item' in item:
				# 获取 category_id 用来生成保存类别目录
				category_id = json_data[item]['category_id']

				# 调用函数创建目录
				out_detect_dir = os.path.join(out_dir, 'detect', category_id_dict[category_id])
				create_directory(out_detect_dir)

				out_seg_dir = os.path.join(out_dir, 'seg', category_id_dict[category_id])
				create_directory(out_seg_dir)

				# 待保存的检测区域路径
				bb_path = os.path.join(out_detect_dir, jpg_filename.replace('.jpg', f'_{item}.jpg'))

				# 待保存的分割区域路径
				seg_path = os.path.join(out_seg_dir, jpg_filename.replace('.jpg', f'_{item}.jpg'))

				if not (os.path.exists(bb_path) and os.path.exists(seg_path)):
					try:
						# 读取图像
						image = Image.open(jpg_file)

						# 根据bounding_box保存切割后的图像
						bounding_box = json_data[item]['bounding_box']
						save_bounding_box(image, bounding_box, bb_path)

						# 根据segmentation获得切割后的图像
						segmentation = json_data[item]['segmentation']
						seg_region = save_segmentation(image, segmentation)

						# 调用函数进行图像切割
						crop_object_region(seg_region, seg_path)
					except:
						print(f'该图像存在问题:{jpg_file}')

	else:
		print("JPG File not found:", jpg_file)

if __name__ == "__main__":

	category_id_dict = {
		1: 'short sleeve top',
		2: 'long sleeve top',
		3: 'short sleeve outwear',
		4: 'long sleeve outwear',
		5: 'vest',
		6: 'sling',
		7: 'shorts',
		8: 'trousers',
		9: 'skirt',
		10: 'short sleeve dress',
		11: 'long sleeve dress',
		12: 'vest dress',
		13: 'sling dress'
	}

	# 将字典值中的空格替换为下划线
	category_id_dict = {key: value.replace(' ', '_') for key, value in category_id_dict.items()}

	print(category_id_dict)

	# 训练集
	anno_dir = 'train/train/annos'
	image_dir = 'train/train/image'
	out_dir = 'train_clsv2'

	# 验证集
	# anno_dir = 'validation/annos'
	# image_dir = 'validation/image'
	# out_dir = 'validation_cls'

	# 获取所有 JSON 文件路径
	# json_files = glob.glob(os.path.join(anno_dir, '*.json'))
	# 替换 golb 加快推理速度
	json_files = []
	for entry in os.scandir(anno_dir):
		if entry.is_file() and entry.name.endswith('.json'):
			json_files.append(entry.path)

	with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool: # 使用CPU核心数作为进程数
		total_files = len(json_files)
		process_func = partial(detect_seg, image_dir=image_dir, out_dir=out_dir, category_id_dict=category_id_dict)
		with tqdm(total=total_files, desc='Processing files') as pbar:
			for _ in pool.imap_unordered(process_func, json_files):
				pbar.update(1)

标签:进度条,代码,jpg,json,DeepFashion2,path,os,image,dir
From: https://www.cnblogs.com/odesey/p/17523763.html

相关文章

  • notepad++如何快速格式化代码
     2023-03-25 4505 广东举报简介: notepad++如何快速格式化代码Notepad++可以使用插件来快速格式化代码,以下是一种使用插件进行代码格式化的方法:打开Notepad++编辑器,并打开需要格式化的代码文件。在菜单栏中选择“插件”->“PluginManager”->“ShowPluginManag......
  • 低代码应用开发平台 高效构建业务系统
    低代码是传统软件开发逐步优化和演变的产物,并非全新革命。传统的开发方法过于昂贵和僵化,无法为企业提供所需的高效和敏捷的开发流程,且交付周期长定制能力弱,难以应对不断变化的市场和客户期望,为提高软件开发效率,对代码进行模块化组装的低代码产品进入开发者视野。低代码是基于可视......
  • 代码规范
    概述撰写编码规范可以清晰定义如下条款有规可循才是真正的规范原则:编程时必须坚持的指导思想规则:编程时强制必须遵守的约定建议:编程时必须加以考虑的约定说明:对原则规则建议进行必要的解释示例:对原则规则建议从正/反两个方面给出例子命名规范禁止一......
  • 41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
    已经好久没有讲一些基础的知识了,这一小节来点简单的,这也是为下节的在Spring多数Boot中使用多数据源做准备。从Spring3.0开始,增加了一种新的途径来配置BeanDefinition,这就是通过JavaCode配置BeanDefinition。      与XML和Annotation两种配置方式不同点在于:      ......
  • Idea远程debug调试本地代码 Remote JVM Debug
    如果项目太大本地启动不了,或者假设你项目是微服务项目依赖太多,你写了个功能后,想本地启动debug调试又不方便,此时可以用一个idea远程debug神奇。实现访问测试环境,回调到你本地启动的代码。1,准备一个springboot项目什么都不用配置2,idea设置RemoteJVMDebug端口随便设置就行......
  • 里面代码块颜色
    这里是没有颜色的:/***Createdby东东on2018/10/28.**@Description发送邮件部分接口*/publicinterfaceMailService{/***@Description//TODO发送简单的文本文件,to:收件人subject:主题content:内容*@Param[to,subject,content]**......
  • C代码中如何使用链接脚本中定义的变量?
    交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载)交流群二:QQ群:536785813(单片机-嵌入式)公 众 号:百问科技版本日期作者说明V12020韦东山技术文档在链接脚本中,经常有这样的代码:SECTIONS{......=ALIGN(4);.rodata:{*(.rodata)}.=ALIGN(4);.data:{*(.d......
  • 问界低代码平台架构设计及业务实践
     1.前言内因:随着之家业务快速发展,公司内部的数字化需求越来越多,信息系统团队每年都面对大量的需求,但研发侧资源是一定的,那么如何更快速的交付需求,越来越成为团队重点思考解决的问题。外因:互联网技术的不断推陈出新,尤其以React,Vue为代表的前端技术框架突飞猛进,大......
  • 问界低代码平台架构设计及业务实践
     1.前言内因:随着之家业务快速发展,公司内部的数字化需求越来越多,信息系统团队每年都面对大量的需求,但研发侧资源是一定的,那么如何更快速的交付需求,越来越成为团队重点思考解决的问题。外因:互联网技术的不断推陈出新,尤其以React,Vue为代表的前端技术框架突飞猛进,大......
  • BackUpLogView 系列 - ps1 文件代码及参考
    注意保存为.ps1后缀的文件 $sourceDirectory="C:\FromDIR"$targetLocalDirectory="D:\ToDIR"$btree="数据库"$taskName="HIS"$memo="心电系统"#---btree为一级类目比如数据库taskname为二级类目比如his----memo在详情页展示,显示具体的备注人......