第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > voc数据集格式转换为coco数据集格式+修改xml格式文件

voc数据集格式转换为coco数据集格式+修改xml格式文件

时间:2023-09-21 12:50:33

相关推荐

voc数据集格式转换为coco数据集格式+修改xml格式文件

voc数据集格式转换为coco格式+修改xml格式文件中部分内容

voc数据集格式→coco数据集格式修改xml格式文件中部分内容

voc数据集格式→coco数据集格式

下面这份代码只需修改文件所在位置xml_path以及生成.json格式的文件所在位置 json_file即可。

import xml.etree.ElementTree as ETimport osimport jsoncoco = dict()coco['images'] = []coco['type'] = 'instances'coco['annotations'] = []coco['categories'] = []category_set = dict()image_set = set()category_item_id = -1image_id = 0000000annotation_id = 0def addCatItem(name):global category_item_idcategory_item = dict()category_item['supercategory'] = 'none'category_item_id += 1category_item['id'] = category_item_idcategory_item['name'] = namecoco['categories'].append(category_item)category_set[name] = category_item_idreturn category_item_iddef addImgItem(file_name, size):global image_idif file_name is None:raise Exception('Could not find filename tag in xml file.')if size['width'] is None:raise Exception('Could not find width tag in xml file.')if size['height'] is None:raise Exception('Could not find height tag in xml file.')image_id += 1image_item = dict()image_item['id'] = image_idimage_item['file_name'] = file_nameimage_item['width'] = size['width']image_item['height'] = size['height']coco['images'].append(image_item)image_set.add(file_name)return image_iddef addAnnoItem(object_name, image_id, category_id, bbox):global annotation_idannotation_item = dict()annotation_item['segmentation'] = []seg = []# bbox[] is x,y,w,h# left_topseg.append(bbox[0])seg.append(bbox[1])# left_bottomseg.append(bbox[0])seg.append(bbox[1] + bbox[3])# right_bottomseg.append(bbox[0] + bbox[2])seg.append(bbox[1] + bbox[3])# right_topseg.append(bbox[0] + bbox[2])seg.append(bbox[1])annotation_item['segmentation'].append(seg)annotation_item['area'] = bbox[2] * bbox[3]annotation_item['iscrowd'] = 0annotation_item['ignore'] = 0annotation_item['image_id'] = image_idannotation_item['bbox'] = bboxannotation_item['category_id'] = category_idannotation_id += 1annotation_item['id'] = annotation_idcoco['annotations'].append(annotation_item)def parseXmlFiles(xml_path):for f in os.listdir(xml_path):if not f.endswith('.xml'):continuebndbox = dict()size = dict()current_image_id = Nonecurrent_category_id = Nonefile_name = Nonesize['width'] = Nonesize['height'] = Nonesize['depth'] = Nonexml_file = os.path.join(xml_path, f)print(xml_file)tree = ET.parse(xml_file)root = tree.getroot()if root.tag != 'annotation':raise Exception('pascal voc xml root element should be annotation, rather than {}'.format(root.tag))# elem is <folder>, <filename>, <size>, <object>for elem in root:current_parent = elem.tagcurrent_sub = Noneobject_name = Noneif elem.tag == 'folder':continueif elem.tag == 'filename':file_name = elem.textif file_name in category_set:raise Exception('file_name duplicated')# add img item only after parse <size> tagelif current_image_id is None and file_name is not None and size['width'] is not None:if file_name not in image_set:current_image_id = addImgItem(file_name, size)print('add image with {} and {}'.format(file_name, size))else:raise Exception('duplicated image: {}'.format(file_name))# subelem is <width>, <height>, <depth>, <name>, <bndbox>for subelem in elem:bndbox['xmin'] = Nonebndbox['xmax'] = Nonebndbox['ymin'] = Nonebndbox['ymax'] = Nonecurrent_sub = subelem.tagif current_parent == 'object' and subelem.tag == 'name':object_name = subelem.textif object_name not in category_set:current_category_id = addCatItem(object_name)else:current_category_id = category_set[object_name]elif current_parent == 'size':if size[subelem.tag] is not None:raise Exception('xml structure broken at size tag.')size[subelem.tag] = int(subelem.text)# option is <xmin>, <ymin>, <xmax>, <ymax>, when subelem is <bndbox>for option in subelem:if current_sub == 'bndbox':if bndbox[option.tag] is not None:raise Exception('xml structure corrupted at bndbox tag.')bndbox[option.tag] = int(option.text)# only after parse the <object> tagif bndbox['xmin'] is not None:if object_name is None:raise Exception('xml structure broken at bndbox tag')if current_image_id is None:raise Exception('xml structure broken at bndbox tag')if current_category_id is None:raise Exception('xml structure broken at bndbox tag')bbox = []# xbbox.append(bndbox['xmin'])# ybbox.append(bndbox['ymin'])# wbbox.append(bndbox['xmax'] - bndbox['xmin'])# hbbox.append(bndbox['ymax'] - bndbox['ymin'])print('add annotation with {},{},{},{}'.format(object_name, current_image_id, current_category_id,bbox))addAnnoItem(object_name, current_image_id, current_category_id, bbox)if __name__ == '__main__':xml_path = 'F:\models\DETR\VOCtest60\Annotations' # 这是xml文件所在的地址json_file = './test.json' # 这是你要生成的json文件parseXmlFiles(xml_path) # 只需要改动这两个参数就行了json.dump(coco, open(json_file, 'w'))

