目标检测数据预处理——部件截图,按一定比例进行外扩

news/2024/10/30 19:23:05/

本片是截图的篇的升级版本,简单版本的截图请参考根据目标框外扩一定比例进行截图(连带标签)。

对目标框(类别名称)进行分类,将同一类的目标框进行截图并分类保存在不同的文件夹中。

  1. 在本篇当中,我关注的是对人的不同部位的检测,所以我分为4类部件:头部区域(头、帽子、眼睛、眼睛……)、身体区域(各种工服)、手部区域(手、手套)、脚部区域(靴子、雨鞋、没穿鞋)。
  2. 而截图方式也是跟简单篇一样,保留截图区域内的目标框。
    特别说明,每类部件只会截部件范围的大图,例如头部区域内的眼睛、眼镜之类的不会单独截那么小的图,没有太多的意义,只会对头部帽子等的目标框进行截图,保留其内的眼睛、眼镜等。
  3. 这里相对于简单篇升级的不仅是从一类的截图升级到部件的截图,还有外扩范围也从上下左右外扩固定范围到根据图片大小按比例外扩。本篇的升级版是按随机比例外扩。
'''
cut 4 part in [head, body, hand, foot]
generate small pic of some rate extend
and generate corresponding json
'''
from copy import deepcopy
import cv2
import json
import osimg_path = "/data/weardata/images"
json_path = "/data/weardata/json"
save_path = "/data/weardata/save"
head_save = os.path.join(save_path, "head")
body_save = os.path.join(save_path, "body")
hand_save = os.path.join(save_path, "hand")
foot_save = os.path.join(save_path, "foot")# 4部件分类
head_label = ["head", "hat", "workhat", "helmet"]
body_label = ["blueworkclothes", "cloth", "refvest", "apron", "whiteworkclothes"]
hand_label = ["glove", "inglove", "hand"]
foot_label = ["shoes", "inshoes", "noshoes"]# 只需要创建好存放图片、json、截图后文件的三个路径即可,其余部件路径自己创建
save_path = [head_save, body_save, hand_save, foot_save]
for s_p in save_path:if not os.path.exists(s_p):os.mkdir(s_p)def cut_part(json_data, part_label, save_path, img_file, img_h, img_w, x_e, y_e):i = 0for shape in json_data["shapes"]:[x_extend, y_extend] = [x_e, y_e]json_data_1 = deepcopy(json_data)if shape["label"] in part_label:img_save = os.path.join(save_path, os.path.splitext(os.path.split(img_file)[-1])[0] + ".jpg")json_save = save_path + "/" + fileif os.path.exists(json_save):json_save = save_path + "/" + str(i) + fileimg_save = save_path + "/" + str(i) + os.path.splitext(os.path.split(img_file)[-1])[0] + ".jpg"json_data_1["imagePath"] = str(i) + os.path.splitext(os.path.split(img_file)[-1])[0] + ".jpg"i += 1print("-----------------------------")p = shape["points"]print(p)print(x_extend, y_extend)x_extend = int(abs(p[1][0] - p[0][0]) * x_e)y_extend = int(abs(p[1][1] - p[0][1]) * y_e)print(x_extend, y_extend)x1 = int(min(p[0][0], p[1][0])) - x_extendy1 = int(min(p[0][1], p[1][1])) - y_extendx2 = int(max(p[0][0], p[1][0])) + x_extendy2 = int(max(p[0][1], p[1][1])) + y_extend# 判断截图是否超过范围if x1 < 0:x1 = 0if y1 < 0:y1 = 0if x2 > img_w:x2 = img_wif y2 > img_h:y2 = img_hprint(x1, y1, x2, y2, p[0][0], p[0][1], p[1][0], p[1][1])print("-----------------------------")inpart_label = []for shape1 in json_data_1["shapes"]:m_p = shape1["points"]m_x1 = int(min(m_p[0][0], m_p[1][0]))m_y1 = int(min(m_p[0][1], m_p[1][1]))m_x2 = int(max(m_p[0][0], m_p[1][0]))m_y2 = int(max(m_p[0][1], m_p[1][1]))m_p[0][0] = m_x1m_p[0][1] = m_y1m_p[1][0] = m_x2m_p[1][1] = m_y2# 过滤哪些目标框留住if shape1["label"] == "other" and ((x1 < m_x1 < x2 or x1 < m_x2 < x2)\and (y1 < m_y1 < y2 or y1 < m_y2 < y2)):inpart_label.append(shape1)if x1 < (m_x1 + m_x2)/2 < x2 and y1 < (m_y1 + m_y2)/2 <y2:if part_label == hand_label:if shape1["label"] in hand_label:inpart_label.append(shape1)else:inpart_label.append(shape1)else:continue# print(m_x1, m_y1, m_x2, m_y2)img = cv2.imread(img_file)try:img = img[y1:y2, x1:x2, :]except TypeError:print(img_file, shape["label"])input()json_data_1["shapes"] = []for p_label in inpart_label:m_p = p_label["points"]m_p[0][0] = m_p[0][0] - x1m_p[0][1] = m_p[0][1] - y1m_p[1][0] = m_p[1][0] - x1m_p[1][1] = m_p[1][1] - y1# 判断目标框是否超出范围if m_p[0][0] < 0:m_p[0][0] = 0if m_p[0][1] < 0:m_p[0][1] = 0if m_p[1][0] > x2 - x1:m_p[1][0] = x2 - x1if m_p[1][1] > y2 - y1:m_p[1][1] = y2 - y1json_data_1["shapes"].append(p_label)json_data_1["imageHeight"] = y2 - y1json_data_1["imageWidth"] = x2 -x1json.dump(json_data_1, open(json_save, "w"), ensure_ascii=False, indent=2)cv2.imwrite(img_save, img)files = os.listdir(json_path)
for file in files:if os.path.splitext(file)[-1] != ".json":continue# 指定各种图片格式,若还有别的格式的图片可以自己添加img_file = os.path.join(img_path, file.split(".json")[0] + ".jpg")if not os.path.exists(img_file):img_file = os.path.join(img_path, file.split(".json")[0] + ".png")if not os.path.exists(img_file):img_file = os.path.join(img_path, file.split(".json")[0] + ".jpeg")json_file = os.path.join(json_path, file)json_data = json.load(open(json_file))img_h = json_data["imageHeight"]img_w = json_data["imageWidth"]# 根据一定的比例进行外扩cut_part(json_data, head_label, head_save, img_file, img_h, img_w, 0.3, 0.2) # headcut_part(json_data, body_label, body_save, img_file, img_h, img_w, 0.25, 0.05) # bodycut_part(json_data, hand_label, hand_save, img_file, img_h, img_w, 0.3, 0.2) # handcut_part(json_data, foot_label, foot_save, img_file, img_h, img_w, 0.2, 0.2) # foot
  1. 这里的外扩比例是左右一个比例,上下一个比例,可以自己调。比如我的body部件的区域比较长,所以上下的比例会比较小。
  2. 截图后保留的目标框有以下两个过滤条件:
    a.中心点没有落入截图区域内不留(没有超过一般),除了“other”标签(特征有歧义的涂黑标签);
    b.手部区域的非本类部件的类别不留。因为手部区域很大概率在body区域之内,中心点很可能落入其中,若是把body的框保留再根据目标框不超过截图范围,则整个截图的范围都是body框,但手部区域相对body区域小很多所以保留的body框的特征基本上全被破坏。
  3. 这里有两处范围判断:一处是截图时截图范围不能超过原图范围;二是目标框范围不能超过截图范围。都是超过最大按最大、低于最小按最小的方式处理。

