赞
踩
虽然现在在目标检测领域yolo
系列非常火(对yolo
感兴趣的小伙伴可以跳转到我的yolo
系列博文介绍:YOLO系列博文),但是在实际工业应用中Faster R-CNN
的应用也是非常广泛,如Mask R-CNN
就是建立在Faster R-CNN
基础上的分割网络。下面我从R-CNN
开始介绍Faster RN
N的演进过程。
全称Region with CNN feature
,利用深度学习进行目标检测的开山之作。
R-CNN
是深度学习用于目标检测的开山之作,网络模型如下,整个算法思想很简单,就是先对输入的图像进行分割候选框选取,然后将选取的候选框送入CNN
网络进行类别预测,非极大值抑制处理(下面会介绍),预测框修正。
R-CNN网络框架:
- 一张图像生成
1K~2K
个候选区域(SS
算法)- 对每个候选区域,使用深度网络提取特征
- 特征送入每一类的
SVM
分类器,判别是否属于该类- 使用回归器精细修正候选框位置
使用了SS
方法从一张图像生成约2000-3000
个候选区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含着可能需要的物体。基本步骤如下:
- 使用一种过分割手段,将图像分割成小区域。
- 查看现有小区域,合并可能性最高的两个区域。重复直到整张图像合并成一个区域位置。
- 输出所有曾经存在过的区域,所谓候选区域。
使用深度网络提取特征之前,首先把候选区域归一化成同一尺寸 227 × 227 227\times227 227×227。
通过SS
算法可以再一张图片中生成大概2000个
候选区域,将候选区域送到CNN
网络之前先进行resize
处理,将2000
候选区域缩放到
227
×
227
227\times227
227×227(原文是不管候选框多大都resize
到
227
×
227
227\times227
227×227),接着将候选区域输入事先训练好的AlexNet CNN
网络获取4096
维的特征得到2000×4096
维矩阵。
将2000×4096
维特征与20
个SVM
组成的权值矩阵4096×20
相乘,获得2000×20
维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000×20
维矩阵中每一列即每一类进行NSM
(非极大值抑制)剔除重叠建议框,得到该列即该类中得分最高的一些建议框。示意图如下:
上图中左边对应的是2000
个候选框通过分类网络生成的2000
个向量,中间是SVM
权值矩阵,每一对应着一个类别权值向量。将得到的2000行向量每一列(即每个类别)进行NMS
即可得到最终的检测结果。
非极大抑制剔除重叠建议框流程:
- 寻找得分最高的目标
- 计算其他目标与该目标的
IoU
值- 删除所有
IoU
值大于给定阀值的目标- 在剩下的边界框中重复前三步,直到将所有边界框遍历完
看不懂的可以参考这篇博文:非极大值抑制
对NMS
处理后剩余的建议框进一步筛选。接着分别用20
个回归器对上述20
个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box
。在原文中作者是这么做的:保留与真实目标比IoU
大于某一阈值的预测框,不满足的直接删除,接着再分别使用20
个回归器对剩余的预测框进行回归操作,最终得到每个类别的修正后得分最高的预测框。这里的实现方法跟上面的SVM
分类差不多,依旧是对卷积神经网络输出的特征向量进行预测,利用每个边界框得到4096
维特征向量来预测的。通过回归分类器之后会得到四个参数分别对应着目标建议框的中心点的x,y
偏移量和目标边界框的宽高缩放因子。通过预测的四个值对得到的建议框进行调整得到最终的预测边界框。
- 检测速度慢,测试一张图片约53s (CPU)。用
Selective Search
算法提取候选框用时约2秒,一张图像内候选框之间存在大量重叠,提取特征操作冗余。- 训练速度慢,并且训练过程极其复杂。
- 训练所需空间大,对于
SVM
和bbox
回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16
,从VOC07
训练集上的5k图像上提取的特征需要数百GB的存储空间。
继2014年的R-CNN
之后,Ross Girshick在15年推出Fast R-CNN
,大幅提升了目标检测的速度。Fast R-CNN
和R-CNN
相比,训练时间从84小时减少为9.5小时,测试时间从47秒减少为0.32秒。在PASCAL VOC
数据集测试的准确率大约67%。Fast R-CNN的
主干网络仍然是VGG16。
Fast R-CNN
对上面提到的R-CNN
的三个缺点进行了改进优化。
R-CNN存在的问题:
问题一:测试时速度慢
R-CNN
一张图像内候选框之间大量重叠,提取特征操作冗余。
Fast R-CNN
将整张图像归一化后直接送入深度网络。在连接时,才加入候选框信息,在末尾的少数几层处理每个候选框。
问题二:训练时速度慢
原因同上。
Fast R-CNN在
训练时,本文先将一张图像送入网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。
问题三:训练所需空间大
R-CNN
中独立的分类器和回归器需要大量特征作为训练样本。
Fast R-CNN
把类别判断和位置精调统一用深度网络实现,不再需要额外存储。
- 一张图片生成
1K~2K
个候选区域(使用SS算法).- 将图像输入到网络得到相应的特征图。将SS算法生成的候选区域投影到特征图上获得相应的特征矩阵。
- 将每个特征矩阵通过
ROI Pooling
(Region of Interest Pooling
)层缩放到7 X 7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。
Fast R-CNN框架:
从上面的网络框图可以看到,整个模型不需要在单独训练分类器和回归器了,直接把他们放到一个网络中了,就是在网络的最后输出层并联两个全连接,一个用于分类预测,一个用于回归预测,全部用深度学习的方法。
R-CNN:
R-CNN
生成候选框是首先对每一个生成的候选区域进行缩放,然后再输入到网络中获取特征,通过SS
算法获得了2000个候选框,那么就要进行2000
正向传播,这就造成了冗余,因为候选区域存在大量重叠的部分。
Fast R-CNN:
Fast R-CNN
生成候选框是直接将整张图像输入到CNN
中得到特征图,然后根据候选区域和特征图对应的映射关系,直接在特征图中获取特征矩阵(借鉴SPPNet
的做法)。ROI Pooling
层将后将候选框统一缩放到统一尺寸。
注意:
SS
算法选出了2000
个候选框,但是在训练的时候并不是所有的候选框都会使用,只使用其中的一小部分,并且这一小部分还分正样本和负样本,正样本就是候选框中确实存在我们需要检测的目标,负样本可以理解为背景,里面不含有我们要检测的目标。论文中作者说的是对2000
个候选框选取其64
个候选区域,然后这64
个人候选区域一部分是正样本,一部分是负样本。那么这64
个框的正负样本是如何区分的呢?候选框与真实目标的IoU
的大于0.5
就认定为是正样本,但是这些选定为正样本的候选框也不是去全部被使用,也只有一部分会被使用。负样本是那些与真实目标的IoU
最大的且IoU
在[0.1,0.5)
之间的,在Faster R-CNN
中改为了[0,0.5)
。下面是作者在原文中的解释:
Faster R-CNN
中的阈值设定:
ROI Pooling:
有了训练样本之后,将用于训练样本的候选框通过RoIPooling
层将其缩放到统一的大小。怎么实现RoIPooling
层呢?假设下图中的左边图为一个候选区域对应的一个特征矩阵,将特征矩阵划分为
7
×
7
7\times7
7×7的49
等份,然后对每一个区域进行最大池化下采样操作,得到如图右所示的
7
×
7
7\times7
7×7特征矩阵。关于RoIPool
和RoIAlign
我的另一篇介绍MASK R-CNN
博文中有介绍:MASK R-CNN网络介绍。
在Fast R-CNN
的最后并联了两个全连接层,第一个全连接层用于目标概率的预测,第二个全连接层用于边界框回归参数的预测。
目标概率预测分类器:
目标概率预测分类器输出N+1
个类别概率,其中N为检测目标的种类,1为背景,以PASCAL VOC
为例,它有20
个类别,则会输出21
个概率类别(通过softmax
处理之后的,满足和为1
),第一个概率为候选框为背景的概率,剩下的对应需要检测的类别的概率,即全连接中有21
个节点。如下图所示,坐左边第一个数表示背景概率,其余20
个表示所属目标的概率。
0 | 0.1 | 0 | 0 | 0.6 | 0 | 0 | 0 | 0 | 0.1 | 0 | 0 | 0.1 | 0 | 0 | 0 | 0.1 | 0 | 0 | 0 | 0 |
---|
边界框回归器:
边界框回归器会输出N+1
个类别候选边界框回归参数(
d
x
d_{x}
dx,
d
y
d_{y}
dy,
d
w
d_{w}
dw,
d
h
d_{h}
dh),因为每个类别对应四个候选边界框回归参数,所以全连接层有(N+1)x4
个节点。注意这里只是以一个框为例,不要误以为整幅图就这几个参数。
根据如下公式根据回归参数计算得到边界框的横纵坐标和宽度和高度。
G
^
x
=
P
w
d
x
(
P
)
+
P
x
G
^
y
=
P
h
d
y
(
P
)
+
P
y
G
^
w
=
P
w
exp
(
d
w
(
P
)
)
G
^
h
=
P
h
exp
(
d
h
(
P
)
)
- P x P_{x} Px, P y P_{y} Py, P w P_{w} Pw, P h P_{h} Ph分别为候选框的中心x,y坐标,以及宽高。
- G ^ x \hat{G}_{x} G^x, G ^ y \hat{G}_{y} G^y, G ^ w \hat{G}_{w} G^w, G ^ h \hat{G}_{h} G^h分别为最终预测的边界框中心的x,y坐标。
d x , d y , d w , d h d_{x},d_{y},d_{w},d_{h} dx,dy,dw,dh为边界框回归参数,从上面的公式可以看出这几个参数就是用来调整候选框的中心坐标和宽高。
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_{c l s}(p, u)+\lambda[u \geq 1] L_{l o c}\left(t^{u}, v\right)
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
其中,左边表示分类损失,右边一项表示边界框回归损失。中括号表示艾佛森括号,只有当u≥1
的时候中括号等于1
,否者等于0
,u
表示的是目标的真实标签,u≥1
表示候选区确实属于所需检测的某个类别,对应着正样本。这一项的作用就是说只计算正样本的损失,负样本直接省略不计算。
- p p p是分类器的预测的softmax概率分布 p = ( p 0 , . . . , p k ) p =(p_{0},...,p_{k}) p=(p0,...,pk)
- u u u对应真实类别标签
- t u t^{u} tu对应边界框回归器预测的对应类别 u u u的的回归参数 ( t x u , t y u , t w u , t h u ) (t_{x}^{u},t_{y}^{u},t_{w}^{u},t_{h}^{u}) (txu,tyu,twu,thu)
- v v v对应真实的边界框回归参数 ( v x , v y , v w , v h ) (v_{x},v_{y},v_{w},v_{h}) (vx,vy,vw,vh)
分类损失为交叉熵损失函数:
L
c
l
s
(
p
,
u
)
=
−
l
o
g
(
p
u
)
L_{c l s}(p, u)=-log(p_{u})
Lcls(p,u)=−log(pu)
边界框损失如下:
L
l
o
c
(
t
u
,
v
)
=
∑
i
∈
{
x
,
y
,
w
,
h
}
smooth
L
1
(
t
i
u
−
v
i
)
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)
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)=
关于L1,L2,Smooth-L1
损失可以参考这篇博文:回归损失函数1:L1 loss, L2 loss以及Smooth L1 Loss的对比。
Faster R-CNN
是继R-CNN
,Fast R-CNN
之后,目标检测界的领军人物Ross Girshick团队在2015年的又一力作,骨干网络还是VGG16
。对比三种检测模型框图,从R-CNN
到Fast R-CNN
,再到本文的Faster R-CNN
,目标检测的四个基本步骤(候选区域生成,特征提取,分类,边界框回归)终于被统一到一个深度网络框架之内。所有计算没有重复,完全在GPU中完成,大大提高了运行速度。
Faster R-CNN
可以简单地看RPN+Fast R-CNN
的系统,用区域生成网络RPN
代替Fast R-CNN
中的Selective Search
方法。所以学会了RPN
也就学会了Faster R-CNN
。论文着重解决了这个系统中的三个问题:
- 如何设计区域生成网络。
- 如何训练区域生成网络。
- 如何让区域生成网络和Fast R-CNN网络共享特征提取网络。
- 将图像输入网络得到相应的特征图。
- 使用
RPN
结构生成候选框,将RPN
生成的候选框投影到特征图上获得相应的特征矩阵。- 将每个特征矩阵通过
ROI pooling
层缩放到7x7
大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。
实际上就是将Fast R-CNN
的SS
算法换成了RPN
算法,会了RPN
算法也就会了Faster R-CNN
算法。所以Faster R-CNN
的核心就是RPN
。
Faster R-CNN网络框架:
在特征图上使用滑动窗口在特征图上进行滑动,每滑动到一个位置就生成一个一维的向量,在向量的基础上通过两个全连接层输出2k
个目标概率值和4k
个边界框回归参数。这里的2k
是针对k
个anchor box
。
2k个目标概率值和4k个边界框回归参数是什么?
2k个目标概率值:
在2k
个scores中
两两一组,其中第一个值为背景的概率,第二个值为不是背景的概率,只判断目前anchor
中是背景还是前景。256
是特征图的深度,用不同的网络深度可能会不一样。
4k个边界框回归参数:
将4k
个coordinates
各参数为一组,其中前两个为anchor
(可以理解成预先设定好的候选框,尺寸大小都是预先给定的)的中心坐标偏移量,后两个为anchor
的相对宽度和高度。Faster R-CNN
中共使用三种尺度(
128
×
128
128\times128
128×128,
256
×
256
256\times256
256×256,
512
×
512
512\times512
512×512)和三种比例的anchor
,每个位置在原图上都对应3x3=9
个anchor
。三种比例分别为1:1
,1:2
,2:1
。对于一张1000x600x3
的图像,大约有60x40x9(20k)
个anchor
,忽略跨越边界的anchor
以后,剩下约6k个anchor
。对于剩下的约6k
个anchor
再使用RPN
网络生成的相应的边界框回归参数,将这6k
个anchor
调整为6k
个候选框,即proposal
。注意区分下anchor
和proposal
,他们不是一个东西,只是利用预先给定的anchor
,经过筛选之后通过RPN
网络生成proposal
,即proposal
是由anchor
计算得到的(或者说proposal
是由anchor
利用RPN
调整得到的)。对于RPN
生成的候选框之间存在大量重叠,基于候选框的cls
得分,采用非极大值(NMS
)抑制,IoU
设为0.7
,这样每张图片只剩2k
个候选框。
RPN网络怎么实现?
里面的滑动窗口就是使用
3
×
3
3\times3
3×3的卷积实现,卷积的步距为1
,padding
也为1
。通过
3
×
3
3\times3
3×3的卷积之后,我们又生成了一个高度以及宽度和我们这个feature map
一样的特征矩阵,然后它的深度也是与我们feature map
一样的,所以说通过我们这个
3
×
3
3\times3
3×3的卷积之后他所得到的特征矩阵的shape
和我们这个feature map
是一模一样的。紧接着在我们所得到的特征矩阵上再并联两个
1
×
1
1\times1
1×1的卷积层来实现对类别的预测和边界框回归参数的预测。然后后面就是通过并联深度为2k
的
1
×
1
1\times1
1×1的卷积和深度为4k
的
1
×
1
1\times1
1×1的卷就得到了图中的2k scores
和4k coordinates
。
RPN正负样本:
我们在训练过程中的正负样本是如何生成的呢?我们刚才介绍了通过滑动窗口在特征图上进行滑动,在原图上大概会生成20000
个anchor
,但这些anchor
并不是说每个都用来训练我们的RPN
网络,论文中作者说的是,对于每一张图片,我们从刚刚上万个anchor
当中采样256
个anchor
,这256
个anchor
是由正样本和负样本两部分组成,比例在1:1
左右。如果我们的正样本的个数不足128
的话,就用负样本来进行一个填充。负样本填充正样本是什么意思?就是假设256
个样本中只有100
个正样本,那么负样本就采用256-100=156
个负样本。那么正负样本是怎么定义的呢?正样本原文给了两种定义方式:1.只要anchor
与标注框的IoU
大于0.7
就是正样本;2.anchor
与标注框有最大的IoU
标记为正样本,这个就是对第一个条件的补充,防止没有正样本。负样本怎么定义呢?负样本是针对那些与所有的标注框的的IoU
值都小于0.3
,这样的anchor
定义为负样本。正样本和负样本之外的anchor
全部丢弃。
损失有两部分:RPN损失和Faster R-CNN损失。
RPN损失:
L
(
{
p
i
}
,
{
t
i
}
)
=
1
N
c
l
s
∑
i
L
c
l
s
(
p
i
,
p
i
∗
)
+
λ
1
N
reg
∑
i
p
i
∗
L
reg
(
t
i
,
t
i
∗
)
L\left(\left\{p_{i}\right\},\left\{t_{i}\right\}\right)=\frac{1}{N_{c l s}} \sum_{i} L_{c l s}\left(p_{i}, p_{i}^{*}\right)+\lambda \frac{1}{N_{\text {reg}}} \sum_{i} p_{i}^{*} L_{\text {reg }}\left(t_{i}, t_{i}^{*}\right)
L({pi},{ti})=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg (ti,ti∗)
包含两部分,分类损失和边界框回归损失。参数解释如下:
- p i p_{i} pi表示第 i i i个
anchor
预测为真实标签的概率。- p i ∗ p_{i}^{*} pi∗为正样本是为1,为负样本时为0。跟
Fast R-CNN
中的艾佛森括号一个意思。- t i t_{i} ti表示预测第 i i i个
anchor
的边界框回归参数。- $t_{i}^{*}$表示第 i i i个
anchor
对应的GT BOX
。- N c l s N_{cls} Ncls表示一个
mini-batch
中的所有样本数量256
。- N r e g N_{reg} Nreg表示
anchor
位置的个数,约2400个
。前面系数 λ = 10 \lambda=10 λ=10
在实际计算的时候
N
c
l
s
N_{cls}
Ncls和
1
λ
×
N
r
e
g
\frac{1}{\lambda} \times N_{reg}
λ1×Nreg都当做一个值来算,都取值256
或者240
,简化了计算。
分类损失如下:
L
c
l
s
=
−
l
o
g
(
p
i
)
L_{cls}=-log(p_{i})
Lcls=−log(pi)
边界框回归损失:
同Fast R-CNN
的边界框回归损失
L
r
e
g
(
t
i
,
t
i
∗
)
=
∑
i
smooth
L
1
(
t
i
−
t
i
∗
)
t
i
=
[
t
x
,
t
y
,
t
w
,
t
h
]
t
i
∗
=
[
t
x
∗
,
t
y
∗
,
t
w
∗
,
t
h
∗
]
smooth
Σ
1
(
x
)
=
{
0.5
x
2
if
∣
x
<
1
∣
x
−
0.5
otherwise
\operatorname{smooth}_{\Sigma_{1}}(x)=
其中:
t
x
=
(
x
−
x
a
)
/
w
a
,
t
y
=
(
y
−
y
a
)
/
h
a
,
t
w
=
log
(
w
/
w
a
)
,
t
h
=
log
(
h
/
h
a
)
,
t
x
∗
=
(
x
∗
−
x
a
)
/
w
a
,
t
y
∗
=
(
y
∗
−
y
a
)
/
h
a
,
t
w
∗
=
log
(
w
∗
/
w
a
)
,
t
a
∗
=
log
(
h
∗
/
h
a
)
其中,
- p i ∗ p_{i}^{*} pi∗为正样本是为1,为负样本时为0。
- t i t_{i} ti表示预测第 i i i个
anchor
的边界框回归参数。- t i ∗ t_{i}^{*} ti∗表示第 i i i个
anchor
对应的GT BOX
的回归参数。
Faster R-CNN损失:
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_{c l s}(p, u)+\lambda[u \geq 1] L_{l o c}\left(t^u, v\right)
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
p p p 是分类器预测的 softmax 概率分布 p = ( p 0 , … , p k ) p=\left(p_0, \ldots, p_k\right) p=(p0,…,pk)
u u u对应目标真实类别标签
t u t^u tu 对应边界框回归器预测的对应类别
u u u 的回归参数 ( t x u , t y u , t w u , t h u ) \left(t_x^u, t_y^u, t_w^u,t_h^u\right) (txu,tyu,twu,thu)
v v v 对应真实目标的边界框回归参数 ( v x , v y , v w , v h ) \left(v_x, v_y, v_w, v_h\right) (vx,vy,vw,vh)
- 利用
ImageNet
预训练分类模型初始化前置卷积网络层参数,并开始单独训练RPN
网络参数。- 固定
RPN
网络独有的卷积层以及全连接层参数,再利用ImageNet
预训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练Fast
R-CNN网络参数。- 固定利用
Fast R-CNN
训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数。- 同样保持固定前置卷积网络层参数,去微调
Fast R-CNN
网络的全连接层参数。最后RPN网络与Fast R-CNN
网络共享前置卷积网络层参数,构成一个统一网络。
R-CNN
1.在图像中确定约
1000-2000
个候选框 (使用选择性搜索Selective Search)
2.每个候选框内图像块缩放至相同大小,并输入到CNN
内进行特征提取
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置
Fast R-CNN
1.在图像中确定约
1000-2000
个候选框 (使用选择性搜索Selective Search
)
2.对整张图片输进CNN
,得到feature map
3.找到每个候选框在feature map
上的映射patch
,将此patch
作为每个候选框的卷积特征输入到SPP layer
和之后的层
4.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
5.对于属于某一类别的候选框,用回归器进一步调整其位置
Faster R-CNN
1.对整张图片输进
CNN
,得到feature map
2.卷积特征输入到RPN
,得到候选框的特征信息
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4.对于属于某一类别的候选框,用回归器进一步调整其位置
至此,关于RCNN
,Fast R-CNN
,Faster R-CNN
的内容就介绍完了,如有错误,敬请指正!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。