faster RCNN选自2015年 NIPS, Faster R-CNN: Towards Real-Time Object Detection withRegion Proposal Networks



正如上图所示,检测不同尺度(scale),不同长宽比(aspect ratios)的目标物通常的3种做法。

(a)Pyramids of images,缩放图像来达到不同的scale,传统机器学习常用的方法

(b)Pyramids of filters,也就是sliding window的思想,也是传统机器学习常用的方法

(c)Pyramids of anchors,fast rcnn提出,Faster rcnn正式命名为RPN(region proposal network),并且从fast rcnn的cpu移植到了fasterrcnn的gpu上。可以实现不同不同scale和不同aspect ratios的检测,使得检测效果更佳准确完美啊。

整个网络结构如上图的左图所示,分为2个网络结构,一个RPN网络和一个FastRCNN网络,两个网络共享了特征图这一层。由于是2个网络结构,训练过程也有点不一样,作者论文中给出了3个训练的方法,

(1)Alternating training,先从pretrained VGG16中导入初始参数,然后有了参数后,先训练RPN,然后RPN将结果送给Fast RCNN,在训练一把Fast RCNN训练完毕后更新卷积层,然后,RPN在从卷基层提取数据,如此不断循环往复。开源的matlab版本就是这种训练方法。

(2)Approximate joint training,就是2个网络一起训练,但是该方法忽略了wrt导数,开源的python版本就是这么训练的,可以减少25-50%的训练时间。为什么呢?因为caffe中所有层都是c++实现的,所以python_layer就没有进行back_ward,当然训练的时候必须显式指定loss_weight:1。

(3)Non-approximate joint training,作者没有实现。

上图中的右图详细说明了RPN的实现细节。

首先,作者提出了Anchor这个概念,其实就是feature map上的一个像素,以该Anchor为中心,可以生成k种 anchor boxes,简单理解就是不同大小和尺度的滑动框,例如本文中的k为9,则生成3个scales和1:1,1:2,2:1,3种aspect ratios。然后使用不同的anchor boxes进行滑动,整个feature map中IOU最高的和每个anchor中,IOU>0.7的将被激活,置为1,IOU<0.3的将被置为0,从而实现了hard negative mining,滑动完毕后将生成256维的向量,然后分别经过2个1*1的卷基层(classification layer,regression layer),分别生成2k scores(是物体,不是物体)和4k coordinates(x,y,w,h)。从而实现了物体的检测,最后经过softmax,实现物体的分类。

安装步骤:

[plain] view plaincopy
  1. git clone  --recursive https://github.com/ShaoqingRen/faster_rcnn.git
  2. cd ./faster-rcnn/external/caffe
  3. make -j8&&make matcaffe
  4. faster_rcnn_build.m
  5. startup.m
  6. fetch_data/fetch_faster_rcnn_final_model.m  (这一步我下载失败,可以去作者github做下面的百度网盘下载,下载Final RPN+FastRCNN models就可以了)
  7. experiments/script_faster_rcnn_demo.m

测试:

下面测试显卡为TitanX

使用VGG16的测试,

使用ZFnet的测试,

windows c++版本

这里所使用的windows caffe为https://github.com/Microsoft/caffe,

可以参考http://blog.csdn.net/qq_14845119/article/details/52415090这篇文章进行编译。

一个注意事项,在编译之前,在libcaffe下面的cu,include,src下面分别添加,roi_pooling_layer.cu,roi_pooling_layer.hpp,roi_pooling_layer.cpp。

这里的程序为根据matlab版本的faster-rcnn改写。

运行效果:

pets数据集上运行效果如下,1050Ti下运行时间为100ms的样子

这里分析一下,目标检测的框架为什么faster-RCNN要比SSD对小目标更好,而RFCN又比faster-RCNN更好些呢?

首先看一下,几个框架读取图片传进网络前做的处理,

faster-RCNN的处理:

faster-RCNN对读取的图片进行了scale处理,首先假设,im_size原始图片大小,target_size为目标图片大小,max_size为目标图片最长边允许的最大长度。

