美文网首页
Faster RCNN

Faster RCNN

作者: 帆人自书 | 来源:发表于2021-08-31 12:50 被阅读0次

    Faster RCNN属于两阶段目标检测算法,其经过RCNN和Fast RCNN的沉淀,在正式介绍其之前,我们先简单回顾一下RCNN和Fast RCNN,其实分析清楚最新的Faster R-CNN就够了,并不需要追溯到那么久(本文参考知乎用户:https://zhuanlan.zhihu.com/p/31426458).


    图1 RCNN架构

    如图1,RCNN首先通过选择性搜索算法Selective Search从一组对象候选框中选择可能出现的对象框,然后将这些选择出来的对象框中的图像resize到某一固定尺寸的图像,并喂入到CNN模型(经过在ImageNet数据集上训练过的CNN模型,如AlexNet)提取特征,最后将提取出的特征送入到SVM分类器来预测该对象框中的图像是否存在待检测目标,并进一步预测该检测目标具体属于哪一类。

    虽然RCNN算法取得了很大进展,但缺点也很明显:重叠框(一张图片大2000多个候选框)特征的冗余计算使得整个网络的检测速度变得很慢(使用GPU的情况下检测一张图片大约需要14S)。


    图2 Fast RCNN架构

    如图2,Fast RCNN是RCNN的改进版,该网络首先输入图像,图像被传递到CNN中提取特征,并返回感兴趣的区域ROI(仍然使用Selective Search,这个过程非常慢),之后在ROI上运用ROI池化层以保证每个区域的尺寸相同,最后这些区域的特征被传递到全连接层的网络中进行分类,并用Softmax和线性回归层同时返回边界框。


    图3 Faster RCNN基本结构(来自原论文)

    下面进入正题,依作者看来,如图3,Faster RCNN其实可以分为4个主要内容:

    1.Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。

    2.Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。

    3.Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。

    4.Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

    所以本文以上述4个内容作为切入点介绍Faster R-CNN网络。

    图4展示了python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构,可以清晰的看到该网络对于一副任意大小PxQ的图像:

    首先缩放至固定大小MxN,然后将MxN图像送入网络;

    而Conv layers中包含了13个conv层+13个relu层+4个pooling层;

    RPN网络首先经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals;

    而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。

    图4 faster_rcnn_test.pt网络结构 (pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt)  

    1 Conv layers

    在Conv layers中:所有的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层不改变输入和输出矩阵大小。

    图5 卷积示意图

    类似的是,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(4个pooling层)固定变为(M/16)x(N/16)!这样Conv layers生成的feature map中都可以和原图对应起来。

    2 Region Proposal Networks(RPN)

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

    图6 RPN网络结构

    上图6展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

    2.1 Anchors

    RPN网络基于anchors预测物体,卷积后的每个格点预测9个anchor,如图7。

    图7 anchors示意图

    借用Faster RCNN论文中的原图,如图8,遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,不用担心,后面还有2次bounding box regression可以修正检测框位置。

    图8

    解释一下上面这张图的数字。

    在原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions

    在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息(猜测这样做也许更鲁棒?反正我没测试),同时256-d不变

    假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2•k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4•k coordinates

    补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(什么是合适的anchors下文5.1有解释)

    注意,在本文讲解中使用的VGG conv5 num_output=512,所以是512d,其他类似。

    其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已!

    那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以

    如何生成Anchors呢?在原图以16像素为间隔的每个格点处产生9个anchor,有些anchor会超出图像边界,如图9

    图9 Gernerate Anchors

    2.2 softmax判定positive与negative

    一副MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,如图10:

    图10 RPN中判定positive/negative网络结构

    1*1卷积后输出为num_output=18,# 2(positive/negative) * 9(anchors),也就是经过该卷积的输出图像为WxHx18大小,同时每个anchors又有可能是positive和negative,所有这些信息都保存WxHx(9*2)大小的矩阵。后面接softmax分类获得positive anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在positive anchors中)。

    2.3 bounding box regression原理

    如图11所示绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。

    图11

    对于窗口一般使用四维向量(x,y,w,h)表示,分别表示窗口的中心点坐标和宽高。对于图12,红色的框A代表原始的positive Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G'

    图12

    那么经过何种变换F才能从图10中的anchor A变为G'呢? 比较简单的思路就是:

    式子1

    2.4 对proposals进行bounding box regression

    在了解bounding box regression后,再回头来看RPN网络第二条线路,如图13。

    图13 RPN中的bbox reg

    经过1*1卷积后,输出num_output=36,即经过该卷积输出图像为WxHx36,在caffe blob存储为[1, 4x9, H, W],这里相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的变换量。

    回到图9,VGG输出50*38*512的特征,对应设置 50*38*k个anchors,而RPN输出:

    1.大小为50*38*2k的positive/negative softmax分类特征矩阵

    2.大小为50*38*4k的regression坐标回归特征矩阵

    恰好满足RPN完成positive/negative分类+bounding box regression坐标回归.

    2.5 Proposal Layer

    Proposal Layer负责综合所有 

     变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。

    Proposal Layer forward(caffe 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超出图像边界(见文章底部QA部分图21)

    4.剔除尺寸非常小的positive anchors

    5.对剩余的positive anchors进行NMS(nonmaximum suppression)

    6.Proposal Layer有3个输入:positive和negative anchors分类器结果rpn_cls_prob_reshape,对应的bbox reg的(e.g. 300)结果作为proposal输出

    之后输出proposal=[x1, y1, x2, y2],注意,由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的,这点在后续网络中有用。另外我认为,严格意义上的检测应该到此就结束了,后续部分应该属于识别了。

    RPN网络结构就介绍到这里,总结起来就是:

    生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals

    3 RoI Pooling原理

    RoI Pooling layer forward过程:

    由于proposal是对应MxN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature map尺度;

    再将每个proposal对应的feature map区域水平分为 pooled_w*pooled_h的网格;

    对网格的每一份都进行max pooling处理。这样处理后,即使大小不同的proposal输出结果都是 pooled_w*pooled_h的固定大小,实现了固定长度输出。

    图14

    4 Classification

    Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。Classification部分网络结构如图15。

    图15 Classification部分网络结构图  

    从RoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:

    1.通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了

    2.再次对proposals进行bounding box regression,获取更高精度的rect box

    相关文章

      网友评论

          本文标题:Faster RCNN

          本文链接:https://www.haomeiwen.com/subject/fsxziltx.html