R-CNN
直接看这篇:【目标检测】RCNN算法详解
SPP-Net论文详解
直接看这篇:SPP-Net论文详解
Fast R-CNN
I. Motivation
R-CNN的缺点:
(1) 多阶段的训练流程(multi-stage pipeline),包括fine-tune卷积网络,训练SVM做分类,最后训练bounding-box regressors。
(2) 训练速度慢,占用空间大:对于每张图片的每个region proposal都需要分别提取特征,并把提取到的特征写入磁盘
(3)检测速度慢:理由同上
Fast R-CNN的解决方法:提出单阶段的训练流程,使用multi-task loss,让模型同时学习如何分类和精调bbox位置,实现端到端训练。
II. Architecture
1. Overview
模型的输入有两个:整张图片和该图片的RoI proposals。先对整张图片提取特征,得到conv feature map,然后对每个proposal,用RoI pooling layer从特征图中提取出一个定长的特征向量,这些定长的特征向量被输入连续的几个FC layers,最终输入两个输出分支:一个用softmax来给出proposal的类别概率,一个就每个类别给出proposal的位置坐标。
模型在ImageNet预训练网络(如VGG-net)的基础上做了改动:最后一个max pooling layer被RoI pooling layer取代,最后的FC层和softmax被换成两个输出分支。
2. RoI pooling layer (借鉴了SPPnet的spatial pyramid pooling layer)
论文中的RoI指的是conv feature map中的一个矩形窗口,参数为(r, c, h, w),(r, c)为左上角坐标,(h, w)为窗口高度和宽度。假设输出尺寸为
H
×
W
H \times W
H×W,则原RoI会被划分成
H
×
W
H \times W
H×W个尺寸为
h
/
W
×
w
/
W
h/W \times w/W
h/W×w/W的子窗口,然后在每个子窗口上进行max-pooling。具体细节可以参考:RoI pooling
RoI pooling layer的反向传播:对于roi max pooling,一个输入节点可能和多个输出节点相连。设
x
i
x_i
xi为输入层的节点,
y
r
j
y_{rj}
yrj为第r个候选区域的第j个输出节点。
∂
L
∂
x
i
=
∑
r
∑
j
δ
(
i
,
r
,
j
)
∂
L
∂
y
r
j
\frac{\partial L}{\partial x_i}=\sum_r\sum_j\delta(i, r, j)\frac{\partial L}{\partial y_{rj}}
∂xi∂L=r∑j∑δ(i,r,j)∂yrj∂L判决函数
δ
(
i
,
r
,
j
)
\delta(i, r, j)
δ(i,r,j)表示i节点是否被候选区域r的第j个节点选为最大值输出。代价对于
x
i
x_i
xi的梯度等于所有相关的后一层梯度之和。
III. Fine-tuning for detection
1. 参数初始化: 在ImageNet上训练1000类分类器。结果参数作为相应层的初始化参数。其余参数随机初始化。
2. batch设置/hierarchical sampling:在训练时,每一个mini-batch中首先加入N张完整图片,而后加入从N张图片中选取的R个候选框,每张图片选取R/N个候选框。这R个候选框可以复用N张图片前5个阶段的网络特征。
实际选择N=2, R=128。
3. Multi-task loss:
loss_cls层评估分类代价。分类损失由真实分类
u
u
u对应的概率决定:
L
c
l
s
(
p
,
u
)
=
−
l
o
g
(
p
u
)
L_{cls}(p, u)=-log(p_u)
Lcls(p,u)=−log(pu)
loss_bbox评估检测框定位代价。比较回归边框的预测值
t
u
t^u
tu和ground truth
v
v
v的差别:
L
l
o
c
(
t
u
,
v
)
=
∑
i
∈
{
x
,
y
,
w
,
h
}
smooth
L
1
(
t
i
u
−
v
i
)
L_{loc}(t^u, v)=\sum_{i\in \{x,y,w,h\}} \text {smooth}_{L_1}(t_i^u-v_i)
Lloc(tu,v)=i∈{x,y,w,h}∑smoothL1(tiu−vi)
smooth L 1 ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ − 0.5 o t h e r w i s e \begin{aligned} \text{smooth}_{L_1}(x) = \begin{cases} 0.5x^2 & if\ |x|<1\\ |x|-0.5 & otherwise \end{cases} \\ \end{aligned} smoothL1(x)={0.5x2∣x∣−0.5if ∣x∣<1otherwise
(1) 回归边框参数
t
t
t和
v
v
v的求法是:(不带*的为预测值,带*的为真实值)
t
x
=
(
x
−
x
r
o
i
)
/
w
r
o
i
,
t
y
=
(
y
−
y
r
o
i
)
/
h
r
o
i
t
w
=
l
o
g
(
w
/
w
r
o
i
)
,
t
h
=
l
o
g
(
h
/
h
r
o
i
)
t
x
∗
=
(
x
∗
−
x
r
o
i
)
/
w
r
o
i
,
t
y
∗
=
(
y
∗
−
y
r
o
i
)
/
h
r
o
i
t
w
∗
=
l
o
g
(
w
∗
/
w
r
o
i
)
,
t
h
∗
=
l
o
g
(
h
∗
/
h
r
o
i
)
t_x=(x-x_{roi})/w_{roi},\ t_y=(y-y_{roi})/h_{roi}\\ t_w=log(w/w_{roi}),\ t_h=log(h/h_{roi})\\ t_x^*=(x^*-x_{roi})/w_{roi},\ t_y^*=(y^*-y_{roi})/h_{roi}\\ t_w^*=log(w^*/w_{roi}),\ t_h^*=log(h^*/h_{roi})
tx=(x−xroi)/wroi, ty=(y−yroi)/hroitw=log(w/wroi), th=log(h/hroi)tx∗=(x∗−xroi)/wroi, ty∗=(y∗−yroi)/hroitw∗=log(w∗/wroi), th∗=log(h∗/hroi)
(2) smooth L 1 \text {smooth}_{L_1} smoothL1的优点是对outlier不敏感
总代价为两者加权和,如果分类为背景则不考虑定位代价:
L
t
o
t
a
l
=
{
L
c
l
s
+
λ
L
l
o
c
if u is foreground
L
c
l
s
if u is background
\begin{aligned} L_{total} = \begin{cases} L_{cls} + \lambda L_{loc} &\text{if u is foreground}\\ L_{cls} & \text{if u is background} \end{cases} \\ \end{aligned}
Ltotal={Lcls+λLlocLclsif u is foregroundif u is background
4.全连接层提速(Truncated SVD) 这部分直接看参考文章
IV.实验与结论 这部分直接看参考文章
参考:
【目标检测】Fast RCNN算法详解
注:RCNN/SPP-Net/Fast RCNN这三个模型都使用selective search来产生候选框