目标检测——Faster R-CNN论文阅读

论文阅读——Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks

一、前言

论文地址:https://arxiv.org/abs/1506.01497
开源代码:https://github.com/endernewton/tf-faster-rcnn

笔者最近在学习目标检测相关方向,第一篇看的就是Faster RCNN算法,但是已经看完了许久,所以经常会忘记,学长一问起来就又不懂了,说明掌握的不够,所以在此又重新看了一遍论文,着重研究了下细节,所以在此记录,写的不好,希望大家多多指正。(毕竟我是小白,所以语言可能会偏通俗,尽量让新手也能看懂)

二、目标检测背景

目标检测是很多计算机视觉任务的基础。目前主流的目标检测算法主要是基于深度学习模型,可以分为两大块:(1)one-stage检测算法。这种算法直接产生物体的类别概率和坐标位置,不需要产生候选区域。比如说YOLO和SSD(2)two-stage检测算法。这是将检测问题划分为两个阶段,首先是产生候选区域,然后对候选区域分类。典型算法就是R-CNN系列,而今天要介绍的就是基于region proposal的目标检测——Faster R-CNN。

三、VGG-16结构

VGG-16是Faster R-CNN使用的主干网络,在论文中可能经常会将主干网络称为backbone network。主干网络的作用就是用来提取图片特征的,这个不是一成不变的,可以替换,比如现在都在流行使用残差网络ResNet,再比如CornerNet算法中使用的backbone是Hourglass Network,所以具体情况具体分析。

网络结构图如图2-1,VGG-16网络中的16代表的含义是含有参数的有16个层,分别是13个卷积层+3个全连接层。如图2-1,其中,13层的卷积层就是在不断地提取特征,池化层就是使图片的尺寸不断在变小,例如,输入图片尺寸为224×224,由于pad=1,所以经过3×3的卷积核之后,图片尺寸不变,所以图片只有在池化层尺寸才会变小。而我们的Faster R-CNN,VGG16用的是 convolution layer
feature,一个卷积层的feature map。

当然,用这种网络式的图应该能够更清楚(图来自于网络):

四、Faster R-CNN算法步骤

这部分是理解Faster R-CNN,先总体描述下算法的整个过程,以便后期我们做细节分析的时候,知道那个细节是在整个算法的哪个过程中。

由图1可知,将整张图片输进CNN,得到feature map,卷积特征输入到RPN,得到候选框的特征信息,对候选框中提取出的特征,使用分类器判别是否属于一个特定类别,对于属于某一特征的候选框,用回归器进一步调整其位置。

Faster R-CNN可以看成是RPN和Fast R-CNN模型的组合体,即Faster R-CNN = RPN + Fast R-CNN。接下来,我们将一步步分析上图3,搞清楚每个步骤的输入输出。

1.如图3-1,首先通过预训练模型训练得到 conv layers

2.如图3-2,这个conv layers实际上就是VGG-16,能够接收整张图片并提取特征图feature maps,这个feature maps是在conv5_3获得最后的特征(怎么一步步获得特征的下面有具体分析)。

3.如图3-4,这个feature maps被共享用于后续的RPN层和RoI池化层

4.如图3-5,先看去往RPN层的:RPN网络用于生成region proposals.该层通过softmax判断anchors属于前景(foreground)还是背景(background),再利用边框回归修正anchors,获得精确的proposals

5.如图3-6,接着是去往RoI pooling的:Roi Pooling层收集输入的feature maps 和 proposals,综合这些信息提取proposal feature map,进入到后面可利用全连接操作来进行目标识别和定位

最后的classifier会将Roi Pooling层形成固定大小的feature map进行全连接操作,利用Softmax进行具体类别的分类,同时,利用L1 Loss完成bounding box regression回归操作获得物体的精确位置.

