文章目录

  • 多文件夹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等视频目标检测数据集)简单易改,有注释相关推荐

  1. 融合视频目标检测与单目标、多目标跟踪,港中文开源一体化视频感知平台 MMTracking...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 编辑丨机器之心 魔王 香港中文大学多媒体实验室(MMLab)OpenMMLab 开源一体化视频目标感知 ...

  2. 港中文开源 | 融合视频目标检测与单目标、多目标跟踪

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习> ...

  3. 计算机一级查找同类型文件,如何快捷找出电脑内的重复文件

    有时特喜欢收集各种软件和资料,但是时间久了,很多软件和资料之前下载过了,后来不记得了,又下载了,这样重复的非常多.这样重复的文件多了,占了大量的磁盘空间,也影响电脑运行性能,当然是要清理掉,但这些文件 ...

  4. ajax 文件数据流,Ajax如何读取数据流中的xml文件?

    Ajax如何读取数据流中的xml文件? 这是我的源代码,请大家帮忙看看,我读到的怎么都是空值.是不是方法错了? var xmlHttp; function createXMLHttpRequest() ...

  5. java对xml文件的读写_java 自己做的对XML文件的读写操作

    XML文件实例: WEB-INF/web.xml type="javax.sql.DataSource" /> type="javax.sql.DataSource ...

  6. python写ini文件不能保持原有顺序问题_python 生成 xml文件 属性的顺序问题

    需求很奇葩. 文档示例 用python 的xml 导出的xml文件,相应的内容是 我们都知道,属性的顺序是不影响,xml值的读取的. 但是,就是有奇葩的需求,需求方还非常强势,说了不影响,但还是要求顺 ...

  7. 目标检测数据集转换 json文件转换为txt文件格式

    目标检测任务中,制作数据集或寻找合适的数据集是极为重要的一项工作.我们需要就数据集标签格式调整模型代码,亦或是改动数据集标签的格式以满足模型需求. 本帖子所述的方法是:使用数据集制作工具labelme ...

  8. android xml 加载错误提示,加载uixml文件失败 打开wps时显示“加载XML文件失败1

    打开wps时显示"加载XML文件失败." 打开wps时显示"加载XML文件失败1 关闭所有打开的Word文档: 开始 → 运行 → 粘贴上面复制的命令 → 确定. 在打开 ...

  9. xml文件拆分 python_使用Python解析大型拆分XML文件

    我有一个非常大的XML日志文件,它以固定大小(约200MB)自动拆分.可能有很多部分(通常少于10个).当它拆分时,它不会在记录的末尾或者甚至在当前行的末尾进行拆分.它只要达到目标尺寸就会裂开.在 基 ...

最新文章

  1. Pycharm那些隐藏的实用小技巧,太强了
  2. mysql数据库21_Mysql5.7.21安装文档
  3. php移动代码,复制移动文件 - PHP
  4. mysql试题百度云_BATJ大厂600多道技术面试题及答案解析
  5. crawler_爬虫开发的曲线图
  6. 如何画出漂亮的气象(实时流量)图
  7. 员工辞职的十大原因!
  8. java包名和类名可以一样吗_Java入门第三课:Java基本语法
  9. css设置字体颜色、文本对齐方式、首行缩进、文本装饰、列表样式、鼠标样式、禁止文本域拖拽、轮廓线、块级元素对齐方式、文字溢出设置
  10. HDU - 6333 Harvest of Apples
  11. Windows 平台sqlalchemy 连接oracle数据库
  12. 函数调用图工具: Understand(支持Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M)
  13. 怎么更改文件类型/后缀?
  14. 使用NLTK实现stemming
  15. WITH TIES语句(SQL)
  16. Java点集_java-二维点集的包装
  17. 分析师意外下调评级为中性,苹果财报能否改变科技股走向?
  18. 网易2016研发工程师编程题--完全解析
  19. 2023届嵌入式笔面经一位双非本科生的秋招日记
  20. 为什么推荐使用hooks,它有什么好处?

热门文章

  1. 数据分析--01股票分析
  2. 汉字转拼音,可识别多音字,可返回首字母,大小写等
  3. 2022 IOTE国际物联网展-唯创知音语音芯片供应商-诚邀您来观展
  4. 屏蔽Android系统的WIFI功能 关闭Android系统的实体按键
  5. java读取mysql数据库配置文件_java读取properties文件的方法
  6. mysql查询 正则表达式_Mysql正则表达式查询
  7. 表达式必须包含指向对象的指针类型
  8. 让python飞:形象理解python 列表、元组、字典、集合、运算符
  9. 电脑丢失dll文件一键修复需要什么软件?快速修复dll文件的方法
  10. 开学带什么去学校?开学必备物品清单