我们经常需要使用自己通过标注工具(如LabelImg、LabelMe等)生成的数据集或者一些开源数据集进行目标检测模型的训练,这些自定义数据集格式多样且不具有一致性,而目标检测的数据格式相比于其他任务又复杂很多,因此,为了兼容一些框架和源码,我们一般需要将自定义数据集转换为标准格式,这种标准格式指的一般是COCO格式和VOC格式,因为它们非常出名,有一些针对的解析库,转换为COCO格式和VOC格式的数据集可以很方便地读取并用于训练。开源数据集一般都会有格式转换的tool使用主流的标注工具自行标注的数据集也已经有很多成熟的开源转换代码了,本文主要来介绍VOC和COCO数据集的格式究竟是怎样的,我们应该如何组织数据集的目录结构来契合标准格式以方便转换。
VOC数据集格式
PASCAL VOC数据集来源于同名的竞赛,开始于2005年,结束于2012年最后一届。VOC并不是一个非常大型的目标检测数据集,但是在COCO诞生之前,它是非常主流的目标检测任务基准数据集,主要数据集为VOC2007和VOC2012,它们的格式是一样的,下面以VOC2007为例展开叙述。
首先看目录结构,根级目录下有5个目录,分别如下所示。
-
└─VOC2007├─JPEGImages│ ├─1.jpg│ ├─2.jpg│ └─3.jpg├─Annotations│ ├─1.xml│ ├─2.xml│ └─3.xml├─ImageSets│ ├─Layout│ │ ├─train.txt│ │ ├─trainva.txt│ │ ├─test.txt│ │ └─val.txt│ ├─Main│ │ ├─*_train.txt│ │ ├─*_trainva.txt│ │ ├─*_test.txt│ │ └─*_val.txt│ ├─Action│ │ ├─*_train.txt│ │ ├─*_trainva.txt│ │ ├─*_test.txt│ │ └─*_val.txt│ └─Segmentation│ ├─train.txt│ ├─trainva.txt│ ├─test.txt│ └─val.txt├─SegmentationClass└─SegmentationObject
其中JPEGImages
目录下放的是所有的图片,这里只是叫这个名字,可以是非JPG格式的图片,而Annotations
则存放的是和上述图片同名的所有XML格式的标注文件(所以xml标注和jpg图片一一对应),这个标注文件的具体解析后面会讲到。ImageSets
文件夹下的则是数据集划分的txt文件,Segmentation
存放的是分割用数据集的划分。
对这四个文件夹而言,它们下面加*号的表示按类别存在多个划分文件,但是对于通用目标检测而言则是只需要train.txt
等文件。这些文本文件每一行有一个图片编号,整个文件其实组成文件名列表,依此就能完成数据集的划分。
所以,对于通用目标检测任务(针对对象类别)而言,我们一般只需要关注Main文件夹下的四个总体划分的文件即可。 至于SegmentationClass
和SegmentationObject
两个文件夹包含JPEGImages
文件夹下图片一一对应的语义分割图和实力分割图,由于目标检测不使用,所以我这里就不介绍了。
最后,具体来看VOC数据集的标注格式,这里选取任意的一个xml文件打开,可以看到,最外层是annotation标签,其内部都是标注信息,包括该图所在文件夹、该图文件名、该图来源、图像尺寸等信息,其中会有多个object标签,每个object标签内为一个目标对象的信息,具体如下面的代码标注。
最后,具体来看VOC数据集的标注格式,这里选取任意的一个xml文件打开,可以看到,最外层是annotation标签,其内部都是标注信息,包括该图所在文件夹、该图文件名、该图来源、图像尺寸等信息,其中会有多个object标签,每个object标签内为一个目标对象的信息,具体如下面的代码标注。
<annotation><folder>VOC2012</folder> # 图像所在文件夹<filename>2007_000032.jpg</filename> # 图像文件名<source> # 图像源<database>The VOC2007 Database</database><annotation>PASCAL VOC2007</annotation><image>flickr</image></source><size> # 图像尺寸信息<width>500</width> # 图像宽度<height>281</height> # 图像高度<depth>3</depth> # 图像深度,也就是通道数</size><segmented>1</segmented> # 图像是否用于分割,对目标检测而言没关系<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>
所以,如果要制作xml标注的自定义VOC格式的数据集,只需要构建三个文件夹,分别是JPEGImages用于存放所有原始图像、Annotations存放所有的和原始图像名称一一对应的xml标注文件和ImageSets/Main,其中存放train.txt、val.txt和test.txt等用来进行数据集划分,这些txt文件可以手动划分好,也可以使用代码随机划分,需要注意的是txt文件内容一行为一个不加拓展名的文件名即可。构建VOC格式的数据集还是很简单的,因为LabelImg等工具生成的xml标注就是VOC格式需要的。