Caffe实现Faster-RCNN:训练和测试出现的问题及解决措施

Python版

环境:Caffe,LINUX,GPU,CUDA

主要从环境编译、模型的训练和测试三个方面进行说明。

一、环境编译及demo的实现

1.编译caffe是出现的问题:

/usr/local/cuda/include/cudnn.h:803:27:note: declared here

make: ***[.build_release/src/caffe/solvers/adam_solver.o] Error 1

    问题出现的原因:随着cudnn的更新,原来fasr-rcnn的cu代码已经不再适用,需要将py-faster-rcnn中的cudnn代码进行更新。(caffe最新版本的下载:https://github.com/BVLC/caffe.git)

     解决办法:

       (1)将./include/caffe/util/cudnn.hpp换成最新版的caffe里的cudnn的实现,即相应的cudnn.hpp.

       (2)将./include/caffe/layers里的,所有以cudnn开头的文件,例如cudnn_conv_layer.hpp。   都替换成最新版的caffe里的相应的同名文件。

 (3)将./src/caffe/layer里的,所有以cudnn开头的文件,例如cudnn_lrn_layer.cu,cudnn_pooling_layer.cpp,cudnn_sigmoid_layer.cu。都替换成最新版的caffe里的相应的同名文件。


2.出现nvcc warning : The 'compute_20', 'sm_20', and'sm_21' architectures are deprecated, and may be removed in a future release(Use -Wno-deprecated-gpu-targets to suppress warning)

    问题出现的原因:编译GPU-caffe时会出现nvcc warning : The 'compute_20', 'sm_20', and'sm_21' architectures are deprecated, and may be removed in a future release(Use -Wno-deprecated-gpu-targets to suppress warning)类似的问题,这是由于现在已经弃用sm20、21,

     解决办法:所以在Makefile.config文件中找到CUDA_ARCH 将前面两行删除即可。

所有的环境已经编译成功(确保根据Faster-RCNN中的README的教程一步步执行),下面执行demo。

3.出现bash: ./tools/demo.py: Permission denied

问题出现的原因:权限问题
解决措施:

解决方案有两个,第一个就是赋予文件可执行性: chmod +x tools/demo.py (这种方式可以解决shell脚本的权限问题);

第二种方法就是使用这样的调用方式:ptyhon tools/demo.py(优先使用这种方法解决python脚本的权限问题)

问题解决:





所有问题已经解决,以下是使用不同的预训练模型来训练Faster-RCNN模型:

首先,分别使用alt_opt(交替优化)的方式训练Faster-RCNN模型,预训练的模型ZF、VGG_CNN_M_1024、VGG16;

其次使用大型网络VGG16,end2end(端对端)的方式训练Faster-RCNN模型。


二、Faster-RCNN模型的训练和测试

2.1 使用交替优化方式进行训练(alt_opt

(1)使用的预训练模型:ZF

    说明:在我的机子上使用README中的命令./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG16 pascal_voc会出现权限问题:./experiments/scripts/faster_rcnn_alt_opt.sh:Permission denied,解决方法:$ chmod u+x experiments/scripts/faster_rcnn_alt_opt.sh,依然会出现 ./experiments/scripts/faster_rcnn_alt_opt.sh:Permission denied问题   。

    因此,我尝试打开路径下的Shell脚本(./experiments/scripts/faster_rcnn_alt_opt.sh),在shell脚本里的最底下有如下的代码:

 time ./tools/train_faster_rcnn_alt_opt.py --gpu ${GPU_ID} \
  --net_name ${NET} \
  --weights data/imagenet_models/${NET}.v2.caffemodel \
  --imdb ${TRAIN_IMDB} \
  --cfg experiments/cfgs/faster_rcnn_alt_opt.yml \
  ${EXTRA_ARGS}

所以,我尝试使用上面的方式,进行模型的训练。

使用上面的方式进行训练,会有很多错误(脚本中交替迭代训练方法的迭代次数为80000,40000,80000,40000),整个训练过程持续4.5小时。最终训练的结果保存在:py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/ZF_faster_rcnn_final.caffemodel

注意1:训练时会在根目录下产生output文件夹

注意2:可以先尝试小的迭代次数,可以加快排除BUG,排除完所有的BUG之后再使用工程文件中的原始迭代次数,这样可以节省拍错的时间。

开始使用下面的命令进行训练Faster-RCNN

./tools/train_faster_rcnn_alt_opt.py --gpu0 --net_name ZF --weights data/imagenet_models/ZF.v2.caffemodel --imdbvoc_2007_trainval --cfg experiments/cfgs/faster_rcnn_alt_opt.yml

  出现问题:./tools/train_faster_rcnn_alt_opt.py  Permission denied,使用 chmod u+x  tools/train_faster_rcnn_alt_opt.py,再次运行

./tools/train_faster_rcnn_alt_opt.py --gpu0 --net_name ZF --weights data/imagenet_models/ZF.v2.caffemodel --imdbvoc_2007_trainval --cfg experiments/cfgs/faster_rcnn_alt_opt.yml

   

    出现问题:AttributeError: 'module' object has no attribute 'text_format'

  解决方法:在/home/xxx/py-faster-rcnn/lib/fast_rcnn/train.py的头文件导入部分加上 : import google.protobuf.text_format

   出现问题:TypeError: 'numpy.float64' object cannot beinterpreted as an index

      这里是因为numpy版本不兼容导致的问题,修改如下几个地方的code:

1)/home/xxx/py-faster-rcnn/lib/roi_data_layer/minibatch.py

将第26行fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)

