【深度学习】Two-Stage目标检测算法

本文参考自 第八章_目标检测.md

Two stage目标检测算法:
先进行区域生成(region proposal,RP)(一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。
任务:特征提取—>生成RP—>分类/定位回归。
常见的two stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。

一、目标追踪

  • 分类
  • 分类+位置
  • 多目标检测
  • 图像分割
    【深度学习】Two-Stage目标检测算法
    【深度学习】Two-Stage目标检测算法

; 二、R-CNN

【深度学习】Two-Stage目标检测算法
【深度学习】Two-Stage目标检测算法
R-CNN简要步骤:
  • 输入测试图像
  • 利用选择性搜索Selective Search算法在图像中从下到上提取2000个左右的可能包含物体的候选区域(Region Proposal)
  • 因为取出的区域大小各自不同,所以需要将每个 Region Proposal 缩放 (warp) 成统一的227×227的大小并输入到CNN,将CNN的fc7层的输出作为特征
  • 将每个Region Proposal提取到的CNN特征输入到SVM进行分类

三、SPP-Net

参考文章:【目标检测】SPPnet论文详解

【深度学习】Two-Stage目标检测算法

; 1.SPP-Net特点

  • 网络的输入图片可以是任意尺寸
  • 深度卷积神经网络的基础结构分为:卷积层(conv layers)→池化层(pooling layers)→全连接层(fc layers)
  • 我们在设计网络的时候,全连接层的输入维数必须提前固定。从全连接层往前推的话,就必须保持第一层卷积的输入尺寸是固定的,例如224×224(ImageNet)、32×32(LenNet)等。这也就要求我们在检测图片时,需要将图片经过crop(裁剪)、warp(拉伸)等操作把图片变换成固定尺寸,才能输入神经网络。这些操作在一定程度上会导致图片信息的丢失或者变形。 对此SPPnet提出的解决方案是在最后一层卷积层后用空间金字塔池化层(Spatial Pyramid Pooling)代替普通池化层。

2.空间金字塔池化(SPP)

  • 论文中举例:把卷积操作之后的特征图(feature maps),以不同大小的块(池化框)来提取特征,分别是4×4,2×2,1×1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial Bins),我们从这21个块中,每个块提取出一个特征(提取方式有平均池化、最大池化等),这样就得到了固定的21维特征向量。
  • 以不同的大小格子的组合方式来池化的过程就是空间金字塔池化。
  • 这么一来,我们只要设计m个n×n大小的网格就可以生成任意维数的特征向量,而不需要在意经过多层卷积操作后的特征图的大小是多少,这也意味着我们不需要在意网络输入的图片尺寸。
  • *使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)

3.SPP-Net过程

  • 首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。
  • 特征提取阶段:这一步就是和R-CNN最大的区别了,这一步骤的具体操作如下:
  • 把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps
  • 然后在feature maps中找到各个候选框的区域
  • 再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。
    而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。
  • 最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别

四、Fast R-CNN

参考文章:【目标检测】Fast R-CNN论文详解

相比R-CNN最大的区别,在于RoI池化层和全连接层中目标分类与检测框回归微调的统一。

【深度学习】Two-Stage目标检测算法

; 1.Fast R-CNN解决R-CNN的三个问题

  • 测试速度慢 R-CNN中用CNN对每一个候选区域反复提取特征,而一张图片的2000个候选区域之间有大量重叠部分,这一设定造成特征提取操作浪费大量计算。 Fast R-CNN将整个图像归一化后直接送入CNN网络,卷积层不进行候选区的特征提取,而是在最后一个池化层加入候选区域坐标信息,进行特征提取的计算。
  • 训练速度慢 同测试速度慢理由
  • 训练所需空间大 R-CNN中目标分类与候选框的回归是独立的两个操作,并且需要大量特征作为训练样本。 Fast R-CNN将目标分类与候选框回归统一到CNN网络中来,不需要额外存储特征。

2.Fast R-CNN的网络结构

