Fast R-CNN阅读笔记
一、解决问题
当前的方法采用多级流水线(卷积、SVM、位置回归都分别单独训练)的方式训练模型,既慢且精度不高。
二、解决方法
使用多任务损失的单阶段训练算法,联合学习候选框分类和修正他们的空间位置。
(一)结构和流程
Fast R-CNN网络将整个图像和一组候选框(通过SS算法在原图中得出候选框,在经过计算得出候选框在特征图中的位置,有其左上角坐标(r,c)及其高度和宽度(h,w)的四元组(r,c,h,w)定义)作为输入。网络首先使用几个卷积层(conv)和最大池化层来处理整个图像,以产生卷积特征图。然后,通过**RoI池化层(可以看做一种经过简化的特殊SPP层)**对于每个候选框从特征图中对应的部分提取固定长度的特征向量。每个特征向量被送入一系列全连接层中,其最终分支成两个同级输出层 :一个输出K个类别加上1个背景类别的Softmax概率估计,另一个为K个类别的每一个类别输出四个实数值(4个值表示K=K个类别的一个类别的检测框位置的修正)。如下图。
(二)具体细节
1.ROI池化层
RoI池化层使用最大池化将任何有效的RoI内的特征转换成具有H×W(例如,7×7)的固定尺度的小特征图。RoI最大池化通过将大小为h×w的RoI窗口分割成H×W个网格,子窗口大小约为h/H×w/W,然后对每个子窗口执行最大池化,并将输出合并到相应的输出网格单元中。同标准的最大池化一样,池化操作独立应用于每个特征图通道。RoI层只是SPP-net中使用的空间金字塔池层的特殊情况,其只有一个金字塔层。
2.使用预训练卷积初始化fast R-CNN网络
当使用预训练网络初始化fast R-CNN网络时,要经历三个变换:
1.最后的最大池化层由RoI池层代替,其将H和W设置为与网络的第一个全连接层兼容的配置(例如,对于VGG16,H=W=7)。
2.网络的最后一格全连接层和Softmax(其被训练用于1000类ImageNet分类)被替换为前面描述的两个同级层(全连接层和K+1个类别的Softmax以及类别对应的检测框回归)。
3.网络被修改为采用两个数据输入:图像的列表和这些图像中的RoI的列表。
3.微调(没有理解明白)
用反向传播训练所有网络权重是Fast R-CNN的重要能力。首先说明为什么SPP-net无法更新空间金字塔池化层之前的卷积层权重。
根本原因是当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播是非常低效的,这是由训练R-CNN和SPPnet网络的方法导致的。
低效的部分是因为每个RoI可能具有非常大的感受野,通常跨越整个输入图像。由于正向传播必须处理整个感受野,训练输入很大(通常是整个图像)。
我们提出了一种更有效的训练方法,通过image-centric sampling的方式对训练期间的特征共享。在Fast RCNN网络训练中,随机梯度下降(SGD)的小批量是被分层采样的,首先采样N个图像,然后从每个图像采样R/N个RoI。关键的是,来自同一图像的RoI在向前和向后传播中共享计算和内存。减小N,就减少了小批量的计算。例如,当N=2和R=128时,得到的训练方案比从128幅不同的图采样一个RoI(即R-CNN和SPPnet的策略)快64倍。
这个策略的一个令人担心的问题是它可能导致训练收敛变慢,因为来自相同图像的RoI是相关的。这个问题似乎在实际情况下并不存在,当N=2和R=128时,我们使用比R-CNN更少的SGD迭代就获得了良好的结果。
除了分层采样,Fast R-CNN使用了一个精细的训练过程,在微调阶段联合优化Softmax分类器和检测框回归,而不是分别在三个独立的阶段训练softmax分类器(为了训练卷积层),SVM和回归器。
4.损失函数
(1)分类损失函数
交叉熵损失函数。因为标签是one-hot形式,所以只由真实类别u对应的softmax结果概率觉得。 L c l s ( p , u ) = − l o g p u L_{cls}(p,u)=-logp_{u} Lcls(p,u)=−logpu
(2)位置回归损失函数
smooth L1损失函数,比较真实分类u对应的预测平移缩放参数
t
u
=
(
t
u
x
,
t
u
y
,
t
u
w
,
t
u
h
)
t_{u}=(t_{ux},t_{uy},t_{uw},t_{uh})
tu=(tux,tuy,tuw,tuh) 和真实平移缩放参数
v
=
(
v
x
,
v
y
,
v
w
,
v
h
)
v=(v_{x},v_{y},v_{w},v_{h})
v=(vx,vy,vw,vh) 的差距:
L
l
o
c
(
t
u
,
v
)
=
∑
i
∈
x
,
y
,
w
,
h
s
m
o
o
t
h
L
1
(
t
u
i
−
v
i
)
L_{loc}(t_{u},v)=∑_{i∈{x,y,w,h}}smooth_{L1}(t_{ui}−v_{i})
Lloc(tu,v)=i∈x,y,w,h∑smoothL1(tui−vi)
s
m
o
o
t
h
L
1
(
x
)
=
{
(
x
)
=
0.5
x
2
,
∣
x
∣
<
1
∣
x
∣
−
0.5
,
o
t
h
e
r
w
i
s
e
s
smooth_{L1}(x)= \begin{cases} \mathcal(x)=0.5x^{2}, &\text{$|x|<1$}\\ \mathcal|x|−0.5, &\text{$otherwises $} \end{cases}
smoothL1(x)={(x)=0.5x2,∣x∣−0.5,∣x∣<1otherwises
(3)总体损失函数
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) + λ[u ≥ 1]L_{loc}(t u ,v) L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)当u=0时(背景)λ=0,即识别为背景的情况下,位置回归不参与损失函数计算。当u=1,2,3,…,k(第1,2,3,…,k类)时,λ=1。
5.奇异值分解(SVD)
图像分类任务中,用于卷积层计算的时间比用于全连接层计算的时间多,而在目标检测任务中,selective search算法提取的建议框比较多(约2k),几乎有一半的前向计算时间被花费于全连接层,就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次计算,因此在Fast R-CNN中可以采用SVD分解加速全连接层计算。
在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层不含偏置,第二个全连接层含偏置。
实验表明,SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度。
三、效果
Fast R-CNN训练VGG16网络比R-CNN快9倍,测试时间快213倍,并在PASCAL VOC上得到更高的精度。
Fast R-CNN训练VGG16网络比SPP-net快3倍,测试速度快10倍,并且更准确。