改为:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)

2) /home/xxx/py-faster-rcnn/lib/datasets/ds_utils.py

将第12行:hashes = np.round(boxes * scale).dot(v)

改为:hashes = np.round(boxes * scale).dot(v).astype(np.int)

3) /home/xxx/py-faster-rcnn/lib/fast_rcnn/test.py

将第129行: hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v)

改为: hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v).np.int)

4)/home/xxx/py-faster-rcnn/lib/rpn/proposal_target_layer.py

将第60行:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)

改为:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)


出现问题: TypeError:slice indices must beintegers or None or have an __index__ method

修改1: /py-faster-rcnn/lib/rpn/proposal_target_layer.py,转到123行:

for ind in inds:

        cls = clss[ind]

        start = 4 * cls

        end = start + 4

        bbox_targets[ind, start:end] =bbox_target_data[ind, 1:]

        bbox_inside_weights[ind, start:end]= cfg.TRAIN.BBOX_INSIDE_WEIGHTS

    return bbox_targets, bbox_inside_weights

这里的ind,start,end都是 numpy.int 类型,这种类型的数据不能作为索引,所以必须对其进行强制类型转换,转化结果如下:

 for ind in inds:

        ind = int(ind)

        cls = clss[ind]

        start = int(4 * cls)

        end = int(start + 4)

        bbox_targets[ind, start:end]= bbox_target_data[ind, 1:]

        bbox_inside_weights[ind, start:end]= cfg.TRAIN.BBOX_INSIDE_WEIGHTS

return bbox_targets, bbox_inside_weights

 修改2:/py-faster-rcnn/lib/roi_data_layer下的minibatch.py文件转到172行,

for ind in inds:
cls = clss[ind]
start = 4 * cls
end = start + 4
bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS
return bbox_targets, bbox_inside_weights
改为:
for ind in inds:
ind = int(ind)
cls = clss[ind]
start = int(4 * cos)
end = int(start + 4)
bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS
return bbox_targets, bbox_inside_weights

以上内容是笔者在训练自己的datasets时候出现的一些问题,大部分还是因为Faster RCNN 发布的时候使用的一些库现在都升级了,所以需要对代码中一些细节进行修改!


训练该模型(ZF_alt-opt)训练时间为4.5小时。

2.2  所有需要改的错误都已经解决,下面进行测试(test)

./tools/test_net.py --gpu 0 --defmodels/pascal_voc/ZF/faster_rcnn_alt_opt/faster_rcnn_test.pt --netoutput/faster_rcnn_alt_opt/voc_2007_trainval/ZF_faster_rcnn_final.caffemodel--imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_alt_opt.yml

出现bash: ./tools/test_net.py: Permission denied

解决:chmod u+x tools/test_net.py,再次执行上面训练的命令就开始测试了



2.3 使用端对端的方式训练模型,使用的预训练模型是VGG16

(因为命令 .experiments/scripts/faster_rcnn_end2end.sh 拒绝访问,所以在该shell脚本里使用里面的命令进行训练和检测)

./tools/train_net.py --gpu 0 --solvermodels/pascal_voc/VGG16/faster_rcnn_end2end/solver.prototxt --weights data/imagenet_models/VGG16.v2.caffemodel--imdb voc_2007_trainval --iters 70000 --cfgexperiments/cfgs/faster_rcnn_end2end.yml

出现:bash: ./tools/train_net.py: Permissiondenied

解决:chmod u+x tools/train_net.py,再执行训练命令。

 

训练该模型训练时间为8小时40分钟

 

2.4 对(end2end-VGG16)训练的模型进行测试


执行命令:./tools/test_net.py --gpu 0 --defmodels/pascal_voc/VGG16/faster_rcnn_end2end/test.prototxt --netoutput/faster_rcnn_end2end/voc_2007_trainval/vgg16_faster_rcnn_iter_70000.caffemodel--imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml

实验结果:Mean AP:0.6926

2.5 也分别使用ZF-end2end(使用两种迭代次数:40000次和70000次)、VGG_CNN_M_1024-alt-opt、VGG_CNN_M_1024-end2end、VGG16-alt-opt  这5种方法训练Faster-RCNN,总共进行训练了7种模型。由于训练和测试的套路和上述一样,只需要修改--net   --weights  --imdb --def等,所以就不在这里重述了。


总结:使用end2end 的训练时间快于alt-opt,VGG16训练出来的模型的Mean AP高于VGG_CNN_M_1024和ZF。



所有的都说完了,祝各位一切顺利啦!



  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值