那么在缩放的过程中,首先,定义scale大小为( target_size ) / im_size_min,如果这个scale的时候,长边的长度超过max_size,就将scale定义为( target_size) / im_size_min,否则就还是用原来的scale。这样做的好处就是输入的图片相对SSD300*300,SSD500*500都大点,最终对小目标也许效果就会更好,当然这样做的话也会使得运行速度变慢,显存使用增加,对于不同ratio(长宽比)的图片运行时间也有差别。使用作者的原始参数,target_size=600 ,max_size=1000也许是对精度,速度,显存占用的一个很好的折中吧。

这里为什么faster-RCNN可以输入Blob不同ratio的数据,这就是RPN网络的亮点,全卷基层的设计,当然不受ratio的影响。

[plain] view plaincopy
  1. function im_scale = prep_im_for_blob_size ( im_size ,target_size ,max_size )
  2. im_size_min = min(im_size ( 1 : 2 ) ) ;
  3. im_size_max = max(im_size ( 1 : 2 ) ) ;
  4. im_scale = double ( target_size ) / im_size_min ;
  5. %Prevent the biggest axis from being more than MAX_SIZE
  6. if round (im_scale ∗ im_size_max ) > max size
  7. im_scale = double (max_size ) / double (im_size_max) ;
  8. end
  9. end

SSD的处理:

直接进行缩放处理,这样做虽然会使图像变形,但是保证了输入的整个图像都是有效的像素。

[plain] view plaincopy
  1. cv::Mat sample_resized;
  2. if (sample.size() != input_geometry_)
  3. cv::resize(sample, sample_resized, input_geometry_);
  4. else
  5. sample_resized = sample;

YOLOV2的处理:

YOLO的处理也保证了图片的ratio,比如tiny-yolo的输入尺寸为416*416,在对图片进行保证ratio的缩放后,对其他区域进行127像素的填充,这样做的好处就是保证了ratio,不足之处就是当输入图片的ratio比较大的时候,就会填充好多无效的127像素,一个图中,无效区域比有效区域还大,当然对小目标的检测就还不如SSD奏效了。

[plain] view plaincopy
  1. static image_t ipl_to_image(IplImage* src)
  2. {
  3. unsigned char *data = (unsigned char *)src->imageData;
  4. int h = src->height;
  5. int w = src->width;
  6. int c = src->nChannels;
  7. int step = src->widthStep;
  8. image_t out = make_image_custom(w, h, c);
  9. int i, j, k, count = 0;;
  10. for (k = 0; k < c; ++k) {
  11. for (i = 0; i < h; ++i) {
  12. for (j = 0; j < w; ++j) {
  13. out.data[count++] = data[i*step + j*c + k] / 255.;
  14. }
  15. }
  16. }
  17. return out;
  18. }
  19. static void rgbgr_image(image_t im)
  20. {
  21. int i;
  22. for (i = 0; i < im.w*im.h; ++i) {
  23. float swap = im.data[i];
  24. im.data[i] = im.data[i + im.w*im.h * 2];
  25. im.data[i + im.w*im.h * 2] = swap;
  26. }
  27. }

RFCN的处理:

RFCN的处理主要是在网络卷积参数的设计上,引入了dilation参数,也就是所谓的hole algorithms,可以有效的增大map,提高对小目标的检测。

如下图所示,假设第一个为原始的map(3*3),第二个为dilation: 2时得到的map(7*7),第三个为在第二个的基础上,dilation: 4得到的map(15*15)。

