Fast R-CNN简介
\space\space\space\space\space\space
从名字可以看出,Fast R-CNN是在前一代R-CNN的基础上,提出的更快、精度更高的网络。R-CNN的缺点如下:
1.训练过程是多阶段的;R-CNN的训练分为三个阶段:a.用ImageNet的分类数据预训练卷积网络,然后拿检测的数据进行微调,来得到一个经过训练的CNN;b.用训练好的CNN去掉softmax层(即原网络倒数第二层)的特征向量为每一个类训练一个SVM分类器;c.用特征向量训练Bounding box 回归器。
2.训练不仅耗时,而且耗费存储空间;训练SVM分类器和Bounding box 回归器都需要前一步CNN倒数第二层的特征向量,所以要将每一张图的每一个候选区对应的特征向量存储到硬盘中,这样,CNN得到特征向量所需的时间以及存储所带来的时间和空间的消耗都是很大的。
3.测试的时候也很耗时。测试的时候,每一张图都会生成2000个候选区域,每一个区域都要依次经网络预测。
\space\space\space\space\space\space
SPPnet在一定程度上改进了R-CNN。相比于R-CNN每张图生成2000个候选区域分别提取特征,SPPnet直接将整张图送入网络提取特征,然后再在最后的feature map上提取候选区域的特征向量。这样减少了很多重复计算(重叠区域重复提取特征)。但它仍然有很多与R-CNN相同的缺点,比如多阶段等。SPPnet在微调CNN时,固定了卷积层的权值,只微调了全连接层,这在一定程度上限制了SPPnet的精度。
Fast R-CNN细节
\space\space\space\space\space\space
网络结构如下图所示。
\space\space\space\space\space\space
与SPPnet一样,Fast R-CNN先将整张图送入网络得到feature map,然后用selective search在原图中生成候选区域后,将它们投影到feature map上,取得对应feature map上的区域;然后将对应feature map上的区域经过RoI pooling转换为固定大小的feature map,再经全连接层生成特征向量;特征向量流入两个分支:其中一个分支是对特征向量对应候选区域的分类分支(一共k个类+1个背景类);另一个分支是对候选区域(k类中的某一类,背景不参与回归)坐标的回归。
RoI pooling
\space\space\space\space\space\space
RoI pooling过程如下所示。feature map左下角h
×
\times
×w(5x7)的区域是候选区域对应的特征图上的区域,我们最终想把它转换为H
×
\times
×W(2x2)的区域来生成固定大小的特征向量。首先将h
×
\times
×w(5x7)均分为H
×
\times
×W(2x2)个子窗口,每个窗口大小近似为h/H
×
\times
×w/W;然后每个子窗口取最大值(max pooling);在候选区域对应的feature map的每一个通道独立的进行上述RoI pooling;最终得到H
×
\times
×W
×
\times
×C的feature map。
预训练CNN模型用于Fast R-CNN
\space\space\space\space\space\space 与R-CNN相同,Fast R-CNN先将卷积网络用ImageNet分类数据预训练,然后对CNN作三处改动:1.最后一个max pooling层替换为RoI pooling层;2.最后一个全连接层(对应ImageNet1000类的输出)替换为分类和回归两个分支;3.能够接收图像以及图像对应的候选区域这两个输入。
预训练后微调CNN
\space\space\space\space\space\space
R-CNN以及SPPnet微调网络的时候,每一个mini-batch中的RoI都来自不同的图片,有的RoI可能感受野很大,这样同一张图片不同RoI可能会有很多重叠部分。当不同mini-batch中有来自相同图片的不同RoI时,就会重复计算重叠部分的特征,所以效率很低。
\space\space\space\space\space\space
Fast R-CNN利用相同图片的RoI之间特征重叠的特点,每个mini-batch每次选取N张图片(N很小),每张图片选取R/N个RoI,即选取少量图片通过CNN,然后在每张图片中选取大量RoI,避免CNN重复计算。文章中设置N=2,R=128。所以,相比每次在128张不同的图片中选取128个RoI,在两张图片中选取128个RoI更高效。
\space\space\space\space\space\space
在每个mini-batch中,25%的RoI是和ground truth有0.5以上的交并比(IoU),这些RoI的类别就是ground truth的类别;剩余75%的RoI,挑选和ground truth的IoU在[0.1,0.5)之间的,这些作为背景类。
多任务loss
\space\space\space\space\space\space
相比R-CNN多阶段训练分类和回归,Fast R-CNN在微调CNN时,直接将CNN生成的特征拿去训练后续的分类和回归两个分支,实现了用一个阶段就完成分类和回归。所以需要一个特殊的loss来在一个阶段完成两个任务。loss如下所示:
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\geq1]L_{loc}(t^u,v)
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)其中,
1.
p
=
(
p
0
,
.
.
.
,
p
k
)
p=(p_0,...,p_k)
p=(p0,...,pk)是网络对候选区域分类的输出,
u
u
u是候选区域对应的类别标签,loss的第一部分
L
c
l
s
(
p
,
u
)
=
−
l
o
g
p
u
L_{cls}(p,u)=-logp_u
Lcls(p,u)=−logpu是多分类的交叉熵损失函数;
2.
L
l
o
c
(
t
u
,
v
)
L_{loc}(t^u,v)
Lloc(tu,v)是关于bounding-box回归的损失函数,具体地,设ground truth的框的位置为
G
=
(
G
x
,
G
y
,
G
w
,
G
h
)
G=(G_x,G_y,G_w,G_h)
G=(Gx,Gy,Gw,Gh),候选区域的位置为
P
=
(
P
x
,
P
y
,
P
w
,
P
h
)
P=(P_x,P_y,P_w,P_h)
P=(Px,Py,Pw,Ph),其中四元组前两个元素是边框中心点坐标,后两个元素是边框的长和宽。那么候选区域与ground truth之间的偏移为
v
=
(
v
x
,
v
y
,
v
w
,
v
h
)
v=(v_x,v_y,v_w,v_h)
v=(vx,vy,vw,vh),其中
v
x
=
G
x
−
P
x
P
w
,
v
y
=
G
y
−
P
y
P
h
,
v
w
=
l
o
g
(
G
w
P
w
)
,
v
h
=
l
o
g
(
G
h
P
h
)
v_x=\dfrac{G_x-P_x}{P_w},v_y=\dfrac{G_y-P_y}{P_h},v_w=log(\dfrac{G_w}{P_w}),v_h=log(\dfrac{G_h}{P_h})
vx=PwGx−Px,vy=PhGy−Py,vw=log(PwGw),vh=log(PhGh)。对于每一个类
u
u
u,网络都会预测一个对应的偏移量为
t
u
=
(
t
x
u
,
t
y
u
,
t
w
u
,
t
h
u
)
t^u=(t_x^u,t_y^u,t_w^u,t_h^u)
tu=(txu,tyu,twu,thu)。所以
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\limits_{i\in\{x,y,w,h\}}smooth_{L1}(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
if
∣
x
∣
<
1
∣
x
∣
−
0.5
otherwise
smooth_{L1}(x)=\begin{cases} 0.5x^2 &\text{if } |x|<1 \\ |x|-0.5 &\text{otherwise } \end{cases}
smoothL1(x)={0.5x2∣x∣−0.5if ∣x∣<1otherwise
相比R-CNN和SPPnet用L2 loss,smooth L1 loss对异常点更不敏感。
3.
[
u
≥
1
]
=
{
1
if
u
≥
1
0
otherwise
[u\geq1]=\begin{cases} 1 &\text{if } u\geq1 \\ 0 &\text{otherwise } \end{cases}
[u≥1]={10if u≥1otherwise
也就是说,当对应标签是0,即候选区域中是背景时,忽略它与ground truth偏移的回归结果。
4. λ \lambda λ是一个超参数,用来平衡分类与回归之间的loss。
RoI pooling层的反向传播
RoI pooling层对输入的导数如下式所示。
∂
L
∂
x
i
=
∑
r
∑
j
[
i
=
i
∗
(
r
,
j
)
]
∂
L
∂
y
r
,
j
\dfrac{\partial L}{\partial x_i}=\sum\limits_{r}\sum\limits_{j}[i=i^*(r,j)]\dfrac{\partial L}{\partial y_{r,j}}
∂xi∂L=r∑j∑[i=i∗(r,j)]∂yr,j∂L
其中
x
i
x_i
xi是RoI对应特征图feature map的第i个元素;
y
r
,
j
y_{r,j}
yr,j是第r个RoI的输出中的第j个元素;如果
y
r
,
j
y_{r,j}
yr,j对应原特征图上的
x
i
x_i
xi这一点,即
i
=
i
∗
(
r
,
j
)
i=i^*(r,j)
i=i∗(r,j),则累加loss对
y
r
,
j
y_{r,j}
yr,j的偏导,直到累加完所有mini-batch中的
y
r
,
j
y_{r,j}
yr,j,它们都对应
x
i
x_i
xi这一点。所以loss对
x
i
x_i
xi这一点的偏导数就是loss对对应输出
y
r
,
j
y_{r,j}
yr,j的偏导和。具体过程如下图所示。
图像尺度不变性
文章使用了两种方法来实现尺度不变性。
(1)暴力法:直接将所有图片resize到固定大小。
(2)图像金字塔(由于使用RoI pooling,网络可以输入任意尺寸的图片):训练的时候,对于每张图片,在不同金字塔尺寸中随机选择一种尺寸送到网络中(也起到数据增强的效果);预测的时候,图像金字塔用来对每个候选区域近似实现缩放标准化。
用奇异值分解来加速
\space\space\space\space\space\space
每一张图都包含大量RoI,所以经过卷积后,会有大量特征向量输送到后面的全连接层,以至于全连接层这部分的计算会耗费大量时间。所以论文用奇异值分解(
W
≈
U
∑
t
V
T
W\approx U\sum_tV^T
W≈U∑tVT)压缩全连接层来减少全连接层的计算时间。具体做法是,将原来一个
u
×
v
u\times v
u×v的全连接层
W
(
u
×
v
)
W(u\times v)
W(u×v),分解为两个全连接层
U
(
u
×
t
)
U(u\times t)
U(u×t)和
∑
t
V
T
(
t
×
v
)
\sum_tV^T(t\times v)
∑tVT(t×v),如下图所示,其中分解后的中间层z没有非线性激活函数。这样全连接层的权值由
u
×
v
u\times v
u×v减小到
t
(
u
+
v
)
t(u+v)
t(u+v)。当
t
t
t远小于
m
i
n
(
u
,
v
)
min(u,v)
min(u,v)时效果更明显。
Fast R-CNN主要的改进
相比于R-CNN于SPPnet
1.将多阶段改进为单阶段,即一个阶段就可以完成分类和回归两个任务。这样就不用存储特征向量,节省了存储空间和训练时间。
2.相比于R-CNN将候选区域依次送入网络,Fast R-CNN将整张图先送入网络提取特征,再在特征图上找到候选区域对应的区域,避免了重复计算。
3.利用RoI pooling,突破网络输入对于图像尺寸的限制。
4.用奇异值分解全连接层,节省计算时间。
论文地址:Fast R-CNN