目标检测(二)—— R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN

R-CNN

R-CNN
区域卷积神经网络(Regions with CNN features,简称 R-CNN)使用深度模型来解决物体识别。

具体步骤:

  • Sective Search 。对每张输入图像使用选择性搜索来选取多个高质量的提议区域。
  • Resize。对每个提议区域,将其变形成卷积神经网络需要的输入尺寸。
  • 特征抽取。选取一个预先训练好的卷积神经网络,去掉最后的输出层来作为特征抽取模块。
  • SVMs。类别预测,练多个支持向量机(SVM)来进行物体类别分类,这里第 i 个 SVM 预测样本是否属于第 i 类。
  • Bbox Reg。边框预测,训练一个线性回归模型来预测真实边界框。
  • 基于像素信息快速分割获得多个区域
  • 将相似的两个区域合并成一个区域,重复合并直至整张图变成一个区域
  • 根据合并信息生成多个有层次结构的提议区域,并为每个提议区域生成物体类别和多个建议框。

优缺点分析:

  • R-CNN 对之前物体识别算法的主要改进是使用了预先训练好的卷积神经网络来抽取特征,有效的提升了识别精度。

  • 速度慢。对一张图像我们可能选出上千个兴趣区域,这样导致每张图像需要对卷积网络做上千次的前向计算。


Fast R-CNN

  • R-CNN 的主要性能瓶颈在于需要对每个提议区域独立的抽取特征,区域会有大量重叠,独立的特征抽取导致了大量的重复计算。
  • Fast R-CNN 对 R-CNN 的一个主要改进在于首先对整个图像进行特征抽取,然后再选取提议区域,从而减少重复计算。
    Fast R-CNN

    Fast R-CNN 跟 R-CNN 的主要不同在于下面四点:

  • 用来提取特征的卷积网络是作用在整个图像上,而不是各个提议区域上。而且这个卷积网络通常会参与训练,即更新权重。

  • 选择性搜索是作用在卷积网络的输出上,而不是原始图像上。
  • RoI Pooling。引入了兴趣区域池化层(Region of Interest Pooling,简称 RoI 池化层)来对每个提议区域提取同样大小的输出以便输入之后的神经层。
  • Softmax。在物体分类时,Fast R-CNN 不再使用多个 SVM,而是像之前图像分类那样使用 Softmax 回归来进行多类预测。

Rol Pooling

RoI 池化层里我们直接设置每个区域的输出大小。例如:设置n×m,那么对每一个区域我们得到 n×m形状输出。具体来说,我们将每个区域在高和宽上分别均匀划分 n 和 m 块,如果划分边界不是整数则定点化到最近的整数。然后对于每一个划分区域,我们输出其最大元素值。

<code>2×2</code> RoI池化层
Github更详细的展示

优缺点分析

  • 不用Resize,不适合求导。
  • 对整个图像进行特征抽取,然后再选取提议区域,从而减少重复计算。
  • 选择性搜索费时

Faster R-CNN

  • Faster R-CNN 对 Fast R-CNN 做了进一步改进,它将 Fast R-CNN 中的选择性搜索替换成区域提议网络(region proposal network,简称 RPN)
  • RPN 以锚框为起始点,通过一个小神经网络来选择提议区域。

Faster R-CNN模型

RPN

具体来说,RPN 里面有四个神经层:

  • CNN-Layer。卷积网络抽取的特征首先进入一个填充数为 1、通道数为 256 的 3×3 卷积层,这样每个像素得到一个 256 长度的特征表示。
  • Anchor Box。以每个像素为中心,生成多个大小和比例不同的锚框和对应的标注。每个锚框使用其中心像素对应的 256 维特征来表示。
  • 在锚框特征和标注上面训练一个两类分类器,判断其含有感兴趣物体还是只有背景。
  • 对每个被判断成含有物体的锚框,进一步预测其边界框,然后进入 RoI 池化层。

优缺点分析

  • RPN 通过标注来学习预测跟真实边界框更相近的提议区域,从而减小提议区域的数量同时保证最终模型的预测精度。

Musk R-CNN

