R-CNN目标检测算法的演进:Faster rcnn => RFCN => Mask R-CNN => Cascade R-CNN

R-CNN目标检测算法的演进:Faster rcnn => R-FCN => Mask R-CNN => Cascade R-CNN

前言

2019年10月11号,晚上9.30和腾讯优图(上海)面试官进行大概1小时的电话面试(日常实习生)。其中一个问题:基于Faster R-CNN 的检测算法是怎样演进的?这类经典的文章看了很多遍,但是自己描述起来却是支支吾吾,归根到底还是平时没有总结。所以,今天第一次在****上面写文章,对那些看似熟悉的知识进行总结。(优图面试官du:既然是搞目标检测的,那些经典的算法,前沿的算法都必须清楚。)

Faster R-CNN

Faster R-CNN是Ren2015年发表于NIPS的论文,经典中的经典啊,后面的二阶段算法基本都用了这个思路。关于Faster R-CNN算最详细的解读可以看知乎的“一文读懂Faster R-CNN”,这里贴出链接:一文读懂Faster R-CNN
Faster R-CNN 网络可以分为两个模块:
第一个模块是 RPN网络,用于生成rois;
第二个模块是 R-CNN网络,对RPN网络产生的rois进行分类。
Faster R-CNN 的方法中主体框架主要都是继承了 Fast R-CNN,其最重要的改进点就RPN网络,使一整套检测算法变成可end-to-end 训练。

R-FCN

R-FCN的全称是R-FCN:ObjectDetectionvia Region-based Fully Convolutional Networks。为什么会有R-FCN呢?原因在论文的Introduction中有说,这里贴出原文:
But recent state-of-the-art image classification networks such as Residual Nets (ResNets) [9] and GoogLeNets [24, 26] are by design fully convolutional2. By analogy, it appears natural to use all convolutional layers to construct the shared, convolutional subnetwork in the object detection architecture, leaving the RoI-wise subnetwork no hidden layer. However, as empirically investigated in this work, this naïve solution turns out to have considerably inferior detection accuracy that does not match the network’s superior classification accuracy. To remedy this issue, in the ResNet paper [9] the RoI pooling layer of the Faster R-CNN detector [18] is unnaturally inserted between two sets of convolutional layers — this creates a deeper RoI-wise subnetwork that improves accuracy, at the cost of lower speed due to the unshared per-RoI computation.
中文翻译:但是,最新的图像分类网络,例如残差网络[9]和GoogLeNets [24、26],在设计上是全卷积的。 以此类推,似乎很自然在目标检测架构中使用全卷积层来构建共享的卷积子网络,使RoI方式的子网络中则没有隐藏层。 但是,根据这项工作的经验研究,这种幼稚的解决方案的检测精度却大大低于原网络的出色分类精度。 为了解决这个问题,在ResNet论文[9]中,将Faster R-CNN检测器[18]的RoI池层不自然地插入到两组卷积层之间(Res4-Res5)-这会创建一个更深的RoI子网络,从而提高准确性,由于每个RoI计算是不共享的导致较低的速度。
使用全卷积层导致检测精度降低的原因是什么呢?文章给分析: unnatural design is caused by a dilemma of increasing translation invariance for image classification vs. respecting translation variance for object detection. 图像分类是平移不变性的,而目标检测对平移是敏感的,需要一定程度上的平移可变性。为了解决这个困境,ResNet论文的检测流程[9]将RoI池化层插入到卷积中——特定区域的操作打破了平移不变性,当在不同区域进行评估时,RoI后卷积层不再是平移不变的。
那R-FCN是怎么解决这个dilemma?通过使用一组专门的卷积层作为FCN(全卷积网络)输出来构建一组位置敏感的分数图,将平移可变性并入FCN。On the top of FCN,添加了一个位置敏感的RoI池化层(position-sensitive RoI pooling layer)。

position-sensitive RoI pooling layer

R-CNN目标检测算法的演进:Faster rcnn => RFCN => Mask R-CNN => Cascade R-CNN网络的最后一个卷积层为每个类别产生一堆大小为k2的位置敏感分数图( position-sensitive score maps),从而得到一个具有C个目标类别的k2(C+1)通道输出层(+1为背景)。k2个分数图对应于描述相对位置的k×k空间网格。例如,对于k×k=3×3,大小为9的分数图编码目标类别在{top-left,top-center, top-right, …, bottom-right}。
position-sensitive RoI layer 为了将位置信息显式地编码到每个RoI中,用规则网格将每个RoI矩形分成k×k的bins。对第(i, j)bin(0≤i,j≤k−1), position-sensitive RoI对第 (i, j) sorce map进行池化。具体公式:
R-CNN目标检测算法的演进:Faster rcnn => RFCN => Mask R-CNN => Cascade R-CNN看起来很抽象,那这张图就很形象了。对于人类这个类别,生成9(k=3)个位置的 position-sensitive score maps。在进行position-sensitive RoI pooling 时,Roi被划分为9个bins,依次对position-sensitive score maps对应的bin内进行池化。
R-CNN目标检测算法的演进:Faster rcnn => RFCN => Mask R-CNN => Cascade R-CNN

