由于最近任务的模型需要采用coco数据集格式,只能将现有数据的xml格式进行转换。查阅了网上很多xml转coco数据集的资料,由于每个人都数据集格式都不一样,发现其实很多细节都对不上,还是得自己重新写一个代码确保最后数据集格式的正确性。记录一下自己的工作。

此处反复研究了coco数据集的格式,主要参考以下两个帖子:

https://blog.csdn.net/weixin_44052271/article/details/120475779
https://blog.csdn.net/weixin_50727642/article/details/122892088

首先先创建一个用于储存数据的图片类似coco数据集的文件夹,包括了以下几个文件夹,我这里训练和验证集已经分好了,不用重新分,所以直接把图片复制粘贴到对应文件夹下就好了

然后再把所有图片和对应xml的名字都改成000000000001 这种形式,一开始没改,名字里面有字母,对应json文件里面的id就是一串字符,然后模型训练就报错了,所以经验就是改了最好。然后再统一一下图片格式都转化为jpg。

xml标注文件类似:

以下是进行转换完整代码

import json
from xml.dom.minidom import parse
import osdef open_xml(xml_path,id):#从xml获得filename,height,widthdomTree = parse(xml_path)# 获得根节点rootNode = domTree.documentElementfilename=rootNode.getElementsByTagName('filename')[0].childNodes[0].datasize=rootNode.getElementsByTagName('size')h=size[0].getElementsByTagName('height')[0].childNodes[0].dataw=size[0].getElementsByTagName('width')[0].childNodes[0].dataid=id  #id获取重复了,懒得删return filename,h,w,iddef images_json(filename,h,w,id):#每张图片生成一个image字典添加到dict_total={'images':[]中images={'file_name': '','height': 0,'width': 0,'id':0}images['file_name']=filenameimages['height']=int(h)images['width'] =int(w)images['id']=int(id)return imagesdef categories_json():categories=[{'supercategory': 'person', 'id': 1, 'name': 'mask'},{'supercategory': 'person', 'id': 2, 'name': 'nomask'}]return categoriesdef extract_xml(xml_path,id):#得到annotations里的对应信息id=idarea=[]box=[]name=[]domTree = parse(xml_path)# 获得根节点rootNode = domTree.documentElementobject = rootNode.getElementsByTagName('object')for i in range(len(object)):name_item=object[i].getElementsByTagName('name')[0].childNodes[0].dataname.append(name_item)box_xmin=object[i].getElementsByTagName('bndbox')[0].getElementsByTagName('xmin')[0].childNodes[0].databox_ymin=object[i].getElementsByTagName('bndbox')[0].getElementsByTagName('ymin')[0].childNodes[0].databox_xmax=object[i].getElementsByTagName('bndbox')[0].getElementsByTagName('xmax')[0].childNodes[0].databox_ymax=object[i].getElementsByTagName('bndbox')[0].getElementsByTagName('ymax')[0].childNodes[0].dataarea_item=(float(box_xmax)-float(box_xmin))*(float(box_ymax)-float(box_ymin))area.append(float(area_item))w=float(box_xmax)-float(box_xmin)h=float(box_ymax)-float(box_ymin)box_item=[float(box_xmin),float(box_ymin),w,h]box.append(box_item)return  area,id,box,name,len(object)def annotations_json(area,id,box,name,count):annotations={'segmentation': [[]],  #忽略'area': 240.000,   #面积需要计算'iscrowd': 0,    #忽略'image_id': 289343,   #就是id'bbox': [0., 0., 60., 40.],'category_id': 1,'id': 1768}  #bbbox序号annotations['area']=float(area)annotations['image_id'] = int(id)annotations['bbox'] = boxif name=='mask':annotations['category_id'] = 1else:annotations['category_id'] = 2annotations['id'] = countreturn annotationsurl=r"C:\Users\dogbark\Desktop\datasets\val\Annotations"
file = os.listdir(url)
dict_total={'images':[],'annotations':[],'categories':[]}#总的json字典for f in file:#这部分操作只生成了images字段real_url = os.path.join(url, f)id = os.path.splitext(f)_, h, w, id0 = open_xml(real_url, id[0])filename=id[0]+'.jpg'image = images_json(filename, h, w, id0)dict_total['images'].append(image)
print(len(dict_total['images'])) #检验生成字段数量是否完整#接下来是categories字段
categories=categories_json()
dict_total['categories']=categories#最后是annotations字段
count=0
for f in file:#这部分操作只生成了images字段real_url = os.path.join(url, f)id = os.path.splitext(f)area, id0, box, name,n= extract_xml(real_url, id[0])for j in range(n):count+=1annotations = annotations_json(area[j], id0, box[j], name[j], count)dict_total['annotations'].append(annotations)
print(count)with open(r"C:\\Users\dogbark\Desktop\datasets\\record.json", "w") as f:json.dump(dict_total, f) #写入json文件print("加载入文件完成...")

