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

来源:互联网 发布:电脑桌面工作计划软件 编辑:程序博客网 时间:2024/05/18 01:57
    使用自己的数据来训练主要可以分成三步:制作训练样本数据集,修改训练参数,选定方法进行训练。训练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=8test.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所有,请勿转载

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 v领线衣 购物领淘金币 领峰贵金属 黑平台 京东领优惠券 帮领淘金币 17173领号 打底衫v领 免费领京东券 免费领q币软件 领势公馆二手房 魔兽领主 狩魔领主 战争领主 领主 领主崛起 巨树领主 绿洲领主 异界大领主 异世大领主 魔界大领主 天降领主 末世领主 召唤大领主 异世领主 领主威武 领主之 全球领主 诸天领主空间 异界破落小领主 异界之魔兽领主 绿洲中的领主 三国领主时代 异界魔兽领主 网游之地球领主 天灾领主加尔鲁什 网游之三国超级领主 网游三国之第一领主 中国领事网 领事 领动灰色 领动2018款