VOC2012目标检测数据集格式转化为COCO目标检测数据集格式

你只需要传入一个VOC数据集根路径可以直接运行,简直不要太方便好吧

需要材料:

  • VOC2012原始数据集
  • 一个pycharm项目文件夹(任意)

达到效果:

  • 自动生成当前项目下的 data/coco 文件夹

  • VOC2012数据集标注格式转为标准的COCO2017数据集格式

  • 图片按照训练集和验证集划分好

voc2012目标检测数据集格式

主要关注框起来的三个文件夹:

COCO2017数据集标注格式

annotation里面就是标注,而train2017和val2017是放的图片

转换代码如下:

  • 文件复制到项目里面任何一个地方都能运行

运行代码:
python demo.py --voc_root={YOUR VOC} # 这里的 {YOUR VOC}就是你自己的voc路径

import os
import json
import xml.etree.ElementTree as ET
import argparse
import shutildef transform_voc2coco(args):voc_root = args.voc_root# 获取工程的根绝对路径project_root = os.path.realpath(os.curdir)while True:if ".idea" in os.listdir(project_root):breakelse:project_root = os.path.join(project_root, "..")# 构建COCO完整目录coco_root = os.path.join(project_root, "data/coco")coco_train = os.path.join(coco_root, "train2017")coco_val = os.path.join(coco_root, "val2017")coco_anno = os.path.join(coco_root, "annotations")coco_train_anno = os.path.join(coco_anno, "instances_train2017.json")coco_val_anno = os.path.join(coco_anno, "instances_val2017.json")if not os.path.exists(coco_root):os.makedirs(coco_root)os.mkdir(coco_train)os.mkdir(coco_val)os.mkdir(coco_anno)coco_train_num = len(os.listdir(coco_train))coco_val_num = len(os.listdir(coco_val))print(f"train_2017 number: {coco_train_num}")print(f"val_2017 number: {coco_val_num}")# voc数据集目录voc_anno_dir = os.path.join(voc_root, "Annotations")voc_images_dir = os.path.join(voc_root, "JPEGImages")voc_train_txt = os.path.join(voc_root, "ImageSets/Main/train.txt")voc_val_txt = os.path.join(voc_root, "ImageSets/Main/val.txt")overwrite_images = True# 复制voc图片到cocoif overwrite_images:# 复制训练集图片with open(voc_train_txt, "r") as f:lines = f.readlines()for line in lines:image_name = line.strip() + ".jpg"image_path = os.path.join(voc_images_dir, image_name)shutil.copy(image_path, os.path.join(coco_train, image_name))# 复制验证集图片with open(voc_val_txt, "r") as f:lines = f.readlines()for line in lines:image_name = line.strip() + ".jpg"image_path = os.path.join(voc_images_dir, image_name)shutil.copy(image_path, os.path.join(coco_val, image_name))def _extract_anno(fp, mode: str = "train"):txt_file = voc_train_txt if mode == "train" else voc_val_txt# 预定义VOC检测的20个类别以及超类supercategorys = ["vehicles", "household", "animals", "person"]vehicles = ["car", "bus", "bicycle", "motorbike", "aeroplane", "boat", "train"]household = ["chair", "sofa", "diningtable", "tvmonitor", "bottle", "pottedplant"]animals = ["cat", "dog", "cow", "horse", "sheep", "bird"]person = ["person"]classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable","dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]# 预构建coco格式的json文件json_file = {"info": [], "license": [], "images": [], "annotations": [],"categories": [{"id": i, "name": class_,"supercategory": ""} for i, class_ in enumerate(classes)]}for i, class_ in enumerate(classes):if class_ in vehicles:json_file["categories"][i]["supercategory"] = supercategorys[0]elif class_ in household:json_file["categories"][i]["supercategory"] = supercategorys[1]elif class_ in animals:json_file["categories"][i]["supercategory"] = supercategorys[2]elif class_ in person:json_file["categories"][i]["supercategory"] = supercategorys[3]else:raise "unsupported class"# 写入json文件with open(txt_file, "r") as f_:lines = f_.readlines()for line in lines:image_xml = line.strip() + ".xml"image_xml_path = os.path.join(voc_anno_dir, image_xml)xml_obj = ET.parse(image_xml_path)root = xml_obj.getroot()img_dir = {"file_name": "", "width": 0, "height": 0, "objects": []}i = 0for eles in root:if eles.tag == "filename":img_dir["file_name"] = eles.textelif eles.tag == "size":for ele in eles:img_dir["width"] = int(ele.text) if ele.tag == "width" else int(img_dir["width"])img_dir["height"] = int(ele.text) if ele.tag == "height" else int(img_dir["height"])elif eles.tag == "object":obj_dir = {"name": "", "bndbox": [], "image_id": int(img_dir["file_name"].split(".")[0]),"id": i}i = i + 1for ele in eles:obj_dir["name"] = ele.text if ele.tag == "name" else obj_dir["name"]if ele.tag == "bndbox":for pos in ele:if pos.tag == "xmin":xmin = int(pos.text)elif pos.tag == "xmax":xmax = int(pos.text)elif pos.tag == "ymin":ymin = int(pos.text)elif pos.tag == "ymax":ymax = int(pos.text)else:raise "unsupported pose"obj_dir["bndbox"] = [xmin, ymin, xmax-xmin, ymax-ymin]img_dir["objects"].append(obj_dir)json_file["annotations"].append({"id": obj_dir["id"],"image_id": obj_dir["image_id"],"category_id": classes.index(obj_dir["name"]),"segmentation": [],"area": float(obj_dir["bndbox"][2]*obj_dir["bndbox"][3]),"bbox": obj_dir["bndbox"],"iscrowd": 0})else:continuejson_file["images"].append({"file_name": img_dir["file_name"],"height": img_dir["height"],"width": img_dir["width"],"id": int(img_dir["file_name"].split(".")[0])})json.dump(json_file, fp)# 生成coco的annotation标注文件override_anno = True# 有一个文件不存在或者需要覆盖掉之前的标注if not os.path.exists(coco_train_anno) or not os.path.exists(coco_val_anno) or override_anno:with open(coco_train_anno, "w") as f:_extract_anno(f, "train")with open(coco_val_anno, "w") as f:_extract_anno(f, "val")print("-" * 30 + "finish" + "-" * 30)if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--voc_root', type=str, default="/project/datasets/VOC2012")args = parser.parse_args()transform_voc2coco(args)

