目标检测网络 -- FasterRCNN

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

FasterRCNN知识点

  • 一、卷积层--backbone特征提取网络
  • 二、RPN网络
  • 三、ROI Pooling
  • 四、分类和回归
  • 五、训练流程及Loss

参考网站:
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.分类和回归
目标检测网络 -- FasterRCNN_第1张图片

一、卷积层–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层:

  1. 所有的conv层都是:kernel_size=3,pad=1,stride=1
  2. 所有的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层不改变输入和输出矩阵大小。如图:
目标检测网络 -- FasterRCNN_第2张图片
类似的是,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的巨大优势,能极大提升检测框的生成速度。目标检测网络 -- FasterRCNN_第3张图片

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这里,就完成了相当于目标定位的功能。
目标检测网络 -- FasterRCNN_第4张图片

所以说这里假如我们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原理:
目标检测网络 -- FasterRCNN_第5张图片
如图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=Awdx(A)+Ax
G y ′ = A h ⋅ d y ( A ) + A y G_{y}^{\prime}=A_{h} \cdot d_{y}(A)+A_{y} Gy=Ahdy(A)+Ay
再做缩放
G w ′ = A w ⋅ exp ⁡ ( d w ( A ) ) G_{w}^{\prime}=A_{w} \cdot \exp \left(d_{w}(A)\right) Gw=Awexp(dw(A))
G h ′ = A h ⋅ exp ⁡ ( d h ( A ) ) G_{h}^{\prime}=A_{h} \cdot \exp \left(d_{h}(A)\right) Gh=Ahexp(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)=WT(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=iNtiWT(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 =argminWintiWT(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的不同之处在于池化窗口的内部的各自包含的特征值数量不一样。

输入特征图:
目标检测网络 -- FasterRCNN_第6张图片
特征图片对应的建议区域:

目标检测网络 -- FasterRCNN_第7张图片
若想输出2*2 的feature map
我们就需要对把这个ROI区域分成4大块,每一块做一下max-pooling 得到最终的值
目标检测网络 -- FasterRCNN_第8张图片
最终的的值就是
目标检测网络 -- FasterRCNN_第9张图片
拓展:ROI Align
目标检测网络 -- FasterRCNN_第10张图片
目标检测网络 -- FasterRCNN_第11张图片
目标检测网络 -- FasterRCNN_第12张图片
ROIalign按照下面的算法计算
目标检测网络 -- FasterRCNN_第13张图片
双线性插值计算方法

如上图,每一个蓝色点周围都有4个像素点,蓝色点的值极为该4个点的加权平均,权重是距离像素点的距离,距离越近,权重越大。如下图所示。
目标检测网络 -- FasterRCNN_第14张图片
圆圈代表像素值,色块面积代表权重。以红色点为例,待计算点(黑色点)距离红色点最远,因此它权重最小,反映在色块面积上就是红色色块面积最小。说明红色对黑色点的影响比较小。

四、分类和回归

目标检测网络 -- FasterRCNN_第15张图片
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

  1. 在预训练的model上,训练RPN网络
  2. 利用训练好的RPN
  3. 第一次训练Fast-RCNN网络
  4. 第二次训练RPN网络
  5. 再次利用步骤4,训练好的RPN网络搜集proposals
  6. 第二次训练Fast-RCNN网络

目标检测网络 -- FasterRCNN_第16张图片
目标检测网络 -- FasterRCNN_第17张图片
整个网络使用的损失,如下所示:
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})=Ncls1iLcls(pi,pi)+λNreg1ipiLreg(ti,ti)
目标检测网络 -- FasterRCNN_第18张图片
Faster RCNN预测
图片经过 RPN 产生anchor boxes
anchor boxes 通过 bounding box regressor 调整位置
使用 objectness classification 分类器的打分进行 NMS, 减少数量
将 region proposal 交给 fast rcnn 检测.

你可能感兴趣的:(目标检测,网络,深度学习)