我们先来看看voc和coco数据集的目录结构:
以VOC2012数据集为例,下载下来有如下五个文件夹:
Annotations文件夹是存放图片对应的xml文件,比如“2007_000027.xml"存放的是图片2007_000027.jpg对应的信息,用记事本打开可以看到,这是xml格式的数据。
ImageSets文件夹里存放了官方为我们划分好的训练集和验证集的txt文件。我们主要使用“ImageSets/Main/"文件夹下的train.txt和val.txt文件,train.txt文件存放了官方划分的训练集的图片名称,val.txt文件存放了验证集图片的名称。
还有一个需要关注的文件夹就是JEPGImages,里面存放了对应图片名称的原始图片。剩下的两个文件夹我们就不需要特别关注了。
接下来我们来看看voc数据集的xml文件里面都有哪些信息。
可以看到一个xml文件包含如下信息:
- folder: 文件夹
- filename:文件名
- path:路径
- source:来源
- size:图片大小
- segmented:图像分割会用到,本文仅以目标检测(bounding box为例进行介绍)
- object:一个xml文件可以有多个object,每个object表示一个box,每个box有如下信息组成:
- name:改box框出来的object属于哪一类,例如Apple
- bndbox:给出左上角和右下角的坐标
- truncated:是否被截
- difficult:是否为检测困难物体
不同于VOC,一张图片对应一个xml文件,coco是直接将所有图片以及对应的box信息写在了一个json文件里。通常整个coco目录长这样:
一个标准的json文件包含如下信息:
(1)images字段列表元素的长度 = 划入训练集(或者测试集)的图片的数量;
(2)annotations字段列表元素的数量 = 训练集(或者测试集)中bounding box的数量;
(3)categories字段列表元素的数量 = 类别的数量
接下来我们看每个key对应的内容:
(1)info
(2)images
(3)licenses
(4)annotations
"bbox"里[x, y, width, height]x, y代表的是物体的左上角的x, y的坐标值。
"segmentation"里[x1, y1, x2, y2, x3, y3, x4, y4]是以左上角坐标为起始,顺时针依次选取的另外三个坐标点。及[左上x, 左上y, 右上x,右上y,右下x,右下y,左下x,左下y]。
(5)categories
GitHub开源项目地址
开始转换前,得先将要转化的所有.xml文件名保存在xml_list.txt列表中。如果是自己制作的voc数据集,在输入标签名的时候记得不要把类别名name打错了。
执行即可将xml转化为一个.json文件。
注意这里的image_id用的是图片名称去掉.jpg,所以图片名必须是数字,如果不是,先将所有图片和label名称改成数字,再转coco。
如果报错,原因是我们的坐标值是浮点数字符串,而int只能转化整型字符串,这时坐标值得先用float将浮点数字符串转成浮点数,再用int将浮点数转成整数。
如果是要将COCO格式的json文件转化为VOC格式的xml文件,将anno和xml_dir改成json文件路径和转化后的xml文件保存路径,执行下面代码即可完成转化。
比如从OpenImageV5下载下来的BIllboard数据集,目录如下:
每一副图像所对应的txt里面的内容对应目标的坐标信息。这里0后面四个值为用长宽归一化了的x1,x2,y1,y2。如下图所示,0表示只有billboard一个类别。
将 txt 文件转换为 Pascal VOC 的 XML 格式的代码如下:
至此,我们基本能够应对目标检测常用到的数据转化了,不管我们拿到的是什么数据集,VOC也好,COCO也罢,亦或是各种txt格式,我们都可以用上面的方法转成我们所需要的数据集。至于自己制作数据集,也很简单,篇幅有限,下一篇再总结了。。。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/3267.html