【深度学习】Two-Stage目标检测算法
  • RoI池化层
    RoI池化层去掉了SPP的多尺度池化,直接用M×N的网格,将每个候选区域均匀分成M×N块,对每个块进行max pooling。从而将特征图上大小不一的候选区域转变为大小统一的特征向量,送入下一层。 什么是RoI呢? RoI是Region of Interest的简写,一般是指图像上的区域框,但这里指的是由Selective Search提取的候选框。
    【深度学习】Two-Stage目标检测算法
    【深度学习】Two-Stage目标检测算法
  • 特征提取方式
    Fast R-CNN在特征提取上可以说很大程度借鉴了SPPnet,首先将图片用选择搜索算法(selective search)得到2000个候选区域(region proposals)的坐标信息。

另一方面,直接将图片归一化到CNN需要的格式,整张图片送入CNN,将第五层的普通池化层替换为RoI池化层,图片然后经过5层卷积操作后,得到一张特征图(feature maps),开始得到的坐标信息通过一定的映射关系转换为对应特征图的坐标,截取对应的候选区域,经过RoI层后提取到固定长度的特征向量,送入全连接层。

【深度学习】Two-Stage目标检测算法

; 五、Faster R-CNN

参考文章:一文读懂Faster RCNN

【深度学习】Two-Stage目标检测算法
【深度学习】Two-Stage目标检测算法

; 1.Faster R-CNN基本结构

Faster RCNN其实可以分为4个主要内容:

  • Conv layers:作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层 Conv layers包含了conv,pooling,relu三种层
    【深度学习】Two-Stage目标检测算法
    Faster RCNN Conv layers中对所有的卷积都做了扩边处理( pad=1,即填充一圈0),导致原图变为 (M+2)×(N+2)大小,再做3×3卷积后输出M×N 。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小,如上图
  • Region Proposal Networks:RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals
    【深度学习】Two-Stage目标检测算法
    根据上图可以看出RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。 其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已! RPN网络结构总结起来就是:
    生成anchors → softmax分类器提取positvie anchors→ bbox reg回归positive anchors → Proposal Layer生成proposals
  • Roi Pooling:该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别 从图络结构图中可以看到Rol pooling层有2个输入:
  • 原始的feature maps
  • RPN输出的proposal boxes(大小各不相同)
  • Classification:利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置

六、R-FCN

参考文章:R-FCN论文详解

【深度学习】Two-Stage目标检测算法

; 1.创新点

  • 采用全卷积(Fully Convolutional),主干网络为Res-Net101
  • 采用位置敏感得分图(position-sentive score maps)

2.R-FCN整体流程

R-FCN主要包括4个部分:Conv layers(ResNet)、Region Proposal Network(RPN)、Classification、Regression。而整个R-FCN的流程如下:

  • 首先输入一张图片,图片要经过resize使得图片的短边的长度为600。
  • 然后图片先经过ResNet-101来提取特征,ResNet-101主要包括5个卷积网络块。
  • 其中conv4的输出作为RPN的输入,和Faster R-CNN相同,这个RPN是用来提取proposal的,即提取出RoIs。
  • 同时,ResNet-101的conv5输出因为是2048-d的,所以又加了一个新的new conv来降低channel的维度,输出的维度为1024-d。
  • 然后这个1024-d的feature map再输入两个平行的conv layer中,一个用来classification,另一个用来regression。
  • 对于classification的conv layer会产生一个k 2 ( c + 1 ) k^2(c+1)k 2 (c +1 )维的position-sensitive score map,然后再结合RPN提取的RoIs进行pooling,之后再为每个RoI得到分类结果。
  • 而对于regression的conv layer则会产生一个4 k 2 4k^2 4 k 2维的position sensitive score map,然后也同样结合RPN提取的RoIs进行pooling,之后再为每个RoI得到回归结果。

3.selective pooling

