ubuntu14.04+cuda8.0+caffe下使用自己的样本数据训练faster-rcnn

使用自己的数据来训练主要可以分成三步:制作训练样本数据集,修改训练参数,选定方法进行训练。训练faster-rcnn 网络相当于在已训练(一般是在imagenet上训练得到)的网络上进行微调,根据自己设备的不同配置,可以选择不同的网络进行微调。本文为了方便,基于ZF网络进行微调,本文默认已经在ubuntu14.04中配置好gpu版的caffe。

一、制作训练样本数据集

注意,这里是“数据集(dataset)”而不是“数据(datas)”,所以,你单纯制作好了样本依然是不能使用的。所以,最简单粗暴的办法就是保留VOC2007数据集的框架,替换其中的样本。
1、下载VOC2007并解压
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
注:大多数人可能在终端中运行命令进行下载的速度很慢,所以建议直接在win7中用迅雷下
将VOCdevkit改名为VOCdevkit2007,然后放到data文件夹下方便后续的使用。

2、生成样本(图片及对应的xml文件)

样本的选择和生成是一个很重要的部分,生成样本主要就是选择样本图片和生成相应的xml文件,其中xml文件的格式可以参考原来/home/nbj2017/py-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations中任意一个文件的格式。

可以使用matlab来求解GT(ground trues)框,求解的思路是:先对每一幅图,在ps中做出与其对应的二值图像,然后通过检测感兴区域的边界得到GT。

注意:得到的样本图片及相应的xml文件的命名方式尽量也要跟VOC2007中的一致,这个也可以在matlab中用一个小程序实现,本文不再赘述。

3、生成训练,测试,验证数据集(即ImageSet\Main中的各个txt文件)

生成ImageSet\Main里包括以下四个txt文件,分别是:trainval.txt(训练和验证集总和)、train.txt(训练集)、val.txt(验证集)、test.txt(测试集),trainval集占整个数据集的70%,train集占trainval集的70%,val集占trainval集的30%,test集占整个数据集的30%。

除了这四个文件之外,对每一个类别(例car),都有car_ trainval.txt,car_train.txt ,car_val.txt ,car_ test.txt他们中含有的样本数量都一样(即行数一样),不同的地方是在没一行的后面都用1或-1表示此幅图中是否含有car类的目标。
本文主要应用与而分类问题,所以这里没有各个类别的txt文件。

4、替换VOC2007中的相应文件夹

将上述三个文件夹分别替换VOC2007数据集中的Annotations、ImageSets\Main和JPEGImages

二、修改训练参数

1、修改prototxt配置文件

这些配置文件都在models下的pascal_voc下。里面有三种网络结构:ZF、VGG16、VGG_CNN_M_1024,本文选择的是ZF。每个网络结构中都有三个文件夹,分别是faster_rcnn_end2end、faster_rcnn_alt_opt、faster_rcnn。使用近似联合训练,比交替优化快1.5倍,但是准确率相近,所以推荐使用这种方法。更改faster_rcnn_end2end文件夹下的train.prototxt和test.prototxt,train中需要更改的地方有三处:

第一处是input-data层,将原先的21改成:你的实际类别数+1(背景),我目标检测一共有1类,所以加上背景这一类,一共2类。
第二处是cls_score层
第三处是bbox_pred,这里需将原来的84改成(你的类别数+1)2,即(1+1)4=8
test.prototxt中没有input-data层,所以只需按照train中的修改cls_score层以及bbox_pred层即可

2. 修改lib/datasets/pascal_voc.py,将类别改成自己的类别

这里的类别以及你之前的类别名称最好是全部小写,假如是大写的话,则会报keyError的错误,这时只需要在pascal_voc。py中第218行的lower去掉即可

三、训练网络

cd py-faster-rcnn
./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascal_voc

注意:如果基于ZF网络使用Approximate joint training(end-to-end)方式进行训练,迭代的次数不是在py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt的solve文件中修改,也不是在/home/nbj2017/py-faster-rcnn/tools/train_faster_rcnn_alt_opt.py中修改,而是在/home/nbj2017/py-faster-rcnn/experiments/scripts/faster_rcnn_end2end.sh中修改ITERS=70000这一项,因为end2end方式不同于Alternative training(alt-opt)方式

遇到的错误及处理方法:

1、 AttributeError: ‘module’ object has no attribute ‘text_format’
在文件./lib/fast_rcnn/train.py增加一行import google.protobuf.text_format 即可解决问题

2、Cannot copy param 0 weights from layer ‘cls_score’; shape mismatch.
Source param shape is 21 4096 (86016); target param shape is 3 4096
(12288). To learn this layer’s parameters from scratch rather than
copying from a saved net, rename the layer.

这种错误就是你所使用的prototxt文件与设置的类别数不匹配,最直接的方法就是去看/home/nbj2017/py-faster-rcnn/tools中的dome.py函数中调用的prototxt文件是否正确。

3、Traceback (most recent call last):
File “./tools/test_net.py”, line 90, in
test_net(net, imdb, max_per_image=args.max_per_image, vis=args.vis)
File “/home/nbj2017/py-faster-rcnn/tools/../lib/fast_rcnn/test.py”, line 295, in test_net
imdb.evaluate_detections(all_boxes, output_dir)
File “/home/nbj2017/py-faster-rcnn/tools/../lib/datasets/pascal_voc.py”, line 317, in evaluate_detections
self._do_python_eval(output_dir)
File “/home/nbj2017/py-faster-rcnn/tools/../lib/datasets/pascal_voc.py”, line 280, in _do_python_eval
use_07_metric=use_07_metric)
File “/home/nbj2017/py-faster-rcnn/tools/../lib/datasets/voc_eval.py”, line 148, in voc_eval
BB = BB[sorted_ind, :]
IndexError: too many indices for array

说明网络没有学到东西,没有训练成功。所以换大型网络(如VGG16),加大训练迭代次数。
本人在实验中也遇到了这个问题,最后换了VGG16网络,迭代次数80000成功解决了这个问题。关于具体的换网络的方法这里不用赘述,只是相应的改些参数,与ZF网络时无异。

4、TypeError: slice indices must be integers or None or have an index method

conda install -n root numpy=1.11.0
然后使用conda list 查看numpy版本是否正确

参考博文:

http://blog.csdn.net/qq_33202928/article/details/72526710
http://blog.csdn.net/CV_adventurer/article/details/72805852
http://blog.leanote.com/post/braveapple/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E8%87%AA%E5%B7%B1%E6%95%B0%E6%8D%AE%E9%9B%86%E8%AE%AD%E7%BB%83Faster-RCNN%E6%A8%A1%E5%9E%8B
http://blog.csdn.net/qq_26569761/article/details/52136845


版权为NBJ所有,请勿转载

你可能感兴趣的:(ubuntu,Network)