基于ubuntu16.04 + caffe+ python + ZF
新类别的制作基于VOC2007 VOC2012
一、VOC2007数据集的下载和解压(转发于https://blog.csdn.net/errors_in_life/article/details/70916583)
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar
将数据集放于data下 存放方式为 VOCdevkit2007/VOC2007
二、使用标注工具labelImg
1.下载标注工具
git clone https://github.com/tzutalin/labelImg
2.安装(在根目录下进行)
$ sudo apt-get install pyqt4-dev-tools
$ sudo pip install lxml
$ sudo apt-get install python-lxml
进入labelImg
make
3.使用labelImg进行标注
open dir 是打开所要标注图像的文件夹
ctrl +R 更改默认注释目标目录(xml文件保存地址)
修改文件可以改变快捷键的使用方式
a 上一张图片
d 下一张图片
w 创建一个矩形框
s 保存
使用快捷键可以避免在切换下一张的过程中,将xml文件转换为txt文件。
画出框后,可以直接输入标签的名称,也可以通过修改predefined_classes.txt文件中修改。
建议训练的标签使用小写字母,空格亲测没有问题。
三、训练前对所要训练的网络中的文件进行修改
1.对 py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt 中的文件、
py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_end2end 中的train.prototxt和test.prototxt文件进行修改
n为 所要训练的类别+1(背景)
① 开头data层的num_classes:n
② roi_data层的num_classes:n
③ cls_score层的num_output:n
④ bbox_preda层的num_output:4n
2.py-faster-rcnn/lib/datasets/pascal_voc.py修改训练集文件夹以及标签
self._data_path = os.path.join( self ._devkit_path, 'VOC'+self._year)
self._classes=( ' _background_ '
'bird' , 'tvmonitor' ...)
如果不是基于VOC2007做的数据集,只要替换VOC2007内的Annotations,ImageSets,JPEGImages即可
3.py-faster-rcnn/lib/datasets/imdb.py修改 append_flipped_images(self)函数
boxes[:, 0] = widths[i] - oldx2 - 1
boxes[:, 2] = widths[i] - oldx1 - 1
for i in xrange(len(boxes)):
if boxes[i][2]<boxes[i][0]
boxes[i][0]=0
4.需要删除的文件
①py-faster-rcnn根目录中的output文件夹
②py-faster-rcnn/data/cache中的文件
③py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件
5.学习率、迭代次数等的修改
学习率 py-faster-rcnn/mdoels/pascal_voc/ZF/faster_rcnn_alt_opt中的solve文件
迭代次数 py-faster-rcnn/mdoels/pascal_voc/ZF/faster_rcnn_alt_opt中的solve文件
py-faster-rcnn/tools/train_faster_rcnn_alt_opt.py
四 、训练并测试模型
1.进入py-faster-rcnn中
训练模型的格式为
./experiments/scripts/fater_rcnn_alt_opt.sh [GPU_ID][NET][dataset]
./experiments/scripts/fater_rcnn_alt_opt.sh 0 ZF pascal_voc
./experiments/scripts/fater_rcnn_end2end.sh 0 ZF pascal_voc
训练好的模型将在py-faster-rcnn/output/faster_rcnn_end2end/voc_2007_trainval下
如果ImageSet/Main下有test正负样本文件,将自动进行模型的测试,并输出map
2.测试模型
①在ImageSet/Main下创建test.txt文件,最好是训练集和验证集中没有的图片,并生成各个类别test的正负样本文件
②在data目录下创建~data/VOCdevkit2007/results/VOC2007/Main/
③执行命令行
time ./tools/test_net.py --gpu 0 --def models/pascal_voc/ZF/faster_rcnn_end2end/test.prototxt --net output/faster_rcnn_end2end/voc_2007_trainval/zf_faster_rcnn_iter_70000.caffemodel --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml
五、demo测试
1.将需要测试的图片放入data/demo中
2.将训练好的~output/faster_rcnn_end2end/voc_2007_trainval/zf_faster_rcnn_iter_7000.caffemodel
放入~data/faster_rcnn_models中
3.修改~tools/demo.py
①修改标签
CLASSES=( ' _background_ '
'bird' , 'tvmonitor' ...)
②修改网络模型
NETS = {'vgg16': ('VGG16',
'VGG16_faster_rcnn_final.caffemodel'),
'zf': ('ZF',
'ZF_faster_rcnn_final.caffemodel')}
③修改测试图片名称,根据data/demo中的图片名称进行修改
im_names = ['1559.jpg','1564.jpg']
④运行demo.py
./tools/demo.py --gpu 0 --net zf