Faster R-CNN简介
\space\space\space\space\space\space
之前表现很好的检测网络如SPPnet和Fast R-CNN,已经减少了检测的运行时间,逐渐凸现出候选区域生成算法如selective search成为进一步加快检测的瓶颈。所以Faster R-CNN提出Region Proposal Network(RPN),用深度卷积网络生成候选区域。通过和检测的卷积网络共享权值特征,RPN几乎是不耗时的。检测的网络仍然是Fast R-CNN。
\space\space\space\space\space\space
用“注意力”机制来解释Region Proposal Network就是,RPN生成的候选区域其实是在告诉网络该往什么地方看。
\space\space\space\space\space\space
为了让网络能够识别不同尺度的目标,之前的方法使用图像金字塔或者过滤器金字塔,如下图(a)(b)所示。RPN在单一尺度的图像中使用不同尺度的“anchor” boxes,避免了枚举不同尺度的图像或者过滤器,有利于加快运行速度,如下图( c)所示。
Faster R-CNN细节
Faster R-CNN的网络结构如下图所示。
\space\space\space\space\space\space
Faster R-CNN由两部分组成:1.由深度全卷积神经网络生成候选区域的RPN;2.使用生成的候选区域进行目标检测的Fast R-CNN。两部分是一个统一的整体,共同构成Faster R-CNN。
Region Proposal Network(RPN)
\space\space\space\space\space\space
因为RPN是全卷积的网络,所以可以输入任意尺寸大小的图片,输出一系列的候选区域。为了生成候选区域,在卷积网络最后一层的特征图上(如上图所示),滑动一个n
×
\times
×n大小的卷积核,生成一个1
×
\times
× 1
×
\times
×C的特征向量(如果卷积网络是ZFnet,C=256;如果卷积网络是VGG,C=512),后面接两个由1
×
\times
× 1卷积组成的分支,分别生成两个特征向量进行回归(reg)和分类(cls)。这个n
×
\times
×n的卷积核滑过整个特征图为止。RPN的结构如下图所示。(文章选取n=3)
\space\space\space\space\space\space
每一个n
×
\times
×n的滑窗对应了k个候选区域,所以回归层有4k个1
×
\times
× 1的卷积核,输出长度为4k的特征向量,代表k个区域的坐标;分类层有2k个1
×
\times
× 1的卷积核,输出长度为2k的特征向量,表示k个区域是否有目标物体。k个候选区域对应于k个不同大小和长宽比的anchor boxes,如上图所示。文章中说对于一个W
×
\times
×H的特征图,最终产生W
×
\times
×H
×
\times
×k个anchor boxes,说明对于最后的特征图,先作大小为1的padding,然后以步长为1用n
×
\times
×n的卷积核滑过整个特征图。
平移不变的anchors
\space\space\space\space\space\space
RPN一个很重要的性质是具有平移不变性。如果一张图片中的目标物体移动到另一个位置,那么RPN仍可以在那个位置找到它。而候选区域生成算法MultiBox就不具有平移不变性,MultiBox不能保证在目标移动位置后仍可以生成对应的候选区域。
\space\space\space\space\space\space
平移不变性还可以减少模型的权值。MultiBox使用k-means算法产生800个anchors,最终分类和回归两个输出向量总共是(4+1)
×
\times
× 800维,所以最后一层共6.1
×
\times
× 106(1536
×
\times
× (4+1)
×
\times
× 800卷积网络是GoogleNet);而RPN最终输出(4+2)
×
\times
× 9(k=9个anchor boxes)维的输出向量,最后一层共2.8
×
\times
× 104(512
×
\times
× (4+2)
×
\times
× 9卷积网络是VGG-16),减少了两个数量级的权值。对于小数据集减少了过拟合的风险。
多尺度的anchors
\space\space\space\space\space\space 对于多尺度预测通常有两种方法:1.图像金字塔,即输入图像resize到不同尺度,然后分别送到网络中计算;2.在卷积最后的特征图上用不同尺寸的卷积核。这两种方法都有对特征的重复计算。RPN使用anchor金字塔,只需输入单一尺度的图像以及在卷积最后的特征图上用单一尺度的卷积核,就可以实现多尺度预测。
RPN的loss函数
\space\space\space\space\space\space
每一个anchor都被赋予二值的类标签。将正类赋给两类anchor:1.给定一个ground truth box,与它有最高IoU的anchor;2.anchor和任意一个ground truth box的IoU超过0.7。一般情况下,第二种情况就已经足够将正样本选出来,但对于极少数特殊情况,找不到IoU超过0.7的anchor,所以就需要第一种情况选出正样本。将负类赋给和所有ground truth box的IoU都小于0.3的anchor。其他情况的anchor抛弃不用。
\space\space\space\space\space\space
与Fast R-CNN的多任务loss类似,训练RPN的loss如下所示:
L
(
{
p
i
}
,
{
t
i
}
)
=
1
N
c
l
s
∑
i
L
c
l
s
(
p
i
,
p
i
∗
)
+
λ
1
N
r
e
g
∑
i
p
i
∗
L
r
e
g
(
t
i
,
t
i
∗
)
L(\{p_i\},\{t_i\})=\dfrac{1}{N_{cls}}\sum\limits_iL_{cls}(p_i,p_i^*)+\lambda\dfrac{1}{N_{reg}}\sum\limits_ip_i^*L_{reg}(t_i,t_i^*)
L({pi},{ti})=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(ti,ti∗).
这里,
1.
i
i
i表示mini-batch中第
i
i
i个anchor;
2.
p
i
p_i
pi表示第
i
i
i个anchor中有目标物体的概率,
p
i
∗
p_i^*
pi∗表示第
i
i
i个anchor的label,正类为1负类为0;
3.
t
i
t_i
ti表示预测出的bounding box的坐标与anchor坐标的偏移量,
t
i
∗
t_i^*
ti∗表示正类anchor对应的ground truth box与anchor坐标的偏移量。具体表示如下:
t
x
=
(
x
−
x
a
)
/
w
a
t_x=(x-x_a)/w_a
tx=(x−xa)/wa,
t
y
=
(
y
−
y
a
)
/
h
a
t_y=(y-y_a)/h_a
ty=(y−ya)/ha,
t
w
=
l
o
g
(
w
/
w
a
)
t_w=log(w/w_a)
tw=log(w/wa),
t
h
=
l
o
g
(
h
/
h
a
)
t_h=log(h/h_a)
th=log(h/ha),
t
x
∗
=
(
x
∗
−
x
a
)
/
w
a
t_x^*=(x^*-x_a)/w_a
tx∗=(x∗−xa)/wa,
t
y
∗
=
(
y
∗
−
y
a
)
/
h
a
t_y^*=(y^*-y_a)/h_a
ty∗=(y∗−ya)/ha,
t
w
∗
=
l
o
g
(
w
∗
/
w
a
)
t_w^*=log(w^*/w_a)
tw∗=log(w∗/wa),
t
h
∗
=
l
o
g
(
h
∗
/
h
a
)
t_h^*=log(h*/h_a)
th∗=log(h∗/ha).
其中
x
,
y
,
w
,
h
x,y,w,h
x,y,w,h代表box的中心点坐标以及长和宽;
x
,
x
a
,
x
∗
x,x_a,x^*
x,xa,x∗对应预测出的box、anchor box、ground truth box的中心点横坐标(
y
,
w
,
h
y,w,h
y,w,h一样);(所以预测出的仍是偏移量,anchor box通过偏移量修正最终得到预测边框。)
4.
L
c
l
s
L_{cls}
Lcls是二分类(有没有目标物体)的log loss;
5.
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 L1 loss(同Fast R-CNN);
6.
p
i
∗
L
r
e
g
p_i^*L_{reg}
pi∗Lreg意味着回归loss只计算有前景物体的anchor(正类
p
i
∗
=
1
p_i^*=1
pi∗=1)忽略负类的anchor(
p
i
∗
=
0
p_i^*=0
pi∗=0)
7.两个loss前都有一个归一化项
N
c
l
s
N_{cls}
Ncls和
N
r
e
g
N_{reg}
Nreg,还有一个平衡因子
λ
\lambda
λ。文章中将
N
c
l
s
N_{cls}
Ncls设为mini-batch的大小(
N
c
l
s
=
256
N_{cls}=256
Ncls=256),将
N
r
e
g
N_{reg}
Nreg设为anchor位置的数量,即特征图的像素总数。(
N
c
l
s
∼
2400
N_{cls}\thicksim2400
Ncls∼2400)
训练RPN
\space\space\space\space\space\space
RPN可以端到端的训练。与Fast R-CNN类似,每个mini-batch只输入一张图片,然后在最终的特征图上生成大量anchor。由于负类anchor的数量占主导,所以文章随机挑选256个anchor作为最终的mini-batch的大小,尽量保证mini-batch中正负类比例为1:1,如果正类不够128个,由负类填充。
\space\space\space\space\space\space
对于主体CNN,由ImageNet的预训练权值初始化,对于新增加的卷积层(anchor box分类和回归层)权值初始化为均值为0,标准差为0.01的高斯分布。
RPN和Fast R-CNN卷积权值共享
有三种训练方法实现RPN和Fast R-CNN卷积权值共享
1.交替训练:首先训练RPN;然后训练Fast R-CNN,RoI由训练好的RPN提供;再将训练完Fast R-CNN的卷积权值初始化RPN,微调RPN。以上过程迭代进行。
2.近似联合训练:直接将RPN和Fast R-CNN合为一体进行训练。前向传播时,RoI由RPN计算产生;反向传播时,RPN和Fast R-CNN两个loss在两个网络特有的部分分别传导梯度,当到达共有的CNN部分,则两部分loss合起来共同传播。这种方法实现起来简单,但是它忽略了Fast R-CNN的loss对RPN产生的bounding box坐标的梯度。
3.非近似联合训练:同样也是将RPN和Fast R-CNN合为一体进行训练,和近似联合训练不同的是,由于RPN产生的RoI也是Fast R-CNN的输入,所以Fast R-CNN的loss也要对RPN的bounding box坐标计算梯度,将梯度传导到RPN网络,对RPN网络的参数进行更新。
论文中使用的是交替训练法,步骤如下:
1.训练RPN。用ImageNet的预训练模型初始化RPN,然后再微调。
2.训练Fast R-CNN。同样也是用ImageNet的预训练模型初始化Fast R-CNN,RoI由第一步训练好的RPN提供。此时RPN和Fast R-CNN还是两个独立的部分。
3.用第二步训练好的Fast R-CNN的权值初始化RPN,然后固定共同的CNN部分的权值,微调RPN特有的部分。
4.固定CNN部分的权值,微调Fast R-CNN特有的部分。现在,两个网络已经共享CNN部分的权值,成为了一个统一的网络。
实现细节
1.训练和预测都是输入单一尺度的图像,将短边固定为600像素。
2.选择了3种面积的anchor:1282,2562,5122,3种长宽比:1:1,1:2,2:1。
3.对于超过图像边界的anchor,训练的时候全部忽略这些anchor;在预测的时候如果出现了超过图像边界的anchor,则将超出部分截去。
4.RPN生成的有些候选区域高度重叠,这里使用非极大抑制(NMS)来处理:对于IoU大于0.7的RoI,根据类别(有无前景)分数去除分数低的RoI。在非极大抑制后,选择类别分数排名前N(top-N ranked)的候选区域输入到Fast R-CNN。训练的时候,每张图片大约产生2000个候选区域。
论文地址:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks