深度学习-卷积神经网络--复习FasterRCNN-61


在开始深入学习Mask RCNN之前先复习一下 Faster RCNN 这个是其他框架的基础 重点的重点

参考链接:https://blog.csdn.net/WZZ18191171661/article/details/79439212
参考链接:https://blog.csdn.net/weixin_42310154/article/details/119889682
论文地址:https://arxiv.org/abs/1506.01497

1. 回顾

作为一个目标检测领域的baseline算法,Faster-rcnn值得你去仔细理解里面的细节,如果你能深入的了解这些,相信定会受益匪浅


ROI:Region of Inetrest 感兴趣的区域,也就是注意力放哪
可以发现目标检测的框架中包含4个关键模块,
包括region proposal(生成ROI)、
feature extraction(特征提取网络)、
classification(ROI分类)、
regression(ROI回归)
而faster-rcnn利用一个神经网络将这4个模块结合起来,训练了一个端到端的网络。
Faster-rcnn主要包括4个关键模块,特征提取网络、生成ROI、ROI分类、ROI回归。

想一想 为什么要有 region proposal 区域候选框?
目标检测,肯定是不能盲目的检测,肯定要思考一下,注意力应该放在哪里,对哪些位置进行检测,哪些位置最有可能出现物体,对吧,选举一样,从候选人里面进行选择。

  1. 特征提取网络:它用来从大量的图片中提取出一些不同目标的重要特征,通常由conv+relu+pool层构成,常用一些预训练好的网络(VGG、Inception、Resnet等),获得的结果叫做特征图;
  2. 生成ROI:在获得的特征图的每一个点上做多个候选ROI(这里是9),然后利用分类器将这些ROI区分为背景和前景,同时利用回归器对这些ROI的位置进行初步的调整;
    这一点特别的重要,注意是特征图的每一个点,每一个点对应多个(例如:9个)ROI,这个点有没有包含物体,这个点有没有,挨个的查下去,
  3. ROI分类:在RPN阶段,用来区分前景(于真实目标重叠并且其重叠区域大于0.5)和背景(不与任何目标重叠或者其重叠区域小于0.1);在Fast-rcnn阶段,用于区分不同种类的目标(猫、狗、人等);
  4. ROI回归:在RPN阶段,进行初步调整;在Fast-rcnn阶段进行精确调整;

总之,其整体流程:

  1. 首先对输入的图片进行裁剪操作,并将裁剪后的图片送入预训练好的分类网络中获取该图像对应的特征图;

  2. 然后在特征图上的每一个锚点上取9个候选的ROI(3个不同尺度,3个不同长宽比),
    并根据相应的比例将其映射到原始图像中(因为特征提取网络一般有conv和pool组成,但是只有pool会改变特征图的大小,因此最终的特征图大小和pool的个数相关);
    (这个一步很大部分人会蒙圈,包括我也是,其实也很很简单, feature_map上的每一个点,取9个候选的ROI,对应原图的有9个相应的区域)

  3. 接着将feature_map输入到RPN网络中,
    RPN网络对feature_map中的每个点进行分类(即确定这些ROI是前景还是背景)
    同时对其进行初步回归(即计算这些前景ROI与真实目标之间的BB的偏差值,包括Δx、Δy、Δw、Δh),然后做NMS(非极大值抑制,即根据分类的得分对这些ROI进行排序,然后选择其中的前N个ROI);

  4. 接着对这些不同大小的ROI进行ROI Pooling操作(即将其映射为特定大小的feature_map,文中是7x7),输出固定大小的feature_map;
    最后将其输入简单的检测网络中,然后利用1x1的卷积进行分类(区分不同的类别,N+1类,多余的一类是背景,用于删除不准确的ROI),同时进行BB回归(精确的调整预测的ROI和GT的ROI之间的偏差值),从而输出一个BB集合。

特征图上的最小单位点,比如原始图像的大小是256x256,特征提取网络中含有4个pool层,然后最终获得的特征图的大小为 256/16 x 256/16,即获得一个16x16的特征图,该图中的最小单位即是锚点,由于特征图和原始图像之间存在比例关系,在特征图上面密集的点对应到原始图像上面是有16个像素的间隔
uploading-image-740259.png

针对每一个锚点,然后根据不同的尺度(128、256、512)和不同的长宽比(1:1、0.5:1、1:0.5)产生9个BB,对于16x16的特征图,最终产生16x16x9=2304个候选的ROI。
锚点、中心:特征图空间单一锚点在原图中的表达,右侧:所有锚点在原图中的表达:

2. 细节 --RPN网络

RPN(Region Proposal Network)。即区域候选网络,该网络替代了之前RCNN版本的Selective Search,用于生成候选框。
任务有两部分,
一个是分类:判断所有预设anchor是属于positive还是negative(即anchor内是否有目标,二分类);
还有一个bounding box regression:修正anchors得到较为准确的proposals。
因此,RPN网络相当于提前做了一部分检测,即判断是否有目标(具体什么类别这里不判),以及修正anchor使框的更准一些。

RPN详解
uploading-image-706144.png

RPN结构,有两条线。
上面一条通过softmax分类anchors获得positive和negative分类,
下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。
最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取修正后的proposals,同时剔除太小和超出边界的proposals。
其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。(只差具体类别分类,还有更精准的再次框位置回归)


参照上面原文中的图,首先,在拿到conv layers的feature map后,先经过一个3x3卷积(卷积核个数为256),所以通过这个卷积层后feature map的通道数也是256,k是anchor个数(文中默认是9)。

(M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x2k的输出,因为这里是二分类判断positive和negative,所以该feature map上每个点的每个anchor对应2个值,
表示目标和背景的概率(为什么有2个,是因为这里是用的softmax,这两个值加起来等于1;也可以用sigmoid,就只需要1个值了)


Reshape层是技术细节问题,对feature map进行维度变换,使得有一个单独的维度为2,方便在该维度上进行softmax操作,之后再Reshape恢复原状。


(M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x4k的输出,因为这里是生成每个anchor的坐标偏移量(用于修正anchor),[tx,ty,tw,th]共4个所以是4k。注意,这里输出的是坐标偏移量,不是坐标本身,要得到修正后的anchor还要用原坐标和这个偏移量运算一下才行。

偏移值计算公式:

其中[xa,ya,wa,ha]是anchor的中心点坐标和宽高,[tx.ty,tw,th]是这个回归层预测的偏移量,

通过这个公式计算出修正后的anchor坐标[x,y,w,h]。计算如下:

[px,py,pw,ph]表示原始anchor的坐标
[dx,dy,dw,dh]表示RPN网络预测的坐标偏移
[gx,gy,gw,gh]表示修正后的anchor坐标。

1、为什么不直接预测修正后的anchor坐标,而是预测偏移量?
(1)如果直接预测修正后的anchor坐标了,那要这个预设anchor有何用?正是因为预测了偏移量,才能和预设anchor联动起来生成修正后的anchor
(2)直接预测框坐标,数量级比较大,难以训练
(3)坐标偏移一方面大小较小,且偏移具有较好的数学公式,求导方便

怎么生成proposal?

如上图Proposal层,这是RPN里最后一个步骤,输入有三个:
cls层生成的(M/16)x(N/16)x2k向量
reg层生成的(M/16)x(N/16)x4k向量
im_info=[M, N,scale_factor]

(1)利用reg层的偏移量,对所有的原始anchor进行修正
(2)利用cls层的scores,按positive socres由大到小排列所有anchors,取前topN(比如6000个)个anchors
(3)边界处理,把超出图像边界的positive anchor超出的部分收拢到图像边界处,防止后续RoI pooling时proposals超出边界。
(4)剔除尺寸非常小的positive anchor
(5)对剩余的positive anchors进行NMS(非极大抑制)
(6)最后输出一堆proposals左上角和右下角坐标值([x1,y1,x2,y2]对应原图MxN尺度)

综上所述,RPN网络总结起来其实就上面四个小标题:
生成anchors–>softmax分类器提取positive anchors–>bbox regression回归positive anchors生成偏移量–>生成最终Proposals

3. 细节 -- RoI pooling

RoI Pooling层则负责收集proposal,并计算出proposal feature maps(从conv layers后的feature map中扣出对应位置),输入有两个:
(1)conv layers提出的原始特征feature map,大小(M/16)x(N/16)
(2)RPN网络生成的Proposals,大小各不相同。一堆坐标([x1,y1,x2,y2])

为什么需要RoI pooling
全连接层的每次输入特征size必须是相同的,而这里得到的proposal大小各不相同。传统的有两种解决办法:

从图像从crop(裁剪)一部分送入网络
将图像wrap(resize)成需要的大小送入网络


很明显看到,crop会损失图像完整结构信息,wrap会破坏图像原始形状信息。因此,需要一种能够把所有图像大小整合到一起又不会简单粗暴造成破坏的方法,这里使用的是RoI pooling,由SSP(Spatial Pyramid Pooling)发展而来。

RoI pooling会有一个预设的pooled_w和pooled_h,表明要把每个proposal特征都统一为这么大的feature map
(1)由于proposals坐标是基于MxN尺度的,先映射回(M/16)x(N/16)尺度
(2)再将每个proposal对应的feature map区域分为pooled_w x pooled_h的网格
(3)对网格的每一部分做max pooling
(4)这样处理后,即使大小不同的proposal输出结果都是pooled_w x pooled_h固定大小,实现了固定长度输出

4. 细节 Classification

注意这里的分类和RPN中的分类不同,RPN中只是二分类,区分目标还是背景;这里的分类是要对之前的所有positive anchors识别其具体属于哪一类。

从RoI pooling处获取到pooled_w*pooled_h大小的proposal feature map后,送入后续网络,做两件事:

(1)通过全连接层和softmax对所有proposals进行具体类别的分类(通常为多分类)
举例说明:
假设pooled_w和pooled_h都为7,那么这些proposals在经过RoI pooling后的特征向量维度为[7, 7, 256],假设一共输出了300个proposals,那么所有的proposals组合起来维度就是[300,7,7,256],经过最后一个全连接层之后(会有拉平操作),维度应该是[300, 类别数],则该向量就能反应出每个proposal属于每一类的概率有多大。最终就知道每个proposal是属于哪一类,根据proposal索引来找到具体是图上哪个proposal。

(2)再次对proposals进行bounding box regression,获取更高精度的最终的predicted box
举例说明:
同上,假设一共输出了300个proposals,回归这里的全连接层输出维度应该是[300, 4],4还是代表偏移量。最终用proposal原始坐标加上偏移量,修正得到最最最终的predicted box结果。

4. 训练

Faster RCNN由于是two-stage检测器,训练要分为两个部分进行,一个是训练RPN网络,一个是训练后面的Fast RCNN分类网络。为了清晰描述整个训练过程,首先明确如下两个事实:
特征提取conv层下面简称共享conv层

RPN网络 = 共享conv层 + RPN特有层(3x3卷积、1x1卷积等)
Faster RCNN网络 = 共享conv层 + Faster RCNN特有层(全连接层)

训练:
第一步:
先使用ImageNet的预训练权重初始化共享conv层, RPN可随机初始化,然后训练RPN网络。训练完后,共享conv层和RPN特有层的权重都更新了。(RPN网络已经具备初步的提取候选框的能力)
第二步:
根据训练好的RPN网络拿到proposals(和测试过程一样)
第三步:
再次使用ImageNet的预训练权重初始化共享conv层(Faster RCNN层随机初始化),然后训练Faster RCNN网络。训练完后,共享conv层和Faster RCNN特有层的权重都更新了。
第四步:
使用第三步训练好的共享conv层和第一步训练好的RPN特有层来初始化RPN网络,第二次训练RPN网络。但这次要把共享conv层的权重固定,训练过程中保持不变,只训练RPN特有层的权重
第五步:
根据训练好的RPN网络拿到proposals(和测试过程一样)
第六步:依然使用第三步训练好的共享conv层和第三步训练好的Faster RCNN特有层来初始化Faster RCNN网络,第二次训练Faster RCNN网络。同样,固定conv层,只fine tune特有部分。

总结一下就是:
训练:共享conv层 + RPN特有层
训练:共享conv层 + Fast RCNN特有层(全连接层)

训练:共享conv层 + RPN特有层 (但是 固定共享conv层)
训练:共享conv层 + Fast RCNN特有层(全连接层)(但是 固定共享conv层)

RPN网络训练有两个Loss:
Lcls:softmax loss,用于分类anchors属于前景还是背景(也有说用二分类交叉熵Loss的)
Lreg:smooth L1 loss,用于修正anchor框,前面乘了一个pi*表示只回归有目标的框

smooth L1 loss

更深入的技术细节请读作者源代码,本文内容足够对Faster RCNN的逻辑有一个全面掌握了
Faster RCNN与SSD的anchor区别在于:
(1)前者在一个特征图上预设了anchor,先进行初步修正与筛选,之后再进行分类与回归
(2)后者在多个特征图上预设了anchor(多尺度),并直接在所有这些anchor上进行分类与回归(单阶段)

prior anchor 论文里面为 预设anchor

posted @ 2024-03-30 17:44  jack-chen666  阅读(10)  评论(0编辑  收藏  举报