Faster RCNN 的细节补充
一、faster rcnn的结构


通过上面的结构,我们知道该faster rcnn前面以VGG16为框架,加入RPN层,最后做分类层。
采用VGG16相对ZF来说慢一点,但是精度也高一点。
二、RPN结构
RPN层的引入,极大提升检测框的生成速度。RPN是指以下结构:

前面的卷积结果过来后,分两路来前进,上面是分类路径(2×9),下面是坐标回归路径(4×9)。RPN属于FCN网络。
PRN的引入属于创新性变化,我们在训练的时候对RPN进行了两次训练,一次是使用gt+data 对其训练,保存产生的proposal,没有共用卷积层的训练;
一次是共享卷积层的训练,具体设置共享卷据层的lr=0,这样就对RPN单独训练了。
还有就是我们训练RPN时,随机采样256的anchors来,以正负1:1来训练,初始化权重使用高斯随机初始化新层权重,旧层使用预训练的imageNet来初始化。
具体的训练步骤:

三、anchors

这里每个像素点为中心产生9个anchor,每个anchor对应一个分类分数和回归分数。256是图片经过前面的卷积后得到的特征的维度,这里是ZF得到的256维度特征,VGG是512。对该特征
进行reshape成2×9和4×9。

图片的左上角产生9个anchors后,以滑窗的形式遍历整个图,对于1000×600的图片来说就产生20000个anchors,忽略跨界anchor大概剩下6000个anchors。注意这里训练时忽略跨界anchors,但测试时不忽略,而采取剪切到边界的方法。
生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals
这里Proposal Layer生成proposals的过程为:
Proposal Layer forward(caffe layer的前传函数)按照以下顺序依次处理:
- 生成anchors,利用
对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致)
- 按照输入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的foreground anchors。
- 限定超出图像边界的foreground anchors为图像边界(防止后续roi pooling时proposal超出图像边界)
- 剔除非常小(width<threshold or height<threshold)的foreground anchors
- 进行nonmaximum suppression
- 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)结果作为proposal输出。
四、bounding box regression原理

绿色是gt box,红色是anchor,由图可知anchor的预测不好,没有包含飞机翼。那么我们现在就对该红框使用回归技术使其尽量拟合绿框。注意这里只有当红色靠近绿框才使用回归,太远的误差大,属非线性回归。

给动(Px,Py,Pw,Ph)寻找一种映射使f(Px,Py,Pw,Ph)=(Gxˆ,Gyˆ,Ghˆ,Gwˆ)≈(Gx,Gy,Gh,Gw)
先做平移

再做尺度缩放

回归就是学习dx(p),dy(P),dw(P),dh(P)四个变换。
输入是P=(Px,Py,Pw,Ph)和gt的t=(tx,ty,tw,th)
而gt与proposal的真正平移量和尺度缩放量是

那么目标函数是d(P)=wΦ(P), Φ(P)是输入proposal的特征向量,w是要学习的参数,d(P)是预测值,我们要使预测值d(P)和真实偏差值t的差距最小,使用平方差函数有

函数优化就是针对该目标函数进行最小化

使用梯度下降求解w。
那么补充下:
1、为什么宽高尺度会设计成这种形式:tx,ty除以宽高,th,tw含log?
因为CNN具有尺度不变性,

图片经上面变化后,t的值不变。如果直接学习坐标差,则就前后发生了改变,即x1-p1不等于x2-p2。
而尺度变化中尺度必须大于0,自然想到exp函数,反过来就是log函数的来源了。
2、为什么anchor靠近gt时,即IOU较大时,才认为是线性变换?
tx和ty显然是线性组合。而tw和th中含有log,我们回忆下
高数里面:

因此:

我们看这公式,当且仅当Gw-Pw=0时,才会是线性函数,即gt的宽高和anchor的宽高必须近似相等。
五、损失函数
正标签:IOU最大 + 与gt重叠>0.7 的框,一个gt框会为多个anchors添加正标签,负标签是<0.3的框。

pi是类的概率(只取1/0,当为1时才对正标签激活后面的坐标回归函数),ti是坐标向量,用这两个量来定义函数(分类得分+回归得分)。
Ncls和Nreg是归一化因子,减少递归时间并规范化模型。
λ的选取经实验得10的时候对结果最好。
上面的分类使用对数log损失,下面的回归使用L1平滑函数损失。回归为什么不使用平方函数损失呢?
因为平方函数随着x的增加,平方函数的惩罚会越来越大,所以使用较为平缓的 |x| ; 但 |x| 在0点出不可导,所以要设计成平滑。
最终的L1平滑函数成这样子:

六、RoI Pooling
输入的图片大小不一样,为了统一图片的格式,使用ROI Pooling,保留了全图的特征,而不用crop或wrap掉部分特征。
RoI Pooling layer forward过程:在之前有明确提到: 是对应MxN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature maps尺度;之后将每个proposal水平和竖直分为pooled_w和pooled_h份,对每一份都进行max pooling处理。这样处理后,即使大小不同的proposal,输出结果都是 大小,实现了fixed-length output(固定长度输出)。

引用:https://zhuanlan.zhihu.com/p/31426458
Faster RCNN 的细节补充的更多相关文章
- Faster R-CNN:详解目标检测的实现过程
本文详细解释了 Faster R-CNN 的网络架构和工作流,一步步带领读者理解目标检测的工作原理,作者本人也提供了 Luminoth 实现,供大家参考. Luminoth 实现:https:// ...
- 从编程实现角度学习Faster R-CNN(附极简实现)
https://www.jianshu.com/p/9da1f0756813 从编程实现角度学习Faster R-CNN(附极简实现) GoDeep 关注 2018.03.11 15:51* 字数 5 ...
- 深度学习原理与框架-卷积网络细节-三代物体检测算法 1.R-CNN 2.Fast R-CNN 3.Faster R-CNN
目标检测的选框操作:第一步:找出一些边缘信息,进行图像合并,获得少量的边框信息 1.R-CNN, 第一步:进行图像的选框,对于选出来的框,使用卷积计算其相似度,选择最相似ROI的选框,即最大值抑制RO ...
- Faster RCNN 学习笔记
下面的介绍都是基于VGG16 的Faster RCNN网络,各网络的差异在于Conv layers层提取特征时有细微差异,至于后续的RPN层.Pooling层及全连接的分类和目标定位基本相同. 一). ...
- 目标检测(四)Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
作者:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun SPPnet.Fast R-CNN等目标检测算法已经大幅降低了目标检测网络的运行时间. ...
- Faster RCNN代码理解(Python)
转自http://www.infocool.net/kb/Python/201611/209696.html#原文地址 第一步,准备 从train_faster_rcnn_alt_opt.py入: 初 ...
- Widows下Faster R-CNN的MATALB配置(CPU)
目录 1. 准备工作 2. VS2013编译Caffe 3. Faster R-CNN的MATLAB源码测试 说实话,费了很大的劲,在调试的过程中,遇到了很多的问题: 幸运的是,最终还是解决了问题: ...
- 【神经网络与深度学习】【计算机视觉】Faster R-CNN
Faster R-CNN Fast-RCNN基本实现端对端(除了proposal阶段外),下一步自然就是要把proposal阶段也用CNN实现(放到GPU上).这就出现了Faster-RCNN,一个完 ...
- r-cnn学习系列(三):从r-cnn到faster r-cnn
把r-cnn系列总结下,让整个流程更清晰. 整个系列是从r-cnn至spp-net到fast r-cnn再到faster r-cnn. RCNN 输入图像,使用selective search来构造 ...
随机推荐
- 如何使用Spark大规模并行构建索引
使用Spark构建索引非常简单,因为spark提供了更高级的抽象rdd分布式弹性数据集,相比以前的使用Hadoop的MapReduce来构建大规模索引,Spark具有更灵活的api操作,性能更高,语法 ...
- Cmd使用方式--命令行运行程序
工具用惯却不知道如何去描述什么用,总感觉自己学东西用东西零零散散不系统,心虚!下面总结下自己使用cmd的几种方式. 1 => cmd,command,是window系统下命令提示符,是一种com ...
- POJ1160 Post Office-四边形不等式优化DP
方程 $\Large f(i,j)=min(f(i-1,k)+w(k+1,j))$ 其中$w(i,j)$表示在$[i,j]$的村庄都去一个邮局的最小距离和 证明w满足四边形不等式 设$w_k(i,j) ...
- 2017.1.16【初中部 】普及组模拟赛C组总结
2017.1.16[初中部 ]普及组模拟赛C组 这次总结我赶时间,不写这么详细了. 话说这次比赛,我虽然翻了个大车,但一天之内AK,我感到很高兴 比赛 0+15+0+100=115 改题 AK 一.c ...
- 廖雪峰Java12maven基础-1maven入门-1maven介绍
1.Java项目: * 1.1.首先确定引入哪些依赖包,如commons-logging, log4j, selenium * 1.2.确定项目的目录结构 * 1.3.配置环境:如JDK的版本号 * ...
- re模块补充
)# 后面加数字代表前面多少个进行替换print(ret8) # stars466c7#7.subn() 会返回替换了多少次ret9=re.subn('\d','asd','sh8sd6sds7smm ...
- LUOGU P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
传送门 解题思路 学习了一下玄学算法--模拟退火,首先要求平衡处,也就是求势能最小的地方,就是求这个点到所有点的距离*重量最小.剩下的几乎是模拟退火的板子了. #include<iostream ...
- java基础之Calender类
Calendar: Calendar类概述 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并 ...
- 关于mybatis对实体类参数绑定参数的问题
dao层的代码: public interface SupplierMapper extends BaseMapper<SupplierDbo>{ /*List<SupplierDb ...
- 语义分割--全卷积网络FCN详解
语义分割--全卷积网络FCN详解 1.FCN概述 CNN做图像分类甚至做目标检测的效果已经被证明并广泛应用,图像语义分割本质上也可以认为是稠密的目标识别(需要预测每个像素点的类别). 传统的基于C ...