提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
参考网站:
https://zhuanlan.zhihu.com/p/106192020
https://blog.csdn.net/zhangyuexiang123/article/details/108255901
https://blog.csdn.net/weixin_37142859/article/details/93356914
Faster RCNN主要有四个知识点: 1.卷积层–backbone特征提取网络; 2.RPN网络; 3.ROI Pooling 4.分类和回归
一、卷积层–backbone特征提取网络
Faster-RCNN主要采用了两种网络结构作为backbone: VGG16 从图中可以看出,对于一副任意大小的图像P×Q,首先缩放至固定大小M×N,并将其送入网络,Conv layers中包含13个conv层+13个relu层+4个pooling层。但是VGG网络存在着反向传播的时候梯度会逐渐消失的弊端。采用 resnet 效果更佳。
Conv layers中包含13个conv层+13个relu层+4个pooling层:
- 所有的conv层都是:kernel_size=3,pad=1,stride=1
- 所有的pooling层都是:kernel_size=2,pad=0,stride=2
在Faster RCNN Conv layers中对所有的卷积都做了扩边处理( pad=1,即填充一圈0),导致原图变为 (M+2)x(N+2)大小,再做3x3卷积后输出MxN 。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小。如图: 类似的是,Conv layers中的pooling层kernel_size=2,stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。
那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16),这样Conv layers生成的feature map中都可以和原图对应起来。
二、RPN网络
Faster-RCNN核心知识点–RPN网络(region proposal network)。可以从网络图中看出,经过特征提取之后得到了Feature map然后送到rpn网络中。下面将详细说明:
1. 为什么要用RPN网络? 主要原因:用滑动窗口的方式生成检测框非常耗时。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
2. RPN网络原理 总体流程:生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals (这里对anchor解释一下:anchor 其实就是预训练网络卷积层的最后一层 feature map 上的一个像素,以该 anchor 为中心,可以生成 k 种 anchor boxes; 每个 anchor box 对应有一组缩放比例(scale)和宽高比(aspect)。论文中,共使用 3 种 scale(128, 256, 512)和3 种 aspect(1:2, 1:1, 2:1), 所以每个 anchor 位置产生 9 个 anchor boxs)
feature map经过3×3卷积后,分成了两条线: (1)第一条线经过softmax进行二分类,获得是否是检测物体(前景)和背景的二分类结果。因为是二分类,所以维度是2k score。k是anchor boxes数量。 (2)第二条线是计算anchors的bounding box regression偏移量,以获得精确的proposal。它的维度是4k coordinates。 而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
所以说这里假如我们backbone提取的feature maps 的维度是W×H×C,在这里,为 feature maps 的每一个点都配k个锚框,所以RPN的输出极为大小为W×H×C×2k的positive/negative softmax分类特征矩阵和W×H×C×4k的坐标回归特征矩阵。
这里还有一个img_info,大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,img_info=[M, N, scale_factor]则保存了此次缩放的所有信息。
接下来,RPN要做的事情就是:
(1). 对于每一个ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个anchor作为正样本。 (2). 对于剩下的anchor,从中选择和任意一个gt_bbox重叠度超过0.7的anchor,作为正样本,正样本的数目不超过128个。 (3). 随机选择和gt_bbox重叠度小于0.3的anchor作为负样本。负样本和正样本的总数为256
3. Proposal Layers Proposal Layer负责综合所有
[
d
x
(
A
)
,
d
y
(
A
)
,
d
w
(
A
)
,
d
h
(
A
)
]
\left[d_{x}(A), d_{y}(A), d_{w}(A), d_{h}(A)\right]
[dx?(A),dy?(A),dw?(A),dh?(A)](这一小节后边会介绍这些参数是什么)变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。 (1). 生成anchors,利用对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致) (2). 按照输入的positive softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的positive anchors (3). 限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposal超出图像边界 (4). 剔除尺寸非常小的positive anchors 对剩余的positive anchors进行NMS(nonmaximum suppression)
bounding box regression原理: 如图15所示,绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以,我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。
对于窗口一般使用四维向量表示,分别表示窗口的中心点坐标、宽和高。对于图16,红色的框A代表原始的positive Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种变换,使得输入原始的anchor A,经过映射得到一个跟真实窗口G更接近的回归窗口G’ 那么,经过何种变换,才能从图中的anchor A变成G’呢?
先做平移
G
x
′
=
A
w
?
d
x
(
A
)
+
A
x
G_{x}^{\prime}=A_{w} \cdot d_{x}(A)+A_{x}
Gx′?=Aw??dx?(A)+Ax?
G
y
′
=
A
h
?
d
y
(
A
)
+
A
y
G_{y}^{\prime}=A_{h} \cdot d_{y}(A)+A_{y}
Gy′?=Ah??dy?(A)+Ay? 再做缩放
G
w
′
=
A
w
?
exp
?
(
d
w
(
A
)
)
G_{w}^{\prime}=A_{w} \cdot \exp \left(d_{w}(A)\right)
Gw′?=Aw??exp(dw?(A))
G
h
′
=
A
h
?
exp
?
(
d
h
(
A
)
)
G_{h}^{\prime}=A_{h} \cdot \exp \left(d_{h}(A)\right)
Gh′?=Ah??exp(dh?(A)) 观察上面4个公式发现,需要学习的是
d
x
(
A
)
,
d
y
(
A
)
,
d
w
(
A
)
,
d
h
(
A
)
d_{x}(A), d_{y}(A), d_{w}(A), d_{h}(A)
dx?(A),dy?(A),dw?(A),dh?(A) 这四个变换。
当输入的anchor A与GT相差较小时,可以认为上述变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调(注意,只有当anchors A和GT比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了)。接下来的问题,就是如何通过线性回归获得这四个变换了。
线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近,即 Y = W×X。
对于上述问题,输入X是Feature map,定义为 ? ;同时,还有训练传入A与GT之间的变换量,即
(
t
x
,
t
y
,
t
w
,
t
h
)
\left(t_{x}, t_{y}, t_{w}, t_{h}\right)
(tx?,ty?,tw?,th?),输出是
d
x
(
A
)
,
d
y
(
A
)
,
d
w
(
A
)
,
d
h
(
A
)
d_{x}(A), d_{y}(A), d_{w}(A), d_{h}(A)
dx?(A),dy?(A),dw?(A),dh?(A)四个变换,那么,目标函数可以表示为:
d
?
(
A
)
=
W
?
T
?
?
(
A
)
d_{*}(A)=W_{*}^{T} \cdot \emptyset(A)
d??(A)=W?T???(A)。其中,
?
(
A
)
\varnothing(A)
?(A)是对应anchor的feature map组成的特征向量,
W
?
W_{*}
W??是需要学习的参数,
d
?
(
A
)
d_{*}(A)
d??(A)是得到的预测值(*表示x, y, w, h, 也就是每一个变换对应一个上述目标函数)。
为了让预测值
d
?
(
A
)
d_{*}(A)
d??(A)与真实值
t
?
t_{*}
t??差距最小,设计L1损失函数:
L
o
s
s
=
∑
i
N
∣
t
?
i
?
W
?
T
?
?
(
A
i
)
∣
L o s s=\sum_{i}^{N}\left|t_{*}^{i}-W_{*}^{T} \cdot \emptyset\left(A^{i}\right)\right|
Loss=i∑N?∣∣?t?i??W?T???(Ai)∣∣?
函数优化目标为:
W
^
?
=
argmin
?
W
?
∑
i
n
∣
t
?
i
?
W
?
T
?
?
(
A
i
)
∣
+
λ
∥
W
?
∥
\widehat{W}_{*}=\operatorname{argmin}_{W_{*}} \sum_{i}^{n}\left|t_{*}^{i}-W_{*}^{T} \cdot \emptyset\left(A^{i}\right)\right|+\lambda\left\|W_{*}\right\|
W
??=argminW???i∑n?∣∣?t?i??W?T???(Ai)∣∣?+λ∥W??∥
作者论文中,使用的smooth-L损失。需要说明,只有在GT与需要回归框位置比较接近时,才可近似认为上述线性变换成立。对应于Faster RCNN原文,positive anchor与ground truth之间的平移量
(
t
x
,
t
y
)
\left(t_{x}, t_{y}\right)
(tx?,ty?)与尺度因子
(
t
w
,
t
h
)
\left(t_{w}, t_{h}\right)
(tw?,th?))如下: 其中,
x
,
y
,
w
,
h
x, y, w, h
x,y,w,h对应两组框的中心点坐标和它的宽和高,变量
x
,
x
a
,
x
?
x, x_{a}, x^{*}
x,xa?,x?分别对应predicted box, anchor box和ground-truth box中心点的横坐标,
y
,
w
,
h
y, w, h
y,w,h都是同理。
三、ROI Pooling
1.为何需要ROI Pooling? 对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的vector or matrix。 如果输入图像大小不定,这个问题就变得比较麻烦。有2种解决办法: (1). 从图像中crop一部分传入网络 (2). 将图像warp成需要的大小后传入网络
回忆RPN网络生成的proposals的方法:对positive anchors进行bounding box regression,那么这样获得的proposals也是大小形状各不相同,即也存在上述问题。所以Faster R-CNN中提出了RoI Pooling解决这个问题。
2.ROI Pooling解释及过程 roi是在原图中的感兴趣区域:可以理解为region of interest。将原图进行特征提取时得到feature map,那么相应的ROI就会在feature map上有映射,这个映射过程就是roi pooling的一部分,一般ROI的步骤会继续进行max pooling,进而得到我们需要的feature map,送入后面继续计算。根据ROIS提供的候选框坐标,映射到FeatureMap,然后进行max-pooling,和普通的max-pooling的不同之处在于池化窗口的内部的各自包含的特征值数量不一样。
输入特征图: 特征图片对应的建议区域:
若想输出2*2 的feature map 我们就需要对把这个ROI区域分成4大块,每一块做一下max-pooling 得到最终的值 最终的的值就是 拓展:ROI Align ROIalign按照下面的算法计算 双线性插值计算方法
如上图,每一个蓝色点周围都有4个像素点,蓝色点的值极为该4个点的加权平均,权重是距离像素点的距离,距离越近,权重越大。如下图所示。 圆圈代表像素值,色块面积代表权重。以红色点为例,待计算点(黑色点)距离红色点最远,因此它权重最小,反映在色块面积上就是红色色块面积最小。说明红色对黑色点的影响比较小。
四、分类和回归
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。 经过roi pooling层之后,batch_size=300, proposal feature map的大小是7*7,512-d,对特征图进行全连接,参照图20,最后同样利用Softmax Loss和L1 Loss完成分类和定位。
即从PoI Pooling获取到7x7大小的proposal feature maps后,通过全连接主要做了如下2件事:
(1)通过全连接和softmax对region proposals进行具体类别的分类,这实际上已经是识别的范畴了 (2)再次对region proposals进行bounding box regression,获取更高精度的rectangle box
五、训练流程及Loss
- 在预训练的model上,训练RPN网络
- 利用训练好的RPN
- 第一次训练Fast-RCNN网络
- 第二次训练RPN网络
- 再次利用步骤4,训练好的RPN网络搜集proposals
- 第二次训练Fast-RCNN网络
整个网络使用的损失,如下所示:
L
(
{
p
i
}
,
{
t
i
}
)
=
1
N
c
l
s
∑
i
L
c
l
s
(
p
i
,
p
i
?
)
+
λ
1
N
r
e
g
∑
i
p
i
?
L
r
e
g
(
t
i
,
t
i
?
)
\begin{array}{r} 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_{r e g}} \sum_{i} p_{i}^{*} L_{r e g}\left(t_{i}, t_{i}^{*}\right) \end{array}
L({pi?},{ti?})=Ncls?1?∑i?Lcls?(pi?,pi??)+λNreg?1?∑i?pi??Lreg?(ti?,ti??)? Faster RCNN预测 图片经过 RPN 产生anchor boxes anchor boxes 通过 bounding box regressor 调整位置 使用 objectness classification 分类器的打分进行 NMS, 减少数量 将 region proposal 交给 fast rcnn 检测.
|