您的位置:首页 > 其它

FastRCNN 训练自己数据集(一)——编译配置

2017-04-19 11:29 776 查看

转载:http://www.cnblogs.com/louyihang-loves-baiyan/


https://github.com/YihangLou/fast-rcnn-train-another-dataset 这是我在github上修改的几个文件的链接,求星星啊,求星星啊(原谅我那么不要脸~~)

FastRCNN是Ross Girshick在RCNN的基础上增加了Multi task training整个的训练过程和测试过程比RCNN快了许多。别的一些细节不展开,过几天会上传Fast
RCNN的论文笔记。FastRCNN mAP性能上略有上升。Fast RCNN中,提取OP的过程和训练过程仍然是分离的。因此我们在训练过程中,需要用OP的方法先把图像OP提取好,再送入Fast RCNN中训练,在检测过程中也是如此需要先把相应的测试图像的OP提取出来送入检测。

首先我要说的是如何安装Fast RCNN环境,具体的流程在Ross Girshick的Github上有,他里面主要是讲解了如何安装和使用。我会稍微提到这一部分内容,主要讲解,如果要训练自己的数据,应该修改那些地方,并把我自己训练的过程跟大家分享一下。


1.当然是Git clone一下Ross的工程啦

这里给出Github的链接https://github.com/rbgirshick/fast-rcnn

首先根据他的提示

Make sure to clone with --recursive
Git clone --recursive https://github.com/rbgirshick/fast-rcnn.git

这里不要忘了加--recursive


2.在这里简单介绍一下工程目录

首先工程的根目录简单的称为 FRCN_ROOT,可以看到根目录下有以下几个文件夹

caffe-fast-rcnn
这里是caffe框架目录

data
用来存放pretrained模型 比如imagenet上的,以及读取文件的cache缓存

experiments
存放配置文件以及运行的log文件,另外这个目录下有scripts 用来获取imagenet的模型,以及作者训练好的fast rcnn模型,以及相应的pascal-voc数据集

lib
用来存放一些Python接口文件,如其下的datasets主要负责数据库读取
config负责cnn一些训练的配置选项

matlab
放置matlab与python的接口,用matlab来调用实现detection

models
里面存放了三个模型文件,小型网络的CaffeNet 大型网络VGG16 中型网络VGG_CNN_M_1024

output
这里存放的是训练完成后的输出目录,默认会在default文件夹下

tools
里面存放的是训练和测试的Python文件


3.编译Cython module

cd $FRCN_ROOT/lib

make

进入lib目录直接make就可以了


4.编译Caffe and pycaffe

cd $FRCN_ROOT/caffe-fast-rcnn

make -j8 && make pycaffe

这里需要注意的是你直接make -j8 && make pycaffe是会报错的,

可以看到图中是是没有Makefile.config文件,但是作者有一个Makefile.config.example文件,你需要复制它一下然后重命名为Makefile.config



需要注意的是里面还有几个配置需要添加

打开 USE_CUDNN = 1,这个选项默认情况下时关闭的,让CUDA支持DNN

打开 WITH_PYTHON_LAYER = 1,这个在默认情况下也是关闭的,FastRCNN需要支持Python接口,因此需要打开

Fast RCNN需要hdf5的支持,这个根据自己的Linux里的库文件安装路径添加,不清楚的可以find一下,不过一般情况下,INCLUDE_DIRS 应该添加上 /usr/include/hdf5/serial LIBRARY_DIRS 添加上 /usr/lib/x86_x64-linux-gnu/hdf5/serial

另外把USE_PKG_CONFIG = 1 记得打开,要不然会找不到一些库文件,PKG是Linux用来管理库文件

这几个是需要在Makefile.config.example中修改的,最好直接copy一个再修改。
另外还有一个需要注意的地方是,当初楼主的linux版本太高,ubuntu这玩意更新太快了,boost库的版本太高,Fast RCNN里面用的是1.55版本的boost库,当时我电脑上是1.59,会出现接口不兼容,记得是废弃了几个接口,编译报错,装回1.55的就可以了


5.下载相应的模型文件

Ross给出的操作是这样的,其实我不推荐这么弄,因为直接用wget去下载的速度比较慢,我们可以打开里面的shell文件,把url粘贴出来,到迅雷里面下载,几分钟就好了
cd $FRCN_ROOT
./data/scripts/fetch_fast_rcnn_models.sh


这里以相应的 imagenet_model为例,你到目录下可以看到3个shell文件,分别是fetch_fast_rcnn_models.s h,fetch_imagenet_models.sh,fetch_selective_search_data.sh,第一是作者训练好的fast_rcnn模型,第二个是imagenet_model上预训练好的模型,第三个对应着的是作者基于Pascal VOC数据集提取的selective_search预选框。如果想要看一下fast rcnn的效果,可以直接加载Ross训练好的fast_rcnn模型,如果要自己训练的话,记得加载imagenet模型