[plain] view plaincopy
  1. layer {
  2. bottom: "res5a_branch2a"
  3. top: "res5a_branch2b"
  4. name: "res5a_branch2b"
  5. type: "Convolution"
  6. convolution_param {
  7. num_output: 512
  8. kernel_size: 3
  9. dilation: 2
  10. pad: 2
  11. stride: 1
  12. bias_term: false
  13. }
  14. param {
  15. lr_mult: 1.0
  16. }

这里用KITTI的一张图片进行测试说明,

The End!

Faster RCNN总结相关推荐

  1. 理解Faster R-CNN

    首先放R-CNN的原理图 显然R-CNN的整过过程大致上划分为四步: 1.输入图片 2.生成候选窗口 3.对局部窗口进行特征提取(CNN) 4.分类(Classify regions) 而R-CNN的 ...

  2. 目标检测——Faster R-CNN论文阅读

    论文阅读--Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks 文章目录 论文阅读--Faste ...

  3. 目标检测算法Faster R-CNN简介

    在博文https://blog.csdn.net/fengbingchun/article/details/87091740 中对Fast R-CNN进行了简单介绍,这里在Fast R-CNN的基础上 ...

  4. 里程碑式成果Faster RCNN复现难?我们试了一下 | 附完整代码

    作者 | 已退逼乎 来源 | 知乎 [导读]2019年以来,除各AI 大厂私有网络范围外,MaskRCNN,CascadeRCNN 成为了支撑很多业务得以开展的基础,而以 Faster RCNN 为基 ...

  5. 完整代码+实操!手把手教你操作Faster R-CNN和Mask R-CNN

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 机器视觉领域的核心问题之一就是目标检测(Object Detection),它的任务是找出图像当中所有感 ...

  6. Grid R-CNN解读:商汤最新目标检测算法,定位精度超越Faster R-CNN

    作者 | 周强 来源 | 我爱计算机视觉 Grid R-CNN是商汤科技最新发表于arXiv的一篇目标检测的论文,对Faster R-CNN架构的目标坐标回归部分进行了替换,取得了更加精确的定位精度, ...

  7. 你真的理解Faster RCNN吗?捋一捋Pytorch官方Faster RCNN代码

    作者丨白裳@知乎 来源丨https://zhuanlan.zhihu.com/p/145842317 编辑丨极市平台 目前 pytorch 已经在 torchvision 模块集成了 FasterRC ...

  8. 经验 | 详解 Faster R-CNN目标检测的实现过程

    计算机视觉联盟  报道 转载于 :机器之心 Faster R-CNN 实现代码:https://github.com/tryolabs/luminoth/tree/master/luminoth/mo ...

  9. 【资源】Faster R-CNN原理及代码讲解电子书

    <Faster R-CNN原理及代码讲解>是首发于GiantPandaCV公众号的教程,针对陈云大佬实现的Faster R-CNN代码讲解,Github链接如下: https://gith ...

  10. 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD

    为什么80%的码农都做不了架构师?>>>    Faster R-CNN.R-FCN 和 SSD 是三种目前最优且应用最广泛的目标检测模型,其他流行的模型通常与这三者类似.本文介绍了 ...

最新文章

  1. Win8/Win8.1值得做的十多项优化方法
  2. PHP配置问题:AppServ安装discuz出错 Fatal error:
  3. VS网站开发的发布部署的不同情况说明
  4. Linux下 运行Jmeter (含一个jmeter简单示例)
  5. vue2.0s中eventBus实现兄弟组件通信
  6. wireshark使用教程 linux,Linux入门教程:ubuntu下安装wireshark(以及配置非root),这个强大的工具可以捕...
  7. linux中下载的服务压缩包存放在,linux 下tomcat6 配置为服务
  8. patran如何看屈曲因子_校准证书中的修正值、修正因子,你真的会用吗?
  9. java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型
  10. 用遗传算法求3维函数 的最小值_遗传算法可视化项目(4):遗传算法
  11. linux 临时文件 清理,Linux临时文件的清理
  12. extjs简单分页grid的总结
  13. 2019年PAT甲级冬季考试真题及参考答案
  14. Golang导出并下载excel封装
  15. C# winfrom 在button按钮上显示箭头
  16. FileZilla的下载与安装以及简单使用(有图解超简单)
  17. python日期间隔天数_Python编程题5--计算两个日期之间相隔的天数
  18. mmkv原理,Android多进程从头讲到尾,成功定级腾讯T3-2
  19. Win7系统打印机不能打印的问题
  20. java scanner 读取文件_Java读取文本文件

热门文章

  1. boost::serialization模块测试extended_type_info的实现,使用多个共享库时有效
  2. boost::::adaptors::indexed::indexed相关的测试程序
  3. boost::interprocess::message_queue用法的测试程序
  4. boost::geometry::model::segment用法的测试程序
  5. boost::allocator_max_size的实例
  6. VTK:可视化之VectorField
  7. VTK:图表之OutEdgeIterator
  8. C语言二叉树曲折级顺序遍历(附完整源码)
  9. C语言在二叉搜索树找到第k个最小元素(附完整源码)
  10. C++在哪几种情况只能用intialization list 而不能用assignment?