Faster RCNN总结
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,实现物体的分类。
安装步骤:
- git clone --recursive https://github.com/ShaoqingRen/faster_rcnn.git
- cd ./faster-rcnn/external/caffe
- make -j8&&make matcaffe
- faster_rcnn_build.m
- startup.m
- fetch_data/fetch_faster_rcnn_final_model.m (这一步我下载失败,可以去作者github做下面的百度网盘下载,下载Final RPN+FastRCNN models就可以了)
- 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的影响。
- function im_scale = prep_im_for_blob_size ( im_size ,target_size ,max_size )
- im_size_min = min(im_size ( 1 : 2 ) ) ;
- im_size_max = max(im_size ( 1 : 2 ) ) ;
- im_scale = double ( target_size ) / im_size_min ;
- %Prevent the biggest axis from being more than MAX_SIZE
- if round (im_scale ∗ im_size_max ) > max size
- im_scale = double (max_size ) / double (im_size_max) ;
- end
- end
SSD的处理:
直接进行缩放处理,这样做虽然会使图像变形,但是保证了输入的整个图像都是有效的像素。
- cv::Mat sample_resized;
- if (sample.size() != input_geometry_)
- cv::resize(sample, sample_resized, input_geometry_);
- else
- sample_resized = sample;
YOLOV2的处理:
YOLO的处理也保证了图片的ratio,比如tiny-yolo的输入尺寸为416*416,在对图片进行保证ratio的缩放后,对其他区域进行127像素的填充,这样做的好处就是保证了ratio,不足之处就是当输入图片的ratio比较大的时候,就会填充好多无效的127像素,一个图中,无效区域比有效区域还大,当然对小目标的检测就还不如SSD奏效了。
- static image_t ipl_to_image(IplImage* src)
- {
- unsigned char *data = (unsigned char *)src->imageData;
- int h = src->height;
- int w = src->width;
- int c = src->nChannels;
- int step = src->widthStep;
- image_t out = make_image_custom(w, h, c);
- int i, j, k, count = 0;;
- for (k = 0; k < c; ++k) {
- for (i = 0; i < h; ++i) {
- for (j = 0; j < w; ++j) {
- out.data[count++] = data[i*step + j*c + k] / 255.;
- }
- }
- }
- return out;
- }
- static void rgbgr_image(image_t im)
- {
- int i;
- for (i = 0; i < im.w*im.h; ++i) {
- float swap = im.data[i];
- im.data[i] = im.data[i + im.w*im.h * 2];
- im.data[i + im.w*im.h * 2] = swap;
- }
- }
RFCN的处理:
RFCN的处理主要是在网络卷积参数的设计上,引入了dilation参数,也就是所谓的hole algorithms,可以有效的增大map,提高对小目标的检测。
如下图所示,假设第一个为原始的map(3*3),第二个为dilation: 2时得到的map(7*7),第三个为在第二个的基础上,dilation: 4得到的map(15*15)。
- layer {
- bottom: "res5a_branch2a"
- top: "res5a_branch2b"
- name: "res5a_branch2b"
- type: "Convolution"
- convolution_param {
- num_output: 512
- kernel_size: 3
- dilation: 2
- pad: 2
- stride: 1
- bias_term: false
- }
- param {
- lr_mult: 1.0
- }
这里用KITTI的一张图片进行测试说明,
Faster RCNN总结相关推荐
- 理解Faster R-CNN
首先放R-CNN的原理图 显然R-CNN的整过过程大致上划分为四步: 1.输入图片 2.生成候选窗口 3.对局部窗口进行特征提取(CNN) 4.分类(Classify regions) 而R-CNN的 ...
- 目标检测——Faster R-CNN论文阅读
论文阅读--Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks 文章目录 论文阅读--Faste ...
- 目标检测算法Faster R-CNN简介
在博文https://blog.csdn.net/fengbingchun/article/details/87091740 中对Fast R-CNN进行了简单介绍,这里在Fast R-CNN的基础上 ...
- 里程碑式成果Faster RCNN复现难?我们试了一下 | 附完整代码
作者 | 已退逼乎 来源 | 知乎 [导读]2019年以来,除各AI 大厂私有网络范围外,MaskRCNN,CascadeRCNN 成为了支撑很多业务得以开展的基础,而以 Faster RCNN 为基 ...
- 完整代码+实操!手把手教你操作Faster R-CNN和Mask R-CNN
点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 机器视觉领域的核心问题之一就是目标检测(Object Detection),它的任务是找出图像当中所有感 ...
- Grid R-CNN解读:商汤最新目标检测算法,定位精度超越Faster R-CNN
作者 | 周强 来源 | 我爱计算机视觉 Grid R-CNN是商汤科技最新发表于arXiv的一篇目标检测的论文,对Faster R-CNN架构的目标坐标回归部分进行了替换,取得了更加精确的定位精度, ...
- 你真的理解Faster RCNN吗?捋一捋Pytorch官方Faster RCNN代码
作者丨白裳@知乎 来源丨https://zhuanlan.zhihu.com/p/145842317 编辑丨极市平台 目前 pytorch 已经在 torchvision 模块集成了 FasterRC ...
- 经验 | 详解 Faster R-CNN目标检测的实现过程
计算机视觉联盟 报道 转载于 :机器之心 Faster R-CNN 实现代码:https://github.com/tryolabs/luminoth/tree/master/luminoth/mo ...
- 【资源】Faster R-CNN原理及代码讲解电子书
<Faster R-CNN原理及代码讲解>是首发于GiantPandaCV公众号的教程,针对陈云大佬实现的Faster R-CNN代码讲解,Github链接如下: https://gith ...
- 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
为什么80%的码农都做不了架构师?>>> Faster R-CNN.R-FCN 和 SSD 是三种目前最优且应用最广泛的目标检测模型,其他流行的模型通常与这三者类似.本文介绍了 ...
最新文章
- Win8/Win8.1值得做的十多项优化方法
- PHP配置问题:AppServ安装discuz出错 Fatal error:
- VS网站开发的发布部署的不同情况说明
- Linux下 运行Jmeter (含一个jmeter简单示例)
- vue2.0s中eventBus实现兄弟组件通信
- wireshark使用教程 linux,Linux入门教程:ubuntu下安装wireshark(以及配置非root),这个强大的工具可以捕...
- linux中下载的服务压缩包存放在,linux 下tomcat6 配置为服务
- patran如何看屈曲因子_校准证书中的修正值、修正因子,你真的会用吗?
- java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型
- 用遗传算法求3维函数 的最小值_遗传算法可视化项目(4):遗传算法
- linux 临时文件 清理,Linux临时文件的清理
- extjs简单分页grid的总结
- 2019年PAT甲级冬季考试真题及参考答案
- Golang导出并下载excel封装
- C# winfrom 在button按钮上显示箭头
- FileZilla的下载与安装以及简单使用(有图解超简单)
- python日期间隔天数_Python编程题5--计算两个日期之间相隔的天数
- mmkv原理,Android多进程从头讲到尾,成功定级腾讯T3-2
- Win7系统打印机不能打印的问题
- java scanner 读取文件_Java读取文本文件
热门文章
- boost::serialization模块测试extended_type_info的实现,使用多个共享库时有效
- boost::::adaptors::indexed::indexed相关的测试程序
- boost::interprocess::message_queue用法的测试程序
- boost::geometry::model::segment用法的测试程序
- boost::allocator_max_size的实例
- VTK:可视化之VectorField
- VTK:图表之OutEdgeIterator
- C语言二叉树曲折级顺序遍历(附完整源码)
- C语言在二叉搜索树找到第k个最小元素(附完整源码)
- C++在哪几种情况只能用intialization list 而不能用assignment?