【深度学习】Two-Stage目标检测算法
【深度学习】Two-Stage目标检测算法
将ROI应用到特征图上,输出一个3×3数组。将得分图和ROI映射到vote数组的过程叫做位置敏感ROI池化(position-sensitive ROI-pool)。该过程与前面讨论过的ROI池化非常接近。
【深度学习】Two-Stage目标检测算法
将ROI的一部分叠加到对应的得分图上,计算V[i][j]。在计算出位置敏感ROI池化的所有值后,类别得分是其所有元素得分的平均值。
【深度学习】Two-Stage目标检测算法
假如我们有C个类别要检测。我们将其扩展为C+1个类别,这样就为背景(非目标)增加了一个新的类别。每个类别有3×3个得分图,因此一共有(C+1)×3×3个得分图。使用每个类别的得分图可以预测出该类别的类别得分。然后我们对这些得分应用 softmax 函数,计算出每个类别的概率。以下是数据流图,在本案例中,k=3。【深度学习】Two-Stage目标检测算法

; 七、FPN(特征金字塔网络)

1.创新点

  • 多层特征
  • 特征融合
  • 解决了目标检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量的情况下,大幅度提升小物体(small object)检测的性能

2.网络结构图

【深度学习】Two-Stage目标检测算法
这种网络结构,能够在增加较少计算量的前提下融合低分辨率语义信息较强的特征图和高分辨率语义信息较弱但空间信息丰富的特征图。

; 3.组成模块

(1)Bottom-up pathway(自底向上线路)
(2)Lareral connections(横向链接)
(3)Top-down path(自顶向下线路)

【深度学习】Two-Stage目标检测算法
  • Bottom-up pathway
    【深度学习】Two-Stage目标检测算法
  • Top-down pathway and lateral connections Top-town pathway是上采样(upsampling)过程。而later connection(横向连接)是将上采样的结果和bottom-up pathway生成的相同大小的feature map进行融合(merge)。 注:上采样尺度因子为2,因为为了和之前下采样卷积的尺度因子等于2一样。上采样是放大,下采样是缩小。
    【深度学习】Two-Stage目标检测算法

八、Mask R-CNN

【深度学习】Two-Stage目标检测算法
【深度学习】Two-Stage目标检测算法
Mask R-CNN是一个实例分割(Instance segmentation)算法,主要是在目标检测的基础上再进行分割。Mask R-CNN算法主要是Faster R-CNN+FCN,更具体一点就是ResNeXt+RPN+RoI Align+Fast R-CNN+FCN。

即在Faster R-CNN的基础上添加了一个预测分割mask的分支,如上图所示。其中黑色部分为原来的Faster-RCNN,红色部分为在Faster-RCNN网络上的修改。将RoI Pooling 层替换成了RoIAlign层;添加了并列的FCN层(mask层)。

; 1.创新点

  • Backbone:ResNeXt-101+FPN
  • RoI Align替换RoI Pooling

2.Mask R-CNN算法步骤

  • 输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;
  • 将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;
  • 对这个feature map中的每一点设定预定个的RoI,从而获得多个候选RoI;
  • 将这些候选的RoI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的RoI;
  • 对这些剩下的RoI进行RoI Align操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);
  • 对这些RoI进行分类(N类别分类)、BB回归和MASK生成(在每一个RoI里面进行FCN操作)。

3.RoI Pooling和RoI Align的不同

ROI Align 是在Mask-RCNN中提出的一种区域特征聚集方式,很好地解决了RoI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在检测测任务中将 RoI Pooling 替换为 RoI Align 可以提升检测模型的准确性。

在常见的两级检测框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,RoI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故RoI Pooling这一操作存在两次量化的过程。

  • 将候选框边界量化为整数点坐标值。
  • 将量化后的边界区域平均分割成k × k k\times k k ×k 个单元(bin),对每一个单元的边界进行量化。

事实上,经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为”不匹配问题(misalignment)”。

【深度学习】Two-Stage目标检测算法
为了解决RoI Pooling的上述缺点,作者提出了RoI Align这一改进的方法(如图2)。
【深度学习】Two-Stage目标检测算法

RoI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。值得注意的是,在具体的算法操作上,RoI Align并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套比较优雅的流程,如下图所示:

  1. 遍历每一个候选区域,保持浮点数边界不做量化。

  2. 将候选区域分割成k × k k\times k k ×k个单元,每个单元的边界也不做量化。

  3. 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。

【深度学习】Two-Stage目标检测算法

Original: https://blog.csdn.net/weixin_42166222/article/details/115578470
Author: MangoloD
Title: 【深度学习】Two-Stage目标检测算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/687126/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球