Mask R-CNN

终于到了kaiming大神,大神就是大神,前面两篇文章里的作者都有他。最近Facebook的一个华人程序员跳楼,闹得蛮大(另一个出头的华人程序员被开除了),不知道大神怎么看。
先对几个术语进行区分:semantic segmentation, instance segmentation 和 object detection。Semantic segmentation的目的是在一张图里分割聚类出不同物体的pixel。semantic segmentation把图片里人所在的区域分割出来了,但是本身并没有告诉这里面有多少个人,以及每个人分别的区域。而instance segmentation 则是semantic segmentation 和 object detection的结合,即要检测图像中的所有对象,同时还要精确分割每个实例。更具体的解释可以看这一篇知乎链接
Mask R-CNN其实就是Faster R-CNN的扩展,在原有的输出上添加了一个并行的预测目标掩码的分支。Faster R-CNN 并不是为网络输入和输出之间的像素到像素对齐(pixel-to-pixel alignment)而设计的,主要是因为Roi pooling 对特征提取时进行粗略的空间量化。为了解决misalignment,大神提出一个无量化层( quantization-free layer)RoiAlign。Misalignment会导致什么结果呢?它不会影响分类(translation invariance for image classification ),但它对预测像素准确的掩码具有很大的负面影响。RoiAlign能将掩模的精度提高了10%至50%!

RoiPool & RoiAlign

RoiPool操作会进行两次量化,导致misalignment:(1)将候选框边界量化为整数点坐标值。(2)将量化后的边界框内区域平均分割成 k x k 个bins,对每一个bin的边界进行量化。
RoiAlign完全消除了RoIPool粗糙的量化,将提取的特征与输入正确对齐。RoiAlign避免了对RoI边界或bin进行任何量化。在每个Roi bin计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。

Cascade R-CNN

Cascade R-CNN,你又是为何而来的?我是为了一级一级的盘你。在物体检测中,需要定义一个IoU阈值来确定正负。 以低IoU阈值训练的物体检测器,例如 0.5,通常会产生噪声检测( noisy detections)。 但是,随着IoU阈值的增加,检测性能趋于下降。于是,Cascade R-CNN 通过训练一系列经过不断提高的IoU阈值训练的检测器,从而可以对接近的假阳性有跟多选择性。
R-CNN目标检测算法的演进:Faster rcnn => RFCN => Mask R-CNN => Cascade R-CNN有基本思想,单个检测器只能是单个质量级别的最优检测器(The basic idea is that a single detector can only be optimal for a single quality level)。在图1©,(d)中,localization performance(定位性能) 是input proposals(输入提案)的函数, detection performance(检测性能)是 IoU threshold(IoU阈值)的函数。 在图1©中,每个边界框回归器对于这些IOU接近于检测器训练阈值IOU的示例的性能最好。这也适用于检测性能,直到过度拟合。图1(d)显示,对于低IOU示例,u=0.5的检测器优于u=0.6的检测器,但在较高的IOU级别上表现不佳。一般来说,在单一IOU水平上优化的检测器并不一定是其他级别的最佳检测器。
然而,为了制造出高质量的探测器,仅仅在训练中增加u是不够的,这反而会降低检测性能(u=0.7)。影响这一结果的主要因素有两个:1)训练过程中由于正样本呈指数级消失而导致的过度拟合;2)检测器为最优的IOU与输入假设的IOU之间的推断时间不匹配( inference-time mismatch between the IoUs for which the detector is optimal and those of the input hypotheses.)这句话有点难理解,文中有进一步解释:high quality detectors are only necessarily optimal for high quality hypotheses. The detection could be suboptimal when they are asked to work on the hypotheses of other quality levels. (高质量的检测器必然是高质量假设的最佳选择。当要求他们研究其他质量水平的假设时,检测可能是次优的。)

继续观察图1©,可得回归器的输出IOU几乎总是优于输入IOU(所有的线都在灰色线之上)。所以,用一定的IOU阈值训练的检测器的输出是训练下一次较高IOU阈值检测器的良好分布。Cascade R-CNN通过调整边界框,每一阶段的目标是找到一组好的相似假阳性来训练下一阶段。当以这种方式操作时,适应于越来越高的IoU的一系列检测器可以克服过度拟合的问题,从而得到有效的训练。在推理时,采用相同的级联过程。逐步改进的假设在每个阶段都能更好地与不断提高的探测器质量相匹配。