目录
- faster-rcnn.pytorch-1.0指南(一)——序言
- faster-rcnn.pytorch-1.0指南(二)——平台搭建和模型训练
- faster-rcnn.pytorch-1.0指南(三)——制作PASCAL VOC2007数据集
- faster-rcnn.pytorch-1.0指南(四)——训练自己的数据集
数据集解析
在利用诸如Faster R-CNN等深度学习网络进行目标检测的时候一定需要训练自己的数据集。在制作为VOC2007格式的数据集之前,来看看这个数据集到底是什么样的:
参照tf-faster-rcnn指南(二)——平台搭建
VOC2007数据集包含有5个文件夹,其中:
1、Annotations文件夹
该文件下存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片。
2、JPEGImages文件夹
该文件夹下存放的是数据集图片,包括训练和测试图片。
3、ImageSets文件夹
该文件夹下存放了三个文件,分别是Layout、Main、Segmentation。
4、SegmentationClass文件和SegmentationObject文件。
这两个文件都是与图像分割相关,跟本文无关,暂且不管。
VOC数据集制作
一、创建文件夹
制作自己的VOC2007格式数据集其实不需要上述那么多内容,我们只要做三个部分即可:Annotations文件夹、JPEGImages文件夹、ImageSets文件夹下的Main和Layout文件。
二、JPEGImages
图片数据的格式需要统一。将自己的数据集中所有的图片存放的这一文件夹下。
三、Annotations
将自己数据集所有图片一一对应xml格式的标签文件放于这一文件夹下。
1、对数据集图片打标签
具体操作查看博客:https://blog.csdn.net/qq_34108714/article/details/89316097
2、标签内容
<annotation>
<folder>VOC2007</folder>
<filename>100001.jpg</filename> //文件名
<path>/tf_faster_rcnn/data/VOCdevkit2007/VOC2007/JPEGImages/100001.jpg</path>
<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>
3、修改xml文件参数(自己打的标签有些内容与标准数据集不同,特别是文件路径)
import os
import os.path
import xml.dom.minidom
# path="../xml/"
path_xml = '/home/Annotations/'
path_img='/home/JPEGImage/'
files = os.listdir(path_xml) # 得到文件夹下所有文件名称
modify_folder = "Annotations"
modify_database = "labproject"
for xmlFile in files: # 遍历文件夹
if not os.path.isdir(xmlFile): # 判断是否是文件夹,不是文件夹才打开
print(xmlFile)
xmlFile
filepath = os.path.join(path_xml, xmlFile)
# 最核心的部分,路径拼接,输入的是具体路径
dom = xml.dom.minidom.parse(os.path.join(path_xml, xmlFile))
root = dom.documentElement
# 修改path
oldpath = root.getElementsByTagName('path_xm')
# print(oldpath[0].firstChild.data)
newpath = path_img + xmlFile[0:6] + ".jpg"
oldpath[0].firstChild.data = newpath
# 修改folder
oldfolder = root.getElementsByTagName('folder')
oldfolder[0].firstChild.data = modify_folder
#修改database
olddatabase = root.getElementsByTagName('database')
olddatabase[0].firstChild.data = modify_database
#修改 filename
oldfilename = root.getElementsByTagName('filename')
oldfilename[0].firstChild.data = xmlFile[0:6] + ".jpg"
with open(os.path.join(path, xmlFile), 'w') as fh:
dom.writexml(fh)
pass
三、ImageSets
接下来为制作ImageSets文件夹下Main和Layout文件夹中的4个文件(test.txt、train.txt、trainval.txt、val.txt)
首先说明一下这四个文件到底是干什么用的:
test.txt:测试集
train.txt:训练集
val.txt:验证集
trainval.txt:训练和验证集
在原始VOC2007数据集中,trainval大约占整个数据集的50%,test大约为整个数据集的50%;train大约是trainval的50%,val大约为trainval的50%。所以我们可参考以下代码来生成这4个txt文件:
import os
import random
trainval_percent = 0.5
train_percent = 0.5
xmlfilepath = '/home/VOC2007/Annotations'
txtsavepath = '/home/VOC2007/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(txtsavepath+'/trainval.txt', 'w')
ftest = open(txtsavepath+'/test.txt', 'w')
ftrain = open(txtsavepath+'/train.txt', 'w')
fval = open(txtsavepath+'/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()
ftest .close()
代码中的路径一定要写正确。
运行完之后会在Main文件夹下生成对应的4个文件(test.txt、train.txt、trainval.txt、val.txt),随后将这4个文件复制到Layout文件夹中即可。