目前手里的数据集都是xml的标注格式,无法直接在detectron2中作对比试验。
detectron2官方文档给出了自定义数据集的注册方案,需先将其转换为coco的.json格式。
爬了很多坑,找了很多代码,终于找到了能用的。
开整!!
代码如下:

import os
import argparse
import json
import xml.etree.ElementTree as ET
from typing import Dict, List
from tqdm import tqdm
import redef get_label2id(labels_path: str) -> Dict[str, int]:"""id is 1 start"""with open(labels_path, 'r') as f:labels_str = f.read().split()labels_ids = list(range(1, len(labels_str)+1))return dict(zip(labels_str, labels_ids))def get_annpaths(ann_dir_path: str = None,ann_ids_path: str = None,ext: str = '',annpaths_list_path: str = None) -> List[str]:# If use annotation paths listif annpaths_list_path is not None:with open(annpaths_list_path, 'r') as f:ann_paths = f.read().split()return ann_paths# If use annotaion ids listext_with_dot = '.' + ext if ext != '' else ''with open(ann_ids_path, 'r') as f:ann_ids = f.read().split()ann_paths = [os.path.join(ann_dir_path, aid+ext_with_dot) for aid in ann_ids]return ann_pathsdef get_image_info(annotation_root, extract_num_from_imgid=True):path = annotation_root.findtext('path')if path is None:filename = annotation_root.findtext('filename')else:filename = os.path.basename(path)img_name = os.path.basename(filename)img_id = os.path.splitext(img_name)[0]if extract_num_from_imgid and isinstance(img_id, str):img_id = int(re.findall(r'\d+', img_id)[0])size = annotation_root.find('size')width = int(size.findtext('width'))height = int(size.findtext('height'))image_info = {'file_name': filename,'height': height,'width': width,'id': img_id}return image_infodef get_coco_annotation_from_obj(obj, label2id):label = obj.findtext('name')assert label in label2id, f"Error: {label} is not in label2id !"category_id = label2id[label]bndbox = obj.find('bndbox')xmin = int(bndbox.findtext('xmin')) - 1ymin = int(bndbox.findtext('ymin')) - 1xmax = int(bndbox.findtext('xmax'))ymax = int(bndbox.findtext('ymax'))assert xmax > xmin and ymax > ymin, f"Box size error !: (xmin, ymin, xmax, ymax): {xmin, ymin, xmax, ymax}"o_width = xmax - xmino_height = ymax - yminann = {'area': o_width * o_height,'iscrowd': 0,'bbox': [xmin, ymin, o_width, o_height],'category_id': category_id,'ignore': 0,'segmentation': []  # This script is not for segmentation}return anndef convert_xmls_to_cocojson(annotation_paths: List[str],label2id: Dict[str, int],output_jsonpath: str,extract_num_from_imgid: bool = True):output_json_dict = {"images": [],"type": "instances","annotations": [],"categories": []}bnd_id = 1  # START_BOUNDING_BOX_ID, TODO input as args ?print('Start converting !')for a_path in tqdm(annotation_paths):# Read annotation xmlann_tree = ET.parse(a_path)ann_root = ann_tree.getroot()img_info = get_image_info(annotation_root=ann_root,extract_num_from_imgid=extract_num_from_imgid)img_id = img_info['id']output_json_dict['images'].append(img_info)for obj in ann_root.findall('object'):ann = get_coco_annotation_from_obj(obj=obj, label2id=label2id)ann.update({'image_id': img_id, 'id': bnd_id})output_json_dict['annotations'].append(ann)bnd_id = bnd_id + 1for label, label_id in label2id.items():category_info = {'supercategory': 'none', 'id': label_id, 'name': label}output_json_dict['categories'].append(category_info)with open(output_jsonpath, 'w') as f:output_json = json.dumps(output_json_dict)f.write(output_json)def main():parser = argparse.ArgumentParser(description='This script support converting voc format xmls to coco format json')parser.add_argument('--ann_dir', type=str, default=None,help='path to annotation files directory. It is not need when use --ann_paths_list')parser.add_argument('--ann_ids', type=str, default=None,help='path to annotation files ids list. It is not need when use --ann_paths_list')parser.add_argument('--ann_paths_list', type=str, default=None,help='path of annotation paths list. It is not need when use --ann_dir and --ann_ids')parser.add_argument('--labels', type=str, default=None,help='path to label list.')parser.add_argument('--output', type=str, default='output.json', help='path to output json file')parser.add_argument('--ext', type=str, default='', help='additional extension of annotation file')args = parser.parse_args()label2id = get_label2id(labels_path=args.labels)ann_paths = get_annpaths(ann_dir_path=args.ann_dir,ann_ids_path=args.ann_ids,ext=args.ext,annpaths_list_path=args.ann_paths_list)convert_xmls_to_cocojson(annotation_paths=ann_paths,label2id=label2id,output_jsonpath=args.output,extract_num_from_imgid=True)if __name__ == '__main__':main()