编程能力有待增强,有错的或者写的不简洁的地方勿怪。以上许多地方出现重复,主要因为是一个字段一个字段地生成,然后再在原本代码上添加新的字段生成的代码,还有一个比较悲惨的原因是以为队友能接手一下我的工作,每人完成一个字段生成的代码,结果发现他太慢了只能含泪自己一个人搞完,虽然工作不多,但是扣的细节不少还是很让人心烦。

【制作coco数据集】相关推荐

  1. 使用VIA(VCC)制作coco数据集

    使用VIA(VCC)制作coco数据集 VCC是一个在线的数据集标注工具VCC在线数据集标注地址 进入网址后,删除其中的两张的测试图片 删除测试图片后,点击Add Files添加自己的数据集图片 然后 ...

  2. 1 图片的重命名 2 对xml文件的图片来进行画框 3 制作coco数据集

    # -*- coding:utf8 -*-import osclass BatchRename():'''批量重命名文件夹中的图片文件'''def __init__(self):self.path = ...

  3. 制作coco数据集,并在mmdetection上实验

    一.dataset2coco 首先将标注好的json和img放在同一个文件夹中,取名为images. format.py 统一修改json中的img_path.将路径修改为统一格式.×××.jpg f ...

  4. 目标检测coco数据集点滴介绍

    目标检测coco数据集点滴介绍 COCO数据集介绍 MS COCO 是google 开源的大型数据集, 分为目标检测.分割.关键点检测三大任务, 数据集主要由图片和json 标签文件组成. coco数 ...

  5. 【caffe-Windows】关于LSTM的使用-coco数据集

    前言 建议大家使用Linux,因为Linux下的配置就没这么麻烦,各种make就行啦.Linux用户请绕道,因为此博客只针对Windows,可能比Linux麻烦很多倍. 在caffe-Windows新 ...

  6. coco 数据集_Tensorflow对COCO目标检测数据预处理

    COCO数据集是微软发布的一个大型图像数据集, 专为对象检测.分割.人体关键点检测.语义分割和字幕生成而设计.这个数据集还提供了Matlab, Python 和 Lua 的 API 接口. 该 API ...

  7. 制作TEC数据集的步骤

    数据集制作步骤: 第一步将元器件检测结果裁剪成独立的元器件图片 1.crop_roi_from_detect_result.py folder_path中存放存放主板和主板对应的元器件输出文件,这个脚 ...

  8. VOC和COCO数据集讲解

    相对其他计算机视觉任务,目标检测算法的数据格式更为复杂.为了对数据进行统一的处理,目标检测数据一般都会做成VOC或者COCO的格式. VOC和COCO都是既支持检测也支持分割的数据格式,本文主要分析P ...

  9. 纯小白通过服务器搭建yolov5环境训练coco数据集

    后知后觉的我,终于明白了之前师哥说的简简单单的几句话. 由于用的公司电脑,没有GPU,没有办法搭建yolo环境,故没法训练模型. 借助服务器,获取所需的GPU.通过vs code连接服务器,剩余操作其 ...

最新文章

  1. 如何正确实施人工智能
  2. MySQL性能优化步骤
  3. linux下使用cmake构建C/C++项目
  4. Zookeeper理解---ZAB协议
  5. Docker容器的简单操作及应用部署
  6. Redis高可用方案哨兵机制------ 配置文件sentinel.conf详解
  7. 3.6 SQL Server 内存
  8. 睡眠 应该用 a加权 c加权_?焦虑自测 ,看看你的焦虑程度到底有多深?是否影响睡眠?...
  9. win10 xampp mysql_Win10系统在本地安装XAMPP的方法
  10. Snake模型综合介绍
  11. 腾讯通rtx中心服务器,腾讯通(RTX)详细使用教程
  12. 如何成为优秀的驱动开发工程师
  13. 小程序 多线程Worker(类似h5的webWorker)
  14. 基于微信小程序的小说阅读系统(小程序+Nodejs)
  15. 苹果今年或无法推出M3芯片;​微软将推私有版ChatGPT:价格是常规版10倍;sudo和su用Rust重写|极客头条
  16. 关于睡眠唤醒实现开机功能
  17. 对于越野车来说 带大梁,前后硬桥!
  18. 七夕送女朋友什么礼物好?不会送礼的男生速看!
  19. 光纤通信系统根据传输距离不同的分类
  20. MyBatis入门系列(18) -MyBatis四大组件之ParameterHandler源码及流程解析

热门文章

  1. 东大毕业生与大数据架构师的对决(结尾附视频)
  2. vue-element-ui 中请求跨域问题解决方法
  3. 指令系统——指令格式(详解)
  4. 学习 java 开发前的准备之JDK配置篇
  5. 量子计算机可以计算葛立恒数,葛立恒数
  6. OSChina 周三乱弹 —— 写代码强迫症
  7. 面试官:说说kafka、activemq、rabbitmq、rocketmq都有什么优缺点和使用场景
  8. 如何查看iOS手机证书安装位置
  9. Windows Server 2016开通TCP端口方式
  10. kafka之ack机制