欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Fast RCNN 训练自己数据集 (1编译配置)

发布时间:2025/7/25 编程问答 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Fast RCNN 训练自己数据集 (1编译配置) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Fast RCNN 训练自己数据集 (1编译配置)

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

转载请注明出处,楼燚(yì)航的blog,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)

总结

以上是生活随笔为你收集整理的Fast RCNN 训练自己数据集 (1编译配置)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。