文章目录[隐藏]
本专栏以理论与实战相结合的方式,左手看论文,右手撸代码,带你一步步掌握深度学习原理和源码,玩转计算机视觉领域中的三大基本任务:图像分类、目标检测、语义分割。
本专栏完整代码将在我的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个步骤:
- Conv layers。首先将图像输入到CNN(VGG-16)提取图像特征,得到的 feature maps 将被共享用于后面的 RPN 和 ROI Pooling。
- Region Proposal Networks。RPN用于生成推荐区域。该网络通过softmax判断anchors属于positive还是negative,再利用边界框回归修正anchors获得精确的推荐框proposals。
- ROI Pooling。该层以feature maps和proposals同时作为输入,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
- 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
暂无评论