R-CNN 系列 object detection 算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R-CNN 系列 object detection 算法相关的知识,希望对你有一定的参考价值。

参考技术A

在 object detection 领域,近 5 年的突破性进展似乎都与一个名字有关系:Ross Girshick。梳理从 R-CNN,Fast R-CNN, Faster R-CNN 到 Mask R-CNN 等各种经典模型,Ross Girshick 都是作者之一,甚至连 YOLO 的作者中也出现了 Ross Girshick 的名字。

这位大神简历如下:

从算法到实现框架再到数据集,这位大神实现了一条龙的突破~

本文的目的是整理总结 R-CNN 系列算法的发展历程和模型本身的核心思想,不涉及太多技术细节(例如训练数据预处理,超参数设置等)。
参考文献主要是上述各算法的原文以及下列资源:

R-CNN,一般认为全称是 Region-based CNN 或者作者原文中提到的 Regions with CNN features。

概括地说,R-CNN 的步骤如下图所示:

下面详细介绍 R-CNN 中的关键环节。

对于输入的图片,首先利用 selective search 算法 生成约 2000 个 region。关于 selective search 算法可以参考 原文 ,也可以参考 我们之前的博客文章 。原文中提到 R-CNN 对各种 region proposal 算法没有偏好,之所以选择 selective search 算法仅仅是为了方便与前人工作做对比。

这一部分的目的是对于每一个 region,通过 CNN (原文选用 AlexNet) 进行特征提取,得到统一长度的 feature vector,以便后续的分类。

由于每个 region 的大小差别比较大,而 AlexNet 默认接收 227×227 pixel 的图片,这里就需要对 region 做一些预处理,主要是 region 大小的转化。

要把一个任意大小的图片转化成 227×227 像素的图片方法有很多,原文中介绍了 4 种方式:

分别是:

最终作者选择了 warp + padding 的方式,一方面 warp 相对来说是最简单的,直接把任意大小的图片缩放成 227×227 即可,另外 padding 是在原 region 周围稍微添加了一些像素点,从实际效果看提高了检测正确率。

将统一大小的 region 送入 CNN 中,进行特征提取。 如何得到这个 CNN 也是一个问题。

针对目标检测的数据集 ILSVRC detection dataset 包含了 200 类物体,PASCAL VOC (Visual Object Classes) 包含了 20 类物体。相对来说带有标签的训练数据比较少,不足以训练一个大型的 CNN,因此采用了 transfer learning 的技术。原文中并没有提到 transfer learning 这个名词,只是说 fine-tuning
首先借用在 ImageNet 上已经训练好的 CNN 模型(最初的文章中用了 AlexNet,后来 arXiv 上新版文章中用了 VGG,效果提升很明显),然后在 PASCAL 数据集上进行 fine-tuning。这里对 AlexNet 网络结构的改变只是将原本对应 ImageNet 1000 类输出的 classification layer 替换成了对应 N+1 类输出的 classification layer,该层权重随机初始化。对于 PASCAL 数据集 N=20,ILSVRC 数据集 N=200,另外 +1 对应 background 类型。

经过 fine-tuning 之后,CNN softmax layer 之前的 4096 维向量即为该 region 的 feature vector.

得到 region 的 feature vector 之后,送入 SVM 进行最后的分类。

这里 SVM 的训练是针对不同类型的物体分开进行的,每一类训练一个 SVM,它只给出针对这一类物体的分类结果。之所以最后用 SVM 分类,而不是直接用 CNN 的 softmax 进行分类,原文作者的解释是尝试过 softmax 之后发现效果比 SVM 差一些,但是同时指出如果调整一些训练策略,softmax 和 SVM 之间的差距有可能缩小。这也为后来基于 R-CNN 的改进埋下了伏笔。

得到所有 region 对应的检测结果(即包含某种类型物体的概率 score)之后,还有一步操作: Non-Maximum Suppression (NMS) 。如果两个 region 检测到同一类物体,比如都检测到了行人,一个 region score 较高,而另一个 score 较低,当这两个 region 的 IoU (intersection-over-union) 超过某个阈值时,即它们重合较多时,只保留那个 score 较高的 region.

object detection 的任务除了检测图中的物体,还要给出定位,即用 bounding box 尽量准确的圈出该物体。前边基于 region 的分类过程可能能够正确辨识出 region 中的物体,但是初始的 region 并不一定是一个合适的 bbox。在 R-CNN 最后又添加了一个线性回归模型,基于 feature vector 来预测正确的 bbox 相对于 region 的位置变换,即预测 bbox 应该如何调整。这个训练过程也是 class-specific 的。

