Faster RCNN论文解析
Faster R-CNN由一个推荐区域的全卷积网络和Fast R-CNN组成, Fast R-CNN使用推荐区域。整个网络的结构如下:

1.1 区域推荐网络
输入是一张图片(任意大小), 输出是目标推荐矩形框的集合,以及相应的目标打分。网络的前面使用了一个基本的卷积层集合来提取特征(ZF或VGG-16)。这个基本层同时被RPN网络和Fast R-CNN使用。
在基本层之后,文中使用一个n*n的滑动窗口在最后一层特征图卷积,在每一个窗口位置,得到一个256维或512维的特征。这个特征随后被送进两个全连接层,分别是box-regression layer和box-classification layer。
上段中的迷你网络如下图所示。由于迷你网络是通过滑动窗口的方式,所以得到的特征是共享位置信息的,于是box-regression和box-classification层的全连是通过1×1的卷积实现。

1.1.1 Anchors
在滑动窗口的每个位置,会预测多个推荐区域,数量记为K(文中为9)。reg层有4K个输出(编码K个方框的坐标),cls层有2K个输出(预测目标或非目标的概率)。 这K个推荐区域被称为anchors。每个anchor都在滑动窗口的中心,并有相应的尺度大小和长宽比例。文中采用了三种尺度和三种长宽比,因此K为9。在这层卷积中,padding为1, stride为1, 所以总共会产生W*H(特征图的大小)个anchors。
1.1.2 Anchors的变换不变性(ranslation-Invariant)
变换不变性是说,anchors和根据anchors计算推荐区域的函数是对图像的变换不变的。就是说,如果变换了图像中的一个对象,那么推荐的区域也是相应变换的,同样的函数可以预测任何位置的一个推荐区域。我的理解是针对图像的平移缩放,anchors照样能检出对应的区域。这个性质是与文中提到的MultiBox方法使用k-means生成anchors相对的,因为k-means聚类方法是依赖于初始点的选取的,所以没有变换不变性。
1.1.3 多尺度Anchors 作为回归引用(Regression References)
有两种多尺度预测方式。一种是图像/特征金字塔,图像在多个尺度进行resize,卷积特征在每个尺度的图像上进行计算,比较耗费时间。另一种在特征图上使用多尺度的滑动窗口,这种方法更为高效。
1.1.4 损失函数
为了训练RPN,文中 对每个anchor赋予二值(是目标或非目标)类标签。对两种anchors赋予正标签:1)和真值框有最高交并比的anchor/anchors;2)和任何真值框的IoU高于0.7。对和所有真值框IoU都低于0.3的anchor赋予负标签。其他的anchors不作为训练目标。损失函数如下:

i是一个mini-batch中anchor的序号,pi是anchor i被预测为目标的概率。真值标签pi*是1, 如果anchor赋予了正标签,pi*是0, 如果anchor赋予了负标签。ti是预测的bounding box的4个参数坐标向量,ti*是正anchor的ground-truth box。Lcls是两类的log损失。Lreg(ti, ti*) = R(ti - ti*),R是smooth L1函数(在(2)式中定义)。pi*Lreg只针对正anchors(pi*=1)。cls和reg层分别输出{pi}和{ti}。Ncls(=256)是mini-batch的大小, Nreg是anchor位置的数目(Nreg~2400),默认设置λ=10,来使两项损失权重大致相等。

