引言

对比了R-CNN,Fast R-CNN,Faster R-CNN,Mask R-CNN目标检测算法的发展过程与优缺点。

R-CNN

R-CNN是第一个成功第将深度学习应用到目标检测的算法。后面的Fast R-CNN,Faster R-CNN都是建立在R-CNN的基础上的。

R-CNN的检测思路是采用提取矿,对每个提取矿提取特征,图像分类,非极大值一直的四个步骤进行的。
步骤:

  • 在数据集上训练CNN。R-CNN的论文中使用的CNN网络是AlexNet,数据集是ImageNet。
  • 在目标检测的数据集上,对训练好的CNN做微调。
  • 使用Selective Search搜索候选区域,统一使用微调后的CNN对这些区域提取特征,并将提取额特征存储起来。
  • 使用存储起来的特征,训练SVM分类器。

这里可以看到这里的CNN主要是用来进行特征提取的,在替代了传统图像处理方法中特征提取,如SIFT, HOG等。

R-CNN系列目标检测算法对比-LMLPHP

R-CNN的缺点是计算量大,在一张图片中,Selective Search得到的区域通常是1000个以上,也就是需要1000次CNN推理过程以及SVM的分类过程,还需要将候选区域的特征保存下来,也占用存储空间。

Fast R-CNN

Fast R-CNN是在R-CNN的基础上进行优化的,通过对整张图片进行卷积计算得到一张大的特征图,使用Selective Search的方式获得候选框,然后将候选框映射到特征图上,获取候选框区域的特征图。使用ROI池化将候选框的特征都映射到相同大小的特征量,然后继续卷积计算分两个分支输出类别和框回归。

R-CNN系列目标检测算法对比-LMLPHP

步骤:

  • 图像输入CNN网络获取一张大的特征图
  • 使用Selective Search搜索候选区域,并截取特征图。
  • 截取的特征图使用ROI Pooling转换到固定大小的特征量
  • 使用特征量进行类别分类和框回归

Fast这个词的Fast在于,在R-CNN中每个候选区域都要计算特征,但是多个候选框是重复的,所以计算特征也是有很多重复。在Fast R-CNN中只需要对图像进行一次CNN获取一次特征图,然后在特征图中截取,用于表示候选框的特征图。

同时进行框回归的时候,还将Seletive Search的框进一步优化了。

ROI Pooling

ROI Pooling的作用是将不同大小的候选区域特征处理成相同的维度。
处理方式是将特征图划分成块,然后在块内进行全局最大池化得到的结果只与特征图的通道数相关,而和大小无关。

在Fast R-CNN中的ROI Pooling是空间金字塔池化(Spatial Pyramid Pooling, SPP)的形式做的优化结果。如输入的 w × h × c w\times h \times c w×h×c的特征图,将特征图划分为 4 × 4 4\times 4 4×4 2 × 2 2\times 2 2×2以及 1 × 1 1\times 1 1×1的【块】。然后对每个【块】的每个通道取最大值(也就是在每个块进行全局最大池化),分别得到 4 × 4 × c 4\times 4\times c 4×4×c 2 × 2 × c 2\times 2\times c 2×2×c 1 × 1 × c 1\times 1\times c 1×1×c的特征。

R-CNN系列目标检测算法对比-LMLPHP

然后将三个层次的特征展开后放到一起,就可以得到 21 c 21c 21c维的特征,其中 21 = 4 × 4 + 2 × 2 + 1 21=4\times 4+ 2\times 2+1 21=4×4+2×2+1。就将任何尺寸大小的特征图处理称为了相同维度的大小。

Faster R-CNN

Faster R-CNN解决的问题是Fast RCNN还是需要使用到Seletive Search的方式获取候选框,然而这个过程是比较慢的,在Faster R-CNN中使用Region Proposal Network(RPN)取代了Seletive Search方法,不仅速度得到了大大提高,还获得了更佳精确的结果。RPN就是一个CNN结构,有两个输出分支,分别是是否有目标的分类,以及坐标的回归。

R-CNN系列目标检测算法对比-LMLPHP

步骤:

  • 图像输入CNN网络获取一张大的特征图。
  • 使用RPN获取候选框
  • 截取的特征图使用ROI Pooling转换到固定大小的特征量。
  • 使用特征量进行类别分类和框回归。

R-CNN系列目标检测算法对比-LMLPHP

Mask R-CNN

Mask RCNN并不是一个目标检测的算法,而是一个语义分割的算法。

  • 在Faster R-CNN的基础上添加一个mask分支,multi-task来实现实例分割
  • 使用ROI Align代替ROI Pooling,提升分割准确率

mask rcnn 采用和faster rcnn相似的两步法结构, 第一阶段RPN网络,提取出候选的目标边界框,第二阶段mask rcnn对于来自RPN的候选区域,利用ROI align提取特征并进行类别分类、边界框回归与二进制掩码生成。每一个候选区域上利用掩码分支预测一个二分类的mask。用来预测mask的掩码分支是一个在像素级别上对于每个ROI预测语义掩码的小全卷积网络。

ROIAlign的计算方式与ROIPooling的方式类似,在ROIPooling中,当下采样或者对齐的时候遇到小数,通常都是取整操作的。这个对目标检测问题不大,但是像素级的实例分割容易产生错位的问题。ROIAlign就是在处理这个小数的时候保留小数信息,然后在取预选区域特征图的时候进行插值计算。

总结

参考

  1. 21个项目玩转tensorflow, 第五章
  2. https://zhuanlan.zhihu.com/p/161379603
  3. mask-rcnn解读
12-11 11:05