老卫带你学---faster-rcnn使用cpu训练

老卫带你学—faster-rcnn使用cpu训练

一、首先参照博客http://blog.csdn.net/qq_14975217/article/details/51495844

对py-faster-rcnn内的roi_pooling_layer和smooth_L1_loss_layer进行替换并重新编译,编译过程参考http://www.cnblogs.com/justinzhang/p/5386837.html

二、修改相关文件

训练过程参考:http://www.cnblogs.com/CarryPotMan/p/5390336.html

http://blog.csdn.net/sinat_30071459/article/details/51332084

1)下载VOC2007数据集

提供一个百度云地址:http://pan.baidu.com/s/1mhMKKw4

解压,然后,将该数据集放在py-faster-rcnn\data下,用你的数据集替换VOC2007数据集。(替换Annotations,ImageSets和JPEGImages)

(用你的Annotations,ImagesSets和JPEGImages替换py-faster-rcnn\data\VOCdevkit2007\VOC2007中对应文件夹)

2)下载ImageNet数据集下预训练得到的模型参数(用来初始化)

提供一个百度云地址:http://pan.baidu.com/s/1hsxx8OW

解压,然后将该文件放在py-faster-rcnn\data下

下面是训练前的一些修改。

3)如果是训练自己的数据集还需要对配置文件做一些修改,本文完全用的VOC的数据集,所以没有做修改,在接下来训练自己的数据集的时候会再重新写一篇教程

4)为防止与之前的模型搞混,训练前把output文件夹删除(或改个其他名),还要把py-faster-rcnn/data/cache中的文件和

py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件删除(如果有的话)。

至于学习率等之类的设置,可在py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt中的solve文件设置,迭代次数可在py-faster-rcnn\tools的train_faster_rcnn_alt_opt.py中修改:

 
    
  1. max_iters = [80000, 40000, 80000, 40000]  

分别为4个阶段(rpn第1阶段,fast rcnn第1阶段,rpn第2阶段,fast rcnn第2阶段)的迭代次数。可改成你希望的迭代次数。如果改了这些数值,最好把py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt里对应的solver文件(有4个)也修改,stepsize小于上面修改的数值。

5)开始训练,按照教程输入

 
    
  1. ./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

会出现错误的情况:


找不到相应的目录,找了半天的错误也没法解决问题,查看faster_rcnn_alt_opt.sh的内容发现是启动

 
    
  1. ./tools/train_faster_rcnn_alt_opt.py

并给train_faster_rcnn_alt_opt.py传递参数,所以放弃脚本启动的方式,直接在终端输入以下 的命令进行启动

 
    
  1. cd /home/wjx/py-faster-rcnn/tools
  2. python train_faster_rcnn_alt_opt.py --gpu 0 --net_name ZF --weights /home/wjx/py-faster-rcnn/data/imagenet_models/ZF.v2.caffemodel --cfg /home/wjx/py-faster-rcnn/experiments/cfgs/faster_rcnn_alt_opt.yml --imdb voc_2007_trainval

出现下面的错误:在cpu only 模式下无法用GPU进行训练


解决方案:打开train_faster_rcnn_alt_opt.py,可以看到定义输入参数的函数,把第34,35,36定以GPU模式训练的部分注释掉,如下面黄色的部分。

 
    
  1. def parse_args():
  2.    """
  3.    Parse input arguments
  4.    """
  5.    parser = argparse.ArgumentParser(description='Train a Faster R-CNN network')
  6.    #parser.add_argument('--gpu', dest='gpu_id',
  7. #                    help='GPU device id to use [0]',
  8. #                    default=0, type=int)
  9.    parser.add_argument('--net_name', dest='net_name',
  10.                        help='network name (e.g., "ZF")',
  11.                        default=None, type=str)
  12.    parser.add_argument('--weights', dest='pretrained_model',
  13.                        help='initialize with pretrained model weights',
  14.                        default=None, type=str)
  15.    parser.add_argument('--cfg', dest='cfg_file',
  16.                        help='optional config file',
  17.                        default=None, type=str)
  18.    parser.add_argument('--imdb', dest='imdb_name',
  19.                        help='dataset to train on',
  20.                        default='voc_2007_trainval', type=str)
  21.    parser.add_argument('--set', dest='set_cfgs',
  22.                        help='set config keys', default=None,
  23.                        nargs=argparse.REMAINDER)

重新开始训练,输入下面的指令:

 
    
  1. python train_faster_rcnn_alt_opt.py --net_name ZF --weights /home/wjx/py-faster-rcnn/data/imagenet_models/ZF.v2.caffemodel --cfg /home/wjx/py-faster-rcnn/experiments/cfgs/faster_rcnn_alt_opt.yml --imdb voc_2007_trainval

出现下面的问题:

由于注释掉gpu参数部分,所以下面的程序中出现gpu_id会出现错误,所以把train_faster_rcnn_alt_opt.py第214行注释掉

重新开始训练,出现下面的错误:

和上面的错误一样,cpu模式的问题,解决方法:将sh文件里面关于gpu_id的都注释掉。

然后,将train_faster_rcnn_alt_opt.py文件第103行caffe.set_mode_gpu()改为caffe.set_mode_cpu(),才能进行训练

除此之外,如果用alt-opt方式进行训练,需要进入/home/wjx/py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt文件夹下将四个solver文件夹里里面涉及路径的改到绝对路径,否则会报错,如下:


