浅读Fast R-CNN
(参考自:https://arxiv.org/abs/1504.08083)
文章目录
摘要
论文:《Fast R-CNN》
论文地址:https://arxiv.org/abs/1504.08083
代码开源:https://github.com/rbgirshick/fast-rcnn
内容简述:
该文提出一种快速的基于区域的卷积网络方法(fast R-CNN)用于目标检测。相比之前的成果,Fast R-CNN训练VGG16网络比R-CNN快9倍,测试时间快213倍,并在PASCAL VOC上得到更高的精度。与SPPnet相比,fast R-CNN训练VGG16网络比他快3倍,测试速度快10倍,并且更准确。
思路
该网络将整个图像与一组候选框作为输入,采用几个卷积层和最大池化层来处理整个图像,产生卷积特征图(feature map)。然后,对于每个bounding box,ROI池化层从特征图中提取固定长度的特征向量。然后通过一系列全连接层(FCs),最终分成两个同级输出层:
- 输出N种类别加上一个背景类别的softmax概率估计。
- 将N种类别进行输出,且每种类别输出四个实数值(表示该类别的检测框的修正)。
与R-CNN框架对比不同处:
- 在卷积层后加了一个ROI pooling Layer
- 损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练。
流程结构:
一、ROI Pooling
该层使用最大池化将任何有效的ROI内的特征转化成具有HxW的固定空间范围的小特征图,其中H和W是层的超参数,独立于任何特定的ROI。RoI是卷积特征图中的一个矩形窗口。 每个RoI由指定其左上角(r,c)及其高度和宽度(h,w)的四元组(r,c,h,w)定义。
RoI最大池化通过将大小为h×w的RoI窗口分割成H×W块,每块的大小约为h/H×w/W,然后对每一块执行最大池化,使这部分大小不一的候选框转变成大小统一的数据,并将输出合并到相应的输出网格单元中,送入下一层。
ROI pooling的反向传播(backward)
对于原始图像:我们将Xi看做第i个激活输入,Yj看做第j个输出:
∂
y
∂
x
i
=
{
0
δ
(
i
,
j
)
=
false
∂
L
∂
y
j
δ
(
i
,
j
)
=
true
\frac{\partial y}{\partial x_{i}}=\left\{\begin{array}{cc}{0} & {\delta(i, j)=\text { false }} \\ {\frac{\partial L}{\partial y_{j}}} & {\delta(i, j)=\text {true}}\end{array}\right.
∂xi∂y={0∂yj∂Lδ(i,j)= false δ(i,j)=true
判决函数 δ(i,j) 表示i节点是否为j节点选为最大值输出。当Xi不在Yj范围内或者Xi不是最大值时,i节点不被选中输出。
对于ROI:一个输入节点可能和多个输出节点相连。设 Xi为输入层的节点,Yrj为第 r个RoI层的第 j个输出节点:
∂
L
∂
x
i
=
∑
r
,
j
δ
(
i
,
r
,
j
)
∂
L
∂
y
r
j
\frac{\partial L}{\partial x_{i}}=\sum_{r, j} \delta(i, r, j) \frac{\partial L}{\partial y_{r j}}
∂xi∂L=r,j∑δ(i,r,j)∂yrj∂L
判决函数 δ(i,r,j) 表示i节点是否被候选区域r的第j个节点选为最大值输出。Loss对于Xi的梯度等于所有相关的最后一层梯度之和。
二、预训练网络的初始化
作者实验了三个预训练的ImageNet网络:
- R-CNN的AlexNet
- VGG_CNN_M_1024
- VGG16
(1
的宽度与深度较小,所以将这个模型称为模型S(小模型),2
的深度与1
相同,但是更宽,所以将这个模型称为模型M(中等模型),3
的模型是最大的,所以称为模型L
。)
每个网络有五个最大池化层和五到十三个卷积层。当预训练网络初始化fast R-CNN网络时,其经历三个过程。
- 最后的最大池化层由RoI池层代替,其将H和W设置为与网络的第一个全连接层兼容的配置(例如,对于VGG16,H=W=7)。
- 网络的最后一格全连接层和Softmax(其被训练用于1000类ImageNet分类)被替换为前面描述的两个同级层(全连接层和K+1个类别的Softmax以及类别特定的检测框回归)。
- 网络被修改为采用两个数据输入:图像的列表和这些图像中的RoI的列表。
三、对网络的微调
当每个训练样本(ROI)来自不同的图像时,通过SPP层的反向传播非常低效,R-CNN亦是如此。低效部分是因为每个ROI可能具有非常大的感受野,通常跨越整个输入图像。由于正向传播必须处理整个感受野,训练输入很大(通常是整个图像)。
所以作者提出了利用训练期间的特征进行共享的概念。在Fast RCNN网络训练中,随机梯度下降(SGD)的小批量是被分层采样的,首先采样N个图像,然后从每个图像采样R/N个 RoI。关键的是,来自同一图像的RoI在向前和向后传播中共享计算和内存。减小N,就减少了小批量的计算。例如,当N=2和R=128时得到的训练方案比从128幅不同的图采样一个RoI(即R-CNN和SPPnet的策略)快64倍。
除了分层采样,Fast R-CNN在微调阶段联合优化Softmax分类器和检测框回归,而不是分别在三个独立的阶段训练softmax分类器,SVM和回归器(该部分是与R-CNN不同之处)。
多任务损失
Fast R-CNN网络具有两个同级输出层:
- 输出在N种类别加上一个背景类别上的离散概率分布(每个Roi),P=(P0,P1,……Pn)。P一般由全连接层上的N+1个输出Softmax来计算。
- 输出检测框的回归偏移(如下式),对应索引第N个类别。包含左上角坐标以及检测框的长和宽。
t n = ( t x n , t y n , t w n , t h n ) t^{n}=\left(t_{x}^{n}, t_{y}^{n}, t_{w}^{n}, t_{h}^{n}\right) tn=(txn,tyn,twn,thn)
对每个标记的RoI使用多任务损失L以联合训练分类和检测框回归:
L
(
p
,
u
,
t
u
,
v
)
=
L
c
l
s
(
p
,
u
)
+
λ
[
u
≥
1
]
L
l
o
c
(
t
u
,
v
)
(
1
)
L\left(p, u, t^{u}, v\right)=L_{c l s}(p, u)+\lambda[u \geq 1] L_{l o c}\left(t^{u}, v\right)(1)
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)(1)
每 个 训 练 的 R O I 用 类 真 值 u 和 检 测 框 回 归 目 标 真 值 v 表 示 。 其 中 L c l s ( p , u ) = − l o g p u , 是 类 真 值 u 的 l o g 损 失 。 对 于 类 真 值 u , 第 二 个 损 失 L l o c 是 定 义 在 检 测 框 回 归 目 标 真 值 元 组 u , v = ( v x , v y , v w , v h ) 和 预 测 元 组 t u = ( t x u , t y u , t w u , t h u ) 上 的 损 失 。 艾 弗 森 括 号 指 数 函 数 为 : λ [ u ≥ 1 ] = { 1 u ≥ 1 0 otherwise 一 般 将 背 景 标 记 为 u = 0 。 对 于 背 景 R O I , 没 有 检 测 框 真 值 的 概 念 , 因 此 将 L l o c 忽 略 。 即 : L = { L c l s + λ L l o c u 为 前 景 L c l s u 为 背 景 对 于 检 测 框 回 归 , 我 们 使 用 损 失 L l o c ( t u , v ) = ∑ i ∈ { x , y , w , h } smooth L 1 ( t i u − v i ) ( 2 ) 其 中 : smooth L 1 ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise ( 3 ) 每个训练的ROI用类真值u和检测框回归目标真值v表示。其中L_{c l s}(p, u)=-log p_{u},是类真值u的log损失。\\对于类真值u,第二个损失L_{l o c}是定义在检测框回归目标真值元组u,v=(v_{x},v_{y},v_{w},v_{h})和预测元组\\t^u=(t^u_{x},t^u_{y},t^u_{w},t^u_{h})上的损失。艾弗森括号指数函数为:\\\lambda[u \geq 1]=\left\{\begin{array}{ll}{1} & {u \geq 1} \\ {0} & {\text { otherwise }}\end{array}\right.\\一般将背景标记为u=0。对于背景ROI,没有检测框真值的概念,因此将L_{l o c}忽略。即:\\L=\left\{\begin{array}{l}{L_{c l s}+\lambda L_{l o c}}&u为前景 \\ {L_{c l s}}&u为背景\end{array}\right.\\对于检测框回归,我们使用损失\\L_{l o c}\left(t^{u}, v\right)=\sum_{i \in\{x, y, w, h\}} \operatorname{smooth}_{L_{1}}\left(t_{i}^{u}-v_{i}\right)(2)\\其中:\\\operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{cc}{0.5 x^{2}} & {i f|x|<1} \\ {|x|-0.5} & {\text { otherwise }}\end{array}\right.(3) 每个训练的ROI用类真值u和检测框回归目标真值v表示。其中Lcls(p,u)=−logpu,是类真值u的log损失。对于类真值u,第二个损失Lloc是定义在检测框回归目标真值元组u,v=(vx,vy,vw,vh)和预测元组tu=(txu,tyu,twu,thu)上的损失。艾弗森括号指数函数为:λ[u≥1]={10u≥1 otherwise 一般将背景标记为u=0。对于背景ROI,没有检测框真值的概念,因此将Lloc忽略。即:L={Lcls+λLlocLclsu为前景u为背景对于检测框回归,我们使用损失Lloc(tu,v)=i∈{x,y,w,h}∑smoothL1(tiu−vi)(2)其中:smoothL1(x)={0.5x2∣x∣−0.5if∣x∣<1 otherwise (3)
( 1 ) 中 的 超 参 数 λ 控 制 两 个 任 务 损 失 之 间 的 平 衡 , 将 回 归 目 标 真 值 v i 归 一 化 为 具 有 零 均 值 和 单 位 方 差 , 所 有 实 验 都 使 用 λ = 1. (1)中的超参数\lambda控制两个任务损失之间的平衡,将回归目标真值v_{i}归一化为具有零均值和单位方差,所有实验都使用\\\lambda=1. (1)中的超参数λ控制两个任务损失之间的平衡,将回归目标真值vi归一化为具有零均值和单位方差,所有实验都使用λ=1.
小批量采样
在微调期间,每个随机梯度下降(SGD)的小批量由N=2个图像构成,均匀地随机选择(如通常的做法,我们实际上迭代数据集的排列)。 我们使用大小为R=128的小批量,从每个图像采样64个RoI。
在训练期间,图像以概率0.5水平翻转。不使用其他数据增强。
SGD超参数
用于Softmax分类和检测框回归的全连接层的权重分别使用具有方差0.01和0.001的零均值高斯分布初始化。偏置初始化为0。所有层的权重学习率为1倍的全局学习率,偏置为2倍的全局学习率,全局学习率为0.001。 当对VOC07或VOC12 trainval训练时,我们运行SGD进行30k次小批量迭代,然后将学习率降低到0.0001,再训练10k次迭代。当我们训练更大的数据集,我们运行SGD更多的迭代。
四、尺度不变性
作者探索两种实现尺度不变对象检测的方法:
- 通过“brute force”学习。
- 通过使用图像金字塔。
在“brute force”方法中,在训练和测试期间以预定义的像素大小处理每个图像。网络必须直接从训练数据学习尺度不变性目标检测。
而多尺度方法通过图像金字塔向网络提供近似尺度不变性。 在测试时,图像金字塔用于大致缩放-规范化每个候选框。在多尺度训练时,每次图像采样时随机采样金字塔尺度,作为数据增强的形式。
五、Fast R-CNN检测
将图像和待计算概率的R个候选框的列表作为输入。在测试时,R通常在2K左右。当使用图像金字塔时,ROI被缩放,使其接近224x224个像素。对于每个测试的ROI r使用
Pr
(
class
=
k
∣
r
)
≜
p
k
\operatorname{Pr}(\text {class}=k | r) \triangleq p_{k}
Pr(class=k∣r)≜pk
为每个类别分配检测置信度,然后对每个类别独立执行非极大值抑制。
六、通过截断的SVD进行提速
对于整体图像分类,与卷积层相比,计算全连接层花费的时间较小。相反,为了检测,要处理的RoI的数量很大,并且接近一半的正向传递时间用于计算全连接层。
层
的
u
×
v
权
重
矩
阵
W
通
过
S
V
D
被
近
似
分
解
为
:
W
≈
U
Σ
t
V
T
在
这
种
分
解
中
,
U
是
一
个
u
×
v
的
矩
阵
,
包
括
W
的
前
t
个
左
奇
异
向
量
,
Σ
t
是
t
×
t
对
角
矩
阵
,
其
包
含
W
的
前
t
个
奇
异
值
,
并
且
V
是
v
×
t
矩
阵
,
包
括
W
的
前
t
个
右
奇
异
向
量
,
截
断
S
V
D
将
参
数
计
数
从
u
v
减
少
到
t
(
u
+
v
)
个
,
如
果
t
远
小
于
m
i
n
(
u
,
v
)
则
S
V
D
可
能
是
重
要
的
。
为
了
压
缩
网
络
,
对
应
于
W
的
单
个
全
连
接
层
由
两
个
全
连
接
层
替
代
,
在
它
们
之
间
没
有
非
线
性
。
这
些
层
中
的
第
一
层
使
用
权
重
矩
阵
Σ
t
V
T
(
不
包
含
偏
置
)
,
并
且
第
二
层
使
用
U
(
其
中
原
始
偏
差
与
W
相
关
联
)
。
当
R
o
I
的
数
量
大
时
,
这
种
简
单
的
压
缩
方
法
给
出
良
好
的
加
速
。
层的u×v权重矩阵W通过SVD被近似分解为:\\ W \approx U \Sigma_{t} V^{T}\\ 在这种分解中,U是一个u×v的矩阵,包括W的前t个左奇异向量,\Sigma_{t}是t×t对角矩阵,其包含W的前t个奇异值,\\ 并且V是v×t矩阵,包括W的前t个右奇异向量,截断SVD将参数计数从uv减少到t(u+v)个,\\ 如果t远小于min(u,v)则SVD可能是重要的。 为了压缩网络,对应于W的单个全连接层由两个全连接层替代,\\ 在它们之间没有非线性。这些层中的第一层使用权重矩阵\Sigma_{t} V^{T}(不包含偏置),\\ 并且第二层使用U(其中原始偏差与W相关联)。当RoI的数量大时,这种简单的压缩方法给出良好的加速。
层的u×v权重矩阵W通过SVD被近似分解为:W≈UΣtVT在这种分解中,U是一个u×v的矩阵,包括W的前t个左奇异向量,Σt是t×t对角矩阵,其包含W的前t个奇异值,并且V是v×t矩阵,包括W的前t个右奇异向量,截断SVD将参数计数从uv减少到t(u+v)个,如果t远小于min(u,v)则SVD可能是重要的。为了压缩网络,对应于W的单个全连接层由两个全连接层替代,在它们之间没有非线性。这些层中的第一层使用权重矩阵ΣtVT(不包含偏置),并且第二层使用U(其中原始偏差与W相关联)。当RoI的数量大时,这种简单的压缩方法给出良好的加速。
注释
详情可入群询问283266234。
若本人对文章解读有所误解与不足处,还望斧正。