将多个文件夹或单文件夹内的xml文件转换为一个json标签(imagenet VID等视频目标检测数据集)简单易改,有注释
文章目录
- 多文件夹xml文件转json
- 单文件夹xml文件转json
该代码主要针对视频目标检测yolov项目需要训练基础的yolox检测器所写(需要VID的json标签文件),鉴于网上没有公开的代码,根据自己的数据集写了一个
- 主要用于对多个文件夹内的xml文件转换为1个json文件,单个文件夹也支持
- 可针对Imagenet VID 等视频目标检测数据集进行标签的转换,imagenet格式
- 任何id都是从0开始
- 如果bndbox标签不为int型,自行更改为float型
多文件夹xml文件转json
import os
from tqdm import tqdm
import xml.etree.ElementTree as ET
import jsonclass_names = ["drone"] # 本人转换的标签只有1个
img_id = -1 # 全局变量
anno_id = -1 # 全局变量def voc2coco(data_dir, dir_save, jsonname): # 获取所有的xml文件列表xml_dir = data_dir# 多个文件夹操作train_xmls = list()for tt in tqdm(os.listdir(xml_dir)): # 遍历文件夹获取xml文件列表one_dir_path = os.path.join(xml_dir, tt)train_xmls = train_xmls + [os.path.join(one_dir_path, n) for n in os.listdir(one_dir_path)]## 单个文件夹操作# train_xmls = [os.path.join(xml_dir, n) for n in os.listdir(xml_dir)]print('got xmls')train_coco = xml2coco(train_xmls)with open(os.path.join(dir_save, jsonname), 'w') as f: # 保存进入指定的coco文件夹json.dump(train_coco, f, ensure_ascii=False, indent=2)print('done')def xml2coco(xmls): # 将多个xml文件转换成coco格式coco_anno = {'info': {"description": "yip_make"}, 'images': [], 'licenses': [], 'annotations': [], 'categories': []}coco_anno['categories'] = [{'supercategory': "", 'id': i, 'name': j} for i, j in enumerate(class_names)]global img_id, anno_idfor fxml in tqdm(xmls): # 逐一对xml文件进行处理try:tree = ET.parse(fxml)objects = tree.findall('object')except:print('err xml file: ', fxml)continueimg_id += 1 # 无论图片有无标签,该图片也算img_idsize = tree.find('size')ih = int(size.find('height').text)iw = int(size.find('width').text)img_name = fxml.replace("Annotations", "Data").replace("xml", "JPEG") # 获得原始图片的路径img_info = {}img_info['id'] = img_idimg_info['file_name'] = img_nameimg_info['height'] = ihimg_info['width'] = iwcoco_anno['images'].append(img_info)if len(objects) < 1:print('no object in ', fxml) # 打印没有bndbox标签的xml文件continuefor obj in objects: # 获取xml内的所有bndbox标签cls_name = obj.find('name').textbbox = obj.find('bndbox')x1 = int(bbox.find('xmin').text)y1 = int(bbox.find('ymin').text)x2 = int(bbox.find('xmax').text)y2 = int(bbox.find('ymax').text)if x2 < x1 or y2 < y1:print('bbox not valid: ', fxml)continueanno_id += 1bb = [x1, y1, x2 - x1, y2 - y1]categery_id = class_names.index(cls_name)area = (x2 - x1) * (y2 - y1)anno_info = {}anno_info['segmentation'] = []anno_info['area'] = areaanno_info['image_id'] = img_idanno_info['bbox'] = bbanno_info['iscrowd'] = 0anno_info['category_id'] = categery_idanno_info['id'] = anno_idcoco_anno['annotations'].append(anno_info)return coco_annoif __name__ == '__main__':## 单个文件夹# data_dir = 'ILSVRC2015/Annotations/VID/train/01_1667_0001-1500'# data_dir含多个文件夹,每个文件夹有多个xml文件data_dir = 'ILSVRC2015/Annotations/VID/val/' # VID格式xml训练集或测试集的文件夹dir_save = 'coco/annotations' # coco文件保存的文件夹if not os.path.exists(dir_save):os.makedirs(dir_save)# jsonname = 'vid_train_coco.json' # coco文件名jsonname = 'vid_val10000_coco.json' # coco文件名voc2coco(data_dir, dir_save, jsonname)
单文件夹xml文件转json
import os
from tqdm import tqdm
import xml.etree.ElementTree as ET
import jsonclass_names = ["drone"] # 本人转换的标签只有1个
img_id = -1 # 全局变量
anno_id = -1 # 全局变量def voc2coco(data_dir, dir_save, jsonname): # 获取所有的xml文件列表xml_dir = data_dir## 单个文件夹操作train_xmls = [os.path.join(xml_dir, n) for n in os.listdir(xml_dir)]print('got xmls')train_coco = xml2coco(train_xmls)with open(os.path.join(dir_save, jsonname), 'w') as f: # 保存进入指定的coco文件夹json.dump(train_coco, f, ensure_ascii=False, indent=2)print('done')def xml2coco(xmls): # 将多个xml文件转换成coco格式coco_anno = {'info': {"description": "yip_make"}, 'images': [], 'licenses': [], 'annotations': [], 'categories': []}coco_anno['categories'] = [{'supercategory': "", 'id': i, 'name': j} for i, j in enumerate(class_names)]global img_id, anno_idfor fxml in tqdm(xmls): # 逐一对xml文件进行处理try:tree = ET.parse(fxml)objects = tree.findall('object')except:print('err xml file: ', fxml)continueimg_id += 1 # 无论图片有无标签,该图片也算img_idsize = tree.find('size')ih = int(size.find('height').text)iw = int(size.find('width').text)img_name = fxml.replace("Annotations", "Data").replace("xml", "JPEG") # 获得原始图片的路径img_info = {}img_info['id'] = img_idimg_info['file_name'] = img_nameimg_info['height'] = ihimg_info['width'] = iwcoco_anno['images'].append(img_info)if len(objects) < 1:print('no object in ', fxml) # 打印没有bndbox标签的xml文件continuefor obj in objects: # 获取xml内的所有bndbox标签cls_name = obj.find('name').textbbox = obj.find('bndbox')x1 = int(bbox.find('xmin').text)y1 = int(bbox.find('ymin').text)x2 = int(bbox.find('xmax').text)y2 = int(bbox.find('ymax').text)if x2 < x1 or y2 < y1:print('bbox not valid: ', fxml)continueanno_id += 1bb = [x1, y1, x2 - x1, y2 - y1]categery_id = class_names.index(cls_name)area = (x2 - x1) * (y2 - y1)anno_info = {}anno_info['segmentation'] = []anno_info['area'] = areaanno_info['image_id'] = img_idanno_info['bbox'] = bbanno_info['iscrowd'] = 0anno_info['category_id'] = categery_idanno_info['id'] = anno_idcoco_anno['annotations'].append(anno_info)return coco_annoif __name__ == '__main__':## 单个文件夹data_dir = 'ILSVRC2015/Annotations/VID/train/01_1667_0001-1500'dir_save = 'coco/annotations' # coco文件保存的文件夹if not os.path.exists(dir_save):os.makedirs(dir_save)# jsonname = 'vid_train_coco.json' # json文件名jsonname = 'vid_val10000_coco.json' # json文件名voc2coco(data_dir, dir_save, jsonname)
将多个文件夹或单文件夹内的xml文件转换为一个json标签(imagenet VID等视频目标检测数据集)简单易改,有注释相关推荐
- 融合视频目标检测与单目标、多目标跟踪,港中文开源一体化视频感知平台 MMTracking...
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 编辑丨机器之心 魔王 香港中文大学多媒体实验室(MMLab)OpenMMLab 开源一体化视频目标感知 ...
- 港中文开源 | 融合视频目标检测与单目标、多目标跟踪
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习> ...
- 计算机一级查找同类型文件,如何快捷找出电脑内的重复文件
有时特喜欢收集各种软件和资料,但是时间久了,很多软件和资料之前下载过了,后来不记得了,又下载了,这样重复的非常多.这样重复的文件多了,占了大量的磁盘空间,也影响电脑运行性能,当然是要清理掉,但这些文件 ...
- ajax 文件数据流,Ajax如何读取数据流中的xml文件?
Ajax如何读取数据流中的xml文件? 这是我的源代码,请大家帮忙看看,我读到的怎么都是空值.是不是方法错了? var xmlHttp; function createXMLHttpRequest() ...
- java对xml文件的读写_java 自己做的对XML文件的读写操作
XML文件实例: WEB-INF/web.xml type="javax.sql.DataSource" /> type="javax.sql.DataSource ...
- python写ini文件不能保持原有顺序问题_python 生成 xml文件 属性的顺序问题
需求很奇葩. 文档示例 用python 的xml 导出的xml文件,相应的内容是 我们都知道,属性的顺序是不影响,xml值的读取的. 但是,就是有奇葩的需求,需求方还非常强势,说了不影响,但还是要求顺 ...
- 目标检测数据集转换 json文件转换为txt文件格式
目标检测任务中,制作数据集或寻找合适的数据集是极为重要的一项工作.我们需要就数据集标签格式调整模型代码,亦或是改动数据集标签的格式以满足模型需求. 本帖子所述的方法是:使用数据集制作工具labelme ...
- android xml 加载错误提示,加载uixml文件失败 打开wps时显示“加载XML文件失败1
打开wps时显示"加载XML文件失败." 打开wps时显示"加载XML文件失败1 关闭所有打开的Word文档: 开始 → 运行 → 粘贴上面复制的命令 → 确定. 在打开 ...
- xml文件拆分 python_使用Python解析大型拆分XML文件
我有一个非常大的XML日志文件,它以固定大小(约200MB)自动拆分.可能有很多部分(通常少于10个).当它拆分时,它不会在记录的末尾或者甚至在当前行的末尾进行拆分.它只要达到目标尺寸就会裂开.在 基 ...
最新文章
- Pycharm那些隐藏的实用小技巧,太强了
- mysql数据库21_Mysql5.7.21安装文档
- php移动代码,复制移动文件 - PHP
- mysql试题百度云_BATJ大厂600多道技术面试题及答案解析
- crawler_爬虫开发的曲线图
- 如何画出漂亮的气象(实时流量)图
- 员工辞职的十大原因!
- java包名和类名可以一样吗_Java入门第三课:Java基本语法
- css设置字体颜色、文本对齐方式、首行缩进、文本装饰、列表样式、鼠标样式、禁止文本域拖拽、轮廓线、块级元素对齐方式、文字溢出设置
- HDU - 6333 Harvest of Apples
- Windows 平台sqlalchemy 连接oracle数据库
- 函数调用图工具: Understand(支持Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M)
- 怎么更改文件类型/后缀?
- 使用NLTK实现stemming
- WITH TIES语句(SQL)
- Java点集_java-二维点集的包装
- 分析师意外下调评级为中性,苹果财报能否改变科技股走向?
- 网易2016研发工程师编程题--完全解析
- 2023届嵌入式笔面经一位双非本科生的秋招日记
- 为什么推荐使用hooks,它有什么好处?