R-FCN算法的Caffe实现
2017-06-03 10:48
190 查看
本博文介绍如何在Caffe上实现R-FCN,关于R-FN的算法讲解和Caffe代码详解可以参考另外一篇博客:Object Detection算法——R-FCN算法及Caffe代码详解
git地址:https://github.com/Orpine/py-R-FCN
基本上按照这个git上的readme.md的流程进行并假设你本机的Caffe本来就可以正常使用。本篇博文主要包括:搭好项目环境,运行demo,自己训练R-FCN模型。接下来详细讲解可能会遇到的坑:
一、搭好项目环境
1、先从git上拉取R-FCN
git地址:https://github.com/Orpine/py-R-FCN
基本上按照这个git上的readme.md的流程进行并假设你本机的Caffe本来就可以正常使用。本篇博文主要包括:搭好项目环境,运行demo,自己训练R-FCN模型。接下来详细讲解可能会遇到的坑:
一、搭好项目环境
1、先从git上拉取R-FCN
git clone https://github.com/Orpine/py-R-FCN.git[/code]
并假设拉取后的文件名是 RFCN_ROOT
2、拉取Caffecd $RFCN_ROOT git clone https://github.com/Microsoft/caffe.git[/code]
3、编译Cythoncd $RFCN_ROOT/lib make
4、复制Makefile.config(这一步git上面漏掉了)cd $RFCN_ROOT/caffe cp Makefile.config.example Makefile.config
5、编译Caffe和pycaffecd $RFCN_ROOT/caffe make -j32 && make pycaffe
会报这个错:
原因是在make -j32的时候找不到hdf5文件。解决办法就是修改Makefile.config文件,将Makefile.config中的下面这两行:INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
换成:INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/ LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/
至此,环境就搭好了
二、用已经训练好的R-FCN模型跑测试图片
1、首先下载已经训练好的R-FCN模型,链接:
https://onedrive.live.com/?authkey=%21AIeljruhoLuail8&cid=10B28C0E28BF7B83&id=10B28C0E28BF7B83%215317&parId=root&action=locate
下载好的模型的目录应该类似下面这样:$RFCN_ROOT/data/rfcn_models/resnet50_rfcn_final.caffemodel $RFCN_ROOT/data/rfcn_models/resnet101_rfcn_final.caffemodel
2、运行demo$RFCN_ROOT/tools/demo_rfcn.py
这一步报错:
原因是找不到python相关的内容,因为在Makefile.config里面没有把python接口的注释去掉。所以打开Makefile.config,找到WITH_PYTHON_LAYER :=1这一行,然后把前面的注释符号去掉。
最后重新编译Caffe和pycaffe:make clean make -j32 && make pycaffe
再运行$RFCN_ROOT/tools/demo_rfcn.py就可以成功了。
因为这个流程除了R-FCN以外,包括Faster RCNN等都很相近,所以在一开始copy Makefile.config时就直接把上面提到的这两处修改了,这样后面的编译和运行就能一次通过。
三、自己训练模型
刚刚的demo跑的是人家训练好的R-FCN模型,接下来就试试自己来训练吧。
1、准备数据
先从网上拉取数据: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/voc2012/VOCtrainval_11-May-2012.tar[/code]
再解压缩:tar xvf VOCtrainval_06-Nov-2007.tar tar xvf VOCtest_06-Nov-2007.tar tar xvf VOCtrainval_11-May-2012.tar
生成的目录应该类似这样:$VOCdevkit/VOC2007 $VOCdevkit/VOC2012
注:上面所用到的这些数据因为几乎所有的object detection算法都会用到,所以拉取一次就够了,不需要每个算法都拉取一次。
因为这里作者要将VOC2007和VOC2012的训练集合并作为模型训练集,所以需要新建一个文件夹VOC0712,合并后的目录应该是这样的:$VOCdevkit/VOC2007 $VOCdevkit/VOC2012 $VOCdevkit/VOC0712
这里git上还有一步是这么写的:cd $RFCN_ROOT/data ln -s $VOCdevkit VOCdevkit0712
这个命令是什么意思呢?其实就是你把下载好的数据放在:$VOCdevkit
这个目录,这个目录一般而言是个公共目录,这样其他算法才能比较方便地使用这个数据集,但是该算法的默认数据集存放位置是:$RFCN_ROOT/data
下面,那怎么办呢?那就在$RFCN_ROOT/data目录下建立$VOCdevkit的索引,运行这个命令后就可以看到在$RFCN_ROOT/data目录下有数据集了,名字为VOCdevkit0712。因此这种做法就是为了避免重复拷贝数据占用空间。
2、下载预训练好的模型
这里下载的模型是指在ImageNet数据集上预训练的ResNet模型,自己训练VOC数据时是在这个预训练的模型上进行fine-tuning的。
下载好了以后目录应该类似这样:$RFCN_ROOT/data/imagenet_models/ResNet-50-model.caffemodel $RFCN_ROOT/data/imagenet_models/ResNet-101-model.caffemodel
3、开始训练cd $RFCN_ROOT ./experiments/scripts/rfcn_end2end.sh 0 ResNet-50 pascal_voc
这个命令表示采用end2end的方式训练,剩下的参数表示GPU的id是0,模型采用ResNet-50,数据集采用pascal_voc,详情可以看rfcn_end2end.sh
运行报错:
解决:因为R-FCN用到Fast RCNN相关内容,报错显示找不到text_format,所以在$RFCN_ROOT/lib/fast_rcnn/train.py文件里面添加一行:import google.protobuf.text_format
再运行./experiments/scripts/rfcn_end2end.sh 0 ResNet-50 pascal_voc
就成功了!如下图:
其实rfcn_end2end.sh文件里面包含了很多东西,大概来看一下。
这部分就是命令行运行时候的几个输入对应的内容:
这部分主要是数据集的选择,包括数据集名称,模型迭代次数等等:
后面这一部分是比较重要的,首先第一行是保存的日志,这个日志就是训练过程中的一些记录,可以根据这个画出训练loss曲线等。然后就是训练部分和测试部分。训练部分用./tools/train_net.py来训练,这个train_net.py里面还是调用了Fast RCNN的train方法,solver的地址也给出了,预训练的模型的地址也就是weights也给出了,imdb是数据集,iter是最大迭代次数,cfg是配置文件,注意这里是用rfcan_end2end.yml里面的一些设置覆盖原来设置文件中的一些参数默认值。原来的设置文件的路径是:$RFCN_ROOT/lib/fast_rcnn/config.py
rfcan_end2end.yml的文件内容如下:这里面对一些参数进行了新的设置,比如HAS_RPN: True表示采用RPN网络。
欢迎交流讨论,相互学习!
相关文章推荐
- R-FCN算法的Caffe实现
- 【caffe-matlab】目标检测R-FCN算法于Windows下配置
- 【caffe-matlab】目标检测R-FCN算法于Windows下配置
- R-FCN算法及Caffe代码详解
- R-FCN算法及Caffe代码详解
- 老调重提,利用 SDK 实现迷宫算法
- C#实现的18位身份证格式验证算法
- 梅西(Massey)迭代算法的实现
- C#实现的18位身份证格式验证算法[转载]
- C#实现的18位身份证格式验证算法[转载]
- TC图形库实现的2D变化算法(平移,旋转)
- C#实现的18位身份证格式验证算法[转载]
- 实现论坛树型结构的具体算法
- C#实现的18位身份证格式验证算法
- C#实现的18位身份证格式验证算法[转载]
- C#实现的基本算法
- C#实现的基本算法 changqi [原作]
- C#实现的18位身份证格式验证算法
- GDI实现的2D变换算法(旋转,平移)[实际上GDI本身提供了这些算法]
- 用BP网络算法实现对含噪声0到9数字的识别