推荐先从这里学习从零开始制作自己的Pascal VOC数据集。


1 MSCOCO数据集简介

1.1 概要

现今最流行的公开数据集是啥?COCO,Common Objects in Context。现如今最先进的视觉检测模型都是在COCO上评测了。
相较于上一代的Pascal VOC,COCO拥有更多的图片–330K,更多的标注–1.5 million,更多的物体类别–80类,更复杂的场景,更多的小的物体,总之就是更大更复杂更具挑战性,也更具说服力。想了解更多,移步COCO官网

1.2 数据集格式

COCO一共有5种不同任务分类,分别是目标检测、关键点检测、语义分割、场景分割和图像描述。COCO数据集的标注文件以JSON格式保存,官方的注释文件有仨 captions_type.json instances_type.json person_keypoints_type.json,其中的type是 train/val/test+year,比如captions_train2017.json instances_train2017.json person_keypoints_train2017.json,其中目标检测的注释放在instances_xxx.json里。

公共格式

{//公共格式,三个json文件开头都是他们"info" : info,  //数据集的信息,"images" : [image],//数据集中所有图片的信息,详细见下方"annotations" : [annotation], //数据集中注释的信息"licenses" : [license],//这个是证书信息,跑模型时不用理会
}info{"year" : int, //数据集年份 2014,2015,2017。"version" : str, //剩下信息不必理会"description" : str, "contributor" : str, "url" : str, "date_created" : datetime,
}image{//对每一张图片"id" : int, //可唯一标识图片的  图片id"width" : int,//图片的 宽、高,,,,没有提到图片的depth"height" : int,"file_name" : str, //文件名称 ,"xxx.jpg""license" : int, "flickr_url" : str,"coco_url" : str, "date_captured" : datetime,
}license{"id" : int, "name" : str,"url" : str,
}

特有格式-目标检测类

//注意:COCO中的每个annotation是独立的,有自己的id。比如说目标检测,一张图片中的每个object是单独存在的,都有自己的一个annotation实例。
annotation{"id" : int, //object id"image_id" : int,//这个object在哪个图片中"category_id" : int, //object的类别"segmentation" : RLE or [polygon],//分割用, "area" : float,"bbox" : [x,y,width,height],//划重点,bbox,以左上角为原点,是实际坐标!!"iscrowd" : 0 or 1,
}
categories[//这个是所有类别的一个总的集合,python.list,比如COCO一共有80类,那它的大小就是80。其中的每一个类别又有如下的结构{"id" : int,//类别id"name" : str, //类名"supercategory" : str,//父 类名,通常不用管}
]

2 动手制作

仅以目标检测为例!!!
自己制作时只需要image,annotation,categories就足够了。

2.1 数据集框架准备

找个位置,新建文件夹coco,进入coco,新建两个文件夹images,annotations,最终形成的目录结构应该是

  • coco/

    • images/
    • annotations/

2.1 制作xml格式的annotation文件

参考【笔记】从零开始制作自己的Pascal VOC数据集的2.1小节。

2.2 xml2coco

把刚才用到的图片直接拷贝到 coco/images
运行如下脚本:
注意:脚本文件来自脚本地址,只做了一点修改使得结果更符合强迫症患者

