一、前言
本篇主要记录Faster rcnn 采用end to end 训练方式做训练
二、制作自己的VOC2007格式的数据集
1、首先创建好路径 py-faster-rcnn/data/VOCdevkit2007/VOC2007
2、在VOC2007下分别创建文件夹 Annotations 、JPEGImages、ImageSets/Main
3、把图片按照 00000×.jpeg 的形式命名,并存放在 JPEGImages 文件夹
4、需要对图片打标注,下载安装好 labelImg 打标注软件,安装好后,执行sudo python labelImg.py 启动,修改data/predefined_classes.txt ,可以更改类别,之后对所有图标打标注。打完标注生成的xml文件存放在 Annotations,xml 文件的名字和图片名字保持一致
5、制作ImageSets文件夹下Main文件夹中的4个文件(test.txt、train.txt、trainval.txt、val.txt)
首先说明一下这四个文件到底是干什么用的,总的数据集分为trainval和test,在trainval又划分成train和val
test.txt:测试集
train.txt:训练集
val.txt:验证集
trainval.txt:训练和验证集
在原始VOC2007数据集中,trainval大约占整个数据集的50%,test大约为整个数据集的50%;train大约是trainval的50%,val大约为trainval的50%。所以我们可参考以下代码(VOC2007 文件下 genImageSets.py)来生成这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()
运行该代码,在Main 文件夹下生成 这4个txt文件
三、采用VGG16 模型做训练
1、py-faster-rcnn/lib/datasets/pascal_voc.py 文件中的第30行, self._classes,改成自己的标签,背景和发票类
2、修改 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_end2end下两个文件:
train.prototxt 和 test.prototxt。
打开文件:test.prototxt
这里21 改自己数据集标签数+1
把这里的84(21×4)改为8(2×4)。同理把train.protptxt里的所有21换成2,所有84换成8。把下面路径的文件把所有21换成2,84改成 8:
训练前清空缓存文件夹:
data/cache/
data/VOCdevkit2007/annotations_cache/
删除 output 文件夹,该文件夹将生成训练得的权值文件
注意:prototxt中的其他内容就不用改了,train.prototxt和test.prototxt的层的名字必须一致,不然test.prototxt中某些层将无法使用训练得到的权值
四、预训练模型
为加快训练,可使用由imagenet数据集预训练得到的模型
下载地址:
链接: https://pan.baidu.com/s/1kUOD6hNE1DkBD0X07Wmf_g 提取码: iuyp
使用其中的 VGG16.v2.caffemodel
训练输入:
./tools/train_net.py --gpu 0 --solver models/pascal_voc/VGG16/faster_rcnn_end2end/solver.prototxt --weights data/imagenet_models/VGG16.v2.caffemodel --imdb voc_2007_trainval --iters 70000 --cfg experiments/cfgs/faster_rcnn_end2end.yml
训练结束,在文件夹 py-faster-rcnn/output/faster_rcnn_end2end/voc_2007_trainval/ 下生成训练得到的模型caffemodel文件,运行一下代码可进行测试, 测试文件微test.txt
./tools/test_net.py --gpu 0 --def models/pascal_voc/VGG16/faster_rcnn_end2end/test.prototxt --net /home/u2/py-faster-rcnn/output/faster_rcnn_end2end/voc_2007_trainval/vgg16_faster_rcnn_iter_70000.caffemodel --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml
四、demo:
1.把 output文件夹下生成的 model 拷贝到py-faster-rcnn/data/faster_rcnn_models 下
2.修改 demo.py 里的第28行的CLASS,下面的NETS。分别改为自己的标签和 步骤1. 中拷贝的训练好模型的名字。
3. 终端输入:
./tools/demo.py