顺便附上一份整理数据的代码:

import shutilroot = r"F:\models\DETR\ouyangDataSets"def move():file_object = open(root + r'\ImageSets\test.txt')try:for line in file_object:print(line)file = root + '\\JPEGImages\\' + line.rstrip('\n') + '.jpg' #移动文件print(file)# pic = line.rstrip('\n') #移动图片shutil.move(file, r"F:\models\DETR\ouyangDataSets\JPEGImages\test")finally:file_object.close()if __name__ == '__main__':move()

修改xml格式文件中部分内容

在上面数据转变为所需要的格式之后,便开始了训练,但在训练过程中发现如下的问题:

这个问题我的确是查了很久,所用的数据集中并不存在**.png**格式的图片,开始怀疑是不是某一处代码将jpg格式的图片转变为了png格式的,于是去查了dataloader.py,但并没有收获,后面怀疑是否是在voc格式的数据转换为coco格式过程中出现了问题,还是一无所获。

后面想着去看看生成的json文件,发现里面存在很多的png格式的文件名,再去看用于生成json格式的xml文件,果然…里面某些图片为.jpg数据的xml文件中的filename的后缀却为.png。

下面附上修改的代码:

# 此代码用于将生成错误的xml文件中的png转为jpg# coding=utf-8import os.pathimport xml.dom.minidompath = r"F:\models\DETR\ouyangDatasets\VOCtest60\Annotations"files = os.listdir(path) # 得到文件夹下所有文件名称s = []for xmlFile in files: # 遍历文件夹if not os.path.isdir(xmlFile) and xmlFile[-2:] != 'py': # 判断是否是文件夹,不是文件夹才打开print("文件名:"+xmlFile)# TODO# xml文件读取操作# 将获取的xml文件名送入到dom解析dom = xml.dom.minidom.parse(os.path.join(path, xmlFile)) ###最核心的部分,路径拼接,输入的是具体路径root = dom.documentElement# 获取标签对name/pose之间的值filename = root.getElementsByTagName('filename')# 原始信息n0 = filename[0]print('原始信息:'+n0.firstChild.data)# 修改n0.firstChild.data = xmlFile[:-3]+'jpg' #所处理的文件名与xml格式中的filename除后缀外是一样的# 打印输出print('修改后的filename:'+n0.firstChild.data)with open(os.path.join(path, xmlFile), 'w') as fh:dom.writexml(fh)print('写入ok------------')

原始xml文件:

<?xml version="1.0" ?><annotation><folder>Fire images</folder><filename>0000.png</filename><path>F:\DataSets\hlw_fire_data\Fire images\00000.jpg</path><source><database>Unknown</database></source><size><width>490</width><height>367</height><depth>3</depth></size><segmented>0</segmented><object><name>fire</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>237</xmin><ymin>82</ymin><xmax>295</xmax><ymax>154</ymax></bndbox></object><object><name>fire</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>209</xmin><ymin>208</ymin><xmax>288</xmax><ymax>251</ymax></bndbox></object></annotation>

修改后的:

<?xml version="1.0" ?><annotation><folder>Fire images</folder><filename>0000.jpg</filename><path>F:\DataSets\hlw_fire_data\Fire images\00000.jpg</path><source><database>Unknown</database></source><size><width>490</width><height>367</height><depth>3</depth></size><segmented>0</segmented><object><name>fire</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>237</xmin><ymin>82</ymin><xmax>295</xmax><ymax>154</ymax></bndbox></object><object><name>fire</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>209</xmin><ymin>208</ymin><xmax>288</xmax><ymax>251</ymax></bndbox></object></annotation>

主要参考博客:

python批量修改xml属性

【学习笔记】使用python批量读取并修改xml文件

Python将voc数据格式转化为coco数据格式

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。