# -*- coding: utf-8 -*-
# @Time    : 2019/7/8 16:10
# @Author  : lazerliu
# @File    : voc2coco.py
# just for object detection
import xml.etree.ElementTree as ET
import os
import jsoncoco = dict()
coco['images'] = []
coco['type'] = 'instances'
coco['annotations'] = []
coco['categories'] = []category_set = dict()
image_set = set()category_item_id = 0
image_id = 0
annotation_id = 0def addCatItem(name):global category_item_idcategory_item = dict()category_item['supercategory'] = 'none'category_item_id += 1category_item['id'] = category_item_idcategory_item['name'] = namecoco['categories'].append(category_item)category_set[name] = category_item_idreturn category_item_iddef addImgItem(file_name, size):global image_idif file_name is None:raise Exception('Could not find filename tag in xml file.')if size['width'] is None:raise Exception('Could not find width tag in xml file.')if size['height'] is None:raise Exception('Could not find height tag in xml file.')img_id = "%04d" % image_idimage_id += 1image_item = dict()image_item['id'] = int(img_id)# image_item['id'] = image_idimage_item['file_name'] = file_nameimage_item['width'] = size['width']image_item['height'] = size['height']coco['images'].append(image_item)image_set.add(file_name)return image_iddef addAnnoItem(object_name, image_id, category_id, bbox):global annotation_idannotation_item = dict()annotation_item['segmentation'] = []seg = []# bbox[] is x,y,w,h# left_topseg.append(bbox[0])seg.append(bbox[1])# left_bottomseg.append(bbox[0])seg.append(bbox[1] + bbox[3])# right_bottomseg.append(bbox[0] + bbox[2])seg.append(bbox[1] + bbox[3])# right_topseg.append(bbox[0] + bbox[2])seg.append(bbox[1])annotation_item['segmentation'].append(seg)annotation_item['area'] = bbox[2] * bbox[3]annotation_item['iscrowd'] = 0annotation_item['ignore'] = 0annotation_item['image_id'] = image_idannotation_item['bbox'] = bboxannotation_item['category_id'] = category_idannotation_id += 1annotation_item['id'] = annotation_idcoco['annotations'].append(annotation_item)def parseXmlFiles(xml_path):for f in os.listdir(xml_path):if not f.endswith('.xml'):continuebndbox = dict()size = dict()current_image_id = Nonecurrent_category_id = Nonefile_name = Nonesize['width'] = Nonesize['height'] = Nonesize['depth'] = Nonexml_file = os.path.join(xml_path, f)# print(xml_file)tree = ET.parse(xml_file)root = tree.getroot()if root.tag != 'annotation':raise Exception('pascal voc xml root element should be annotation, rather than {}'.format(root.tag))# elem is <folder>, <filename>, <size>, <object>for elem in root:current_parent = elem.tagcurrent_sub = Noneobject_name = Noneif elem.tag == 'folder':continueif elem.tag == 'filename':file_name = elem.textif file_name in category_set:raise Exception('file_name duplicated')# add img item only after parse <size> tagelif current_image_id is None and file_name is not None and size['width'] is not None:if file_name not in image_set:current_image_id = addImgItem(file_name, size)# print('add image with {} and {}'.format(file_name, size))else:raise Exception('duplicated image: {}'.format(file_name))# subelem is <width>, <height>, <depth>, <name>, <bndbox>for subelem in elem:bndbox['xmin'] = Nonebndbox['xmax'] = Nonebndbox['ymin'] = Nonebndbox['ymax'] = Nonecurrent_sub = subelem.tagif current_parent == 'object' and subelem.tag == 'name':object_name = subelem.textif object_name not in category_set:current_category_id = addCatItem(object_name)else:current_category_id = category_set[object_name]elif current_parent == 'size':if size[subelem.tag] is not None:raise Exception('xml structure broken at size tag.')size[subelem.tag] = int(subelem.text)# option is <xmin>, <ymin>, <xmax>, <ymax>, when subelem is <bndbox>for option in subelem:if current_sub == 'bndbox':if bndbox[option.tag] is not None:raise Exception('xml structure corrupted at bndbox tag.')bndbox[option.tag] = int(option.text)# only after parse the <object> tagif bndbox['xmin'] is not None:if object_name is None:raise Exception('xml structure broken at bndbox tag')if current_image_id is None:raise Exception('xml structure broken at bndbox tag')if current_category_id is None:raise Exception('xml structure broken at bndbox tag')bbox = []# xbbox.append(bndbox['xmin'])# ybbox.append(bndbox['ymin'])# wbbox.append(bndbox['xmax'] - bndbox['xmin'])# hbbox.append(bndbox['ymax'] - bndbox['ymin'])# print('add annotation with {},{},{},{}'.format(object_name, current_image_id, current_category_id,#                                                bbox))addAnnoItem(object_name, current_image_id, current_category_id, bbox)if __name__ == '__main__':#修改这里的两个地址,一个是xml文件的父目录;一个是生成的json文件的绝对路径xml_path = 'xxx/VOCdevkit/VOC2007/Annotations/'json_file = 'xxx/coco/annotations/instances.json'parseXmlFiles(xml_path)json.dump(coco, open(json_file, 'w'))

至此,自制的coco数据集完成。

3 测试

测试制作的coco数据集能否被cocoapi识别。

3.1 安装cocoapi

git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make

3.2 实测

# -*- coding: utf-8 -*-
# @Time    : 2019/7/8 14:32
# @Author  : lazerliu
# @File    : CocoForm_Learn.py
import sys
import jsonsys.path.append("/xxx/cocoapi/PythonAPI")#把cocoapi的绝对路径加上
from pycocotools.coco import COCOann_file = "xxx/coco/annotations/instances.json"# json文件的绝对路径
coco = COCO(annotation_file=ann_file)print("coco\nimages.size [%05d]\tannotations.size [%05d]\t category.size [%05d]\ndone!"%(len(coco.imgs),len(coco.anns),len(coco.cats)))

