当前位置:网站首页>VOC格式数据集转COCO格式数据集
VOC格式数据集转COCO格式数据集
2022-08-05 00:44:00 【佐咖】
使用下面给出的代码前,只需要修改原始.xml文件路径和转换后的.json要保存到的路径即可:

具体转换代码见下:
### 用这个将xml转化为json格式可以正常的训练
import xml.etree.ElementTree as ET
import os
import json
coco = dict()
coco['images'] = []
coco['type'] = 'instances'
coco['annotations'] = []
coco['categories'] = []
category_set = dict()
image_set = set()
category_item_id = 0
# image_id = 'ball-'
image_id = 0
id_num = 0
annotation_id = 0
def addCatItem(name):
global category_item_id
category_item = dict()
category_item['supercategory'] = 'none'
category_item_id += 1
category_item['id'] = category_item_id
category_item['name'] = name
coco['categories'].append(category_item)
category_set[name] = category_item_id
return category_item_id
def addImgItem(file_name, size):
global image_id, id_num
if 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_item = dict()
# temp = str(id_num)
temp = int(id_num)
# image_item['id'] = image_id + temp
image_item['id'] = temp
id_num += 1
image_item['file_name'] = file_name
image_item['width'] = size['width']
image_item['height'] = size['height']
coco['images'].append(image_item)
image_set.add(file_name)
return image_item['id']
def addAnnoItem(object_name, image_id, category_id, bbox):
global annotation_id
annotation_item = dict()
annotation_item['segmentation'] = []
seg = []
# bbox[] is x,y,w,h
# left_top
seg.append(bbox[0])
seg.append(bbox[1])
# left_bottom
seg.append(bbox[0])
seg.append(bbox[1] + bbox[3])
# right_bottom
seg.append(bbox[0] + bbox[2])
seg.append(bbox[1] + bbox[3])
# right_top
seg.append(bbox[0] + bbox[2])
seg.append(bbox[1])
annotation_item['segmentation'].append(seg)
annotation_item['area'] = bbox[2] * bbox[3]
annotation_item['iscrowd'] = 0
annotation_item['ignore'] = 0
annotation_item['image_id'] = image_id
annotation_item['bbox'] = bbox
annotation_item['category_id'] = category_id
annotation_id += 1
annotation_item['id'] = annotation_id
coco['annotations'].append(annotation_item)
def parseXmlFiles(xml_path):
for f in os.listdir(xml_path):
if not f.endswith('.xml'):
continue
bndbox = dict()
size = dict()
current_image_id = None
current_category_id = None
file_name = None
size['width'] = None
size['height'] = None
size['depth'] = None
xml_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.tag
current_sub = None
object_name = None
if elem.tag == 'folder':
continue
if elem.tag == 'filename':
file_name = elem.text
if file_name in category_set:
raise Exception('file_name duplicated')
# add img item only after parse <size> tag
elif 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'] = None
bndbox['xmax'] = None
bndbox['ymin'] = None
bndbox['ymax'] = None
current_sub = subelem.tag
if current_parent == 'object' and subelem.tag == 'name':
object_name = subelem.text
if 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> tag
if 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 = []
# x
bbox.append(bndbox['xmin'])
# y
bbox.append(bndbox['ymin'])
# w
bbox.append(bndbox['xmax'] - bndbox['xmin'])
# h
bbox.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 = "coco/trainxml" ## 原始的训练集.xml文件路径
json_file = 'coco/annotations/instances_train2017.json' ## 转后保存训练集.json文件的路径
#
# xml_path = "coco/valxml" ## 原始的验证集.xml文件路径
# json_file = 'coco/annotations/instances_val2017.json' ## 转后保存验证集.json文件的路径
parseXmlFiles(xml_path)
json.dump(coco, open(json_file, 'w'))
上面代码是将训练集或验证集里面的所有.xml标签文件转化为一个.json文件,具体转换后的效果见下:

转换后的.json文件中标签的样纸见下:

以上就是VOC格式数据集转COCO格式数据集的方法即代码,希望能帮助到你,多多支持,谢谢!
边栏推荐
- 仅3w报价B站up主竟带来1200w播放!品牌高性价比B站投放标杆!
- redis可视化管理软件Redis Desktop Manager2022
- Raw and scan of gorm
- 2022 Hangzhou Electric Power Multi-School Session 3 K Question Taxi
- 【无标题】
- Software Testing Interview Questions: What's the Difference Between Manual Testing and Automated Testing?
- 2022杭电多校第三场 L题 Two Permutations
- OPENWIFI实践1:下载并编译SDRPi的HDL源码
- 进程间通信和线程间通信
- Software testing interview questions: test life cycle, the test process is divided into several stages, and the meaning of each stage and the method used?
猜你喜欢

Will domestic websites use Hong Kong servers be blocked?

JUC线程池(一): FutureTask使用

Dynamic Programming/Knapsack Problem Summary/Summary - 01 Knapsack, Complete Knapsack

oracle create tablespace

LiveVideoStackCon 2022 上海站明日开幕!

LiveVideoStackCon 2022 Shanghai Station opens tomorrow!

金九银十面试跳槽季;你准备好了吗?

Theory of Software Fundamentals

could not build server_names_hash, you should increase server_names_hash_bucket_size: 32

gorm joint table query - actual combat
随机推荐
ORA-00257
More than 2022 cattle school training topic Link with the second L Level Editor I
2022 Hangzhou Electric Power Multi-School Session 3 Question L Two Permutations
CNI(Container Network Plugin)
TinyMCE disable escape
FSAWS 的全球基础设施和网络
Matlab uses plotting method for data simulation and simulation
2022 Hangzhou Electric Multi-School 1004 Ball
[FreeRTOS] FreeRTOS and stm32 built-in stack occupancy
Bit rate vs. resolution, which one is more important?
软件测试面试题:系统测试的策略有?
tiup status
Software Testing Interview Questions: What Are the Types of Software Testing?
Lattice PCIe 学习 1
软件测试面试题:负载测试、容量测试、强度测试的区别?
DHCP的工作过程
软件测试面试题:一套完整的测试应该由哪些阶段组成?
仅3w报价B站up主竟带来1200w播放!品牌高性价比B站投放标杆!
【idea】idea配置sql格式化
Helm Chart