理论上数据集的格式名称等没有强制的要求,但是为了尽量少的修改代码,我们用PASCAL VOC 格式制作数据集,这样制作完之后替换原来数据集的相应文件就可以了。
VOC数据集下载之后解压后是下面的几个文件夹:
其中在图像物体识别上着重需要了解的是Annotations、ImageSets和JPEGImages,这三个文件夹
1、JPEGImages文件夹:该文件夹下存放着所有的训练集图片,格式都是.jpg需要注意的是命名格式,虽然对命名没有特别要求,但是最好按照官方的命名方法,如000001.jpg,000123.jpg。
图片的像素尺寸大小不一,但是横向图的尺寸大约在500*375左右,纵向图的尺寸大约在375*500左右,基本不会偏差 超 过 100。(在之后的训练中,第一步就是将这些图片都resize到300*300或是500*500,所有原始图片不能离这个标准过远。)。这些图像就是用来进行训练和测试验证的图像数据。
2、Annotations 文件夹:该文件夹下存放的是每一个图片的标注信息,文件都是.xml格式,文件名和图片名是一致的对于该xml的格式,可以参考一下示例:
<annotation> <folder>VOC2012</folder> <filename>2007_000392.jpg</filename> //文件名 <source> //图像来源(不重要) <database>The VOC2007 Database</database> <annotation>PASCAL VOC2007</annotation> <image>flickr</image> </source> <size> //图像尺寸(长宽以及通道数) <width>500</width> <height>332</height> <depth>3</depth> </size> <segmented>1</segmented> //是否用于分割(在图像物体识别中01无所谓) <object> //检测到的物体 <name>horse</name> //物体类别 <pose>Right</pose> //拍摄角度 <truncated>0</truncated> //是否被截断(0表示完整) <difficult>0</difficult> //目标是否难以识别(0表示容易识别) <bndbox> //bounding-box(包含左下角和右上角xy坐标) <xmin>100</xmin> <ymin>96</ymin> <xmax>355</xmax> <ymax>324</ymax> </bndbox> </object> <object> //检测到多个物体 <name>person</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>198</xmin> <ymin>58</ymin> <xmax>286</xmax> <ymax>197</ymax> </bndbox> </object> </annotation>注意:必须格式一致,在xml文件中最好没有类似<?xml version="1.0"?> 这样的头,我一开始制作的数据集包含这个头,训练一致报错,后来删除这个头之后训练正常。
这是一个基本的格式,其中的object标签保存的就是人脸的位置信息,对于一个图片里面有多个对象的话,在该xml中就有多个object。然后Annotations文件夹里面就是这样的一堆xml文件,其他没什么。
训练时报错:File "/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 108, in append_flipped_images assert (boxes[:, 2] >= boxes[:, 0]).all() AssertionError
需要注意:
检查自己数据发现,左上角坐标(x,y)可能为0,或标定区域溢出图片,而faster rcnn会对Xmin,Ymin,Xmax,Ymax进行减一操作,如果xmin或者ymin为0,减一后变为65535
3、ImageSets 文件夹:该文件夹下有四个文件夹其中Action下存放的是人的动作(例如running、jumping等等,这也是VOC challenge的一部分)
Layout下存放的是具有人体部位的数据(人的head、hand、feet等等,这也是VOC challenge的一部分)
Main下存放的是图像物体识别的数据,总共分为20类。
Segmentation下存放的是可用于分割的数据。
对物体识别来说用到的文件夹是Main文件夹,其他的文件夹不太重要(对于我目前的需求来说),这个文件夹中主要有四个.txt文件,分别是train.txt、test.txt、trainval.txt、val.txt
test.txt中保存的是测试所用的所有样本的名字,不过没有后缀(下同),一般测试的样本数量占总数据集的50%
train.txt中保存的是训练所用的样本名,样本数量通常占trainval的50%左右
val.txt中保存的是验证所用的样本名,数量占trainval的50%左右
trainval.txt中保存的是训练验证样本,是上面两个的总和,一般数量占总数据集的50%
jpg和xml文件制作完成后,生成这几个文件:
import os import random folderpath = "F:\\imagedata\\" trainval_percent = 0.66 train_percent = 0.5 xmlfilepath = 'F:\\imagedata\\Annotations' txtsavepath = 'F:\\imagedata\\ImageSets\\Main' total_xml = os.listdir(xmlfilepath) num = len(total_xml) list = range(num) tv = int(num*trainval_percent) tr = int(tv*train_percent) trainval = random.sample(list,tv) train = random.sample(trainval,tr) ftrainval = open(folderpath + 'ImageSets/Main/trainval.txt', 'w') ftest = open(folderpath + 'ImageSets/Main\\test.txt', 'w') ftrain = open(folderpath + 'ImageSets/Main\\train.txt', 'w') fval = open(folderpath + 'ImageSets/Main\\val.txt', 'w') for i in list: name = total_xml[i][:-4]+'\n' if i in trainval: ftrainval.write(name) if i in train: ftrain.write(name) else: fval.write(name) else: ftest.write(name) ftrainval.close() ftrain.close() fval.close()http://www.cnblogs.com/whlook/p/7220105.html ftest .close()
分享一个图片标记工具:亲测好用
https://github.com/tzutalin/labelImg