【完】

【笔记】制作自己的MSCOCO数据集(VOC2COCO)相关推荐

  1. TensorFlow 制作自己的TFRecord数据集

    TensorFlow 制作自己的TFRecord数据集 准备图片数据 网上下载了2类吉他和房子的图片, 全部 resize成64*64大小 如下图, 保存项目下: 现在利用这2 类 共108张图片制作 ...

  2. MSCOCO数据集分析

    MSCOCO数据集是多模态学习领域重要的数据集,网址:http://cocodataset.org/#home COCO is a large image dataset designed for o ...

  3. python数据挖掘学习笔记】十九.鸢尾花数据集可视化、线性回归、决策树花样分析

    #2018-04-05 16:57:26 April Thursday the 14 week, the 095 day SZ SSMR python数据挖掘学习笔记]十九.鸢尾花数据集可视化.线性回 ...

  4. MSCOCO数据集转VOC数据集训练目标检测模型

    MSCOCO数据集转VOC数据集训练目标检测模型 Images 2014 Train images [83K/13GB] 2014 Val images [41K/6GB] 2014 Test ima ...

  5. 制作自己的ctpn数据集

    制作自己的ctpn数据集 1.利用label-image标注自己的数据集,保存为.txt文件,结果如下: 上图第一列 0:标签 后面的小数是label-image标注的坐标框位置(归一化后的结果) 2 ...

  6. 超分辨率重建数据集制作:生成低分辨率数据集

    目录 背景 代码 结果 其他 注意: 超分主流有两种BI.BD. 1.实际上公认的是使用MATLAB进行插值. 2.Bicubic(双三次插值)方式.(BI方式) 3.高斯模糊+双三次插值是另一种常用 ...

  7. 从零开始制作人脸表情的数据集

    一.背景 人脸表情识别网上已有很多教程,大多基于fer2013数据集展开的.现在的问题就在于fer2013数据集的数量太少,表情的区分度不够明显,大部分基于此数据集的模型,其识别精度仅有70%左右. ...

  8. 利用matlab将自己的数据制作为标准VOC数据集格式

    在使用各种深度网络的时候,需要根据自己的需求,自己的数据fine-tuning自己的模型,首要的一步就是讲自己的数据制作成标准VOC数据集,本文记录自己利用matlab制作标准VOC数据集的方法. 1 ...

  9. tensorflow2视力表E字符(学习笔记)--制作自己的数据集

    网上收集E字符图片,完成数据扩充 下图是我收集的图片 声明: import tensorflow as tf import numpy as np import matplotlib.pyplot a ...

最新文章

  1. 2021年大数据Hive(十二):Hive综合案例!!!
  2. protobuf和socket通信简单实例
  3. 重磅《美国机器智能国家战略》
  4. 基于 esp32 + lvgl8.0 的小电视
  5. 关于CentOS-6的默认带的mysql启动和安装问题
  6. 平台的本质——保险公司互联网平台建设系列
  7. Paradise(天堂)勒索病毒解密工具
  8. iconfont在IE下不兼容问题
  9. java取当前北京时间_用Java取指定时区的时间 北京时间,纽约时间,班加罗尔时间...
  10. hdu3594-仙人掌图的判断tarjan找环-Cactus
  11. 软测(三)测试用例基本介绍
  12. 关于Boost电感的问题
  13. Windows操作系统的日志分析
  14. 【FLink】Assigned key must not be null
  15. 软件测试中的杀虫剂效应与金字塔模型
  16. iOS学习笔记-091.彩票06——我的彩票
  17. 拜日式精准引导词_拜日式引导词
  18. xcode 下载中断问题
  19. 剥茧抽丝做 UI 动效,其实很简单
  20. JavaWeb版 仿必胜客在线订餐系统

热门文章

  1. 如何使得中文不被 json_encode 不编码成 unicode PHP 浏览:9722 2014年08月14日 使用 php 自带的 json_encode 函数对数据进行编码时,中文都会变成
  2. 客户关系管理系统的系统需求分析与数据库设计
  3. 逃避日志记录攻击过程
  4. 法语初级学习笔记-02-动词变位
  5. 国内图书分类号、国际图书分类号、DOI查询
  6. 小学计算机教案四年级上册,四年级上册小学信息技术教学计划
  7. Centos7 yum转为阿里源
  8. Web GIS在人口统计学上的10种运用
  9. 查看CPU核数、内存使用情况【一文读懂】
  10. linux安装系统内存检测,Ubuntu下安装内存检测工具Valgrind