一、基本信息
标题:Fast R-CNN
时间:2015
论文领域:物体检测
引用格式:Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE international conference on computer vision. 2015.
二、研究背景
R-CNN是多阶段模型,需要使用Selective Search选择proposals,然后对每个proposals进行resize,卷积,全连接。可以发现缺点就是每个proposal都需卷积,而且尺寸固定。Fast R-CNN了借鉴SPPnet的空间金字塔池化层思想,但是解决了SPPNet对卷积层进行后向传播效率太低的缺点
SPPNet原理就是利用ROI池化层将CNN的输入从固定尺寸改为任意尺寸,通过最大池化层,可以将任意宽度的、高度的卷积特征转换成固定长度的向量,原始图像中的候选框,实际也可以对应到卷积特征中相同位置的框。利用SPP层可以将不同形状的特征对应到相同长度的向量特征。与R-CNN相比比,SPPNet具有更快的速度。但是SPPNet难以(效率低)对SPP层下面所有的卷积层进行后向传播:
严格说,SPP-Net也可以反向传播,但是会复杂很多,所以用connot update the convolutional layers其实是不算太准确的说法。Ross大神在Fast R-CNN中给出的解释是:SPP训练样本来自不同图像导致反向传播效率低下。我的理解是:SPP-Net中fine-tuning的样本是来自所有图像的所有RoI打散后均匀采样的,即RoI-centric sampling,这就导致SGD的每个batch的样本来自不同的图像,需要同时计算和存储这些图像的Feature Map,过程变得expensive. Fast R-CNN采用分层采样思想,先采样出N张图像(image-centric sampling),在这N张图像中再采样出R个RoI,具体到实际中,N=2,R=128,同一图像的RoI共享计算和内存,也就是只用计算和存储2张图像,消耗就大大减少了。
作者:知乎用户
链接:https://www.zhihu.com/question/66283535/answer/275678219
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、创新点
主要是2点 ROI Pooling layer 和 Multi-task loss
ROI池化层
可以看到先对原图进行卷积,得到卷积层,在将Selective Search选择的proposals对应到卷积层。由于proposal尺寸不一样,需要进行RoI pooling,比如下面是卷积层:
有一个proposals:
划分网格,paper里设置的是7 * 7,下图是2 * 2:
每个网格选最大值(max pooling一个意思):
动画:
和SPP对比,就是只有一层(尺度)的SPP
Multi-task loss
proposals给出bbox是粗糙的,还需要细化,R-CNN是直接再训练一个模型专门用于检测bbox,而Fast R-CNN是把这个任务加入到类别检测里了,组成了Multi-task loss:
L
(
p
,
u
,
t
u
,
v
)
=
L
c
l
s
(
p
,
u
)
+
λ
[
u
≥
1
]
L
l
o
c
(
t
u
,
v
)
L\left(p, u, t^{u}, v\right)=L_{\mathrm{cls}}(p, u)+\lambda[u \geq 1] L_{\mathrm{loc}}\left(t^{u}, v\right)
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
其中,
真实类标为
u
u
u
类标为
u
u
u的bbox区域:
v
=
(
v
x
,
v
y
,
v
w
,
v
h
)
v = \left(v_{\mathrm{x}}, v_{\mathrm{y}}, v_{\mathrm{w}}, v_{\mathrm{h}}\right)
v=(vx,vy,vw,vh)
预测的结果为:
p
=
(
p
0
,
…
,
p
K
)
p=\left(p_{0}, \ldots, p_{K}\right)
p=(p0,…,pK),包括背景有K+1类
预测的bbox位置:
t
u
=
(
t
x
u
,
t
y
u
,
t
w
u
,
t
h
u
)
t^{u}=\left(t_{\mathrm{x}}^{u}, t_{\mathrm{y}}^{u}, t_{\mathrm{w}}^{u}, t_{\mathrm{h}}^{u}\right)
tu=(txu,tyu,twu,thu)
分类损失
L c l s ( p , u ) = − log p u L_{\mathrm{cls}}(p, u)=-\log p_{u} Lcls(p,u)=−logpu是个log形式的损失函数,即对真实分类的概率取负log
理解log损失(交叉熵损失)
就是og(真实类对应输出的概率乘)再取负号
bbox预测损失
[
u
≥
1
]
[u\ge1]
[u≥1]为1,反之为0。文中实验时
λ
=
1
\lambda=1
λ=1。
L
l
o
c
(
t
u
,
v
)
=
∑
i
∈
{
x
,
y
,
w
,
h
}
smooth
L
1
(
t
i
u
−
v
i
)
L_{\mathrm{loc}}\left(t^{u}, v\right)=\sum_{i \in\{\mathrm{x}, \mathrm{y}, \mathrm{w}, \mathrm{h}\}} \operatorname{smooth}_{L_{1}}\left(t_{i}^{u}-v_{i}\right)
Lloc(tu,v)=i∈{x,y,w,h}∑smoothL1(tiu−vi)
其中
smooth
L
1
(
x
)
=
{
0.5
x
2
if
∣
x
∣
<
1
∣
x
∣
−
0.5
otherwise
\operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{ll} 0.5 x^{2} & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise } \end{array}\right.
smoothL1(x)={0.5x2∣x∣−0.5 if ∣x∣<1 otherwise
文中认为
L
1
L_{1}
L1对于噪点相比于
L
2
L_{2}
L2更不敏感,所以使用
L
1
L_{1}
L1正则的模型更为鲁棒。就是一个类似reverse Huber (berHu)的损失,在笔记有介绍
Fast R-CNN核心就上面2个内容,下面补充些paper东西
Fast R-CNN算法步骤:
feature_maps = process(image)
ROIs = region_proposal(feature_maps)
for ROI in ROIs
patch = roi_pooling(feature_maps, ROI)
class_scores, box = detector(patch)
class_probabilities = softmax(class_scores)
来源:这里
Mini-batch sampling
Fast R-CNN采用分层采样思想,先采样出N张图像(image-centric sampling),在这N张图像中再采样出R个RoI,具体到实际中,N=2,R=128,同一图像的RoI共享计算和内存,也就是只用计算和存储2张图像,消耗就大大减少了。解决的就是SPPNet中RoI-centric sampling导致反向传播卷积层效率低下问题。
我的理解是Fast R-CNN的sampling方式改了下,那SPPNet也改成这种sampling是不是也能方向传播到卷积层呢?
Back-propagation through RoI pooling layers
反向传播关键在ROI层,对每个proposals的网格做如下判断,
x
i
x_i
xi中的i是否对应当前,换句话说就是
[
i
=
i
∗
(
r
,
j
)
]
[i=i^{*}(r,j)]
[i=i∗(r,j)]表示i节点是否被候选区域r的第j个节点选为最大值输出。如果是就累加下一个proposals,这样就求出
∂
L
∂
x
i
\frac{\partial L}{\partial x_{i}}
∂xi∂L
剩余内容还有尺度不变性、SVD全连接层加速、、、没时间补了
四、实验结果
提升很多,,
Fast R-CNN在VOC12上获得最高结果,mAP为65.7%(加上额外数据为68.4%)
五、结论与思考
作者结论
微调哪些层?
对于在SPPnet论文中考虑的不太深的网络,仅微调全连接层似乎足以获得良好的精度。我们假设这个结果不适用于非常深的网络。为了验证微调卷积层对于VGG16的重要性,我们使用Fast R-CNN微调,但冻结十三个卷积层,以便只有全连接层学习。这种方式模拟单尺度SPPnet训练,将mAP从66.9%降低到61.4%(表5)。这个实验验证了我们的假设:通过RoI池化层的训练对于非常深的网是重要的。
这是否意味着所有卷积层应该微调?没有。在较小的网络(S和M)中,我们发现conv1(第一个卷积层)是通用的和任务独立的(一个众所周知的事实1)。允许conv1学习或不学习,对mAP没有很有意义的影响。对于VGG16,我们发现只需要更新conv3_1及以上(13个卷积层中的9个)的层。这种观察是实用的:(1)从conv2_1更新使训练变慢1.3倍(12.5小时对比9.5小时)和(2)从conv1_1更新GPU内存不够用。当从conv2_1学习时mAP仅为增加0.3个点(表5,最后一列)。 所有Fast R-CNN在本文中结果都使用VGG16微调层conv3_1及以上的层,所有实验用模型S和M微调层conv2及以上的层。
SVM分类是否优于Softmax?
一句话:Softmax略优于SVM,mAP分别提高了0.1和0.8个点
更多的候选区域更好吗?
我们发现mAP上升,然后随着候选区域计数增加而略微下降(图3,实线蓝线)。这个实验表明,用更多的候选区域没有帮助,甚至稍微有点伤害准确性。
总结
本文提出Fast R-CNN,一个对R-CNN和SPPnet干净,快速的更新。 除了报告目前的检测结果之外,我们还提供了详细的实验,希望提供新的见解。 特别值得注意的是,稀疏目标候选区域似乎提高了检测器的质量。 过去探索这个问题过于昂贵(在时间上),但Fast R-CNN使其变得可能。当然,可能存在允许密集盒执行以及稀疏候选框的尚未发现的技术。这样的方法如果被开发,可以帮助进一步加速目标检测。
思考
参考
【论文翻译】Fast R-CNN
Fast R-CNN文章详细解读
Understanding Region-based Fully Convolutional Networks (R-FCN) for object detection