天天看点

深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN 总览

深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN 总览

深度学习目标检测之 R-CNN 系列包含 3 篇文章:

  • 深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN 总览
  • 深度学习目标检测之 R-CNN 系列:Faster R-CNN 网络详解
  • 深度学习目标检测之 R-CNN 系列:用 Faster R-CNN 训练自己的数据(caffe 版)

1. 前言

这一篇文章主要是从 R-CNN 的发展历程来介绍各个版本的 R-CNN 是如何发展的。

R-CNN(Regions with CNN features) 是基于深度学习的早期目标检测框架发展起来的。如果按照 one-stage 和 two-stage 的分类, R-CNN 系列属于 two-stage 的方法,即第一步得到包含目标的候选区域,第二步对候选区域进行分类和校准,得到最终的检测结果。

R-CNN 系列是目标检测中的重要里程碑, 整个 R-CNN 系列中现在应用较多的是 Faster R-CNN,但是为了更清楚的理解 Faster R-CNN,所以还是从 R-CNN 讲起。

2. R-CNN

R-CNN 在 VOC 2012 上大放异彩,mAP 提升超 30%,其在检测任务上的意义不亚于同年 AlexNet 在分类任务上的突破。R-CNN 后来(2014年)被整理并发表于 Rich feature hierarchies for accurate object detection and semantic segmentation Tech report 。

如原文开篇所说, R-CNN 主要解决了两个问题:

  • 如何利用深度神经网络去做目标的定位?
  • 如何在一个小规模的数据集上训练能力强劲的网络模型?

下面透过 R-CNN 的过程来看看作者是如何解决上面这两个问题的。

深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN 总览

上图来自原文,简要的说明下 R-CNN 的过程:

  • 利用 Selective Search 的方法,从输入图片中得到大约 2k 的 region candidates(但是他们的 size 却是各异)
  • 将这些 region candidates warp 到一个统一的

    size,比如对于 AlexNet,就是 warp 到 227*227

  • 在 image classification 的数据集(ILSVRC2012)上预训练模型,这里的分类为 N 类
  • 将上面得到的 region candidates 用于 fine tuning CNN网络,这里的 region candidates 可以分为 N+1 类,这里的加一指的是不包含目标的背景,训练时的 batch size 为128(32 positive + 96 negtive/background(iou < 0.5)), 比例为 1:3)
  • 对于每一个输入 CNN 的 region candidates 都会得到一个特征向量,这个向量会被输入 SVM 分类器进行分类, iou < 0.3 的为 negtive,对于分类后的结果采用 NMS(非极大值抑制) 来进一步减少 region candidates
  • 为了减小定位误差,专门训练了一个回归模型用来修正预测的检测窗口

下图大致表示了 R-CNN 的过程。

深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN 总览

再回到上面的两个问题:

  • 如何利用深度神经网络去做目标的定位?

    其实这里的深度神经网络仅仅是进行了特征提取,当然这已经是进步了。

  • 如何在一个小规模的数据集上训练能力强劲的网络模型?

    先在大的分类数据集上预训练模型,然后到目标数据集(比如检测数据集)上 fine tuning。

R-CNN 的缺点是明显的:

  • 冗余计算。Selective Search 的方法相对于传统的滑窗做法已经有了进步,但是 2k 的 region proposal 中依然有大量的重叠区域,而每个 region proposal 都会输入 CNN,因此会产生大量的冗余计算。特别需要注意的是,这个计算在 test 的时候也依然是少不了的,所以这将是一个非常致命的弱点。
  • region proposal 的尺度缩放问题。由于 Seletive Search 得到的 region proposal 的尺寸是各不相同的,直接采用 warp 的方式变换到相同的尺寸,这可能导致目标失真变形。
  • 虽然应用了 CNN,但是其实仅仅只是用来提取特征,比如 SVMs 和 regressors 并没有用来更新 CNN
  • 训练过于复杂。首先是 Selective Search,然后是 CNN,最后还有 SVM 和 regression

3. Fast R-CNN

2015 年 R-CNN 的原作者 Ross Girshick 单枪匹马一个人提出了 Fast R-CNN。

前面我们提到 warp region proposal 可能会引起目标失真变形的问题,Fast R-CNN 借鉴了 SPP,这样 CNN 就可以接受不同 size 的输入,通过 RoI Pooling 层(简化的 SPP 层)之后会变换到统一的 size,这样最后输入全连接层的 feature map 还是固定的 size。

另外一点就是上面提到了将 2k 个 region proposal 输入 CNN 是非常不经济的,而且没有必要的,所以 Fast R-CNN 在通过 Selective Search 提取 region proposal 之后, 将整张图片输入 CNN 得到 feature map,然后通过映射关系,找到原图中的 region proposal 在 feature map 中的对应 patch,将此 patch 作为每个候选框的卷积特征输入到 RoI Pooling layer 和之后的层,完成特征提取工作。这样一来相当于 2K 的 region proposal 共享了 CNN 的权重。

下面来具体看下 Fast R-CNN 的完整过程:

  • 在 image classification 的数据集上预训练模型,这里的分类为 N 类
  • 利用 Selective Search 的方法,从输入图片中得到大约 2k 的 region candidates(但是他们的 size 却是各异)
  • 将预训练模型中的 max pooling 换为 RoI Pooling layer;将最后的 fully connected layer 和 softmax layer(N 类)换为 fully connected layer 和 softmax layer(N+1 类)
  • 最后的模型分为两个不同的分支:一个是 softmax 对于每一个 ROI 预测的 N+1 类的分类结果;另一个是对上面分类的 ROI 的 bounding box 的回归结果。
    深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN 总览

从上面的过程可以发现,之前 R-CNN 的处理流程是先提 proposal,然后 CNN 提取特征,之后用 SVM 分类器,最后再做 box regression,而在 Fast R-CNN 中,作者巧妙的把 box regression 放进了神经网络内部,与 region 分类和并成为了一个multi-task 模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。这里值得一提的是对于这个 multi-task 模型的 loss function 采用了multi-task loss。

经过这一顿猛操作,Fast RCNN(VGG16)相比 RCNN,在训练速度上快了将近 9 倍,在测试速度上快了 213 倍。

4. Faster R-CNN

不管是 R-CNN 还是 Fast R-CNN 都是采用的 Selective Search 的方式找到的 region proposal,但是这种无监督的方式产生了大量的重叠区域,造成算力的浪费,在 Fast R-CNN 中 Selective Search 花费的时间是 特征提取的时间的 10 倍左右,但是如果减少 region proposal 的数量又可能导致漏检。显然 Selective Search 已经限制了 Fast R-CNN 的发挥。

任少卿和何凯明等人于 2015 年提出了 Faster R-CNN,用 RPN(Region Proposal Nerworks)替代了 Selective Search,即利用神经网络自己学习生成候选区域的策略,充分利用了 feature map 的价值。这样一来就真正实现了检测任务端到端,并且由于速度的提升,基本实现了实时检测(17 FPS)。

从某种程度上来说,Faster R-CNN 就是在 Fast R-CNN 的基础上加入了 RPN。

深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN深度学习目标检测之 R-CNN 系列: 从 R-CNN 和 Fast R-CNN 到 Faster R-CNN 总览

参考

  • Object Detection for Dummies Part 3: R-CNN Family
  • R-CNN, Fast R-CNN, Faster R-CNN, YOLO — Object Detection Algorithms
  • FasterRCNN之整体框架详解
  • 深度学习之 Pytorch 物体检测实战(董洪义)

继续阅读