概述
Fast R-CNN是对R-CNN和SPP-Net的改进,一方面借助SPP的思想,使得骨干网络只需要对原图做一次特征提取就好了,大大减少时间开销;另一方面将bbox的回归器和分类器都整合到了网络当中,简化了训练流程,也减少了特征存储的开销;还有一方面就是采用了新的训练策略,解决了SPP-Net中难以更新SPP模块之前的卷积层参数的问题。
细节
检测流程
流程概述:
- 在原图上进行选择性搜索,获得2000个候选框
- 原图进行缩放,通过网络进行特征提取,得到共享特征图,将每个候选框都映射到特征图中,得到候选框特征
- 将候选框特征通过ROI池化层得到统一尺寸(如7x7)的候选框特征,对其进行展平并经过一系列全连接层之后,送入并行的softmax分类器和bbox回归器。
补充1: 补充2: ROI池化相当于是SPP的一个特例。SPP是对特征图进行多级池化,如将特征图划分为
4
?
4
,
2
?
2
,
1
?
1
4*4,2*2,1*1
4?4,2?2,1?1的网格,每个网格内进行最大池化并得到一个特征图,当然,通道数保持不变。ROI的话,只有一级池化,论文中说的话划分为
7
?
7
7*7
7?7的网格。 补充3: softmax分类器输出21个类别的条件类别概率(20个voc的类别+1个背景类),bbox回归器输出n+1个类别的回归参数,也就是输出
(
n
+
1
)
?
4
(n+1)*4
(n+1)?4个参数
训练模型
预训练模型的处理: 1、将最后一个池化层改成ROI池化;2、将原模型最后的全连接层和softmax改成两个并行的;3、网络除了接受图片之外,还会接受这些图片对应的候选框(ROI)。
训练策略
为什么SPP-Net中难以更新SPP模块之前的卷积层参数? 采样N张图片,每张图片随机采样ROI,当然总共的采样个数要和我们设定的Mini-batch size相同。也就是,这些ROIs可以来自若干张图片,另外我们知道,ROI对应的感受野是比较大的,也就是这两点,导致反向传播非常的困难。
当前策略: 有了一个规则,不再是随机采样。采样N张图片,每张图片采样
R
/
N
R/N
R/N个ROI,这个R就是我们需要的ROI的个数。实际上,减小N的数量可以相对减小计算量,但是如果我们取N=1的话,也就是所有ROI都来自同一个原始图像,各个ROI的相关度会过高,不利于模型收敛。论文中的例子是,我们需要128个ROI,就采样两张图片比较合适一些,每张图片采用64个,那么这64个ROI就可以共享同一张图片的特征了。
损失函数: 这里的参数
p
,
u
,
t
u
,
v
p,u,t^{u},v
p,u,tu,v指的分别是预测的类别、真实的类别、对于这个真实类别的bbox回归参数的预测
(
x
,
y
,
w
,
h
)
(x,y,w,h)
(x,y,w,h)、真实的bbox回归参数的预测
(
x
,
y
,
w
,
h
)
(x,y,w,h)
(x,y,w,h)。第一项是softmax损失,第二项是bbox回归参数的正则化项,
λ
\lambda
λ是权重因子,而
[
u
≥
1
]
[u\geq1]
[u≥1]表示只有u>=1返回1,否则返回0,也就意味着只有真实标签为1,才会有这一项边界框损失。 第一项作者说的是
?
l
o
g
(
p
u
)
-log (p_{u})
?log(pu?),其中u是真实标签。其实就是多分类的损失的化简,
L
c
l
s
(
p
,
u
)
=
?
∑
i
=
1
n
u
i
?
l
o
g
(
p
i
)
L_{cls}(p,u)=-\sum_{i=1}^nu_{i}*log(p_{i})
Lcls?(p,u)=?∑i=1n?ui??log(pi?),因为多分类的标签是独热编码,也就是一个1剩下全是0,所以只剩下一项了。
第二项是smooth L1函数,相关介绍可以看链接
采样和正负样本
Mini-batch size是128,也就是选取两张图片,每张图片提取64个ROI。在这64个ROI中,25%是前景作为正样本,75%是背景负样本。当候选框与任一GT box的IOU大于0.5就是前景,与所有的GT box计算IOU都属于
[
0.1
,
0.5
]
[0.1,0.5]
[0.1,0.5]的就是负样本。前者对应的标记
u
=
1
u=1
u=1,后者对应的标记
u
=
0
u=0
u=0。而那些IoU<0.1的ROI不参与最开始的训练。训练好一个模型后,使用这些IoU<0.1的ROI进行难例挖掘以进一步调优训练。在训练的过程中,为了增加样本的多样性,一般会使用50%的概率随机水平翻转图像,以此进行样本扩充
|