在最终使用时,R-CNN 输出包含两部分:

理论上来说,更新 bbox 的位置之后,应该在新的 bbox 中重新进行分类,这样准确度可能更高一些,但是原文作者发现实际上并没有明显改进。因此,实际使用中并没有对新的 bbox 重新分类。

总的来说,上述 R-CNN 的训练是分多步走的:先是 fine-tuning 一个 CNN 得到 feature vector,然后训练 SVM 进行分类,最后还要再训练一个线性回归环节预测 bounding box 的调整。

Fast R-CNN 的改进是不再使用独立的 SVM 和线性回归,而是统一用 CNN 将这三个环节整合起来。Fast R-CNN 在训练时间和检测时间方面比当时已有的其他算法快若干数量级。

Fast R-CNN 整体框架如下:

基本步骤:

在上述各环节中,我认为比较关键的有两个:一是 RoI projection,即将 image 上的 RoI 映射到 feature map 上的 RoI。二是通过 RoI pooling layer 将 feature map 上不同大小的 RoI 转化成统一大小的 sub feature map。而这两个环节都借鉴了 SPPnets ,其中 RoI pooling layer 是 SPPnets 中 Spatial Pyramid Pooling layer 的特例。

原本 R-CNN 是在原图上选取若干RoI,然后经过 CNN 处理,最后提取出 feature vector。对于每个图片上不同的 RoI 来说,从输入到输出没有任何共享的东西。

RoI projection 的作用是将 R-CNN 中对 image RoI 的处理推迟到了 feature map 上,这样可以让一个 image 的所有 RoI 共享从 image 到 feature map 的卷积处理过程。这很显然会加速训练和测试过程。至于如何将 image RoI 映射到 feature map RoI,已经有了 非常细致的讨论 ,这里不再赘述。

如何将 feature map 上不同大小的 RoI 转化成统一大小的 sub feature map? 这里 有非常直观的动画演示。

概括如下:
假设我们已经得到下面的 feature map (只考虑 2D)

其中 RoI 为黑框部分,大小为 。

我们希望将 RoI 转化成 2×2 大小,可以选择一个 2×2 的窗口如下

对每一个格子进行 max pooling 操作,得到如下的 2×2 的 feature map

总的来说,如果 RoI 大小为 ,希望得到的 feature map 大小为 ,则窗口中格子数目为 。可以根据具体情况向上或向下取整。

结合实际应用,如果 CNN 网络选用 VGG16,结构如下:

将最后一个 max pooling layer 替换为 RoI pooling layer。前部的卷积层对输入图片的大小没有严格限制,这一限制主要是在 fully connected layer,所以为了配合 VGG16 网络结构,要确保每个 RoI 输出的 feature map 依然为 。

对于 VGG16 网络结构的修改还包括:

在 Fast R-CNN 中,region proposal 是由 CNN 网络之外的算法提供的,例如 selective search。相对于后续的 region recognition 过程,region proposal 这一步实际上是整个算法的速度瓶颈。

Faster R-CNN 之所以 "Faster",就是因为提出了 Region Proposal Network (RPN) ,加速了 region proposal 过程。Faster R-CNN 本质上就是 RPN + Fast R-CNN.

整个 Faster R-CNN 结构如下:

或者更加详细的结构如下:

RPN 和 Fast R-CNN 共享从 image 到最后一层 CNN 输出的 feature map 这一段网络结构。 有些文章 也将 Faster R-CNN 看做三个模块:用于生成 feature map 的 Feature network,用于生成 region proposal 的 RPN,以及用于最终的 object detection 的 Detection network。我们这里还是采用 RPN + Fast R-CNN 的形式。

RPN 的输入是原始 image,输出是 region proposals。在具体实现中,RPN 是 fully convolutional network (FCN),只包含 convolutional layer,原本在分类/回归中常用的全连通层也由卷积操作替代。

有了 region proposals,后边的操作与 Fast R-CNN 是相同的。

原文中采用 alternating training 的方式:

以上是关于R-CNN 系列 object detection 算法的主要内容,如果未能解决你的问题,请参考以下文章

R-CNN 系列 object detection 算法

目标检测 | 经典算法 Cascade R-CNN: Delving into High Quality Object Detection

《Sparse R-CNN:End-to-End Object Detection with Learnable Proposals》论文笔记

论文阅读(Chenyi Chen——ACCV2016R-CNN for Small Object Detection)

论文阅读(Chenyi Chen——ACCV2016R-CNN for Small Object Detection)

深度学习论文翻译解析:Faster R-CNN: Down the rabbit hole of modern object detection