Ubuntu 16.04下Caffe-SSD的应用(七)——制作自己的VOC2007数据集
前言
1.前面的博文大概讲了官方的VOC2007的内容结构与各个目录的作用,接下来要讲的是如何制作自己的VOC2007数据,并用于训练。
2.制作VOC2007数据集的前准备是必须有包含要训练的样本的图像,和LabelImg,LabelImg是用来标注数据用的。
一、创建文件目录
1.创建VOC2007目录,在VOC2007目录下再创建三个空目录,分别是Annotations、ImageSets、JPEGImages,此时VOC2007目录下只有三个空的目录。
2.在ImageSets目录创建一个Main的目录。
3.把所有要标注的图像全部放进行JPEGImages目录下。
4.对JPEGImages下的图像进行重命名。
用python对整个文件下的图像以递增的方式进行命名,以下是python代码,路径改成自己的路径,在终端运行就可以了。
在home目录新建一个python脚本:
vim rename.py
输入以下代码,把路径改成自己的路径
import os
def rename():
path="/home/matt/data/VOC2007/JPEGImages/"
ex = 0
filelist = os.listdir(path)
count = 1
for file in filelist:
Olddir = os.path.join(path,file)
if os.path.isdir(Olddir):
continue
filename = os.path.splitext(file)[0]
filetype = ".jpg"
p = str(count).zfill(5)
Newdir = os.path.join(path,str(ex)+p+filetype)
os.rename(Olddir,Newdir)
count += 1
rename()
保存,退出,在终端运行:
sudo python ./rename.py
完成之后,文件名字如下图:
二、使用LabelImag标注数据
1.打开LabelImag标注工具,导入JPEGImages下的所有图像。
在LabelImg目录下,用终端运行
./labelImg.py
打开LabelImg工具,选择打开目录,选择VOC2007/JPEGImages/。
LabelImg把所有图像数据都读入进来
2.选择保存xml文件的路径,这里要选择VOC2007目录下的Annotations文件夹,选择要标注成的数据数据格式,这里选VOC。
3.开始标注数据。
打开一张图像,创始区块,然后用鼠标把要训练的物体框选进去,框选完成之后会跳出一个标示框,输入物体的名字,如果在整个图像场景下比较难识别到该物体,则选择有难度的,点OK。
然后保存
在VOC2007/Annotations目录下会有一个与该文件名字相同的xml文件
打开文件可以看到里面的内容
<annotation>
<folder>JPEGImages</folder>
<filename>000001.jpg</filename>
<path>/home/matt/data/VOC2007/JPEGImages/000001.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>500</width>
<height>500</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>firearm</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>156</xmin>
<ymin>183</ymin>
<xmax>494</xmax>
<ymax>309</ymax>
</bndbox>
</object>
</annotation>
关于这个文件的内容说明,请看之前关于官方数据说明的那部分,这里就不重新再说明了。
然后点下一个图像,继续以上的操作直到所有的图像都标示完成。
三、生成相关的txt文件
1.把所有的图像都标注完成之后,在main目录下使用python脚本生成存放训练与测试信息的相关txt文件,路径改成自己的路径。
import os
import random
xmlfilepath=r'/home/matt/data/VOC2007/Annotations/'
saveBasePath=r"/home/matt/data/"
trainval_percent=0.8
train_percent=0.8
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)
print("train and val size",tv)
print("traub suze",tr)
ftrainval = open(os.path.join(saveBasePath,'VOC2007/ImageSets/Main/trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath,'VOC2007/ImageSets/Main/test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath,'VOC2007/ImageSets/Main/train.txt'), 'w')
fval = open(os.path.join(saveBasePath,'VOC2007/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()
ftest .close()
2.运行上面的python脚本,在main目录下生成四个txt文件
结语
1.以上的操作完成之后,就得到了VOC2007格式的数据集,接下来要做的事是把数据集转换成lmdb数据格式,步骤就跟处理之前处理VOC2007数据一样了。
2.我使用的图像数据是我同学收集和整理的,所以我就不上传上来了,如果有需要的话,可以加这个群(487350510)。