(19)目标检测算法之模型预测并保存结果到xml中,自动生成标签文件/自动标注
创始人
2024-06-02 23:23:12
0

目标检测算法之模型预测并保存结果到xml中,自动生成标签文件/自动标注

  • 在做深度学习算法研究中,标图往往是工作量很大且性价比较低的一项工作了,最近在用YOLO,在此参考网上已有程序完善下可执行demo
  • 看过一下demo,需要导入utils下的模块,我没有安装成功,在此特别感谢这篇文章:YOLOv5实现半标注—告别大量重复标注工作,本文是在其代码上做了些更改

1. 自动生成标签实现

  • 具体过程的话呢需要一些几点:

      1. 对少些图像进行标注并训练,保存模型权重文件
      1. 封装预测模块,并将预测结果整理成代码中所需要的格式:由[x_min,y_min,x_max,y_max,label[x_min,y_min,x_max,y_max,label]组成的列表
      1. 修改测试路径,运行自动检测demo,批量生成标签
  • 我用的是YOLO,如果你的是其他模型,自行做出相应修改

  • 完整代码如下:

import os
import cv2
from lxml.etree import Element, SubElement, tostring
import detect_yolov5 as detectclasses=['desk','packet','cue']def create_xml(list_xml,list_images,xml_path):"""创建xml文件,依次写入xml文件必备关键字:param list_xml:   txt文件中的box:param list_images:   图片信息,xml中需要写入WHC:return:"""node_root = Element('annotation')node_folder = SubElement(node_root, 'folder')node_folder.text = 'Images'node_filename = SubElement(node_root, 'filename')node_filename.text = str(list_images[3])node_size = SubElement(node_root, 'size')node_width = SubElement(node_size, 'width')node_width.text = str(list_images[1])node_height = SubElement(node_size, 'height')node_height.text = str(list_images[0])node_depth = SubElement(node_size, 'depth')node_depth.text = str(list_images[2])if len(list_xml)>=1:        # 循环写入boxfor list_ in list_xml:node_object = SubElement(node_root, 'object')node_name = SubElement(node_object, 'name')# if str(list_[4]) == "person":                # 根据条件筛选需要标注的标签,例如这里只标记person这类,不符合则直接跳过#     node_name.text = str(list_[4])# else:#     continuenode_name.text = str(list_[4])node_difficult = SubElement(node_object, 'difficult')node_difficult.text = '0'node_bndbox = SubElement(node_object, 'bndbox')node_xmin = SubElement(node_bndbox, 'xmin')node_xmin.text = str(list_[0])node_ymin = SubElement(node_bndbox, 'ymin')node_ymin.text = str(list_[1])node_xmax = SubElement(node_bndbox, 'xmax')node_xmax.text = str(list_[2])node_ymax = SubElement(node_bndbox, 'ymax')node_ymax.text = str(list_[3])xml = tostring(node_root, pretty_print=True)   # 格式化显示,该换行的换行file_name = list_images[3].split(".")[0]filename = xml_path+"/{}.xml".format(file_name)f = open(filename, "wb")f.write(xml)f.close()if __name__ == '__main__':path = r"./mytrain/images"        # 图片路径xml_path = r"mytrain/images"      # xml标注保存路径for name in os.listdir(path):print(name)#xml_name=name.split('.')[0]+".xml"if(name.split('.')[-1]=='jpg'):image = cv2.imread(os.path.join(path, name))list_image = (image.shape[0], image.shape[1], image.shape[2], name)  # 图片的宽高等信息result = detect.detect(image)xyxy_list = []for res in result:x_min = res['position'][0]y_min = res['position'][1]x_max = res['position'][0] + res['position'][2]y_max = res['position'][1] + res['position'][3]name = res['class']_list = [x_min, y_min, x_max, y_max, name]xyxy_list.append(_list)create_xml(xyxy_list, list_image, xml_path)  # 生成标注的xml文件

2. 批量复制xml

  • 此方法针对背景相同且图像中多数待标注对象相同时使用
  • 输入待标注图像名称及已标注.xml,即可批量复制并保存成对应图像名字的标签文件.xml
  • 完成代码:
#批量赋值图像的标注文件.xml并重命名为图像名字import os
import shutil# imgspath="./file3/jpg"
# xmlpath="file3/jpg/005.xml"
imgspath="./imgs"
xmlpath="./imgs/0.xml"for root,dirs,files in os.walk(imgspath,topdown=True):for name in files:str=name.split('.')if(str[-1] == 'jpg'):newname=str[0]+'.xml'newxml=os.path.join(root,newname)print(newxml)if not os.path.exists(newxml):shutil.copy(xmlpath,newxml)

3. 读取文件夹图像并批量重命名

针对:

  • 有重复名字的数据集
  • 名字特别复杂的数据集

代码如下:

'''
读取文件夹路径下图像并且批量重命名
'''# -*- coding:UTF-8 -*-
import os
import cv2
import randomdef traverse_path(file_path):files = os.listdir(file_path)for fi in files:fi_d = os.path.join(file_path, fi)if os.path.isdir(fi_d):traverse_path(fi_d)else:img_name=os.path.join(file_path, fi)#print(img_name)if img_name[-4:]=='tiff':#print(img_name)imglist.append(img_name)txt_file.write(img_name)txt_file.write('\n')elif img_name[-3:]=="jpg":# print(img_name)imglist.append(img_name)txt_file.write(img_name)txt_file.write('\n')# for i in len(lists):#     print(lists(i))return imglistif __name__ == '__main__':dirname = "./file3"txt_path = './list.txt'savepath="./png"if not os.path.exists(savepath):os.makedirs(savepath)txt_file = open(txt_path, 'w')imglist = []traverse_path(dirname)print("读取图像数量:", len(imglist))#批量重命名保存n=0t=0while t< len(imglist):img=cv2.imread(imglist[t])# newname=imglist[t].rsplit("\\",1)[0] + "\\" + str(n)+".png"newname = savepath+ "\\" + str(n) + ".png"#重命名保存cv2.imwrite(newname,img)print(newname)t+=1n+=1

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...