TensorFlow2深度学习实战(十六):目标检测算法Faster R-CNN解析

本专栏以理论与实战相结合的方式,左手看论文,右手撸代码,带你一步步掌握深度学习原理和源码,玩转计算机视觉领域中的三大基本任务:图像分类、目标检测、语义分割。

本专栏完整代码将在我的GiuHub仓库更新,欢迎star收藏:https://github.com/Keyird/DeepLearning-TensorFlow2

一、Faster R-CNN 介绍

2015年,微软研究团队的任少卿、何凯明等人提出了Faster R-CNN,该方法提出了一种新的Region Proposal Networks取代了原来的Selective Search算法,几乎不消耗计算时间,使得生成推荐区域过程变得非常高效,解决了Fast R-CNN生成推荐区域耗时的问题。

Faster R-CNN算法将Region Proposal Networks与Fast R-CNN进一步合并为一个单个网络。当采用非常深的VGG-16模型作为骨干网络时,基于该方法的检测系统在GPU上的帧速率为5fps,基本达到实时检测的水平。同时在PASCAL VOC2007、2012和MS COCO数据集上,其检测精度也达到了最好的水平。

在这里插入图片描述

二、算法流程

如下图所示,Faster R-CNN算法流程主要有以下4个步骤:

  1. Conv layers。首先将图像输入到CNN(VGG-16)提取图像特征,得到的 feature maps 将被共享用于后面的 RPN 和 ROI Pooling。
  2. Region Proposal Networks。RPN用于生成推荐区域。该网络通过softmax判断anchors属于positive还是negative,再利用边界框回归修正anchors获得精确的推荐框proposals。
  3. ROI Pooling。该层以feature maps和proposals同时作为输入,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  4. Classifer and Detector。将proposal feature maps输入全连接层预测proposals的类别;同时再次进行边界框回归,获得检测框最终的精确位置。

在这里插入图片描述

三、网络结构

如下图所示,是Faster R-CNN网络的整体架构图,输入是PxQ的图像,经过resize后变为MxN的大小送入网络中。从图中结构可知,Faster R-CNN采用的是VGG16作为骨干网络来提取特征。随着深度学习飞速的发展,越来越多高效的骨干网络相继被提出,比如ResNet系列等,均可用于Faster R-CNN中,替代其原有的VGG网络。
在这里插入图片描述

Faster R-CNN是经典的双阶段目标检测网路,整个边界框回归部分由两部分组成,第一次bounding box regression即在RPN中的第二条支路中进行,用来获得较为精确的proposal;第二次bounding box regression即在ROI Pooling之后的全连接层中进行,用来获得更加精确的目标框位置。

1、Conv layers

Conv layers即指特征提取网络,Faster R-CNN采用VGG16进行特征提取,得到的feature maps被共享用于后续的RPN和ROI Pooling。Conv layers部分共有13个conv层,13个relu层,4个pooling层。在Conv layers中:

  • 所有的conv层都是:kernel_size=3,pad=1,stride=1
  • 所有的pooling层都是:kernel_size=2,pad=0,stride=2

在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。那么,一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)。

详细了解VGG16,可参考:https://blog.csdn.net/wjinjie/article/details/105274142

2、Region Proposal Networks

经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;R-CNN使用SS(Selective Search)方法生成检测框。而Faster R-CNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。

在这里插入图片描述
上图展示了RPN网络的具体结构,可以看到RPN网络实际分为2条线:

  • 上面一条通过softmax分类,判断anchors是positive还是negative,即该anchors是否包含待检测目标。
  • 下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。

而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就相当于完成了初步的目标定位功能。

如下图所示,假如原图是600x600的大小,输入到Conv layers后下采样了4次,因此输出的feature maps大小为:38x38。接下来,在RPN中,为每一个点(一共38x38个)都配备这k种anchors作为初始的预选框。

在这里插入图片描述
图中的k即代表anchors的不同种类数,在文章中设置的是9。2k和4k分别代表中两条支路的通道数,即18和36。其中,2代表positive或negative;4代表目标框的坐标位置(x,y,w,h)。

由于feature maps上每个点都9个anchors,所以一共有:38x38x9=12996个anchors。全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练。

Proposal Layer负责综合所有偏移量[dx, dy, dw, dh]和anchors,计算出精确的proposals,送入后续RoI Pooling Layer。

3、ROI Pooling

ROI Pooling的作用是将不同大小的proposals下采样成相同的大小,便于后续的分类与回归处理。具体做法是:

  • 由于proposals对应的坐标是原图上的,因此先要将proposals映射回到(M/16)x(N/16)大小的feature map上;
  • 再将每个proposal 对应的feature map区域水平分为size固定为[pool_w, pool_h]的网格,即7x7的网格;
  • 对网格的每一份都进行max pooling处理,获得7x7大小的fearture map。
    在这里插入图片描述

4、Classifer and Detector

Classifer and Detector部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。本部分结构图如下所示:
在这里插入图片描述

四、损失函数

整个网络的损失函数由两部分构成,分类损失和目标框回归损失,总的损失函数如下:
在这里插入图片描述
其中,

i

i

i 表示 anchors index,

p

i

p_i

pi 表示 positive softmax probability,

p

i

p_i^*

pi 代表对应的 GT predict 概率;

t

t

t 代表predict bounding box,

t

t^*

t 代表对应positive anchor的GT box。

当第i个anchor与GT间IoU>0.7,认为是该anchor是positive,

p

i

=

1

p_i^*=1

pi=1;反之IoU<0.3时,认为是该anchor是negative,

p

i

=

0

p_i^*=0

pi=0;至于那些0.3<IoU<0.7的anchor则不参与训练;

由于在实际过程中,

N

c

l

s

N_{cls}

Ncls

N

r

e

g

N_{reg}

Nreg差距过大,用参数λ平衡二者(如

N

c

l

s

=

256

N_{cls}=256

Ncls=256

N

r

e

g

=

2400

N_{reg}=2400

Nreg=2400时,设置

λ

=

10

\lambda=10

λ=10 ),使总的网络Loss计算过程中能够均匀考虑2种损失。

整个网络的损失分为两个部分,其中分类损失采用的是二分类交叉熵损失,目标框回归部分采用的是经典的

s

m

o

o

t

h

L

1

smooth_{L1}

smoothL1损失,用于边界框回归网络训练。注意在该损失中乘了

p

i

p_i^*

pi ,相当于只关心 positive anchors 的回归,其实在回归中也完全没必要去关心negative。

其中,

s

m

o

o

t

h

L

1

smooth_{L1}

smoothL1损失函数公式如下:
在这里插入图片描述

五、网络训练

Faster R-CNN 是双阶段网络,其训练过程较单阶段网络也更为复杂一点。Faster R-CNN的在实际训练过程主要分为以下几个步骤:

  • 加载预训练模型(VGG、ResNet),在其基础上进行训练
  • 第一次训练RPN网络,收集proposals
  • 第一次训练Fast RCNN网络
  • 第二训练RPN网络,收集proposals
  • 第二次训练Fast RCNN网络

可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。

参考文献:
https://zhuanlan.zhihu.com/p/31426458
https://cloud.tencent.com/developer/article/1441555

戳戳下方公众号,更多干货第一时间送达!

版权声明:本文为CSDN博主「AI 菌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wjinjie/article/details/120826938

AI 菌

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

【无标题】

Using winsys: x11 ERROR: Deserialize engine failed because file path: /opt/nvidia/deepstream/deepstream-6.0/sources/deepst