PASCAL VOC目标检测数据集格式转化为COCO目标检测数据集格式相关推荐

  1. 目标检测,将voc格式转化为coco格式详细过程

    在目标检测方法研究中,数据集的格式至关重要,为了减小模型的训练时长,需要现在小数据集进行模型研究,从而需要将VOC数据集转化为coco格式.下面一步一步来看: 1. 下载VOC数据集 Pascal V ...

  2. Dataset之Pascal:Pascal竞赛及其Pascal VOC(VOC 2012、VOC 2007) 数据集的简介、下载、使用方法详细攻略

    Dataset之Pascal VOC:Pascal VOC(VOC 2012.VOC 2007) 数据集的简介.下载.使用方法详细攻略 目录 Pascal 竞赛 1.PASCAL VOC竞赛任务 2. ...

  3. PASCAL VOC

    参考网页:http://www.360doc.com/content/13/0517/10/1054746_286033689.shtml  PASCAL VOC(pattern analysis,s ...

  4. COCO KeyPoints关键点数据集准备

    COCO KeyPoints关键点数据集准备 概述 网上搜了一圈,coco关键点数据集准备的内容比较少,这里写一篇完成的标注流程到数据集准备的文章,以备后忘 标注工具 coco官方标注工具: coco ...

  5. 玩转肺癌目标检测数据集Lung-PET-CT-Dx ——④转换成PASCAL VOC格式数据集

    文章目录 关于PASCAL VOC数据集 目录结构 ①创建VOC数据集的几个相关目录 XML文件的形式 ②读取dcm文件与xml文件的配对关系 ③创建VOC格式数据集 ④创建训练.验证集 本文所用代码 ...

  6. 目标检测数据集PASCAL VOC简介

    简介 PASCAL VOC挑战赛 (The PASCAL Visual Object Classes )是一个世界级的计算机视觉挑战赛, PASCAL全称:Pattern Analysis, Stat ...

  7. .val()数据乱码_【目标检测数据集】PASCAL VOC制作

    [VOC2007+2012] 数据集地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/ PASCAL VOC为图像识别和分类提供了一 ...

  8. voc2007数据集_【目标检测数据集】PASCAL VOC制作

    [VOC2007+2012] 数据集地址:https://pjreddie.com/projects/pascal-voc-dataset-mirror/ PASCAL VOC为图像识别和分类提供了一 ...

  9. 目标检测实战篇1——数据集介绍(PASCAL VOC,MS COCO)

    前言   前面我们讲过了目标检测的YOLO系列算法,SSD算法.从这个博文开始,我们要真实开启实战篇章.在正式介绍实战篇之前,我们需要先知道两个数据集:PASCAL VOC和COCO数据集. 一.PA ...

最新文章

  1. 控件的呈现方法(Rendering)的内核
  2. 阿里宣布Atlas正式开源:带你重返App开发的田园时代
  3. python3.6.4安装教程-Python3.6.4官方版
  4. Maven(五)使用Nexus搭建Maven私服
  5. 分类算法之决策树介绍
  6. Unity3D下Linux平台播放RTSP或RTMP流
  7. 高通cpu排行_安卓手机芯片排行:麒麟990 5G仅排第三,980还输给了765G?
  8. 3D-BoNet:比3D点云实例分割算法快10倍!代码已开源
  9. P2962 [USACO09NOV]灯Lights 对抗搜索
  10. Storm 多语言支持
  11. layui参考文档地址
  12. mysql varchar varbinary_mysql varbinary vs varchar
  13. 几款优秀的Windows密码抓取工具
  14. 2019-12-17-整理的遥感影像(也包含一些GIS和地学数据)下载地址
  15. Matlab 让多图排版更美观
  16. 进销存设计中的库存设计
  17. orcad DRC检查,元件C2都没连接,为什麼不报错
  18. 编程基础---java Servlet 学习
  19. 南京航空航天大学计算机组成原理,2017年南京航空航天大学计算机科学与技术学院829计算机专业基础之计算机组成原理考研题库...
  20. vCenter Server CA证书下载

热门文章

  1. 机器学习算法的要点(附 Python 和 R 代码)
  2. 数据库SQL实战11_获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date=‘9999-01-01‘, 结果第一列给出员工的emp_no, 第二列给出其manager
  3. 花一周时间整理了3.5W字的全栈自动化测试面试题(答案+学习路线)!为了找到好工作,拼了!
  4. 微软预览word_如何在Microsoft Word中更改语言
  5. java匿名内部类,什么是匿名内部类,如何定义匿名内部类,如何使用匿名内部类?
  6. kali下经典的ddos攻击软件_Kali-DDoS工具集合
  7. 基于无线lora通信实现远程采集输出0~10v,0~20ma模拟量信号以及开关量信号
  8. Java面试宝典!java除法保留小数点后两位
  9. 『关于摄影的前后期』
  10. 2023程序员今年的一些现状