前面提到faster_rcnn_alt_opt.sh无法启动训练,后修改成如下的代码可以进行训练:

 
     
  1. #!/bin/bash
  2. # Usage:
  3. # ./experiments/scripts/faster_rcnn_alt_opt.sh GPU NET DATASET [options args to {train,test}_net.py]
  4. # DATASET is only pascal_voc for now
  5. #
  6. # Example:
  7. # ./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG_CNN_M_1024 pascal_voc \
  8. #   --set EXP_DIR foobar RNG_SEED 42 TRAIN.SCALES "[400, 500, 600, 700]"
  9. set -x
  10. set -e
  11. export PYTHONUNBUFFERED="True"
  12. GPU_ID=$1</span></code></li><li class="L5"><code class="language-py"><span class="pln">NET=$2
  13. NET_lc=${NET,,}</span></code></li><li class="L7"><code class="language-py"><span class="pln">DATASET=$3
  14. array=( $@ )</span></code></li><li class="L0"><code class="language-py"><span class="pln">len=${#array[@]}
  15. EXTRA_ARGS=${array[@]:3:$len}</span></code></li><li class="L2"><code class="language-py"><span class="pln">EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_}
  16. case $DATASET in</span></code></li><li class="L5"><code class="language-py"><span class="pln"> &nbsp;pascal_voc)</span></code></li><li class="L6"><code class="language-py"><span class="pln"> &nbsp; &nbsp;TRAIN_IMDB="voc_2007_trainval"</span></code></li><li class="L7"><code class="language-py"><span class="pln"> &nbsp; &nbsp;TEST_IMDB="voc_2007_test"</span></code></li><li class="L8"><code class="language-py"><span class="pln"> &nbsp; &nbsp;PT_DIR="pascal_voc"</span></code></li><li class="L9"><code class="language-py"><span class="pln"> &nbsp; &nbsp;ITERS=40000</span></code></li><li class="L0"><code class="language-py"><span class="pln"> &nbsp; &nbsp;;;</span></code></li><li class="L1"><code class="language-py"><span class="pln"> &nbsp;coco)</span></code></li><li class="L2"><code class="language-py"><span class="pln"> &nbsp; &nbsp;echo "Not implemented: use experiments/scripts/faster_rcnn_end2end.sh for coco"</span></code></li><li class="L3"><code class="language-py"><span class="pln"> &nbsp; &nbsp;exit</span></code></li><li class="L4"><code class="language-py"><span class="pln"> &nbsp; &nbsp;;;</span></code></li><li class="L5"><code class="language-py"><span class="pln"> &nbsp;*)</span></code></li><li class="L6"><code class="language-py"><span class="pln"> &nbsp; &nbsp;echo "No dataset given"</span></code></li><li class="L7"><code class="language-py"><span class="pln"> &nbsp; &nbsp;exit</span></code></li><li class="L8"><code class="language-py"><span class="pln"> &nbsp; &nbsp;;;</span></code></li><li class="L9"><code class="language-py"><span class="pln">esac</span></code></li><li class="L0"><code class="language-py"></code></li><li class="L1"><code class="language-py"><span class="pln">LOG="/home/wjx/py-faster-rcnn/experiments/logs/faster_rcnn_alt_opt_${NET}_${EXTRA_ARGS_SLUG}.txt.`date +'%Y-%m-%d_%H-%M-%S'`"</span></code></li><li class="L2"><code class="language-py"><span class="kwd">exec &amp;&gt; &gt;(tee -a "$LOG")
  17. echo Logging output to "$LOG"</span></code></li><li class="L4"><code class="language-py"></code></li><li class="L5"><code class="language-py"><span class="com">#time ./tools/train_faster_rcnn_alt_opt.py --gpu ${GPU_ID} \&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/span>
  18. time cd /home/wjx/py-faster-rcnn/tools/
  19. python train_faster_rcnn_alt_opt.py --net_name ${NET} </span><span class="pln">\</span></code></li><li class="L8"><code class="language-py"><span class="pln"> &nbsp;--weights /home/wjx/py-faster-rcnn/data/imagenet_models/${NET}.v2.caffemodel \&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/span>
  20.  --imdb ${TRAIN_IMDB} \</span></code></li><li class="L0"><code class="language-py"><span class="pln"> &nbsp;--cfg /home/wjx/py-faster-rcnn/experiments/cfgs/faster_rcnn_alt_opt.yml \</span></code></li><li class="L1"><code class="language-py"><span class="pln"> &nbsp;${EXTRA_ARGS}
  21. set +x
  22. NET_FINAL=`grep "Final model:" ${LOG} | awk '{print $3}'`
  23. set -x
  24. time cd /home/wjx/py-faster-rcnn/tools/
  25. test_net.py --def /home/wjx/py-faster-rcnn/models/${PT_DIR}/${NET}/faster_rcnn_alt_opt/faster_rcnn_test.pt \
  26.  --net ${NET_FINAL} \&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/span></code></li><li class="L0"><code class="language-py"><span class="pln"> &nbsp;--imdb ${TEST_IMDB} \
  27.  --cfg /home/wjx/py-faster-rcnn/experiments/cfgs/faster_rcnn_alt_opt.yml \
  28.  ${EXTRA_ARGS}

启动训练输入以下的代码:

 
     
  1. ./faster_rcnn_alt_opt.sh 0 ZF pascal_voc

说明:

一、第一个参数实际的意义是GPU的编号,但是在CPU的模式下进行训练的话此参数没有任何意义,因为关于gpu_id的代码已经在上面注释掉了。

二、原始参数在CPU下进行训练会出现下面的情况,loss=-nan


可能的原因分析:按GPU的学习率在CPU上进行训练,CPU的速度可能跟不上

解决方法:把/home/wjx/py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt文件夹下将四个solver文件里面的base_lr由0.001调小一点,调节成0.0001后开始训练,不会出现上面的问题。参考:http://blog.csdn.net/kuaitoukid/article/details/42120961


最后,训练好的模型会保存在~/py-faster-rcnn/output/文件夹下



        </div>
            </div>
        </article>

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值