将以上代码存储并命名为voc2coco.py

打开终端,运行以下指令

 python voc2coco.py \--ann_dir sample/Annotations \      #xml文件的储存路径--ann_ids sample/gun_detection/gun_hypo_test.txt \       #要转换文件的名字,只有文件名不包括拓展名--labels sample/labels.txt \    #要转换的数据的类别,注意顺序--output sample/outputs/gun_hypo_test.json \  #转换成功后存储的路径和文件名--ext xml

(日常搬砖)voc(xml)格式的标注转换为coco(json)格式相关推荐

  1. labelme json转换为coco json 格式 包含area面积

    reference 提供了转换代码,需要改写部分 https://github.com/fengzhongyouxia/TensorExpand/tree/master/TensorExpand/Ob ...

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

    voc数据集格式转换为coco格式+修改xml格式文件中部分内容 voc数据集格式→coco数据集格式 修改xml格式文件中部分内容 voc数据集格式→coco数据集格式 下面这份代码只需修改文件所在 ...

  3. labelImg的VOC格式转化为labelme的json格式

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.安装labelme 二.VOC转化为JSON的代码 1.代码: 2.用labelme查看转化完成的文件 前言    ...

  4. sql解析json格式字段、sql关联json格式字段,mysql解析json、sql解析json字符串

    sql解析json格式字段.sql关联json格式字段,mysql解析json.sql解析json字符串 sql解析字符串 sql关联json中的某个字段 sql解析字符串 表名user_login ...

  5. php读取本地xlsx格式文件的数据并按json格式返回

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 目的:php读取并操作本地xlsx格式的文件: 完整示例代码: 代码讲解:前端发起post网络请求,php接收 ...

  6. php使用 js格式解析,php 无限级数据JSON格式及JS解析_PHP教程

    Flash需要JSON格式的数据,于是,就有了如下代码:(PHP实现,C#类似,JSON库自己去下吧~~) 复制代码 代码如下: //–查询用户下线信息,返回JSON,用于flash if(!empt ...

  7. php+json对象格式,PHP 创建对象来输出 JSON 格式

    PHP 想要输出 JSON [{0 -> xxx, north -> ooo}],但是没有对象(PHP: Objects),想要直接指定值,再使用 json_encode() 产生 JSO ...

  8. labelme的 json格式转化成自己的json格式

    labelme的json格式: {"version": "4.5.6","flags": {},"shapes": [{ ...

  9. python json格式转换_Python实现把json格式转换成文本或sql文件

    python如何将json格式的数据快速的转化成指定格式的数据呢?或者转换成sql文件? 下面的例子是将json格式的数据准换成以#_#分割的文本数据,也可用于生成sql文件. [root@bogon ...

  10. 调用python脚本并传递参数json格式_使用 Python 处理 JSON 格式的数据

    如果你不希望从头开始创造一种数据格式来存放数据,JSON 是一个很好的选择.如果你对 Python 有所了解,就更加事半功倍了.下面就来介绍一下如何使用 Python 处理 JSON 数据. JSON ...

最新文章

  1. 请输入课程编号C语言,C语言 学生选课系统 程序
  2. python牛顿法求立方根_【华为机试】求解立方根(牛顿迭代法)
  3. 第一次玩,试试手(标题)
  4. 2014 java面试题_2014 java面试题 (答案)
  5. jQuery 的一个自动向上翻页的效果
  6. go kegg_对miRNA进行go和kegg等功能数据库数据库注释
  7. 使用 Windows 7 VHD启动计算机
  8. VMWare 下 CentOS 设置静态 IP 地址
  9. Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to 以及Spring事务失效的原因和解决方案
  10. 【C语言】贪吃蛇游戏的实现(一)
  11. 生鲜配送如何让“订单管理”变得简单?
  12. 永磁同步电机自抗扰无位置传感器控制仿真,同时实现自抗扰和基于eso扩张状态观测器的无位置控制仿真
  13. QGraphicsItem设置绘图区域和鼠标响应以及碰撞检测区域,并实现碰撞检测
  14. 详解MapReduce实现数据去重与倒排索引应用场景案例
  15. Pycharm安装FLASK出现错误,无法安装
  16. 《Dead Cells》的随机地图生成
  17. 王者荣耀qq区服务器位置,王者荣耀:qq区单排现状,射手可能是最难的一个位置,为什么?...
  18. 浅谈智慧校园能源监控系统的设计
  19. Java实现转账业务
  20. opencv 图像金字塔(python)

热门文章

  1. WebGL多模型光照综合实例
  2. 简单理解下内存的几大区域
  3. ADO.NET的主要对象
  4. Java获取字符串信息
  5. iBATIS In Action:iBATIS的安装和配置
  6. oxite “传入的路由无效”解决方案
  7. 计算某个目录下所有文件的MD5值
  8. Spring的三种注入方式
  9. C 线性表的链式存储实现及插入、删除等操作示例
  10. #openstack centos6 centos7 kvm镜像制作