目标检测常用数据集及转换方式
# 前言
我们经常使用标注工具(如LabelImg、LabelMe等)生成的数据集或者一些开源数据集进行目标检测模型的训练,但是这些自定义数据集格式多样且不具有一致性,而目标检测的数据格式相比于其他任务又复杂很多,因此,为了兼容一些框架和源码,我们一般需要将自定义数据集转换为标准格式,本文将会主要相机讲解各种数据集格式及转换方式
# COCO
COCO 全称是 Common Objects in COntext,是微软团队提供的一个可以用来进行图像识别的数据集。MS COCO 数据集中的图像分为训练、验证和测试集。COCO 通过在 Flickr 上搜索80个对象类别和各种场景类型来收集图像,其使用了亚马逊的 Mechanical Turk(AMT)。
官网:COCO - Common Objects in Context (cocodataset.org) (opens new window)
# 标注格式
我们下载之后可以看到标注文件如下
COCO 通过大量使用 Amazon Mechanical Turk 来收集数据。COCO 数据集现在有3种标注类型:object instances(目标实例), object keypoints(目标上的关键点), 和image captions(看图说话),使用 JSON 文件存储。存储格式如下(具体配置请查看官网:COCO - Common Objects in Context (cocodataset.org) (opens new window))
{
"info": info,
"licenses": [license],
"images": [image],
"annotations": [annotation],
"categories": [category]
}
2
3
4
5
6
7
在 train.json 和 val.json 中,虽然内容很多,但是总体来说从开始到结尾按照顺序就是这5段,其中 info、licenses、images 这三个结构体/类型在不同 JSON 文件中类型相同,定义共享。
不共享的是 annotation 和 category 这两种结构体,他们在不同类型的 JSON 文件中是不一样的。
images 数组元素的数量等同于划入训练集(或者测试集)的图片的数量;
annotations 数组元素的数量等同于训练集(或者测试集)中bounding box的数量;
categories 数组元素的数量(Image Caption 没有此字段)
# 目录概述
-coco/
|-train2017/
|-1.jpg
|-2.jpg
|-val2017/
|-3.jpg
|-4.jpg
|-test2017/
|-5.jpg
|-6.jpg
|-annotations/
|-instances_train2017.json
|-instances_val2017.json
|-*.json
2
3
4
5
6
7
8
9
10
11
12
13
14
train2017 以及 val2017 这两个文件夹中存储的是训练集和验证集的图像,而 test2017 文件夹中存储的是测试集的信息,可以只是图像,也可以包含标注,一般是单独使用的。annotations 文件夹中的文件就是标注文件
# VOC
**VOC(Visual Object Classes)**数据集来源于 PASCAL VOC 挑战赛,开始于2005年,结束于2012年最后一届。VOC 并不是一个非常大型的目标检测数据集,但是在COCO诞生之前,它是非常主流的目标检测任务基准数据集,主要数据集为 VOC2007 和 VOC2012
官网:The PASCAL Visual Object Classes Homepage (ox.ac.uk) (opens new window)
# 标注格式
<annotation>
<folder>VOC</folder> # 图像所在文件夹
<filename>000032.jpg</filename> # 图像文件名
<source> # 图像源
<database>The VOC Database</database>
<annotation>PASCAL VOC</annotation>
<image>flickr</image>
</source>
<size> # 图像尺寸信息
<width>500</width> # 图像宽度
<height>281</height> # 图像高度
<depth>3</depth> # 图像通道数
</size>
<segmented>0</segmented> # 图像是否用于分割,0代表不适用,对目标检测而言没关系
<object> # 一个目标对象的信息
<name>aeroplane</name> # 目标的类别名
<pose>Frontal</pose> # 拍摄角度,若无一般为Unspecified
<truncated>0</truncated> # 是否被截断,0表示完整未截断
<difficult>0</difficult> # 是否难以识别,0表示不难识别
<bndbox> # 边界框信息
<xmin>104</xmin> # 左上角x
<ymin>78</ymin> # 左上角y
<xmax>375</xmax> # 右下角x
<ymax>183</ymax> # 右下角y
</bndbox>
</object>
# 下面是其他目标的信息,这里略掉
<object>
其他object信息,这里省略
</object>
</annotation>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 目录概述
-VOC/
|-JPEGImages/
|-1.jpg
|-2.jpg
|-Annotations/
|-1.xml
|-2.xml
|-ImageSets/
|-Layout/
|-*.txt
|-Main/
|-train.txt
|-val.txt
|-trainval.txt
|-test.txt
|-Segmentation/
|-*.txt
|-Action/
|-*.txt
|-SegmentationClass/
|-SegmentationObject/
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
其中对于目标检测任务而言,最常用的以及必须的文件夹包括:JPEGImages,Annotations,ImageSets/Main。
JPEGImages 里存放的是图像,而 Annotations 里存放的是 xml 标注文件
# YOLO
YOLO 数据集格式的出现主要是为了训练 YOLO 模型,其文件格式一般为 txt 文件,可以通过修改模型的配置文件进行数据加载,每行如下所示:
{目标类别} {目标中心点x坐标} {目标中心点y坐标} {目标框宽度w} {目标框高度h}
需要注意的是 YOLO 数据集的标注格式是将目标框的位置信息进行归一化处理(此处归一化指的是除以图片宽或高)
# 目录概述
-yolo/
|-images/
|-train/
|-1.jpg
|-2.jpg
|-test/
|-3.jpg
|-4.jpg
|-val/
|-5.jpg
|-6.jpg
|-labels/
|-train/
|-1.txt
|-2.txt
|-test/
|-3.txt
|-4.txt
|-val/
|-5.txt
|-6.txt
|-train.txt
|-test.txt
|-val.txt
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
除此之外还有 DOTA 数据集,使用 txt 格式标注文件,每一行格式是“x1,y1,x2,y2,x3,y3,x4,y4,类别,difficult”,由于DOTA数据集为旋转框标注,因此以四个点坐标为标注格式,但是这不是本文重点,因此这个不详细解释
# 格式转换
这里推荐一个 voc yolo coco 相互转换 的脚本仓库:DeepLearning/others/label_convert at master · KKKSQJ/DeepLearning (github.com) (opens new window)
# 参考文章
目标检测 | 常用数据集标注格式以及转换代码_以下哪些属于图像分类部分导入数据时_JUST LOVE SMILE的博客-CSDN博客 (opens new window)
常见目标检测数据集标注格式_在目标检测中,样本标签用json还是yaml存储?_yjyn1的博客-CSDN博客 (opens new window)
常见数据集格式+数据集标注_booze-J的博客-CSDN博客 (opens new window)