赞
踩
开始于2020年7月27日 晚八点(未看实验部分and相关工作部分,整体也是半懂不懂,觉得懂了,但又不懂,秃头啊)
结束于2020年7月30日 下午一点
因为本学期看的第三篇FPN论文是和faster rcnn网络结合,并没有学习过什么是faster rcnn,斗争了一下,菜菜的小孙决定来看这篇文章了,于是这篇文章成为了小孙本学期精读的第四篇论文。原文链接
问题:
目标检测网络依赖区域提案算法来确定目标位置,已有的Selective Search方法(SS)和EdgeBoxes方法在CPU上运算速度分别为2s/图、0.2s/图。所以提取proposal在时间测试方面是计算瓶颈。
创新:
1.设计一个全卷积网络Region Proposal Networks(RPN),利用CNN卷积操作后的特征图生成region proposals,代替了Selective Search、EdgeBoxes等方法,速度上提升明显
2.通过训练Region Proposal Networks与目标检测网络Fast R-CNN共享卷积层,将两个网络融合为一个网络,大幅提高网络的检测速度。
1.Conv layers:
Faster RCNN首先使用一组基础的conv+relu+pooling层(例如VGG16,或Resnet101,去除其中的全连接层,只留下卷积层)提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
2.Region Proposal Networks:
RPN网络用于生成region proposals。首先生成一堆Anchor box,通过softmax判断anchors属于前景(foreground)或者后景(background),即是物体和背景的概率,这是一个二分类;同时,另一分支bounding box regression修正anchor box,形成较精确的proposal(注:这里的较精确是相对于后面全连接层的再一次box regression而言)
3.Roi Pooling(Region of interest pooling):
该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层。
4.Classification:
利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。
上图是VGG16模型的网络结构,可以清晰的看到该网络对于一副任意大小PxQ的图像:
首先缩放至固定大小MxN,然后将MxN图像送入网络;Conv layers中包含了13个conv层(kernel_size=3, padding=1,stride=1)+13个relu层+4个pooling层(kernel_size=2,padding=0,stride=2)
一共经过了4个Pooling层,那么一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)。其中这个r = 16,被称为子采样率。那么在feature map上的一个点就可以对应着原始图片上16个像素点。这样就可以通过feature map与原始图像的位置相互对应。
由上图可以看到,RPN被分成了两条线。
上面一条通过softmax分类anchors获得positive和negative分类。
下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。
而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。
其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
anchor:
一组矩形,长宽比为大约为
{
1
:
2
,
1
:
1
,
2
:
1
}
\ \{1:2,1:1,2:1\}
{1:2,1:1,2:1},基础大小为
{
12
8
2
,
25
6
2
,
51
2
2
}
\ \{128^2,256^2,512^2\}
{1282,2562,5122},对Conv layers计算获得的feature maps滑窗时每个滑窗位置所对应的原图区域中都9种(3×3)可能的anchors作为初始的检测框。
问:一共有多少个anchor呢?
答:feature map的大小为M×N,则有M×N×9个anchor。原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以:
c
e
i
l
(
800
/
16
)
∗
c
e
i
l
(
600
/
16
)
∗
9
ceil(800/16)*ceil(600/16)*9
ceil(800/16)∗ceil(600/16)∗9其中
c
e
i
l
(
)
ceil()
ceil()代表向上取整。
问:如何确定原图中对应的 bbxes?
答:要找到anchor在原图中获得对应的 bbxes, 关注两个因数即可:1.bbxes 中心点位置 2.bbxes 的高和宽
每个 bbx 的中心点由 backbone 最后一个卷积层后的 feature map 大小确定。如果 feature map 大小是 50*38,即将原图划分为 50* 38的栅格,每个栅格的中心即为bbxes 的中心点。(等同于特征图的x,y直接乘16)
每个bbxes 的长宽,则由 anchor的scale 与 aspect ratio 确定。这里每个 bbx 的高宽确定逻辑如下:
问:anchors size怎么设置的?
答:根据检测图像设置的。在python demo中,会把任意大小的输入图像reshape成800x600(即图2中的M=800,N=600)。anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。
给anchor分配标签:
训练RPN时,作者为每个anchor分配一个二分类标签(是或者不是物体)。
我们为两种anchor设置一个正标签:
单个ground-truth box可以为多个anchor分配正标签。通常第二个条件足够判定正样本,但仍然采用第一个条件的原因是在极少数情况下,第二个条件可能无法找到正样本。
我们为anchor设置一个负标签:
那些既不是正样本也不是负样本的锚点不参与训练。
softmax:
MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),我们令 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积。可以看到其num_output=18,也就是经过该卷积的输出图像为WxHx18大小。
我们知道每一个点所对应的k个anchor中,每一个anchor都有2个得分scores,分别代表是positive anchor的得分,或者negative anchor的得分。这样也就相当于初步提取了目标检测候选区域的box(即positive anchor)
问:为何要在softmax前后都接一个reshape layer?
答:其实只是为了便于softmax分类,至于具体原因和caffe的实现形式相关。
对于窗口一般使用四维向量
(
x
,
y
,
w
,
h
)
(x,y,w,h)
(x,y,w,h)表示,分别表示窗口的中心点坐标和宽高。红色的框A代表原始的positive Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:
给定anchor
A
=
(
P
x
,
P
y
,
P
w
,
P
h
)
A=(P_x,P_y,P_w,P_h)
A=(Px,Py,Pw,Ph)和
G
T
=
(
G
x
,
G
y
,
G
w
,
G
h
)
GT=(G_x,G_y,G_w,G_h)
GT=(Gx,Gy,Gw,Gh)
寻找一种变换
F
(
A
x
,
A
y
,
A
w
,
A
h
)
=
(
G
x
′
,
G
y
′
,
G
w
′
,
G
h
′
)
F(A_x,A_y,A_w,A_h)=(G_x^{'},G_y^{'},G_w^{'},G_h^{'})
F(Ax,Ay,Aw,Ah)=(Gx′,Gy′,Gw′,Gh′),其中
(
G
x
′
,
G
y
′
,
G
w
′
,
G
h
′
)
≈
(
G
x
,
G
y
,
G
w
,
G
h
)
(G_x^{'},G_y^{'},G_w^{'},G_h^{'})\approx(G_x,G_y,G_w,G_h)
(Gx′,Gy′,Gw′,Gh′)≈(Gx,Gy,Gw,Gh)
那么经过何种变换才能从上图中的窗口 A 变为窗口 G’呢? 比较简单的思路就是平移+缩放
平移:
(
Δ
x
,
Δ
y
)
=
(
P
w
⋅
d
x
(
P
)
,
P
h
⋅
d
y
(
P
)
)
(\Delta x,\Delta y)=(P_w\cdot d_x(P),P_h\cdot d_y(P))
(Δx,Δy)=(Pw⋅dx(P),Ph⋅dy(P))
G
x
′
=
P
x
+
P
w
⋅
d
x
(
P
)
G_x^{'}=P_x+P_w\cdot d_x(P)
Gx′=Px+Pw⋅dx(P)
G
y
′
=
P
y
+
P
h
⋅
d
y
(
P
)
G_y^{'}=P_y+P_h\cdot d_y(P)
Gy′=Py+Ph⋅dy(P)
缩放:
(
S
w
,
S
h
)
=
(
exp
(
d
w
(
P
)
,
e
x
p
(
d
h
(
P
)
)
(S_w,S_h)=(\exp(d_w(P),exp(d_h(P))
(Sw,Sh)=(exp(dw(P),exp(dh(P))
G
w
′
=
P
w
⋅
exp
(
d
w
(
P
)
)
G_w^{'}=P_w\cdot \exp(d_w(P))
Gw′=Pw⋅exp(dw(P))
G
h
′
=
P
h
⋅
exp
(
d
h
(
P
)
)
G_h^{'}=P_h\cdot \exp(d_h(P))
Gh′=Ph⋅exp(dh(P))
我们要学习的是
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P)当输入的anchor A与GT相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调。
接下来的问题就是如何通过线性回归获得
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P)了。线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近,即
Y
=
W
X
Y=WX
Y=WX
对于该问题,输入X是cnn中conv5的feature map,定义为Φ;同时还有训练传入A与GT之间的变换量,即
(
t
x
,
t
y
,
t
w
,
t
h
)
(t_x,t_y,t_w,t_h)
(tx,ty,tw,th)。输出是
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P)四个变换。那么目标函数可以表示为:
d
∗
(
P
)
=
W
∗
T
ϕ
5
(
P
)
d_{*}(P)=W_*^T\phi_5(P)
d∗(P)=W∗Tϕ5(P)
此时我们需要通过线性回归得到平移变换量和尺度缩放量
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P)我们先计算出predicted box和anchor box之间需要的平移量
(
t
x
,
t
y
)
(t_x,t_y)
(tx,ty)和缩放量
(
t
w
,
t
h
)
(t_w,t_h)
(tw,th)
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)
然后在计算出Gound Truth和anchor box之间需要的平移量
(
t
x
∗
,
t
y
∗
)
(t_x^*,t_y^*)
(tx∗,ty∗)和缩放量
(
t
w
∗
,
t
h
∗
)
(t_w^*,t_h^*)
(tw∗,th∗)
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)
我们的目的就是学习一个合适的参数
W
∗
W_*
W∗(* 表示x,y,w,h,也就是每一个变换对应着一个目标函数,使得
d
(
P
)
d(P)
d(P) 即是
(
t
x
,
t
y
,
t
w
,
t
h
)
(t_x,t_y,t_w,t_h)
(tx,ty,tw,th)与
(
t
x
∗
,
t
y
∗
,
t
w
∗
,
t
h
∗
)
(t_x^*,t_y^*,t_w^*,t_h^*)
(tx∗,ty∗,tw∗,th∗)的差距最小。我们用smoothL1损失函数(如下所示)。
问:为什么平移量
(
t
x
,
t
y
)
(t_x,t_y)
(tx,ty)和缩放量
(
t
w
,
t
h
)
(t_w,t_h)
(tw,th)要这样设计?
答:首先我们要明确CNN具有尺度不变的性质,就是说上面两个人虽然具有不同的尺寸,但由于两者都是人,所以我们得到的特征应该是相同的。假设我们得到的特征为
ϕ
1
,
ϕ
2
\phi_1,\phi_2
ϕ1,ϕ2,那么一个完好的特征应该具备
ϕ
1
=
ϕ
2
\phi_1=\phi_2
ϕ1=ϕ2的性质。
(1)x,y坐标除以宽高:
如果我们直接学习坐标差值,以x坐标为例,
x
i
,
p
i
x_i,p_i
xi,pi分别代表第i个框的x坐标,学习到的映射为f,
f
(
ϕ
1
)
=
x
1
−
p
1
f(\phi_1)=x_1-p_1
f(ϕ1)=x1−p1,同理
f
(
ϕ
2
)
=
x
2
−
p
2
f(\phi_2)=x_2-p_2
f(ϕ2)=x2−p2,很明显
x
1
−
p
1
≠
x
2
−
p
2
x_1-p_1\neq x_2-p_2
x1−p1=x2−p2,也就是说同一个
ϕ
\phi
ϕ对应着多个y值,不满足函数的定义。
(2)宽高坐标Log形式:
我们想要得到一个放缩的尺度,也就是说这里限制尺度必须大于0。我们学习的
(
t
w
,
t
h
)
(t_w,t_h)
(tw,th)怎么保证满足大于0呢?直观的想法就是EXP函数,那么反过来推导就是Log函数的来源了。
问:为什么只有当anchors A和GT比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了?
答:Log函数明显不满足线性函数,但是当:
l
i
m
x
=
0
l
o
g
(
1
+
x
)
=
s
lim_{x=0}log(1+x)=s
limx=0log(1+x)=s
t
w
=
l
o
g
(
G
w
/
P
w
)
=
l
o
g
(
1
+
(
G
w
−
P
w
)
/
P
w
)
t_w=log(G_w/P_w)=log(1+(G_w-P_w)/P_w)
tw=log(Gw/Pw)=log(1+(Gw−Pw)/Pw)
当且仅当
G
w
−
P
w
=
0
G_w-P_w=0
Gw−Pw=0时,才是线性函数。
num_output=36,即经过该卷积输出图像为WxHx36,这里相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P)
VGG输出50×38×512的特征,对应设置50×38×k个anchors,而RPN输出:
大小为50×38×2k的positive/negative softmax分类特征矩阵
大小为50×38×4k的regression坐标回归特征矩阵
恰好满足RPN完成positive/negative分类+bounding box regression坐标回归.
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\})=\frac{1}{N_{cls}}\sum_iL_{cls}(p_i,p_i^*)+\lambda\frac{1}{N_{reg}}\sum_ip_i^*L_{reg}(t_i,t_i^*)
L({pi},{ti})=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(ti,ti∗)
loss函数由两部分组成,分别是特征图每个像素点的物体分数和边框回归分数。
分类损失:
L
c
l
s
(
p
i
,
p
i
∗
)
=
−
l
o
g
[
p
i
∗
p
i
∗
+
(
1
−
p
i
∗
)
(
1
−
p
i
)
]
L_{cls}(p_i,p_i^*)=-log[p_i*p_i^*+(1-p_i^*)(1-p_i)]
Lcls(pi,pi∗)=−log[pi∗pi∗+(1−pi∗)(1−pi)]
p
i
∗
=
1
p_i^*=1
pi∗=1则代表为正anchor,
p
i
∗
=
0
p_i^*=0
pi∗=0则代表为负anchor
回归损失:
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∗)
s
m
o
o
t
h
L
1
(
x
)
=
{
0.5
x
2
∣
x
∣
<
1
∣
x
∣
−
0.5
o
t
h
e
r
w
i
s
e
smooth_{L1}(x)=
在训练RPN的阶段,
N
c
l
s
N_{cls}
Ncls = 256,在训练fast rcnn的阶段,
N
c
l
s
N_{cls}
Ncls = 128。
Proposal Layer有3个输入:
positive vs negative anchors分类器结果,对应的bbox reg的
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P),以及图片信息im_info;另外还有参数feat_stride=16。
Proposal Layer作用:
Proposal Layer负责综合所有
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P)变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。
Proposal Layer forward:
1.生成anchors,利用
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P)对所有的anchors做bbox regression回归
2.按照输入的positive softmax scores由大到小排序anchors,提取前(e.g. 6000)个anchors,即提取修正位置后的positive anchors
3.限定超出图像边界的positive anchors为图像边界(防止后续roi pooling时proposal超出图像边界)
4.剔除非常小(width<threshold or height<threshold)的positive anchors
5.对剩余的positive anchors进行NMS(nonmaximum suppression)非极大值抑制算法
6.再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前(e.g. 300)结果作为proposal输出。注:输出是proposal=[x1, y1, x2, y2]
对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值Nt的框从B中移除.重复这个过程,直到B为空。
举例:
定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
RoI Pooling layer forward原理:
如图
RoI Pooling layer forward过程:
Classification:
部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
参考文章特征向量通过两个全连接bbox_pred_net和cls_score_net。cls_score_net层为每个bounding box生成类别分数(可以通过应用softmax将其转换为概率)。bbox_pred_net层生成类特定的bounding box回归系数,该回归系数与proposal target layer产生的原始bounding box坐标组合以产生最终bounding box。这些步骤如下所示。
1.stage1_rpn_train.pt
单独训练RPN 网络,训练的模型用ImageNet的模型来初始化,采用end to end的方式来调整参数。
(backbone+rpn+fast rcnn——>backbone1+rpn1+fast rcnn,backbone 、rpn参数更新)
2.stage1_fast_rcnn_train.pt
单独训练检测网络Fast Rcnn,训练用的proposals来自第一步的RPN net,模型初始化采用ImageNet模型。
(backbone+rpn1+fast rcnn——>backbone2+rpn1+fast rcnn1,backbone 、fast rcnn参数更新)
3.stage2_rpn_train.pt
用第二步Fast Rcnn的参数来初始化RPN模型,但是训练的时候固定卷积层,只调整属于RPN的参数。
(backbone2+rpn1+fast rcnn1——>backbone2+rpn2+fast rcnn1,rpn参数更新)
4.stage2_fast_rcnn_train.pt
保持共享的卷积层固定,用第三步调整后的RPN输出的proposals作为输入,微调Fast Rcnn剩下的参数。
(backbone2+rpn2+fast rcnn1——>backbone2+rpn2+fast rcnn2,fast rcnn参数更新)
abstract:
SOTA的目标识检测网络依赖于区域提案/候选框生成(region proposal)算法来假设物体位置。最新的进展如SPPnet和Fast R-CNN已经减少了检测网络的时间,(间接)凸显出候选框计算成为算法时间的瓶颈。在这项工作中,我们提出了Region Proposal Network(RPN),它和检测网络共享整图的卷积特征,因此使得候选框的计算几乎不额外占用时间。RPN是一个全卷积网络,可同时预测每个位置的物体外接框和物体分数。RPN采用端到端的方式进行训练,产生高质量的候选框,进而被Fast R-CNN用来做检测。我们通过共享RPN和Fast R-CNN的卷积特征,进一步把RPN和Fast R-CNN融合成一个单一网络——使用最近流行的基于注意力机制的网络技术,RPN组件指引统一后的网络该看哪儿。对于很深的VGG-16模型,我们的检测系统在GPU上达到每秒5帧(包括所有步骤)的效率,同时在VOC2007, 2012和MS COCO数据集上有着良好的准确率,此时每张图上仅产生300个候选框。在ILSVRC和COCO 2015竞赛中,Faster R-CNN和RPN是几个不同领域中第一名模型的基础。
introduction:
目标检测的最新进展是由region proposal方法和基于区域的卷积神经网络(R-CNN)的成功推动的。尽管基于候选框的CNN在计算上是昂贵的,如R-CNN中最初开发的那样,但由于在候选框中共享卷积,它们的成本已经大大降低。最新作品中(incarnation),当忽略候选框提取的时间,Fast R-CNN使用很深的网络几乎实现了实时速度。如今,候选框成为最先进检测系统进行测试时的计算瓶颈。
候选框提取算法通常依赖低成本的特征和经济的推理(inference)方案。SS(Selective Search),最流行的方法之一,在低层特征上合并超像素。但是当对比高效的检测网络,SS慢了一个数量级,CPU上每张图的运行时间为2秒。EdgeBoxes最近给出了候选框质量和计算速度间的最好的权衡,每张图上的运行时间为0.2秒。尽管如此,提取候选框的步骤仍然在检测网络中占据很多运行时间。
可以注意到,快速的基于区域的CNN利用了GPU的优势,而研究中使用的候选框方法是在CPU上实现的,这使得运行时间的比较是不公平的。一个很明显的可用来加速候选框提取的计算时间的方法是在GPU上重新实现该算法。这可能是一种有效的工程解决方案,但是重新实现会忽略下游检测网络,因此会错过共享计算的重要机会。
本文中,作者展示一个算法上的的改变——使用一个深的卷积网络计算候选框——产生了一个完美且高效的解决方案,该方案中候选框的计算几乎不增加对检测网络的计算耗时。为此,作者引入新颖的Region Proposal Networks(RPNs),它和SOTA的目标检测网络共享卷积层。通过在测试时共享卷积,计算候选框的成本很小(例如,每张图像10毫秒)。
我们观察到,基于区域的检测网络如Fast R-CNN,使用的卷积特征图也可以用来生产候选框。在这些卷积特征的顶端,我们通过增加额外的卷积层构建了RPN,这些卷积层用来同时回归区域边界和物体分数。因此,我们的RPN是一种完全卷积网络(FCN),它们可以针对生成检测提案的任务进行端到端的训练。
RPN被设计用来高效地预测多尺度和不同长宽比的候选框。相比于之前使用图像金字塔(a)的方法,或滤波器金字塔(b),我们引入新颖的(anchor)框来作为多尺度和不同长宽比的参考。
我们的任务可以被认为是一个回归金字塔的参考,避免了遍历不同尺度或长宽比的图像或滤波器。这个模型在单尺度图像上训练和测试的性能很好,且这样使运行速度受益。
为了将 RPNs和Fast R-CNN统一起来,作者提出一个训练方案:候选框提取任务的微调和保持候选框不变物体检测任务的微调之间进行交替训练。该方案快速收敛并产生在两个任务之间产生一个统一网络,该网络有着共享的卷积特征。
我们在PASCAL VOC检测benchmarks上评估我们的方法,其中具有Fast R-CNN的RPN产生的检测精度优于具有Fast R-CNN的选择性搜索算法。同时,我们的方法在测试时放弃了SS的几乎所有计算负担,提案的有效运行时间仅为10毫秒。使用超深模型VGG,我们的检测方法在GPU上的帧速率仍为5fps(包括所有步骤),所以就速度和准确率而言是一个实用的检测系统。作者还测试了在MS COCO上的结果,观察到使用COCO数据时可提高VOC上的效果。
本文的初步版本在以前已经发表,自此,RPN和Faster R-CNN框架被采用并延伸至其他方法,如3D物体检测,基于块的检测,实例分割和看图说话。我们快速高效的检测系统已被嵌入诸如Pinterests的商业系统,报告称用户参与度得到提高。
在ILSVRC和COCO 2015比赛中,Faster R-CNN和RPN是几个在ImageNet 检测,ImageNet定位,COCO检测,COCO分割任务第一名网络的基础。RPNs完全从数据中学习候选区域,这样可很容易从更深更具有表达性的特征中收益(101层的残差网络)。Faster R-CNN和RPN也被竞赛中几个领先的网络使用。这些结果表明我们的方法不仅在实际使用中是一个高效的解决方案,而且是提高检测准确率的有效方法。
network:
我们的检测系统叫Faster R-CNN,由两个模块组成。第一个模块是一个深度全卷积网络,用于产生候选区域,第二个模块是Fast R-CNN检测算子,来使用候选框。整个系统是一个简单、统一的目标检测网络(如图)。使用最近流行的基于注意力机制的神经网络,RPN模块告诉Fast R-CNN模块应该看哪里。在3.1章节,我们介绍候选框生成网络的设计和属性。3.2章节,我们开发训练具有共享特征的两个模块的算法。
RPN:
RPN将任意大小的图像作为输入,并输出一组矩形对象提议,每个提议具有对象分数(objectness score:“Objectness” measures membership to a set of object classes vs. background.)我们使用一个全卷积网络建模该过程,也就是本章节讲述的内容。因为我们的最终目标是与Fast R-CNN目标检测网络共享计算,我们假设两个网络共享一组共同的卷积层。在我们的实验中,我们研究了具有5个可共享卷积层的Zeiler和Fergus模型(ZF)以及具有13个可共享卷积层的Simonyan和Zisserman模型(VGG)。
为生成候选区域框,作者在最后一层共享卷积层输出的卷积特征图上滑动小的网络。这个小网络将输入卷积特征图上n×n大小的窗口作为输入。每个滑窗映射为低维特征(ZF模块的是256维, VGG模块的为512维,后连接ReLU)。特征被送给两个全连接层——边界框回归层(box-regression layer, reg)和边界框分类层(box-classification layer, cls)。我们在这篇文章中令n=3,注意(滑窗中像素)在输入图上的有效感受野很大(ZF和VGG的分别为171和228)。这个小网络在某一位置上的图解如所示。注意,由于小网络以滑窗形式操作,所有空间位置共享全连接层。该结构可以用nn的卷积层后接两个11的卷积层(分别用于回归和分类)很自然地实现。
锚点:
每个滑窗位置,我们同时预测多个候选框,每个位置候选框的最大数量表示为k。所以,回归层有4k个输出来编码k个box的坐标,分类层输出2k个得分来估计每个候选框是否为物体的概率。k个候选框作为k个参考框的参数,在这里我们称之为anchors。一个anchor位于滑窗的中心,关联一个尺度(scale)和一个长宽比(aspect ratio)。默认情况下,我们使用3个尺度和3个长宽比,每个滑窗位置共生成9个锚点(anchors)。对一个WH(一般约为2400)大小的卷积特征图而言,共有WH*k个锚点。
平移不变形:
就anchors本身和相对于anchors产生候选框的函数这两者而言,作者方法的一个重要属性是具有平移不变性。如果平移图像中的对象,则候选框也应该平移,并且同一函数应该能够在任一位置预测提案。这种平移不变属性在我们的方法中得到了保证。相比较而言,MultiBox使用k-means均值产生的800个锚点不具有平移不变性。因此MultiBox不能保证物体平移时,生成相同的候选框。
平移不变性还减小了模型大小。MultiBox有一个(4+1)×800维的全连接输出层,而作者的方法当k=9时,仅有(4+2)×9维的卷积输出层。结果是结果是,作者的输出层有2.8×10000个参数(512×(4+2)×9),比GoogleNet使用MultiBox时,MultiBox的输出层参数量6.11000000(1536(4+1)*800)少了两个数量级。如果考虑特征投影层,我们的候选框生成层的参数仍比MultiBox6的参数少一个数量级,因此PASCAL VOC等小数据集的过度拟合风险较小。
多尺度anchor作为回归参考:
我们设计的anchor提出了一种多尺度(和多种长宽比)的新颖方案。如图1所示,已经有两种流行的方法来进行多尺度预测。第一种方法是基于图像/特征金字塔,如DPM和基于CNN的方法如fast rcnn和overfate。在每个尺度上计算特征图(HOG或深度卷积特征)。该方法通常有效但是耗时。例如,在DPM中,使用不同大小的滤波器(如57和75)来训练不同长宽比的模型。如果用这种方法来解决多尺度,可以认为是“滤波器金字塔”。第二种方法通常级联在第一种方法后。
相比较而言,我们基于anchor的方法是建立在a pyramid of anchors上的,更加省时。我们的方法是参考多个不同尺度和长宽比的锚点框来分类和回归边界框的。它仅依赖单尺度的图像和特征图,使用单尺度的滤波器(在特征图上进行滑窗)。我们通过实验证明了该方案对解决多尺度和不同大小也有效。
由于基于anchor的这种多尺度设计,我们可以简单地使用在单尺度图像上计算出的卷积特征,就像Fast R-CNN检测器所做的那样。基于anchor的多尺度设计是在无需额外损失条件下共享特征解决尺度问题的关键部分。
损失函数:
训练RPN时,作者为每个anchor分配一个二分类标签(是或者不是物体)。我们为两种anchor设置一个正标签:
请注意,单个ground-truth box可以为多个anchor分配正标签。通常第二个条件足够判定正样本,但仍然采用第一个条件的原因是在极少数情况下,第二个条件可能无法找到正样本。如果与所有ground-truth box的IoU比率低于0.3,我们会为非正锚框分配负标签。那些既不是正样本也不是负样本的锚点不参与训练。
基于上述定义,作者将Fast R-CNN中的多任务损失函数最小化。本文对一幅图像的损失函数定义如下:
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\})=\frac{1}{N_cls}\sum_iL_{cls}(p_i,p_i^*)+\lambda\frac{1}{N_{reg}}\sum_ip_i^*L_{reg}(t_i,t_i^*)
L({pi},{ti})=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(ti,ti∗)
这里
i
i
i是批处理中anchor的索引,
p
i
p_i
pi是
i
i
i是一个物体的预测概率。当anchor是正标签,则ground truth
p
i
∗
\ p_i^*
pi∗为1,当anchor是负标签,则ground truth
p
i
∗
\ p_i^*
pi∗为0。
t
i
\ t_i
ti为预测边框的4个参数坐标的向量,
t
i
∗
\ t_i^*
ti∗是正标签anchor的ground truth边框坐标。分类损失函数
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是Fast R-CNN中定义的鲁棒损失函函数(smooth L1)。
p
i
∗
∗
L
r
e
g
\ p_i^**L_{reg}
pi∗∗Lreg表示仅对正标签的anchor(
p
i
∗
=
1
\ p_i^*=1
pi∗=1)计算回归损失,(
p
i
∗
=
0
\ p_i^*=0
pi∗=0)则不计算。cls和res层的输出分别由
{
p
i
}
\ \{p_i\}
{pi}和
{
t
i
}
\ \{t_i\}
{ti}组成。
两个因式使用
N
c
l
s
\ N_{cls}
Ncls和
N
r
e
g
\ N_{reg}
Nreg进行归一化,并通过平衡参数λ进行加权。当前实现中(Released代码),cls用最小批处理的大小进行归一化(
N
c
l
s
=
256
\ N_{cls}=256
Ncls=256),reg用anchor位置的数量进行归一化(
N
r
e
g
2400
\ N_{reg}~2400
Nreg 2400)。默认设置λ=10,这样cls和reg因式的权重大体相等。通过实验表明,结果对λ值在很大范围内不敏感。我们还注意到上述的归一化不是必须的,公式可以简化。
对于边界框回归,作者根据采用4个参数坐标:
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代表了框中心坐标和它的宽度和长度。
x
,
x
a
,
x
∗
\ x,x_a,x^*
x,xa,x∗分别代表了预测框,anchor框和ground truth框(
y
,
w
,
h
\ y,w,h
y,w,h同理)。这可以被认为是从anchor框到附近的ground truth框进行边界框回归。
然而,本文算法实现边界框回归的方式不同于之前基于ROI的算法。在SPPNet和Fast R-CNN中,对从任意大小RoIs池化得到特征图执行边界框回归,并且回归权重由所有大小区域共享。在我们的公式中,用于回归的特征在特征图上具有相同的空间大小(3*3)。为了考虑不同的大小,学习了一组k个边界框回归量。 每个回归量负责一个比例和一个宽高比,并且k个回归量不共享权重。因此,即使特征具有固定的尺寸/比例,仍然可以预测各种尺寸的框。
训练RPN:
RPN可以通过反向传播和随即梯度下降(SGD)进行端到端的训练。作者根据Fast R-CNN中图像为中心的采样策略来训练网络。来自单一图像的每个mini-batch都包含了正标签anchor和负标签anchor。对所有anchor的损失函数进行优化是可以的,但由于负样本占据多数,优化将会偏向负样本。因此我们改为从一幅图像中随机采样256个anchor来计算mini batch的损失函数,其中正负anchor的比例为1:1。如果图像中的正样本数少于128,则用负样本进行填充mini batch。
我们使用均值为0标准差为0.01的高斯分布随机初始化所有新增层。其他的层(共享卷积层))采用预训练的ImageNet 分类模型中的参数进行初始化。我们调整了ZF网络和VGG网络conv3_1及其以上的所有层来节省内存。我们使用PASCAL VOC数据集,对前60k的批单元使用0.001的学习率,紧接着的20k的批单元使用0.0001的学习率。使用0.9的动量和0.0005的权重衰减。
RPN和Fast rcnn共享特征:
到目前为止,我们已经描述了如何训练网络以生成候选框,而没有考虑基于区域的对象检测CNN将利用这些候选框。对于检测网络,我们采用的是Fast R-CNN。接下来我们描述一个学习到统一算法的网络,这个网络由RPN和Fast R-CNN共享卷积层组成。
独立训练的RPN和Fast R-CNN通过不同的方式改变它们的卷积层。因此我们需要开发允许两个网络共享卷积层的技术,而不是学习两个分开的网络。我们探讨三种拥有共享特征网络的训练方法:
实现细节:
我们在单尺度图像上对候选框和检测网络都进行了训练和测试。我们对图像进行了缩放,使其短边s=600像素。尺度特征提取(使用图像金字塔)可能提高准确性,但是没能很好地平衡速度和准确性。在缩放后的图,ZF和VGG网络在最后一个卷积层的总步长为16个像素,缩放前(大约500×375分辨率的图)PASCAL典型图的步长为10个像素(600/16=375/10)。即使大步长会有好的结果,但使用小步长可能进一步提高准确性。
对于anchor来说,作者使用128×128,256×256,512×512共3个尺度框的面积和1:1,1:2, 2:1共3个长宽比。这些超参不是针对特殊的数据集选择的,下章节作者通过剥离(ablation)实验说明其影响。正如上文讨论的那样,作者的方案不需要图像金字塔或滤波器金字塔来预测多尺度的区域,节省了可观的运行时间。下图展示了算法对不同尺度和长宽比(图像的检测)能力。
下表表明使用ZF网络时每个anchor的平均生成大小。作者注意到其算法允许预测出比底层感受野更大的物体。这种预测不是不可能的——只有物体的中间部分可见时,仍然可以推断物体的范围。
跨越图像边界的anchor box需要小心处理。训练时,作者忽视所有跨越边界的anchor ,因此他们对损失函数没有影响。对于一个典型的1000600的图像而言,总共大约有20000(6040*9)个anchor 。忽略跨越边界框的anchor ,每张图大约有6000个anchor 用于训练。如果训练时没有忽略离群的边界框,它们会在目标中产生大的、难以纠正的错误,训练将不会收敛。然而测试时,仍然对整个图像使用全卷积的RPN。这可能会产生跨越边界的框,此时(将其)裁剪至图像边界。
一些RPN产生的候选框之间高度重叠。为减少冗余,作者基于分类得分,对候选框采用非最大值抑制(NMS)处理。作者规定NMS的阈值为0.7,这样每张图留下大约2000个候选区域。正如将要展示的,NMS没有伤害最终的检测准确性,但大幅度减少了候选框的数量。NMS处理后,作者利用排名前N的候选框用于检测。后文中,作者利用2000个RPN候选框训练Fast R-CNN,但是测试时评测不同数量的候选框。
结论:
作者提出RPN用于生成高效,准确的候选框。通过和下游检测网络共享卷积,候选框步骤(时间上)几乎无成本。作者的方法使得一个统一的、基于深度学习的物体检测系统运行时几乎达到实时的帧率。学习出来的RPN也提高了候选框的质量并(提高了)整‘’体检测的准确性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。