[MMDetection]VOC数据格式转为COCO数据格式


 以下脚本可以根据创建VOC格式数据集转换为COCO数据集

其中文件组织格式如下

VOC2007

        ------Annotations

                ------***********.xml

                ------***********.xml

       -------ImageSets

                ------train.txt 

                ------test.txt

        -------JPEGImages

                ------***********.jpg

                ------***********.jpg

     

COCO2017

        ------train

                ------annotations

                        ------train.json

                ------images

                        ------***********.jpg

                        ------***********.jpg

       -------test

                ------annotations 

                        ------train.json

                ------images

                        ------***********.jpg

                        ------***********.jpg

 

#!/usr/bin/python
# xml是voc的格式
# json是coco的格式
import sys, os, json, glob
import xml.etree.ElementTree as ET
import shutil
INITIAL_BBOXIds = 1
# PREDEF_CLASSE = {}
PREDEF_CLASSE = {'DT_SUBSIDENCE':0, 'PIP':1, 'NET':2, 'GROUND_LAMP':3, 'DT_CRACK':4, 'PIP_S':5, 'DT_GAP':6}# function
def get(root, name):return root.findall(name)def get_and_check(root, name, length):vars = root.findall(name)if len(vars) == 0:raise NotImplementedError('Can not find %s in %s.' % (name, root.tag))if length > 0 and len(vars) != length:raise NotImplementedError('The size of %s is supposed to be %d, but is %d.' % (name, length, len(vars)))if length == 1:vars = vars[0]return varsdef convert(xml_paths, out_json, mode = "train"):json_dict = {'images': [], 'type': 'instances','categories': [], 'annotations': []}categories = PREDEF_CLASSEbbox_id = INITIAL_BBOXIdsfor image_id, xml_f in enumerate(xml_paths):# 进度输出# sys.stdout.write('\r>> Converting image %d/%d' % (#     image_id + 1, len(xml_paths)))# sys.stdout.flush()tree = ET.parse(xml_f)root = tree.getroot()# filename = get_and_check(root, 'frame', 1).text# print(type(xml_f))filename = xml_f.split(r"E:\VOC2007\Annotations")[1]   # VOC的annotations的路径filename = filename.split("\\")[1]filename = filename.split(".xml")[0]+".jpg"print("########################",filename,xml_f)if mode == "test":src = os.path.join(r"E:\VOC2007\JPEGImages",filename) # VOC的JPEGImages的路径dst = os.path.join(r"E:\COCO2017\test\images",filename) # 需要存放的COCOimage路径shutil.copyfile(src, dst)if mode == "train":src = os.path.join(r"E:\VOC2007\JPEGImages",filename)dst = os.path.join(r"E:COCO2017\train\images",filename)shutil.copyfile(src, dst)size = get_and_check(root, 'size', 1)width = int(get_and_check(size, 'width', 1).text)height = int(get_and_check(size, 'height', 1).text)image = {'file_name': filename, 'height': height,'width': width, 'id': image_id + 1}json_dict['images'].append(image)## Cruuently we do not support segmentation# segmented = get_and_check(root, 'segmented', 1).text# assert segmented == '0'for obj in get(root, 'object'):category = get_and_check(obj, 'name', 1).textif category not in categories:new_id = max(categories.values()) + 1categories[category] = new_idcategory_id = categories[category]bbox = get_and_check(obj, 'bndbox', 1)xmin = int(get_and_check(bbox, 'xmin', 1).text) - 1ymin = int(get_and_check(bbox, 'ymin', 1).text) - 1xmax = int(get_and_check(bbox, 'xmax', 1).text)ymax = int(get_and_check(bbox, 'ymax', 1).text)if xmax <= xmin or ymax <= ymin:continueo_width = abs(xmax - xmin)o_height = abs(ymax - ymin)ann = {'area': o_width * o_height, 'iscrowd': 0, 'image_id': image_id + 1,'bbox': [xmin, ymin, o_width, o_height], 'category_id': category_id,'id': bbox_id, 'ignore': 0, 'segmentation': []}json_dict['annotations'].append(ann)bbox_id = bbox_id + 1for cate, cid in categories.items():cat = {'supercategory': 'none', 'id': cid, 'name': cate}json_dict['categories'].append(cat)# json_file = open(out_json, 'w')# json_str = json.dumps(json_dict)# json_file.write(json_str)# json_file.close() # 快json.dump(json_dict, open(out_json, 'w'), indent=4)  # indent=4 更加美观显示 慢if __name__ == '__main__':# 1、读取VOC2007\ImagesSets\Main中的文件 得到测试集和训练集的图片名test_filenames = []train_filenames = []with open(r"E:\lijunjie\GPR\radar_data\AUD_VOC\VOC2007\ImageSets\Main\test.txt") as f:for filename in f.readlines():test_filenames.append(filename.split('\n')[0])  # 去掉换行符 \n with open(r"E:\lijunjie\GPR\radar_data\AUD_VOC\VOC2007\ImageSets\Main\train.txt") as f:for filename in f.readlines():train_filenames.append(filename.split('\n')[0])  print(test_filenames)print(train_filenames)# 2、分别拼凑出 训练 和 测试 所需要的xml 路径xml_path = r'E:\VOC2007\Annotations'  # 改一下读取xml文件位置train_xml_files = []test_xml_files = []for train_filename in train_filenames:train_xml_file = os.path.join(xml_path,train_filename) + '.xml'   # 拼接路径 加上后缀# print(train_xml_file)train_xml_files.append(train_xml_file)for test_filename in test_filenames:test_xml_file = os.path.join(xml_path,test_filename) + '.xml'# print(test_xml_file)test_xml_files.append(test_xml_file)print(test_xml_files)print(train_xml_files)# 3、转换数据convert(test_xml_files, r'E:\COCO2017\test\annotations\test.json',mode="test")  # 这里是生成的json保存位置,改一下convert(train_xml_files, r'E:\COCO2017\train\annotations\train.json',mode="train")  # 这里是生成的json保存位置,改一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13698.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

malloc()与calloc()的辨析

malloc()与calloc()的相同点 两者都是常用的内存分配函数&#xff0c;用于动态分配内存 两者返回值类型都为void*&#xff0c;需要强制转换为所需类型 使用完分配的内存后&#xff0c;都需使用free()函数来释放该内存&#xff0c;防止内存泄漏 malloc()与calloc()的不同点 mal…

flask+分页查询列表显示

import pymysqlfrom flask import Flask, render_template, requestapp Flask(__name__)app.debug Trueapp.route(/) def home():return render_template(Order_page.html)#查询数据以列表的形式返回查询结果 app.route(/Order_list, methods[POST]) def Order_list():db py…

删除数据库记录错误

删除数据库记录错误&#xff1a;Unexpected update count received (Actual: 2, Expected: 1). All changes will be rolled back. 解决&#xff1a;同时删掉ID为8的记录就行了 分析&#xff1a;这种情况是未设置主键约束&#xff0c;插入了相同的记录导致的。推测应该是框架对…

【产生初始解利器】基于蒙特卡洛模拟产生满足固定需求和固定供给的随机供给矩阵

如何生成一个总和是定值的随机矩阵 震惊&#xff0c;如果做一个约束比较强的模型&#xff0c;解的矩阵需要满足很多等式约束&#xff0c;而且都是整数&#xff0c;随机产生初始解很困难&#xff0c;该怎么办&#xff1f; 震惊&#xff0c;如果做一个约束比较强的模型&#xff0…

抖音seo矩阵系统源码开发部署--开发文档分享

目录 一、抖音seo矩阵系统源码自研概况分析 二、 技术开发语言及功能框架 技术要求&#xff1a; 功能框架&#xff1a; 三、 抖音seo矩阵系统开发原则 四、 抖音seo矩阵系统源码开发示例 一、抖音seo矩阵系统源码自研概况分析 关于抖音seo矩阵系统源码自研&#xff0c;在开…

模块化规范

常用模块化有两种规范&#xff0c;commonJS和ES6 一&#xff1a;两者区别 二&#xff1a;如何转义&#xff1f; 我们常遇到的使用场景是&#xff0c;在commonJS的模块里需要引入ES6规范的模块。这时就需要把ES6模块转译为commonJS规范的模块&#xff0c;否则报错 转义工具有…

CMU15-445 2022 Fall 通关记录 —— Project 2:B+ Tree(下篇)

Project 2&#xff1a;B Tree Project #2 - BTree | CMU 15-445/645 :: Intro to Database Systems (Fall 2022) NOTE&#xff1a; 记录完成该Pro中&#xff0c;一些可能会遇到的问题&#xff1a; 本实验中&#xff0c;有很多API是需要自己去实现的&#xff0c;因此&#x…

多元分类预测 | Matlab基于北方苍鹰优化深度置信网络(NGO-DBN)的分类预测,多输入模型,NGO-DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab基于北方苍鹰优化深度置信网络(NGO-DBN)的分类预测,多输入模型,NGO-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可…

4G理论概述

文章目录 LTE网络基础架构UMTS&#xff08;通用移动通信系统&#xff0c;Universal Mobile Telecommunications System&#xff09;UTRAN&#xff08;UMTS陆地无线接入网&#xff0c;UMTS Terrestrial Radio Access Network&#xff09;RNC&#xff08;无线网络控制器&#xff…

Quiz 14_2-1: Using Web Services | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介Quiz 14_2-1: Using Web Services单选题&#xff08;1-15&#xff09;操作题Autograder : Extracting Data from XML Python for Everybody 课程简介 Python for Everybody 零基础程序设计&#xff08;Python 入门&#xff09; This cou…

linux 命令之find

find 命令 1. 作用 命令用于在指定目录下以及其子母路查找文件和目录。 2. 语法 find [path] [expression] 不指定path的默认为当前路径 2.1 常见的参数 -name pattern&#xff1a;按文件名查找&#xff0c;支持使用通配符 * 和 ?。 -type type&#xff1a;按文件类型查…

【kubernetes系列】kubernetes之initcontainer初始化容器

概述 Init Container就是用来做初始化工作的容器&#xff0c;可以是一个或者多个&#xff0c;如果有多个的话&#xff0c;这些容器会按定义的顺序依次执行&#xff0c;只有所有的Init Container执行完后&#xff0c;主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据…