一.VOC2007格式数据集制作
1.数据集简介
解压VOC2007数据集后可以看到VOC2007文件夹下有以下5个文件夹:
Annotations文件夹
该文件下存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片。
JPEGImages文件夹
改文件夹下存放的是数据集图片,包括训练和测试图片。
ImageSets文件夹
该文件夹下存放了三个文件,分别是Layout、Main、Segmentation。在这里我们只用存放图像数据的Main文件,其他两个暂且不管。
SegmentationClass文件和SegmentationObject文件。
这两个文件都是与图像分割相关。
2.开始制作
制作自己的VOC2007格式数据集其实不需要上述那么多内容,我们只要做三个部分即可:Annotations文件夹、JPEGImages文件夹、ImageSets文件夹下的Main文件。
***第一步:***我们参照原始VOC2007数据集的文件层次创建上述四个文件夹,也就是创建一个VOCdevkit文件夹,下面再创建Annotations、JPEGImages、ImageSets三个文件夹,最后在ImageSets文件夹下再创建一个Main文件夹。
创建好所有文件夹后,我们将自己的数据集图片都放到JPEGImages文件夹下(使用的是高分辨率遥感影像数据集,NWPH)。按照习惯,我们将图片的名字修改为000001.jpg这种格式的(参照原始数据集图片命名规则),统一命名方法网络上有很多,使用以下的代码,将原始数据集图片重命名:
import os
#以下换成图片所在的路径
path = "F:\caffe\py-faster-rcnn-master\data\VOCdevkit\VOC2007\JPEGImages"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=0
for file in filelist:
print(file)
for file in filelist: #遍历所有文件
Olddir=os.path.join(path,file) #原来的文件路径
if os.path.isdir(Olddir): #如果是文件夹则跳过
continue
filename=os.path.splitext(file)[0] #文件名
filetype=os.path.splitext(file)[1] #文件扩展名
Newdir=os.path.join(path,str(count).zfill(6)+filetype) #用字符串函数zfill 以0补全所需位数
os.rename(Olddir,Newdir)#重命名
count+=1
另外强调两点:第一点是图片的格式,图片需是JPEG或者JPG格式,其他格式需要转换一下。第二点是图片的长宽比,图片长宽比不能太大或太小,这个参考原始VOC2007数据集图片即可。
第二步:我们来制作Annotations文件夹下所需要存放的xml文件。这里我们需要借助大神带给我们的福利了LabelImg工具
1)下载LabelImg
使用git命令
git clone https://github.com/tzutalin/labelImg
下载后是自动在home目录下解压好的,文件名为LabelImg
2)安装
$ sudo apt-get install pyqt4-dev-tools # 安装PyQt4
$ sudo pip install lxml # 安装lxml,如果报错,可以试试下面语句
$ sudo apt-get install python-lxml
然后打开终端,进入LabelImg目录后使用make编译
cd LabelImg
make all
完成
3)使用
在labelImg目录下使用终端执行
python labelImg.py
第三步:我们来制作ImageSets文件夹下Main文件夹中的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 = 'Annotations'
txtsavepath = '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()
注意:上述代码中涉及到的路径要写全,另外各个数据集所占比例根据实际数据集的大小调整比例。
至此,我们自己的VOC2007格式数据集就全部制作完成了。
二.VOC数据集转换为lmdb格式
1.首先看到caffe-SSD/data目录下,其中有我们新建的VOCdevkit文件夹还有一个VOC0712文件夹:
进入VOC0712文件夹内,可以看到:
create_data.sh, create_list.sh, labelmap_voc.prototxt三个文件
create_list.sh: 用于生成训练集,测试集的文件路径txt文件和一个测试集目录名和图片大小的txt
create_data.sh: 用于生成lmdb格式的训练数据集和测试集
labelmap_voc.prototxt: 里头是标签的信息
将这三个文件复制到自己新建的VOCdevkit/VOC2007文件夹内:复制后VOC2007文件夹内文件如下
然后要准备修改复制过来的这三个文件
首先修改create_list.sh(改成自己的目录就行)
总共需要改三处。
然后改create_data.sh(改成自己的目录就行)
总共需要修改五处。
最后修改labelmap_voc.prototxt文件:
除了第一个背景标签部分不要改,其他改成自己的标签就行,多的删掉,少了添加进去就行
最后,再在caffe-ssd/examples文件夹内新建一个VOC2007文件夹就行(空的):新建后examples目录内文件如下:
2. 要开始生成lmdb的最后步骤了
cd caffe
./data/VOCdevkit/VOC2007/create_list.sh
结果图
运行完后,会在自己建的VOCdevkit/VOC2007目录内生成trainval.txt, test.txt, test_name_size.txt
sudo ./data/VOCdevkit/VOC2007/create_data.sh
结果图
运行完后,会在会在自己建的VOCdevkit/VOC2007目录内生成lmdb文件夹
三.数据集转化出现的错误
1.
解决方法
将caffe-ssd的路径加到creat_annoset中,添加代码
import sys
sys.path.insert(0, ‘/home/chengzhe/download/caffe-SSD/python’)
sys.path.append("/home/chengzhe/download/caffe-SSD/python")
将caffe-SSD的路径加入到.bashrc
source ~/.bashrc
2.
出错原因
/ImageSets/Main/下的训练文件 test.txt,trainval.txt(我在windows下用程序生成的)的分行符是windows格式的换行(0d0a)(\r\n),而create_list.sh则按unix格式换行(0a)(\n)来处理的,导致生成的临时文件(caffe/data/VOC0712/test.txt,val.txt)的换行都是错的。
解决方法:在ubuntu环境下再把Main下的几个文件内容复制一遍到新文件里
原文链接:https://blog.youkuaiyun.com/Bankeey/article/details/76595884
3.运行create_data.sh出错
主要原因是:标签有误,修改标签后问题解决
四.用caffe-ssd训练标签后的数据
1.运行命令之前,先对数据进行修改,python examples/ssd/ssd_pascal.py
2.进行训练
cd ~/caffe
python example/ssd/ssd_pascal.py
3.遇到的错误
1)
出现此错误,在ssd-pascal.py中添加两行
import sys
sys.path.insert(0,"/home/chengzhe/download/caffe-SSD/python")
2)
解决方法:删除assert len > 0
3)
解决方法:将xrange变成range
4)
解决方法:
将pad = int((3 + (dilation - 1) * 2) - 1) / 2 改为pad = int((3 + (dilation - 1) * 2) - 1) // 2.
注意在 model_libs.py 中有三处
链接:https://blog.youkuaiyun.com/dihe874981/article/details/86622906
4)
提醒xrange的错误,将其改成range
提醒print的错误,在print后加上括号
5)运行后的结果
6)运行单张相片
python examples/ssd/score_ssd_pascal.py