该论文要解决的问题:
区域推荐算法还是有不足,SS速度很慢,卷积网络在GPU上运行,而区域推荐方法在CPU上运行。如果用GPU处理推荐区域,那么速度会更快。
作者的方法:
引进了一个Region Proposal Networks(RPNs)方法,用深度卷积神经网络来计算推荐区域,能和检测网络分享计算层。
作者方法简介:
feature map可以像Fast RCNN一样被用来做基于区域的检测,也可以用来生成推荐区域,设计RPNs来有效预测一个宽范围的尺度和方向比例的推荐区域。
然后提出一个训练的计划, 在区域推荐的任务的微调和目标检测的微调之间交替进行,同时保证推荐固定,这个计划收敛的很快,而且还能在这些任务中共享计算。
就是说先粗调anchor,得到粗调的anchor,再在这个微调的anchor上同时进行位置微调和分类预测,虽然生成了更好的被调整的anchor,但是分类还是用的之前的粗调的anchor
和其他方法不同,这样计算量会小很多,只需要每次对feature map的一个区域提取一次(只有一种scale的filter),然后对它进行金字塔处理就可以了。
RCNN缺陷:
RCNN网络通过端对端的方法,将推荐区域分成Object类别或背景。RCNN主要扮演一个分类器的角色,而没有预测物体的边界(不计算被bounding box regression重新定义的话)。它的准确性依赖于区域推荐模块的表现。
Faster RCNN由两个模块组成:
整体的体系是一个单一的、统一的目标检测网络。RPN告诉Fast RCNN模组应该检测哪些区域。
13个conv,13个relu,4个pooling
所有的conv层都是:kernel_size=3,pad=1,stride=1
所有的relu层都是:kernel_size=2,pad=1,stride=1
所有的pooling层都是:kernel_size=2,pad=,stride=0
因此conv层和relu层不会改变输入和输出矩阵的大小,而pooling层会让输出的长宽等于输入的1/2
所以,M x N大小的矩阵经过Conv layers就会变成(M/16) x (N/16)。
输入:
一个RPN接受一个image作为输入
目标:
和Fast RCNN共享计算,所以我们假定两个网络分享一个公共的卷积层。
实现目标的方法:
对最后的特征层进行滑窗操作( 3 × 3 3 \times 3 3×3),每个滑动窗口会映射成一个低维度的特征,然后把这个特征喂进两个并列的全连接层:一个是回归层,一个是分类层。
输出:
一系列矩形的推荐区域,每个都带着目标分数。
介绍了anchor的概念,还有使用anchor的好处
对于每个滑动窗口,都会预测对各推荐区域,然后每个position的最大可能性的推荐的数量,定义为k。所以reg层的4k个输出就能确定k个box,cls层输出的2k就是估计每个推荐区有Object和没Object的概率。这k个推荐处理后就是anchor。每个anchor的中心都在滑窗中(中心),使用了三个尺寸和三个长宽比,所以每个sliding position有9个anchor。
平移不变性
作者的方法的一个重要属性就是平移不变性,这些依赖于anchor和计算推荐相对于anchor的函数。这个属性同时也减少了modle size。当k=9的时候,只有一个维度是(4+2)x 9的卷积输出层,输出层有2.8 x 1 0 4 10^4 104个参数(512 x ( 4 + 2 ) x 9 for VGG-16)。
Anchor的多尺度
作者的方法是建立一个anchor的金字塔,这样的成本效益更好。作者方法参考多尺度和多纵横比的anchor box来分类和回归边界框。它只依赖一个单尺度的 image 和 feature map ,并且使用一个单尺度的过滤器(就是滑窗只滑一次就够了)。这个多尺度的anchor是不附加额外计算成本的关键。
Faster RCNN没有FPN,但有多尺度anchor
讲的是如何训练,其中包括如何划分正负样本,损失函数如何定义,以及算是函数中的含义,还有后面回归框的计算,最后是关于anchor的一部分细节。
正负样本选择:
为了训练RPNs, 给每个anchor分配一个二分类标签(决定有没有object)。
注意: 一个ground-truth box可能会将好几个anchor都设置为正样本,一般情况下,第二个条件已经能满足我们的需求了,但我们还是要采用第一个条件,因为如果只用第二个条件,有的时候会找不到正样本。
剩下的Anchor对训练没有帮助。
损失函数:
i i i是一个batch中的anchor的index
p i p_i pi 是被预测anchor中有object的可能性
p i ∗ p^*_i pi∗是,如是正样本,就是1,如果是负样本,就是0
p i ∗ L r e g p^*_iL_{reg} pi∗Lreg是说,如果是正样本,就激活,负样本就不激活
t i t_i ti 代表了被预测的bounding box
t i ∗ t^*_i ti∗ 是和正样本anchor关联的ground-truth box。。
L c l s L_{cls} Lcls是一个二分类器。
对于回归损失来说,我们用 L r e g ( t i , t I ∗ ) = R ( t i − t i ∗ ) L_{reg}(t_i,t^*_I)=R(t_i-t^*_i) Lreg(ti,tI∗)=R(ti−ti∗),其中 R R R是smooth L 1 L_1 L1。
cls和reg层的输出由 p i p_i pi和 t i t_i ti组成。
N c l s N_{cls} Ncls和 N r e g N_{reg} Nreg是用来标准化的,前者是mini-batch size, 后者是number of anchor locations。
λ \lambda λ是用来平衡二者权重的,默认是10。
不带 ∗ * ∗的是真实值,带 ∗ * ∗的是预测值。
在我们的方程式中,被使用的特征是相同大小的(3x3),来自feature maps.为了计算变化的尺寸,设计了多个回归量(k,9)来学习。每个回归量都代表一个scale和一个aspect ratio,而且这k个回归量不共享权重。
可以通过反向传播和SGD来进行端对端的RPNs训练。
训练的mini-batch来自包含很多正负样本anchor的单个图片。全部的anchor的loss函数都是有可能优化的,但是偏置会指向负样本,因为负样本占主体地位。
我们从一个图片中采集256个anchor来计算mini-batch的损失函数,其中被采样的正样本和负样本的数量是1:1。如果正样本不足128的话,我们就用负样本填充。
随机初始化所有的新的层的weigths(均值为0,方差为0.01的高斯分布),然后其他的层的权重就用预训练的ImageNet classficition模型初始化 。
使用的是 学习率为0.001,mini-batch是60k,接下来的是学习率为0.0001,mini-batch是20k。
接下来是用一个由RPN和Fast RCNN组成的共享卷积层的统一的神经网络。
RPN和Fast RCNN是独立训练的,都会用不同的方法来修改他们的卷积层。因此我们需要开发一个技术,能让他们两个网络之间共享卷积层,而不是学习两个独立的网络,我们讨论三种方法来训练一个特征共享的网络:
(1) Alternating training:我们先训练RPN,然后用RPN生成的推荐来训练Fast RCNN,然后用Fast RCNN 调优的神经网络来初始化RPN。(Fast RCNN调优了什么神经网络?就是最开始的那个没训练的?VGG?)重复这个过程。在这篇论文的实验中,用到的都是这个方法。
(2)Approximate joint training: RPN和Fast RCNN在训练期间被整合到一块,就像Figure 2。在每次的SGD迭代中,将RPN生成的推荐区域,当成是一个固定的、与计算的推荐区域给Fast RCNN训练。反向传播就和往常一样,对联合起来的一整个共享layer进行方向传播。但是,我们忽略了w.r.t的导数,而推荐区域的坐标也是卷积层的产物(应该就是这个东西没参与反向传播的计算),所以我们叫做近似计算。
(3)Non-approximate joint training:超出本文范围,不讨论
4-Step Alternatingh Training:
使用交替优化的四步学习共享特征的训练算法:
一、像3.1.3描述的那样训练RPN。用Image-Net-pre-trained model来初始化RPN网络。
二、使用第一步RNP生成的推荐区域来训练Fast RCNN(此时Fast RCNN是一个单独的网络),Fast RCNN的权重通过Image-Net-pre-trained model来初始化,这个时候并没有什么共享,这两个网络是连续的。
三、用训练好的网络来初始化RPN,固定被共享的卷积层的参数不变(通过设置learning_rate=0),然后对RPN独有的层进行微调(如何微调???)
四、还是固定共享的卷积层参数不变,对Fast RCNN独有的层进行微调。
上面的交替训练可以迭代很多次,但是提升不大。
anchors的postivate和negative分类是softmax搞出来的???(我懂了,训练的时候是使用的与ground-truth box的IoU来分P或N,但是使用的时候,是用softmax来预测是P或N)
用boduning box regression修正anchors获得精准的proposals.
预测出来的是bounding box regression的偏移量?
最后的proposals层综合positive anchors和bounding box regression偏移量来得到精确的proposals,同时剔除太小或超出边界的proposals.
这两次是哪两次?RPN layer一次,ROI layer 的FC之后又一次
最后的预测,每个anchor都有偏移量?不是,只有被选中的正样本才有偏移量吧
之后会从其中随机选128个正和负样本?(正负样本怎么来(anchor生成层出来的),训练的时候可以是IoU,这会呢???(应该还是用的上一层RPN的标签))
RPN环节:softmax判定positive和negative(应该判断的是有没有object的置信度吧?这里的正样本和后面的不太相同?后面是根据Anchor来调整softmax的参数?)
在进入reshape和Softmax中,先做了1x1的卷积。经过1x1的卷积输出的图像为 W x H x 18的大小,对应feature maps中的9个anchor,信息都保存在 W x H x (9*2)矩阵中,对应这每个cell的9个anchor的positive和negative情况。这就相当于初步确立了推荐区域box,为什么这么说呢,应为anchor本来就是一个框,positive就是假定框里有object的情况。
RPN的bounding box regression
另一条线路: 这个1x1输出的维度是W x H x (4*9) 就是说对于每个anchor,都有一个预测的回归量
Proposal Layer:
综合所有的regression box量和positive anchors,
1.对所有生成的anchor进行regression box处理,得到所有修正过的anchors
2.提取前N个softmax的positive分数最高的修正过的anchors
3.限定超过图像边界的positive anchor为图像边界
4.剔除掉size非常小的anchor
5.对所有的anchors进行非极大值抑制
anchor基本是覆盖了800x600的各个尺度和形状
关于anchor的置信度:每个点都是256维的向量,通过全连接变成2k,然后softmax ,2k
变成k??
训练
1.
文章链接
知乎文章