原论文:《Fast R-CNN》
代码:https://github.com/rbgirshick/fast-rcnn
关键操作:RoI映射、RoI池化
基本说明:
- 输入:图片及一些目标候选区域
- 流程:
- 获取候选框;
- 对整张图片特征提取,获取特征图;
- 将候选框映射到特征图上,得到RoI(Region of Interest);
- 在RoI上进行RoI池化,再经过全连接层后得到固定长度的特征向量;
- 将特征向量分别送入两个全连接层;
- 两个全连接层分别用作分类任务和边界框回归任务。
主要内容介绍
一、获取候选框
与R-CNN使用的方式相同,即使用 Selective Search 算法获取候选框。
二、整张图片特征提取
使用AlexNet、VGG16等卷积网络均可。
三、候选框在特征图上的映射(RoI映射)
可以参考图片在特征提取网络中传递的过程(比如pooling),对候选框的大小进行调整。《目标检测之 Fast R-CNN》对这点介绍的比较详尽,我将这部分摘录如下:
比如采用的是pre-trained 网络模型为VGG16的话,RoIPooling替换掉最后一个max pooling层的话,则原图像要经过4个max pooling层,输出的feature maps是原图像的1/16,因此,将原图像对应的四元数组转换到feature maps上就是每个值都除以16,并量化到最接近的整数。
四、RoI池化(这是稀疏金字塔池化的一种特例)
RoI(Region of Interest)指的是候选框在特征图上的映射。注意,它是特征图上的一部分。
这种池化方法的目的是将大小不一的RoI转换成具有统一行列数的特征图。
具体方法如下(可参考原论文或者《目标检测模型二:Fast-R-CNN,ROI池化》):
输入:尺寸为 h × w h\times w h×w 的RoI(对于不同的 RoI, h h h与 w w w的大小都是不相同的)
输出: H × W H\times W H×W 的特征图( H H H 与 W W W 是人为控制的超参数)
操作:将RoI均等的分为 h H × w W \frac{h}{H} \times \frac{w}{W} Hh×Ww 个子窗口(将RoI分出 h H \frac{h}{H} Hh行与 w W \frac{w}{W} Ww列),然后在每一子窗口上使用max-pooling得到一个值,这些值构成了我们最终想要的大小固定的特征图。
举例:
[ 85 9 90 85 77 41 47 17 91 75 0 26 45 15 38 68 53 2 95 28 92 1 26 28 41 96 13 53 33 45 9 57 12 21 75 91 5 31 68 64 92 41 57 79 86 63 53 33 31 67 47 27 43 15 71 27 85 10 61 42 65 98 100 54 ] = = = = = = = = = > R O I : 左 下 h = 5 , w = 7 [ 41 96 13 53 33 45 9 12 21 75 91 5 31 68 92 41 57 79 86 63 53 31 67 47 27 43 15 71 85 10 61 42 65 98 100 ] = = = = = = = = > 分 割 : H = 2 , W = 2 [ 41 96 13 ∣ 53 33 45 9 12 21 75 ∣ 91 5 31 68 92 41 57 ∣ 79 86 63 53 31 67 47 ∣ 27 43 15 71 85 10 61 ∣ 42 65 98 100 ] = = = = = = = > m a x − p o o l i n g [ 96 91 92 100 ] \begin{bmatrix} 85 & 9 & 90 & 85 & 77 & 41 & 47 & 17 \\ 91 & 75 & 0 & 26 & 45 & 15 & 38 & 68 \\ 53 & 2 & 95 & 28 & 92 & 1 & 26 & 28 \\ 41 & 96 & 13 & 53 & 33 & 45 & 9 & 57 \\ 12 & 21 & 75 & 91 & 5 & 31 & 68 & 64 \\ 92 & 41 & 57 & 79 & 86 & 63 & 53 & 33 \\ 31 & 67 & 47 & 27 & 43 & 15 & 71 & 27 \\ 85 & 10 & 61 & 42 & 65 & 98 & 100 & 54 \\ \end{bmatrix} \overset{ROI:左下h=5,w=7}{=========>} \begin{bmatrix} 41 & 96 & 13 & 53 & 33 & 45 & 9 \\ 12 & 21 & 75 & 91 & 5 & 31 & 68 \\ 92 & 41 & 57 & 79 & 86 & 63 & 53 \\ 31 & 67 & 47 & 27 & 43 & 15 & 71 \\ 85 & 10 & 61 & 42 & 65 & 98 & 100 \end{bmatrix} \\ \overset{分割:H=2, W=2}{========>} \begin{bmatrix} 41 & 96 & 13 & | & 53 & 33 & 45 & 9 \\ 12 & 21 & 75 & | & 91 & 5 & 31 & 68 \\ \hdashline 92 & 41 & 57 & | & 79 & 86 & 63 & 53 \\ 31 & 67 & 47 & | & 27 & 43 & 15 & 71 \\ 85 & 10 & 61 & | & 42 & 65 & 98 & 100 \end{bmatrix} \overset{max-pooling}{=======>} \begin{bmatrix} 96 & 91 \\ 92 & 100 \end{bmatrix} \\ ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡859153411292318597529621416710900951375574761852628539179274277459233586436541151453163159847382696853711001768285764332754⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=========>ROI:左下h=5,w=7⎣⎢⎢⎢⎢⎡411292318596214167101375574761539179274233586436545316315989685371100⎦⎥⎥⎥⎥⎤========>分割:H=2,W=2⎣⎢⎢⎢⎢⎡411292318596214167101375574761∣∣∣∣∣539179274233586436545316315989685371100⎦⎥⎥⎥⎥⎤=======>max−pooling[969291100]
五、损失函数
使用多任务损失函数,即同时进行分类与回归的操作:
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,\pmb{v})=L_{cls}(p,u)+\lambda[u\geq 1]L_{loc}(t^u,\pmb{v})
L(p,u,tu,vvv)=Lcls(p,u)+λ[u≥1]Lloc(tu,vvv)
其中,
L
c
l
s
L_{cls}
Lcls 是分类任务的损失函数,
L
l
o
c
L_{loc}
Lloc 是边界框回归的损失函数。u是实际的类别,
v
=
(
v
x
,
v
y
,
v
w
,
v
h
)
\pmb{v}=(v_x,v_y,v_w,v_h)
vvv=(vx,vy,vw,vh) 是实际的边界框。对于每一个类别u,网络所输出的边界框是
t
u
=
(
t
x
u
,
t
y
u
,
t
w
u
,
t
h
u
)
\pmb{t}^u=(t^u_x,t^u_y,t^u_w,t^u_h)
tttu=(txu,tyu,twu,thu),这个框应该与
v
\pmb{v}
vvv 越近越好。
此外,
λ
=
1
\lambda=1
λ=1,
[
u
≥
1
]
=
{
1
if
u
≥
1
0
otherwise
[u\geq 1]=\begin{dcases} 1 &\text{if } u\geq 1 \\ 0 &\text{otherwise } \end{dcases}
[u≥1]={10if u≥1otherwise 。
分类的损失函数:
L
c
l
s
(
p
,
u
)
=
−
l
o
g
(
p
u
)
L_{cls}(p,u)=-log(p_u)
Lcls(p,u)=−log(pu)
回归的损失函数:
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,\pmb{v})=\sum_{i\in \{x,y,w,h\}}smooth_{L_{1}}(t^u_i-v_i)
Lloc(tu,vvv)=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_{L_{1}}(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。
六、其他
1. 截断式奇异值分解(Singular Value Decomposition,SVD)
用于加快大型全连接网络的训练速度:
W
≈
U
Σ
t
V
T
W \approx U\Sigma_{t}V^T
W≈UΣtVT
这里,
W
W
W是
u
×
v
u\times v
u×v 的矩阵,
U
U
U 是
u
×
t
u\times t
u×t 的矩阵,
Σ
t
\Sigma_{t}
Σt 是
t
×
t
t\times t
t×t 的对角阵,
V
V
V 是
v
×
t
v\times t
v×t 的矩阵。
可以根据上面的近似公式将一层的全连接网络(输入神经元 u u u 个,输出神经元 v v v 个)用两层的全连接网络(输入神经元 u u u 个,中间层神经元 t t t 个,输出神经元 v v v 个,没有非线性计算单元)替代。在这两层神经元中,第一个是权重矩阵 Σ t V T \Sigma_{t}V^T ΣtVT(没有biases),第二个是 U U U(它的biases与 W W W 的biases相同)。
说明: 对于 W W W,有 u v uv uv 个参数;对于 U Σ t V T U\Sigma_{t}V^T UΣtVT 有 t u + t v tu + tv tu+tv 个参数。如果 t ≪ m i n ( u , v ) t\ll min(u,v) t≪min(u,v),则两层的全连接网络在训练起来就会比单层的快(参数更少,所以更快)。
奇异值分解的内容,需要学习《矩阵论》。
2. 小批量采样
参考《Fast-RCNN论文总结整理》
3. 参数初始化
参考《Fast-RCNN论文总结整理》
4. RoI池化中的BP算法
∂
L
∂
x
i
=
∑
r
∑
j
[
i
=
i
∗
(
r
,
j
)
]
∂
L
∂
y
r
j
\frac{\partial L}{\partial x_i}=\sum_{r}\sum_{j}[i=i^{*}(r,j)]\frac{\partial L}{\partial y_{rj}}
∂xi∂L=r∑j∑[i=i∗(r,j)]∂yrj∂L
其中,
x
i
x_i
xi 是输入到RoI池化层的第
i
i
i 个activation;
y
r
j
y_{rj}
yrj 是从第
r
r
r 个RoI得到的第
j
j
j 个池化后的输出:
y
r
j
=
x
i
∗
(
r
,
j
)
y_{rj}=x_{i^{*}(r,j)}
yrj=xi∗(r,j);
i
∗
(
r
,
j
)
=
a
r
g
m
a
x
i
′
∈
R
(
r
,
j
)
(
x
i
′
)
i^{*}(r,j)=\underset{i'\in R(r,j)}{argmax}(x_{i'})
i∗(r,j)=i′∈R(r,j)argmax(xi′);
R
(
r
,
j
)
R(r,j)
R(r,j) 是池化后的输出
y
r
j
y_{rj}
yrj 在每个子窗口中的索引集合。