参考博客:

  1. Mask RCNN 学习笔记-勇者无敌
  2. 机器之心

    • 注意到 RPN 输出的是实数坐标的提议区域,在输入到 RoI 池化层时我们将实数坐标定点化成整数来确定区域中的像素
    • 在计算过程中,我们将每个区域分割成多块然后同样定点化区域边缘到最近的像素上

这两步定点化会使得定点化后的边缘和原始区域中定义的有数个像素的偏差,这个对于边界框预测来说问题不大,但在像素级别的预测上则会带来麻烦。

Musk R-CNN

Musk R-CNN具体网络结构
主要贡献:

  1. 强化的基础网络。通过 ResNeXt-101+FPN 用作特征提取网络,达到 state-of-the-art 的效果。
  2. ROIAlign解决Misalignment 的问题
  3. Loss Function

FPN

多尺度的object detection算法:FPN(feature pyramid networks)。
低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。
因此,有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而FPN预测是在不同特征层独立进行的。

四种利用特征的形式

  • 图像金字塔,即将图像做成不同的scale,然后不同scale的图像生成对应的不同scale的特征。缺点:增加了时间成本,故有些算法在测试时选用图像金字塔。
  • 采用最后一层网络特征。SPP net,Fast RCNN,Faster RCNN等
  • 采用多尺度特征融合的方式,没有上采样过程。SSD
  • 顶层特征通过上采样和低层特征做融合,而且每层都是独立预测的
    四种利用特征的形式

FPN作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。

skip connection的网络结构&FPN

这里写图片描述
上面一个带有skip connection的网络结构在预测的时候是在finest level(自顶向下的最后一层)进行的,简单讲就是经过多次上采样并融合特征到最后一步,拿最后一步生成的特征做预测。而下面一个网络结构和上面的类似,区别在于预测是在每一层中独立进行的

FPN 算法流程

一个自底向上的线路,一个自顶向下的线路,横向连接(lateral connection)。
FPN算法流程
图中放大的区域就是横向连接,这里1*1的卷积核的主要作用是减少卷积核的个数,也就是减少了feature map的个数,并不改变feature map的尺寸大小。

  • 自底向上其实就是网络的前向过程。在前向过程中,feature map的大小在经过某些层后会改变,而在经过其他一些层的时候不会改变,作者将不改变feature map大小的层归为一个stage,因此每次抽取的特征都是每个stage的最后一个层输出,这样就能构成特征金字塔。
  • 自顶向下的过程采用上采样(upsampling)。
  • 横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge)。在融合之后还会再采用3*3的卷积核对每个融合结果进行卷积,目的是消除上采样的混叠效应(aliasing effect)

总结

FPN(Feature Pyramid Network)算法同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式不同。
期待代码

ROl Align

ROI Pooling 两个量化的过程:

  1. 从roi proposal到feature map的映射过程。方法是[x/16],这里x是原始roi的坐标值,而方框代表四舍五入。
  2. 从feature map划分成7*7的bin,每个bin使用max pooling。
    ROI Pooling
    这两种情况都会导致证输入和输出之间像素级别上的无法一一对应(pixel-to-pixel alignment between network input and output)。

ROI Align layer:去掉ROI Pooling过程中所有的量化过程,包括从原图proposal到最后一层feature map映射,以及把feature map划分成m*m的bin过程中的量化。

ROI Align具体过程

过程

roi映射到feature map后,不再进行四舍五入:
这里写图片描述
- 将候选区域分割成k x k个单元
这里写图片描述
- 在每个单元中计算固定四个坐标位置
这里写图片描述
- 用双线性内插的方法计算出这四个位置的值,进行最大池化操作。
这里写图片描述

固定位置是指在每一个矩形单元(bin)中按照比例确定的相对位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。显然这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。
在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。
值得一提的是,在做实验的时候发现,ROI Align在VOC2007数据集上的提升效果并不如在COCO上明显。经过分析为造成这种区别的原因是COCO上小目标的数量更多,而小目标对misalignment问题的影响更为明显(同样是0.5个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多

猜你喜欢

转载自blog.csdn.net/qq_38622495/article/details/82287096