五、细节部分解读

  1. RPN网络

    之前的R-CNN和Fast R-CNN都是采用可选择性搜索(SS)来产生候选框的,但是这种方法特别耗时,因此,Faster R-CNN最大的亮点就是抛弃以往的SS,采用RPN来生成候选框。下图是RPN网络的结构图。

    先对上图做个注解:

    1. Conv feature map:VGG-16网络最后一个卷积层输出的feature map

    2. Sliding windows:滑动窗口,实际就是3*3的卷积核,滑窗只是选取所有可能的区域,并没有什么额外的作用

    3. K anchor boxes:在每个sliding window的点上的初始化的参考区域(论文中k=9),其实就是9个矩形框

    4. Intermediate layer:中间层

    5. 256-d:中间层的维度(论文中有说用ZF网络就是256维,VGG的话就512维)

    6. Cls layer:分类层,预测proposal的anchor对应的proposal的(x,y,w,h)

    7. 2k scores:2k 个分数(18个)

    8. Reg layer:回归层,判断该proposal是前景还是背景

    9. 4k coordinates:4k 坐标(36个)

  2. RPN实现方式

    RPN 的输入是卷积特征图,输出是图片生成的 proposals.如下图,RPN通过一个滑动窗口,连接在最后一个卷积层(conv5-3的卷积)的feature map上,生成一个长度为256(对应于ZF网络)维的全连接特征。

    接着如下图,这个全连接特征分别送入两个全连接层,一个是分类层,用于分类预测,另外一个是回归层,用于回归。对于每个华东窗口位置一般设置k(论文中k=9)个不同大小或比例的anchors,这意味着每个滑窗覆盖的位置就会预测9个候选区域。

    对于分类层,每个 anchor 输出两个预测值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score;对于回归层,输出4k(4×9=36)个坐标值,表示各个候选区域的位置即(x,y,w,h)

    也就是说,在这里,我们是通过在这些特征图上应用滑动窗口加anchor机制进行目标区域判定和分类的,这里的滑窗加anchor机制,功能其实就类似于 fast rcnn 的selective search 生成proposals 的作用,而我们是通过RPN来生成proposals。RPN就是一个卷积层+relu+左右两个层(cls layer和reg layer)的小型网络。

  3. anchor

    论文中的原话:The k proposals are parameterized relative to k reference boxes, which we call anchors。字面上可以理解为锚点,位于之前提到的

    3×3的滑窗的中心处。anchor实际上就是矩形,如下图所示,9个anchor的中心点重合。对于一个滑窗,我们可以同时预测多个proposal,就是因为有多个anchor。这9个anchor是作者设置的,论文中scale ==[128,256,512],长宽比[1;1,1:2,2:1],所以有9种。自己可以根据目标的特点做出不同的设计。对于一幅W×H的feature map,共有W×H×k个锚点。

  4. VGG如何提取特征

    如下图,这是VGG网络的流程图

    每个卷积层利用前面网络信息来生成抽象描述. 第一层一般学习边缘edges信息,第二层学习边缘edges中的图案patterns,以学习更复杂的形状等信息. 最终,可以得到卷积特征图,其空间维度(分辨率)比原图小了很多,但更深. 特征图的 width 和 height 由于卷积层间的池化层而降低,而 depth 由于卷积层学习的 filters 数量而增加.

  5. ROI pooling

    ROI就是region of interest,指的是感兴趣区域,如果是原图,roi就是目标,如果是featuremap,roi就是特征图像目标的特征了,roi在这里就是经过RPN网络得到的,总之就是一个框。pooling就是池化。所以ROI Pooling就是Pooling的一种,只是是针对于Rois的pooling操作而已。RPN 处理后,可以得到一堆没有 class score 的 object proposals.待处理问题为:如何利用这些proposals分类.Roi pooling层的过程就是为了将不同输入尺寸的feature map(ROI)抠出来,然后resize到统一的大小。

    ROI pooling层的输入:

    • 特征图feature maps(这个特征图就是cnn卷积出来后的用于共享的那个特征图)
    • roi信息(就是RPN网络的输出, 一个表示所有ROI的N×5的矩阵,其中N表示ROI的数目。第一列表示图像index,其余四列表示其余的左上角和右下角坐标,坐标信息是对应原图中的绝对坐标。)

    ROI pooling层的过程:

    首先将RPN中得到的原图中的roi信息映射到feature上(按原图与featuremap的比例缩小roi坐标就行了),然后经过最大池化,池化到固定大小w×h。但这个pooling不是一般的Pooling,而是将区域等分,然后取每一小块的最大值,最后才能得到固定尺寸的roi。

    也就是:

    • 根据输入的image,将Roi映射到feature map对应的位置;
    • 将映射后的区域划分为相同大小的sections(sections数量和输出的维度相同);
    • 对每个section进行max pooling操作;

    ROI pooling层的输出:

    结果是,由一组大小各异的矩形,我们快速获取到具有固定大小的相应特征图。值得注意的是,RoI pooling 输出的维度实际上并不取决于输入特征图的大小,也不取决于区域提案的大小。这完全取决于我们将区域分成几部分。也就是,batch个roi矩阵,每一个roi矩阵为:通道数xWxH,也就是从selective search得到batch个roi,然后映射为固定大小。

  6. NMS

    NMS(Non Maximum Suppression,非极大值抑制)用于后期的物体冗余边界框去除,因为目标检测最终一个目标只需要一个框,所以要把多余的框干掉,留下最准确的那个。

    NMS的输入:

    检测到的Boxes(同一个物体可能被检测到很多Boxes,每个box均有分类score)

    NMS的输出:

    最优的Box.

    过程举例:

    假设图片中的某个目标检测到 4 个 Boxes,每个 Box 分别对应一个类别 Score,根据 Score 从小到大排列依次为,(B1, S1), (B2, S2), (B3, S3), (B4, S4). S4 > S3 > S2 > S1.
    ***以上B代表的是框,S代表的是框的分数***
    
    Step 1. 根据Score 大小,挑Score最大的那个先,从 Box B4 框开始;
    Step 2. 分别计算 B1, B2, B3 与 B4 的重叠程度 IoU,判断是否大于预设定的阈值;如果大于设定阈值,则舍弃该 Box;同时标记保留的 Box. 假设 B3 与 B4 的阈值超过设定阈值,则舍弃 B3,标记 B4 为要保留的 Box;
    Step 3. 从剩余的 Boxes 中 B1, B2 中选取 Score 最大的 B2, 然后计算 B2 与 剩余的 B1 的重叠程度 IoU;如果大于设定阈值,同样丢弃该 Box;同时标记保留的 Box.
    重复以上过程,直到找到全部的保留 Boxes.
    
  7. 全连接层

    经过roi pooling层之后,batch_size=300, proposal feature map的大小是7×7,512-d,对特征图进行全连接,参照下图,最后同样利用Softmax Loss和L1 Loss完成分类和定位。

    通过全连接层与softmax计算每个region proposal具体属于哪个类别(如人,马,车等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个region proposal的位置偏移量bbox_pred,用于回归获得更加精确的目标检测框

    即从PoI Pooling获取到7x7大小的proposal feature maps后,通过全连接主要做了:

    通过全连接和softmax对region proposals进行具体类别的分类;

    再次对region proposals进行bounding box regression,获取更高精度的rectangle box。

六、Loss Function

为了训练RPN,作者给每个anchor分配了二类别标签(是目标或者不是目标),还给两种anchor设定了一个正标签(两种anchor分别是:①具有与实际边界框的重叠最高交并比(IoU)的anchor,②具有与实际边界框的重叠超过0.7 IoU的anchor),一个GT包围盒可以对应多个anchor,这样一个GT包围盒就可以有多个正标签。负标签则是与所有GT包围盒的IoU都小于0.3的anchor。剩下的既不是正样本也不是负样本,不用于最终训练.

我们对一个图像的损失函数如公式1 :共有两大部分组成:分类损失(classification loss,就是分类分的准不准,比如这个目标是dog,你是否分类成pig或者cat了) 和回归损失(regression loss,就是框画的精不精确,比如这个目标是dog,这个框有没有刚好框住dog,还是说只框住了一半) ,这两大块是按一定比重组成的(通过λ调节).

先大概解释下公式中的变量:i是一个mini-batch中anchor的索引,Pi是anchor i是目标的预测概率。如果anchor为正,GT标签Pi* 就是1,如果anchor为负,Pi* 就是0。ti是一个向量,表示预测的包围盒的4个参数化坐标,ti* 是与正anchor对应的GT包围盒的坐标向量。ti* 是与正anchor对应的GT包围盒的坐标向量。λ是平衡参数,值为10,Ncls值为256,Nreg最大为2400,代表anchor的数量。

  • 分类损失

    分类损失Lcls是两个类别(目标或者非目标)的对数损失:

    对于每一个anchor计算对数损失,然后累加求和求和除以总的anchor数量Ncls。

  • 回归损失

    是一个向量,表示该anchor预测的偏移量,是与ti维度相同的向量,表示anchor相对于gt实际的偏移量。具体如下:

    x,y,w,h指的是包围盒中心的(x, y)坐标、宽、高。变量x,xa,x*分别指预测的包围盒、anchor的包围盒、GT的包围盒(对y,w,h也是一样)的x坐标。可以理解为从anchor包围盒到附近的GT包围盒的包围盒回归。

    R是smoothL1 函数就是这样。

七、实验结果分析

此次的Faster R-CNN是在pascal_voc数据集上训练及测试的

1.检测器使用的是Fast R-CNN和ZF。

由图5-1可知,SS在Fast R-CNN框架下的mAP为58.7%,EB的mAP为58.6%。RPN与Fast R-CNN的mAP为59.9%。

2.检测器使用的是Fast R-CNN和VGG16。

由图5-2可知,使用RPN+VGG,非共享特征的结果是68.5%,高于SS的。这是因为RPN+VGG生成的提议比SS更准确。对于特性共享的RPN+VGG,mAP是69.9%,比SS要高很多。如果在PASCAL VOC 2007和2012的训练评估数据集上进一步训练RPN和检测网络,该mAP是73.2%,也就是说能达到更高。

3.检测器使用的是Fast R-CNN和VGG16。

如图5-3,是我自己训练测试的结果与论文的mAP对比:

八、总结

Faster R-CNN创新点:

  • 设计 RPN,利用CNN卷积操作后的特征图生成region proposals,代替了Selective Search的方法,速度上提升明显;

  • 训练 RPN 与检测网络Fast R-CNN共享卷积层,大幅提高网络的检测速度。

  • FasterR-CNN将一直以来分离的region proposal和CNN分类融合到了一起,使用端到端的网络进行目标检测,无论在速度上还是精度上都得到了不错的提高。

RPN的核心思想是使用CNN卷积神经网络直接产生Region Proposal,使用的方法本质上就是滑动窗口。RPN的作用:

  • 输出proposal的位置(坐标)和score

  • 将不同scale和ratio的proposal映射为低维的feature vector

  • 输出是否是前景的classification和进行位置的regression

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值