上式中x,y,w,h表示box的中心坐标和宽度、高度。变量x, xa, x*分别表示预测框、anchor框、真值框。
1.1.5 训练RPN网络
每个mini-batch从单个图像中的正负anchors产生。文中正负anchor的比例为1:1。如果正样本数少于128,则用负样本填充。
1.2 RPN和Fast R-CNN共享特征
RPN和Fast R-CNN单独训练会以不同方式修改卷积层。文中介绍了三种方式共享卷积层。
(i)交替训练。首先训练RPN,使用proposals训练Fast R-CNN。网络使用Fast R-CNN微调,然后用来初始化RPN,迭代这个过程。
(ii) 近似联合训练。在每次SGD迭代时,前馈计算生成区域推荐,看作训练Fast R-CNN检测器的预计算推荐。反馈传播中共享层传播RPN和Fast R-CNN结合的损失。这种方式忽略了关于推荐框坐标的导数。
(iii) 非近似联合训练。Fast R-CNN中的 RoI pooling层接收卷积特征和预测的bounding boxes作为输入,这时反向传播会涉及到box corrdinates.这时需要RoI poling层关于box coordinates是可微的。
1.2.1 4-步交替训练
第一步,训练RPN,用预训练的ImageNet模型初始化,端到端微调区域推荐任务。第二步,通过Fast R-CNN训练一个单独的检测网络,从第一步的模型中产生推荐框。这个网络也用ImageNet模型初始化。这时候两个网络不共享卷积层。第三步,使用检测网络初始化RPN训练,固定了共享卷积层,只微调独属于RPN的层。现在两个网络共享卷积层。第四步,使卷积层固定,微调独属于Fast R-CNN的层。这样,两个网络共享了卷基层,形成了一个统一网络。
1.3 实现细节
训练时,会将与边界有交叉的anchors删除,否则会难以收敛。测试时,仅仅将与边界交叉的anchors切到边界即可。
Faster RCNN论文解析的更多相关文章
- [原创]Faster R-CNN论文翻译
Faster R-CNN论文翻译 Faster R-CNN是互怼完了的好基友一起合作出来的巅峰之作,本文翻译的比例比较小,主要因为本paper是前述paper的一个简单改进,方法清晰,想法自然.什 ...
- k[原创]Faster R-CNN论文翻译
物体检测论文翻译系列: 建议从前往后看,这些论文之间具有明显的延续性和递进性. R-CNN SPP-net Fast R-CNN Faster R-CNN Faster R-CNN论文翻译 原文地 ...
- [Network Architecture]Mask R-CNN论文解析(转)
前言 最近有一个idea需要去验证,比较忙,看完Mask R-CNN论文了,最近会去研究Mask R-CNN的代码,论文解析转载网上的两篇博客 技术挖掘者 remanented 文章1 论文题目:Ma ...
- Faster R-CNN论文详解 - CSDN博客
废话不多说,上车吧,少年 paper链接:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks ...
- 【目标检测】Cascade R-CNN 论文解析
目录 0. 论文链接 1. 概述 2. 网络结构的合理性 3. 网络结构 4. 参考链接 @ 0. 论文链接 Cascade R-CNN 1. 概述 这是CVPR 2018的一篇文章,这篇文章也为 ...
- Faster RCNN论文学习
Faster R-CNN在Fast R-CNN的基础上的改进就是不再使用选择性搜索方法来提取框,效率慢,而是使用RPN网络来取代选择性搜索方法,不仅提高了速度,精确度也更高了 Faster R-CNN ...
- Faster R-CNN论文阅读摘要
论文链接: https://arxiv.org/pdf/1506.01497.pdf 代码下载: https://github.com/ShaoqingRen/faster_rcnn (MATLAB) ...
- Faster RCNN代码解析
1.faster_rcnn_end2end训练 1.1训练入口及配置 def train(): cfg.GPU_ID = 0 cfg_file = "../experiments/cfgs/ ...
- faster rcnn算法及源码及论文解析相关博客
1. 通过代码理解faster-RCNN中的RPN http://blog.csdn.net/happyflyy/article/details/54917514 2. faster rcnn详解 R ...
随机推荐
- javascript入门教程 (1)
对于刚刚接触前端开发或者刚开始学习javascript的同学来说,js能用来做些什么,它是如何诞生的,它的组成结构是怎么的,在这些问题上可能都只有一些模糊的概念, js的入门篇 就是希望可以从0开始深 ...
- 在CentOS7上安装MySQL5.7-YUM源方式
获取RPM包 # wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 列出RPM包里都有哪些文件 # ...
- Struts2知识点小结汇总
Struts2部分 1. JavaEE软件三层结构和MVC的区别? JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层).业务逻辑层.数据持久层.[其中WEB层会使用前 ...
- 分享一个在js中判断数据是undefined,NaN,null,的技巧
教大家如何在js中判断一个值是否是undefined,null,NaN,以及如何单独判断 平常开发过程中大家可能遇到一种问题,就是取页面某个值的时候获取不到这个var就是undefined了,如果是数 ...
- getline的字符串读入
也许是最近模拟题打多了的缘故,我发现自己渐渐变得比较毒瘤起来,当然这也是有一定的好处的,因为从中我也学到了一些处理字符串的正确姿势,今天我们就来讲一 讲如何用函数getline来读入一整行字符串进行处 ...
- React基本语法
React 一.导入 0.局部安装 react 和 react-dom npm install --save-dev react react-dom 1.react ...
- Apache Flume简介及安装部署
概述 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的软件. Flume 的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目 ...
- select epoll poll
如何理解 Epoll select 和 poll 三种模型,能否用生活中的例子做比喻? 比如说你从某宝下单买了几个东西,这几个东西分别由N个快递员分别给你送过来.在某一时刻,你开始等快递.对于sele ...
- C# 截取屏幕图像
#region 截取屏幕图像 private static Bitmap GetScreenCapture() { Rectangle tScreenRect = , , Screen.Primary ...
- 快排(golang实现) 递归方法
递归方法,逻辑简洁清晰.这个算法还是很重要的,需要重点记忆理解,面试经常考手写.据说是与傅里叶变换等并称“20世纪十大算法”.https://blog.csdn.net/v_JULY_v/articl ...