这里是imagenet_model的shell文件,看家里面的URL了没,最后的URL链接就是这个链接再加上FILE变量,链接,你直接把它链接起来,复制到迅雷中下载就可以了,速度灰常快,直接下载的话炒鸡慢啊。

下在之后记得放到data/目录下去解压哦,




6.运行网络和加载模型文件

在tools下面有个demo.py文件
cd $FRCN_ROOT
./tools/demo.py


就可以直接运行,记得看一下里面的参数,这里对显卡有一定的要求,Ross说必须是3G的显存以上才可以跑的动哦,里面有3个大小的网络caffenet是最小的,有显卡应该就能跑起来,vgg_cnn_m_1024是一个中型网络,vgg16是大型网络,后两个得看显卡的显存大小才能跑起,显存不够启动会报错的。

如果在cpu模式下的话速度是灰常慢的,GPU模式下大概0.2秒左右。

对了demo里面都是有显示的函数的,如果你是在linux终端下没有输出设备运行是会报错的

正确运行的结果如下

里面有两个图片检测效果,这里放一张




7.关于训练自己的数据样本

请等待下一篇 过两天就放上来 FastRCNN 训练自己数据集 (2接口修改训练)

评论列表

  
#1楼 2015-10-20
14:13 lightning16  

demo我都跑通了,现在是想用自己的道路标识进行训练,用什么工具能把这些标识提前出来在annoations呢?

支持(0)反对(0)

  
#2楼[楼主] 2015-10-23
00:22 楼燚航的blog  

@ lightning16

你说的应该是原始的GroundTruth,就是目标在图中的位置吧,我当时是自己写的python 和 opencv一个标注小工具

支持(0)反对(0)

  
#3楼 2015-11-16
16:27 Vict  

cd $FRCN_ROOT

./tools/demo.py

这之前的东西都搞定,但跑demo出问题。

Traceback (most recent call last):

File "./tools/demo.py", line 17, in <module>

from fast_rcnn.config import cfg

File "/home/zhaoyannan/fast-rcnn/tools/../lib/fast_rcnn/__init__.py", line 8, in <module>

from . import config

File "/home/zhaoyannan/fast-rcnn/tools/../lib/fast_rcnn/config.py", line 23, in <module>

from easydict import EasyDict as edict

ImportError: No module named easydict

支持(0)反对(0)

  
#4楼 2015-11-16
16:28 Vict  

对了我是用cpu配置的caffe,没配置cuda

支持(0)反对(0)

  
#5楼[楼主] 2015-11-16
19:05 楼燚航的blog  

@ Vict

我觉得你可能是easydict环境没有配或者是附加模块的路径问题,你在编译的时候Makefile.config下是否添加了相应的python附加包的路径

支持(0)反对(0)

  
#6楼 2015-11-17
02:17 sunjieee  

博主,我在fast rcnn编译caffe-fast-rcnn出现问题

加上WITH_PYTHON_LAYER = 1就有问题

把这句注释掉就能编译,但跑会有问题

而我尝试最新的caffe同样加上WITH_PYTHON_LAYER = 1却能够编译完成

这是哪里的问题?是boost版本问题吗?

实验室的服务器不敢改,用自己电脑gt750跑的话会要几天吗?

具体报错:

.build_release/lib/libcaffe.so: undefined reference to `boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > > >::maybe_assign(boost::match_results<__gnu_cxx::__normal_iterator<char
const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > > > const&)'

.build_release/lib/libcaffe.so: undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char,
boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)'

collect2: error: ld returned 1 exit status

Makefile:545: recipe for target '.build_release/tools/device_query.bin' failed

make: *** [.build_release/tools/device_query.bin] Error 1

make: *** Waiting for unfinished jobs....

支持(0)反对(0)

  
#7楼[楼主] 2015-11-18
18:49 楼燚航的blog  

@ sunjieee

我之前boost升级也碰到过问题,后来退回到1.55版本,就没有Boost的问题了,你可以试试

支持(0)反对(0)

  
#8楼 2015-12-28
19:55 野孩子1991  

楼主,可否给下你的selective search的代码,我在网上找的产生的op都不好,对比demo里的检测车辆那个,我的op只能找到两辆车。谢谢。

支持(0)反对(0)

  
#9楼 2016-01-27
14:52 黄豆豆是小小兵  

博主您好,参照您的博客安装了fast-rcnn,但是在编译caffe和pycaffe时出现了问题,向您请教一下~

.build_release/lib/libcaffe.so:对‘caffe::CuDNNConvolutionLayer<double>::Backward_gpu(std::vector<caffe::Blob<double>*, std::allocator<caffe::Blob<double>*> > const&, std::vector<bool, std::allocator<bool> > const&, std::vector<caffe::Blob<double>*, std::allocator<caffe::Blob<double>*>
> const&)’未定义的引用

谢谢( ^_^ )

支持(0)反对(0)

  
#10楼[楼主] 2016-02-19
13:08 楼燚航的blog  

@ 野孩子1991

你可以直接到Fast或者FasterRCNN的Github主页上有相应的链接,跳过去下载就可以了

支持(0)反对(0)

  
#11楼[楼主] 2016-02-19
13:09 楼燚航的blog  

@ 黄豆豆是小小兵

你那个cuDNN的编译选项要确保打开哦

支持(0)反对(0)

  
#12楼 2016-03-09
13:40 keran  

唔,我刚才没编译,但是现在编译出现了大bug呀,求帮助!

In file included from src/caffe/util/cudnn.cpp:2:0:

./include/caffe/util/cudnn.hpp:64:32: 错误: 变量或字段‘createTensor4dDesc’声明为 void

./include/caffe/util/cudnn.hpp:64:32: 错误: ‘cudnnTensorDescriptor_t’在此作用域中尚未声明

./include/caffe/util/cudnn.hpp:64:57: 错误: ‘desc’在此作用域中尚未声明

。。。。。太多了放不下

./include/caffe/util/cudnn.hpp: 在函数‘void caffe::cudnn::setConvolutionDesc(cudnnConvolutionStruct**, int, cudnnFilterDescriptor_t, int, int, int, int)’中:

./include/caffe/util/cudnn.hpp:104:3: 错误: ‘cudnnSetConvolution2dDescriptor’的实参不依赖模板参数,所以‘cudnnSetConvolution2dDescriptor’的声明必须可用 [-fpermissive]

./include/caffe/util/cudnn.hpp:104:3: 附注: (如果您使用‘-fpermissive’,G++ 会接受您的代码,但是允许使用未定义的名称是不建议使用的风格)

./include/caffe/util/cudnn.hpp: 在函数‘void caffe::cudnn::createPoolingDesc(cudnnPoolingStruct**, caffe::PoolingParameter_PoolMethod, cudnnPoolingMode_t*, int, int, int, int, int, int)’中:

./include/caffe/util/cudnn.hpp:117:13: 错误: ‘CUDNN_POOLING_AVERAGE_COUNT_INCLUDE_PADDING’在此作用域中尚未声明

./include/caffe/util/cudnn.hpp:123:3: 错误: ‘cudnnSetPooling2dDescriptor’的实参不依赖模板参数,所以‘cudnnSetPooling2dDescriptor’的声明必须可用 [-fpermissive]

make: *** [.build_release/src/caffe/util/math_functions.o] 错误 1

谢谢!

支持(0)反对(0)

  
#13楼 2016-03-30
15:31 雪花扇子  

楼主你好,为什么会出现cannot import name symbol_database

支持(0)反对(0)

  
#14楼 2016-04-01
18:46 JustJay  

@ 野孩子1991

selective-search提取OP的坐标是[top left bottom right]形式,并且从1开始,demo.py里面OP坐标形式为[left top right bottom],并且从0开始。

所以你需要进行坐标变换:all_proposals=all_proposals[ : , (1,0,3,2)]-1。

我当时也是只能检测出两辆车,后来发现是坐标的问题

支持(0)反对(0)

  
#15楼 2016-04-01
18:51 JustJay  

@ 雪花扇子

我建议你在make -j8 && make pycaffe 之后从上到下依次查找error。很多问题是没有安装库文件。google相应error之后 sudo apt-get install 相应的库 就好啦!

支持(0)反对(0)

  
#16楼 2016-04-01
18:58 雪花扇子  

@ JustJay

谢谢!那个问题以及解决了。我看了demo发现不仅有图片还有.mat的数据文件,那在在测试的时候是不是还得准备测试图片的.mat文件。这样我随便拿一张图片来做测试不就不能测试吗?

支持(0)反对(0)

  
#17楼 2016-04-01
19:04 JustJay  

@ 雪花扇子

是这样的,如果你需要测试自己的图片就要提取Object Proposal,也就是那个生成的.mat文件。我目前用的是selective-search提取的,Edge-Boxes还没有调好。不过你要非常注意坐标问题,正如博主提到的一样。

支持(0)反对(0)

  
#18楼 2016-04-01
19:10 雪花扇子  

@ JustJay

那我如果是实际用呢?就比如像博主那样要对道路上的车辆进行检测,那是不是要把视频每帧经过 selective-search 提取出 Object Proposal生成.mat文件然后和每帧图片本身传到模型做检测啊。这样的话有点麻烦

支持(0)反对(0)

  
#19楼 2016-04-01
19:16 JustJay  

@ 雪花扇子

我是初学caffe,现在还只是进行到检测自己的图片阶段,甚至还没有开始训练自己的数据集:(,不过你说的这个问题我不久会着手研究,如果你有什么进展,希望可以互相交流切磋!!!

支持(0)反对(0)

  
#20楼 2016-04-01
19:21 雪花扇子  

@ JustJay

我也是出学,只是在跑demo的时候发现这个问题,多多交流

支持(0)反对(0)

  
#21楼 2016-04-05
10:33 野孩子1991  

@ JustJay

非常感谢,我现在着手正在搞别的,等过段时间再搞一下试试。

支持(0)反对(0)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: