Fast R-CNN
Ross Girshick
摘要
本文提出了 Fast R-CNN 作为目标检测的算法。与之前的目标检测算法相比, Fast R-CNN有着创新性的改进,提高了训练与测试的速度,同时也提升了检测正确率。
简介
当前的目标检测算法为多阶段的算法,其速度较慢而且不都优雅。存在着两个挑战:(1)需要处理大量的候选目标的定位;(2)这些目标只是被粗略的标记了出来,需要进一步的调整来达到更精确的定位。目前面向这些问题的解决方案往往需要在速度,准确率,或简易性上作出妥协与让步。
本文提出的算法为单阶段训练算法。对目标候选区域的分类与回归定位进行了共同学习。
回顾
R-CNN与SPP net算法的弊端:
前任算法R-CNN的弊端:
(1)多阶段的训练:使用log loss对CNN的目标候选进行训练,然后使用SVM,取而代之softmax分类器,进行特征分类,第三阶段对边框回归器进行训练。
(2)训练十分耗费时间与空间:对于SVM与边框回归器的训练,需要把每个目标候选区的特征进行提取并写入磁盘中,若使用深度网络(如VGG16),对于5k images of the VOC07这样的数据集将耗费2.5 GPU-days,并耗费数百GB的磁盘空间。
(3)目标检测十分缓慢:使用VGG16网络进行目标检测,每张图像需47s运行时间。
R-CNN之所以如此缓慢,是由于它为每一个候选区都进行了前向计算,而没有进行共享计算,SPP池化通过共享计算加速了R-CNN。
SPPnet为整个输入图像计算了卷积特征图,然后使用提取自共享特征图的特征向量来对每个目标候选区进行分类。
SPP-net的弊端:多阶段算法(特征提取,微调,SVM,边框回归各自训练),与R-CNN不同,SPPnet无法更新SPP池化之前的卷积层,这限制了深度网络的准确度。
Fast R-CNN
优点:
(1)更高的检测正确率(mAP)。
(2)单阶段训练,使用一个多任务的损失函数。
(3)训练可更新所有层。
(4)无需为特征缓存提供硬盘空间。
结构与训练
将带有一系列目标候选区的输入图像输入至网络,经过若干层卷积层与池化层后,得到一个卷积特征图,对于特征图上对应于目标的候选区域,使用ROI 池化层将其提取出一个固定大小的特征图,然后通过全连接层将其映射成一个特征向量。每个特征向量将输入到一系列全连接层,最终分支输出为两个姊妹输出层:一个输出层产生出各个类别的softmax概率,评估K个目标类加上一个“背景”类的概率。另一个输出层输出4个实数,为K类中每一类的边框回归修正值。
RoI pooling层
RoI pooling层使用max pooling将RoI的特征图转化为一个更小的特征图(大小为
H
∗
W
H *W
H∗W)每个RoI边框通过一个四元组
(
r
,
c
,
h
,
w
)
(r,c,h,w)
(r,c,h,w)来确定,
(
r
,
c
)
(r,c)
(r,c)为边框左上角的坐标,
(
h
,
w
)
(h,w)
(h,w)为边框的长和宽。
RoI max pooling将
h
∗
w
h*w
h∗w的RoI划分为
H
∗
W
H*W
H∗W个网格的子窗口(大小为
h
/
H
∗
w
/
W
h/H*w/W
h/H∗w/W)。然后对每个子窗口内的值进行max pooling。RoI max pooling将在特征图的每一个通道上独立进行,RoI max pooling如同SPP池化的一个特例,只不过它只有一个金字塔层级。
损失函数
Fast R-CNN有两个姊妹输出层:第一个输出描述了每个RoI的
K
+
1
K+1
K+1个类别的概率分布
p
=
(
p
0
,
.
.
.
,
p
K
)
p=(p_0,...,p_K)
p=(p0,...,pK),由
K
+
1
K+1
K+1个输出的全连接层接连的softmax层计算得出。第二个输出层输出为边框回归的偏移量:
t
k
=
(
t
x
k
,
t
y
k
,
t
w
k
,
t
h
k
)
t^k=(t^k_x,t^k_y,t^k_w,t^k_h)
tk=(txk,tyk,twk,thk)。每个RoI标注有一个真实类别
u
u
u与一个真实边框回归目标
v
v
v。对于每个标注的RoI使用多任务的损失函数
L
L
L,共同训练目标分类与边框回归。
L
(
p
,
u
,
t
u
.
v
)
=
L
c
l
s
(
p
,
u
)
+
λ
[
u
≥
1
]
L
l
o
c
(
t
u
,
v
)
L(p,u,t^u.v)=L_{cls}(p,u)+\lambda [u\ge 1]L_{loc}(t^u,v)
L(p,u,tu.v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
其中
L
c
l
s
(
p
,
u
)
=
−
l
o
g
P
u
L_{cls}(p,u)=-log P_u
Lcls(p,u)=−logPu为正确类别
u
u
u的log loss。
定位损失函数
L
l
o
c
L_{loc}
Lloc通过类别
u
u
u的边框回归目标
v
=
(
v
x
,
v
y
,
v
w
,
v
h
)
v=(v_x,v_y,v_w,v_h)
v=(vx,vy,vw,vh)以及预测回归偏移的
t
u
=
(
t
x
u
,
t
y
u
,
t
w
u
,
t
h
u
)
t^u=(t^u_x,t^u_y,t^u_w,t^u_h)
tu=(txu,tyu,twu,thu)来定义。
式中
λ
[
u
≥
1
]
\lambda [u\ge 1]
λ[u≥1]意味着当
u
≥
1
u\ge 1
u≥1时,
λ
=
1
\lambda=1
λ=1,否则
λ
=
0
\lambda=0
λ=0,因此通过约定背景类
u
=
0
u=0
u=0,其
λ
=
0
\lambda=0
λ=0,故背景类的定位损失
L
l
o
c
L_{loc}
Lloc可以被忽略。
对于边框回归,定位损失函数定义为:
L
l
o
c
(
t
u
,
v
)
=
∑
i
∈
(
x
,
y
,
w
,
h
)
S
m
o
o
t
h
L
1
(
t
i
u
−
v
i
)
L_{loc}(t^u,v)=\sum_{i\in(x,y,w,h)}Smooth_{L_1}(t^u_i-v_i)
Lloc(tu,v)=i∈(x,y,w,h)∑SmoothL1(tiu−vi)
其中:
S
m
o
o
t
h
L
1
(
x
)
=
{
0.5
x
2
∣
x
∣
<
1
∣
x
∣
−
0.5
o
t
h
e
r
Smooth_{L_1}(x)=\left\{ \begin{array}{rcl} 0.5x^2 & & {\left|x\right| < 1}\\ \left|x\right|-0.5 & & {other} \end{array} \right.
SmoothL1(x)={0.5x2∣x∣−0.5∣x∣<1other
SGD最小批
在训练期间,每个SGD最小批有N=2张图像构成。R=128,从每批图像中采样出 R / N = 64 R/N=64 R/N=64个RoI,从其中抽取出25%的RoI,它们需要与真实边框的IoU至少为0.5.这些RoI使用前景类 u ≥ 1 u\ge1 u≥1来标注。剩下的RoI,其与真实边框的IoU处于 [ 0.1 , 0.5 ) [0.1,0.5) [0.1,0.5)区间,将它们看着背景样本,并标记为 u = 0 u=0 u=0,训练时图像将以0.5的概率被进行随机水平翻转,无其他数据增强方式。
截断SVD
对于整图分类,全连接层计算花费的时间少于卷积层。而大型的全连接层可以通过截断SVD技术进行加速计算。
一个
u
∗
v
u*v
u∗v的权重矩阵
W
W
W,可以近似为
W
≈
U
Σ
t
V
T
W \approx U\Sigma_t V^T
W≈UΣtVT,
U
U
U为
u
∗
t
u*t
u∗t型的矩阵,
Σ
t
\Sigma_t
Σt为
t
∗
t
t*t
t∗t型的对角矩阵,V为
v
∗
t
v*t
v∗t型的矩阵。截断SVD可以使全连接层参数的数量从
u
v
uv
uv减少至
t
(
u
+
v
)
t(u+v)
t(u+v),并且如果
t
t
t远小于
m
i
n
(
u
,
v
)
min(u,v)
min(u,v)时,效果将会十分显著。为了压缩网络,权重为
W
W
W的全连接层可以替换为两个全连接层,并且其之间无需非线性层。其中第一层权重为
Σ
t
V
T
\Sigma_t V^T
ΣtVT,第二层权重为
U
U
U。当RoI的数量较多时,这种压缩大可以大加速算法。