Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Region Proposal Networks
- 输入为任何尺寸的图片,输出一组矩阵,并有各个的给分
- 主要使用全连接神经网络进行建模
- 全连接神经网络与与Fast R-CNN对象检测网络共享卷积权值信息
- 在最后的卷积层上使用一个小型的卷积网络。该小型网络将输入卷积特征图作为输入和空间窗口。 每个滑动窗口都映射到一个较低维的特征。实现方式是两个1*1的卷积层以及一个n*n的卷积层
使用了注意力机制
Anchors
在每个滑动窗口的地方,对多种边界进行预测,最大可能性的地方被标注为k。reg层有4k个输出(坐标点)来对应k个预测的区域。
每个anchor在每一个滑动窗口的中心,并且与一个比率以及标准有关。
一个W*H的特征图有WHk个anchor。
比如这里一个框,有3个标准与3个尺度(k=3*3=9),所以遍历整个图之后得到的,就是WHk个anchor。
RPN详解
Multi-Scale Anchors as Regression References
常用的两种处理的方法:
- 将整个图像进行放缩,每个放缩尺度进行计算
- 改变滑动窗口的大小以及横纵比例(such as 5×7 and 7×5)
loss function
Intersection-over-Union (IoU) 联结交界
选择anchor的时候,操作是
- 一个anchor是相对来说最大覆盖一个真实框的
- 一个anchor覆盖率大于0.7
通常,第二个条件足以确定阳性样本。 但是仍然采用第一个条件是因为在极少数情况下,第二个条件可能找不到阳性样本。
对于小于0.3的样本,直接标记为负样本。
L
(
p
i
,
t
i
)
=
1
N
c
l
s
∑
L
c
l
s
(
p
i
,
p
i
∗
)
+
λ
N
c
l
s
∑
p
i
∗
L
c
l
s
(
t
i
,
t
i
∗
)
L({p_i},{t_i})={{1}\over{N_{cls}}}\sum L_{cls}(p_i,p^*_i)+{{\lambda}\over{N_{cls}}}\sum p^*_i L_{cls}(t_i,t^*_i)
L(pi,ti)=Ncls1∑Lcls(pi,pi∗)+Nclsλ∑pi∗Lcls(ti,ti∗)
变量名 | 说明 |
---|---|
i | anchor在一个小批量的索引 |
p i p_i pi | anchor是一个物体的预测值 |
p i ∗ p_i^* pi∗ | anchor是一个物体的真实值,以0/1表示 |
t i t_i ti | 预测框的坐标,4个参数 |
t i ∗ t_i^* ti∗ | 真实框的坐标,4个参数 |
L c l s L_{cls} Lcls | log loss |
L r e g L_{reg} Lreg | reg loss,定义是: R ( t i − t i ∗ ) R(t_i−t^∗_i) R(ti−ti∗),其中 R R R是鲁棒性损失函数 |
p i ∗ L r e g p_i^*L_{reg} pi∗Lreg | reg loss只在正样本的时候被计算,因为只有正样本的时候, p i ∗ 才 等 于 1 p_i^*才等于1 pi∗才等于1 |
N c l s N_{cls} Ncls | 标准化参数 |
N r e g N_{reg} Nreg | 标准化参数 |
x,y为中心坐标的位置
w,h为区域的宽度以及高度
x
,
x
a
,
x
∗
分
别
指
代
预
测
盒
子
,
a
n
c
h
o
r
盒
子
,
真
实
盒
子
x,x_a, x^∗分别指代 预测盒子, anchor 盒子, 真实盒子
x,xa,x∗分别指代预测盒子,anchor盒子,真实盒子
在前文中,使用的卷积核是(3x3)固定大小的,为了适应各种形状的一套k个边界盒子的回归被学习到了。
Training RPNs
可以被反向传播以及stochastic gradient descent (SGD)训练。中心思想是以图像为中心。每个小批样本均来自包含多个正负示例锚的单个图像。
对所有样本进行损失函数的优化是可行的,但是问题是会导致偏向占据主导地位的负样本。
在图像中随机采样256个anchor,以计算小批量样本的损失函数,其中所采样的正anchor和负anchor的比例最大为1:1。 如果图像中的正样本少于128个,就用负样本填充小批量样本。
零均值高斯分布(标准偏差为0.01)中绘制权重来随机初始化所有新层。
所有其他层(即共享的卷积层)都通过预先训练ImageNet分类模型,标准实践来初始化。
sharing Features for RPN and Fast R-CNN
训练方法:
- Alternating training 首先训练RPN,然后使用反馈来训练Fast R-CNN。然后使用由Fast R-CNN调谐的网络初始化RPN,然后重复此过程。
- Approximate joint training 每个SGD迭代的时候,前向传播生成的区域在训练Fast R-CNN检测器时像固定的
- Non-approximate joint training RoI层接受卷积特征图作为输入,并且对于可能的盒子进行预测。
Roi layer
Roi pooling层详解:
Roi pooling层也是pooling层的一种,只是是针对于Rois的pooling操作而已。
Roi pooling层的过程就是为了将proposal抠出来的过程,然后resize到统一的大小。
Roi pooling层的操作如下:
1、根据输入的image,将Roi映射到feature map对应的位置;
2、将映射后的区域划分为相同大小的sections(sections数量和输出的维度相同);
3、对每个section进行max pooling操作;
Roi learn more
Roi learn more
4-Step Alternating Training
- 训练RPN网络:该网络使用ImageNet预先训练的模型进行初始化,并针对检测端到端进行了调整。
- 我们使用步骤1 的RPN给出的区域,通过Fast R-CNN训练一个单独的检测网络。 该检测网络也由ImageNet预训练模型初始化。 此时,这两个网络不共享卷积层。
- 我们使用检测器网络初始化RPN训练,但固定共享的卷积层,仅微调RPN特有的层。现在,这两个网络共享卷积层。
- 保持共享卷积层固定,微调Fast R-CNN的唯一层。 这样,两个网络共享相同的卷积层并形成统一的网络。 可以进行类似的交替训练进行更多的迭代,但是我们发现改进可以忽略不计。
Implementation Details
- 对图像放缩,使得最短边的长度为600px
- ZFand VGG 最后一个卷积层上的ZF和VGG网络的总步幅为 16像素(这个步长的效果已经不错,还是可以更小)