截图前:

第1张图片有head、hand、foot这三个部件的目标框。
在这里插入图片描述
第2张图片有head、hand、body这三个部件的目标框。
在这里插入图片描述

截图后:

自己生成4个部件的保存路径。在这里插入图片描述

1.搜索第1张图的截图效果

1)搜索第1张图内的head区域

a.截取的图片:
在这里插入图片描述
b.选取其中一张labelme打开:
在这里插入图片描述

2)搜索第1张图内的hand区域

a.截取的图片:
在这里插入图片描述

b.选取其中一张labelme打开:
在这里插入图片描述

3)搜索第1张图内的foot区域

a.截取的图片:
在这里插入图片描述
b.选取其中一张labelme打开:
在这里插入图片描述

2.搜索第2张图的截图效果

1)搜索第2张图内的head区域

a.截取的图片:
在这里插入图片描述
b.选取其中一张labelme打开:
在这里插入图片描述

2)搜索第2张图内的body区域

a.截取的图片:
在这里插入图片描述
b.选取其中一张labelme打开:
在这里插入图片描述

3)搜索第2张图内的hand区域

a.截取的图片:
在这里插入图片描述
b.选取其中一张labelme打开:
在这里插入图片描述


http://www.ppmy.cn/news/83594.html

相关文章

