1 基本结构
1.1 算法流程
Faster-RCNN算法流程可分为4个步骤:
- 特征提取:将整个图像缩放到固定大小(由于后边有全连接层)输入到CNN网络中进行特征提取,得到特征图
- 候选区域提取:输入特征图,使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
- ROI pooling:将各个不同尺寸的特征矩阵通过ROI pooling层缩放到7*7大小的特征图,然后展平特征图送入全连接层。
- 目标分类和回归:使用两个同级层:K+1个类别的SoftMax分类层和K个边框的回归层,完成目标的分类和回归。
其实Faster-RCNN可以看为:Fast-RCNN + RPN,将Fast-RCNN的选择性搜索(Selective Search)生成候选框替换为RPN生成候边框,其余基本不变。
1.2 网络结构
Faster RCNN网络结构如下图所示:
网络结构可分为四部分:
- Backbone:Backbone由CNN卷积神经网络构成,常用的是VGG和ResNet网络,用来提取图像中的特征,获取图像中的特征图。该特征图被共享用于后续RPN层生成候选区域和ROI pooling层中。
- RPN层:RPN网络用来生成候选框,用于后续的目标检测。
- ROI pooling:该部分收集图像的特征图和RPN网络提取的候选区域位置,综合信息后获取固定尺寸的特征,送入后续全连接层判定目标类别和确定目标位置。
- 目标分类和回归:该部分利用ROI pooling输出特征向量计算候选区域类别,并通过回归获得检测框最终过的精确位置。
1.2.1 Backbone
Backbone一般为VGG、ResNet网络构成,主要进行特征提取,将最后的全连接层舍弃,得到特征图送入后续网络汇总进行处理。
在源码中,使用的是ResNet+FPN结构来提取特征,与普通过的Faster-RCNN只需要将一个特征图输入到后续网络中不同,由于加入FPN结构,需要将多个特征图逐个送入到后续网络中,如下图所示:
FPN结构作用是当前层的特征图融合未来层的特征进行上采样,并加以利用。因为有了这样的一个结构,当前的特征图就可以获取未来的信息,也就将低阶特征与高阶特征就有机融合起来,提升检测精度。如下图所示:
在这里ResNet进行特征提取,FPN网络进行特征融合获取更多的特征图,输入到RPN网络中的特征图是[p2,p3,p4,p5,p6],而目标检测网络Fast-RCNN的输入是[p2,p3,p4,p5]:
1.2.2 RPN网络
overfeat中使用魂动窗口生成检测框,R-CNN使用选择性搜索方法生成检测框,而Faster-RCNN直接使用RPN生成候选框,极大提升检测速度。
RPN网络主要流程:
- 1、生成一系列的固定参考框anchors,覆盖图像的任意位置,然后送入后续网络中进行分类和回归
- 2、分类分支:通过softmax分类判断anchor中是否包含目标
- 3、回归分支:计算目标框对于anchors的偏移量,以获得精确的候选区域
- 4、最后的proposal层则负责综合含有目标的anchors和对应的bbox回归偏移量获取候选区域,同时剔除太小和超出边界的候选区域。
1.2.2.1 anchors
anchor在目标检测中表示参考框,首先预设一组不同尺度不同长宽比的固定参考框,覆盖几乎所有位置,每个参考框负责检测与其交并比大于阈值(超参数,通常为0.5或0.7)的目标。anchor技术将候选区域生成问题转换为“这个固定参考框中有没有目标,目标框偏离参考框多远”,不在需要多尺度遍历滑框,真正实现又好又快。
在Faster-RCNN中框出多尺度,多种长宽比的anchors,如下图所示:下图中分别是尺度为32,64,128,长宽比是1:1,1:2,2:1的一组anchors。我们利用这组anchor在特征图上进行滑动,并对应到原图上即可获取一系列的固定参考框。
我们在上边提到FPN网络,通过上采样,生成不同尺度的特征图,每一个尺度特征图生成不同比例的anchor:
得到一系列的anchors后就可以送入后续网络中进行分类和回归
1.2.2.2 RPN分类
一副MN大小的矩阵送入Faster-RCNN网络后,经过backbone特征提取到RPN网络变为HW大小的特征图。如下图所示,是RPN进行分类的网络结构:(k=9)
先做一个1*1的卷积,得到[batchsize,H,W,18]的特征图,然后进行变形,将特征图转化为[batchsize,9*H,W,2]的特征图后,送入softmax中进行分类,得到分类结果,再进行reshape最终得到[batchsize,H,W,18]大小的结果,18表示k=9个anchors是否包含目标的概率值。
1.2.2.3 RPN回归
RPN回归的结构如下图所示:(k=9)
经过该卷积输出特征图为[1,H,W,4*9],feature maps每个点都有9个anchors,每个anchor又有4个用于回归的变换量,即
d
x
(
P
)
,
d
y
(
P
)
,
d
w
(
P
)
,
d
h
(
P
)
d_x(P),d_y(P),d_w(P),d_h(P)
dx(P),dy(P),dw(P),dh(P),也就是每个anchor的中心点、宽和高的回归参数。
绿色框表示GT box,黄色框表示候选框,红色框表示最终预测的候选框,因此,他们可表示为:
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
w
exp
(
d
h
(
P
)
)
\begin{aligned} \\ \hat G_x=P_wd_x(P)+P_x \\ \hat G_y=P_hd_y(P)+P_y \\ \hat G_w=P_w\exp(d_w(P)) \\ \hat G_h=P_w\exp(d_h(P)) \end{aligned}
G^x=Pwdx(P)+PxG^y=Phdy(P)+PyG^w=Pwexp(dw(P))G^h=Pwexp(dh(P))
P
x
,
P
y
,
P
w
,
P
h
P_x,P_y,P_w,P_h
Px,Py,Pw,Ph分别为候选框的中心x,y坐标和宽高
G
^
x
,
G
^
y
,
G
^
w
,
G
^
h
\hat G_x,\hat G_y,\hat G_w,\hat G_h
G^x,G^y,G^w,G^h分别为最终预测的边界框x,y坐标和宽高
注意:中线点坐标是在宽高的基础上乘以对应的回归参数进行上下左右平移
1.2.2.4 Proposal层
Proposal层负责综合RPN网络对anchors分类和回归的结果,利用回归的结果对包含目标的anchors进行修正,计算出候选区域,送入后续的ROI pooling层中。
Proposal层处理流程如下:
- 1、利用RPN网络回归的结果 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) dx(P),dy(P),dw(P),dh(P),对所有的anchors进行修正,得到修正后的检测框
- 2、根据RPN网络分类的softmax输出的概率值由大到小对检测框进行排序,提取前6000个结果,即提取修正位置后的检测框
- 3、限定超出图像边界的检测框为图像边界,防止后续ROI pooling时候选区域超出图像边界。(参考下图)
- 对剩余的检测框进行非极大值抑制NMS
- Proposal层输出是对应输入网络图像尺度的归一化后的坐标值[x1,y1,x2,y2]\(左上角和右下角坐标)
- Proposal层有3个输入:RPN分类和回归结果,以及图像的原信息
1.2.3 ROI pooling
ROI pooling层负责收集RPN网络生成的候选区域,并将其映射到特征图中并固定维度,送入后续网络进行分类和回归。
ROI pooling的作用过程,如下图所示:
注意:由Proposal层输出的候选框尺寸大小不同,ROI pooling负责将大小不同的候选框调整为同一尺寸大小。
ROI pooling使用最大池化将任何有效的ROI区域内的特征转换成具有pool_H
×
\times
×pool_W的固定空间范围大小的特征图,其中pool_H和pool_W是超参数,比如设置成7$\times$7,它们独立于任何特定的ROI,如下图所示:
在实现过程中,FPN网络产生了多个尺度特征图,那候选区域要映射到哪个特征图中?
不同尺度的ROI使用不同特征层作为ROI pooling层的输入,大尺度ROI就用最后面的层,小尺度就用前面的层,通常使用下边的公式确定ROI所在的特征层:
k
=
[
k
0
+
log
2
(
(
w
h
)
/
224
)
]
k=[k_0+\log_2(\sqrt(wh)/224)]
k=[k0+log2((wh)/224)]
其中224是imageNet的标准输入,
k
0
k_0
k0是基准值,设置为4,
w
w
w和
h
h
h是ROI区域的长和宽,假设ROI是112
×
\times
× 112的大小,那么
k
=
k
0
−
1
=
4
−
1
=
3
k=k_0-1=4-1=3
k=k0−1=4−1=3,意味着该ROI应该使用第三特征层。
k
k
k值会做取整处理,防止结果不是整数,而且为了保证
k
k
k值在2-5之间,还会做截断处理(如果
k
k
k值大于5,将会按照
k
=
5
k=5
k=5处理)。
1.2.4 目标分类和回归
通过利用获得的候选区域的特征图,使全连接层与softmax计算每个候选区域具体属于的类别(人,猫,狗……),输出概率值。同时再次利用回归方法获得每个区域的位置偏移量,用于回归更加精确的目标检测框,网络结构如下图所示:
从ROI pooling层获取到固定大小的特征图后,送入后续网络,进行了以下两个步骤:
- 1、通过全连接和softmax对候选区域进行分类
- 2、再次对候选区域进行回归修正,获取更高精度的检测框