对话 ONES 联合创始人兼 CTO 冯斌:技术管理者如何打造一支自驱型团队?

熟悉冯斌的人&#xff0c;大都直接称呼其网名 Kid&#xff0c;包括他在 ONES 的同事。人如其名&#xff0c;Kid 的寓意就是「用孩子的眼光看世界」&#xff0c;返璞归真的思维方式才能发现新大陆。正如毕加索说的&#xff1a;「我一生都在向孩子学习。」 在 ONES 联合创始人兼…

多大一口气能将汽车吹上天,你算出来了吗?

多大一口气能将汽车吹上天&#xff0c;你算出来了吗?起来了解其中的原理&#xff0c;手把手教你如何计算汽车起飞所需的风速! 空气同时通过机翼上表面和下表面时&#xff0c;会在机翼上下方形成不同流速&#xff0c;空气通过机翼上表面时流速大&#xff0c;压强较小;通过下表面…

Turtlebot4 和 Turtlebot3 和 Turtlebot2 ROS开源机器人说明及参数对比

一、TB4和TB3产品参数对比&#xff1a; 二、Turtlebot 3和Turtlebot 4的比较&#xff1a; 很多未接触过Turtlebot ROS机器人系列的用户&#xff0c;看到TB3和TB4两型号&#xff0c;就会很自然地认为TB4肯定比TB3高级&#xff0c;会问到TB4和TB3的区别&#xff0c;TB4进行了哪些…

供应商管理软件如何帮助企业提高盈利能力?

为了在当今快节奏的商业环境中保持竞争力和刺激增长&#xff0c;供应商管理技术正变得至关重要。供应商管理是任何公司最关键的因素之一&#xff0c;其中包括考核供应商、采购及招投标管理、协同管理等多项任务。 随着成熟的供应商管理软件的出现&#xff0c;企业主现在可以优…

open3d-gui 所有不同种类的部件

整体效果如上. 下面一步一步添加部件来实现. 目录 1. 菜单栏 2. 文件选择部件 3. 垂直可折叠部件 3.1 label部件 3.2 复选框checkbox 3.3 色板 3.4 下拉框combobox 3.5 拨动开关toggleSwitch 3.6 部件代理WidgetProxy 3.7 WidgetStack 3.8 列表 3.9 树形视图 3.…

财务共享时代企业数智化应用能帮我们做些什么?

随着企业规模的不断扩大和业务范围的逐步扩展&#xff0c;财务工作的难度和复杂度也在不断提高&#xff0c;传统的手工录入和处理方式呈现出流程长、效率低、易出错等问题。为了提升财务工作的效率和准确性&#xff0c;越来越多的企业开始利用数智化应用打造企业内部的财务数智…

网络安全面试题汇总(附答案)

作为从业多年的网络安全工程师&#xff0c;我深知在面试过程中面试官所关注的重点及考察的技能点。网络安全作为当前信息技术领域中非常重要的一部分&#xff0c;对于每一个从事网络安全工作的人员来说&#xff0c;不仅需要掌握一定的技术能力&#xff0c;更需要具备全面的综合…

「实在RPA·烟草数字员工」助力烟草行业数字化转型加速度

烟草行业作为烟草产业链上重要一环&#xff0c;外部连接烟草工业企业、零售客户、消费者&#xff0c;内部包含营销、专卖、烟叶、物流等诸多业务&#xff0c;信息系统众多&#xff0c;企业数据量庞大。因此&#xff0c;清楚地了解自身存在的痛点&#xff0c;找到适合自身业务需…