R-CNN 是目标检测领域的里程碑式工作,它首次成功地将深度学习(CNN)应用于目标检测任务,并显著提升了检测精度。理解 R-CNN 是理解现代目标检测器(如 Fast R-CNN, Faster R-CNN, YOLO, SSD)的基础。

目标检测 vs. 图像分类

首先,必须清楚目标检测和图像分类的核心区别:

  • 图像分类: 回答“这张图片是什么?” 的问题。输出一个单一的标签(如“猫”、“狗”)。

  • 目标检测: 回答“图片里有什么?它们在哪儿?” 的问题。输出多个边界框(Bounding Box,表示物体位置)和对应的类别标签

R-CNN 的核心思想很直观:既然CNN在图像分类上很厉害,那我们就把检测问题转化成多个分类问题来处理。


R-CNN 的工作原理:一个三阶段流水线

R-CNN 的检测过程不是一个端到端的网络,而是一个多步骤的流水线,如下图所示。我们可以将其概括为三个核心阶段:

第1阶段:区域提议 - “找出所有可能是物体的区域”

这个阶段的目标是,在不关心物体类别的情况下,从图像中快速找出所有可能包含物体的潜在区域。

  • 使用的算法: R-CNN 使用的是 选择性搜索 算法。

  • 如何工作

    1. 根据像素的颜色、纹理、大小和形状兼容性,使用分割算法将图像分成许多小区域。

    2. 不断地合并这些相似的小区域,形成更大的区域。

    3. 在合并过程中产生的所有区域,都作为候选区域提议。

  • 输出: 最终会产生大约 2000个 候选区域提议。这些区域形状、大小各异,每个都可能包含一个物体。

注意: 这个阶段是“传统”的计算机视觉算法,不涉及深度学习,计算速度相对较慢。

第2阶段:特征提取 - “看看每个区域里有什么特征”

这个阶段是R-CNN的核心,即使用CNN为每一个候选区域提取一个固定长度的特征向量。

  • 输入: 第1阶段产生的 ~2000个候选区域。

  • 关键操作:扭曲缩放

    • 问题: 候选区域是各种不同大小和长宽比的矩形,但CNN的全连接层需要固定尺寸的输入(例如AlexNet需要227x227)。

    • 解决方案: 将每个候选区域扭曲缩放 到一个统一的大小(如227x227)。

  • 特征提取

    • 将扭曲后的区域图像输入到一个预训练好的CNN(例如在ImageNet上预训练的AlexNet)中。

    • 移除该CNN原本的分类层(最后输出1000个类别的层)。

    • 将CNN的最后一个全连接层的输出 作为该区域的特征。

  • 输出: 每个候选区域被转换成一个 4096维 的特征向量。

注意: 这一步计算量巨大!需要对一张图片中的 ~2000个区域分别进行一次前向传播,导致大量的重复计算。

第3阶段:分类与修正 - “判断类别并微调位置”

这个阶段使用第2阶段提取的特征,来最终确定每个区域里是什么物体,以及它的精确位置。

  • A. 分类器

    • 任务: 判断这个区域属于哪个类别(如人、车、猫)还是背景。

    • 使用的模型: 为每一个类别单独训练一个线性支持向量机

    • 过程: 将4096维的特征向量输入到所有类别的SVM中。每个SVM会给出一个分数,表示该区域属于其对应类别的置信度。选择分数最高的类别作为该区域的预测类别,如果所有类别的分数都很低,则判定为“背景”。

  • B. 边界框回归器

    • 任务: 对候选区域的位置和大小进行微调,使其更紧密地贴合真实的物体。因为选择性搜索提出的候选框通常不够精确。

    • 使用的模型: 为每一个类别单独训练一个线性回归模型

    • 过程: 输入同样是4096维的特征向量,输出是四个值 (dx, dy, dw, dh),分别表示对候选框中心点x坐标、中心点y坐标、宽度和高度的调整量。


R-CNN 的训练过程

R-CNN的训练也是一个多步骤的过程,并非端到端:

  1. 有监督预训练: 在一个大型分类数据集(如ImageNet)上预训练一个CNN(如AlexNet)。这一步让网络学会了强大的通用图像特征。

  2. 特定领域微调

    • 为了让我们预训练的CNN适应新的检测任务和数据集(如PASCAL VOC),我们需要在扭曲后的候选区域上对其进行微调。

    • 关键:定义正负样本。将与真实框重叠度(IoU)大于0.5的候选区域作为正样本(标签为该真实框的类别),将与所有真实框IoU都小于0.3的作为负样本(标签为“背景”)。

    • 将CNN原本的1000类输出层替换为(N+1)类输出层(N是目标类别数,+1是背景)。

  3. 训练SVM分类器

    • 使用微调后的CNN为每个候选区域提取特征。

    • 为每个类别训练一个SVM。正样本是该类别的真实框负样本是与所有真实框IoU小于0.3的候选区域(这是一个更严格的标准,与微调时不同)。

  4. 训练边界框回归器

    • 对于每个类别,使用与该类别的真实框有较高重叠(IoU > 0.6)的候选区域及其对应的真实框调整量,来训练回归器。


R-CNN 的显著贡献与致命缺点

贡献:
  1. 开创性: 首次将CNN引入目标检测,在PASCAL VOC数据集上将mAP从35.1%提升至53.7%,性能提升巨大。

  2. 证明了迁移学习的威力: 通过在大型分类数据集上预训练,然后在小型检测数据集上微调,可以有效解决检测数据不足的问题。

  3. 奠定了两阶段检测器的基础: 其“区域提议 + 深度特征分类”的思想影响了后续一系列工作。

致命缺点:
  1. 训练复杂、多阶段: 需要独立训练CNN、SVM和边界框回归器三个模块,管道冗长,存储和部署麻烦。

  2. 训练和测试速度极慢

    • 推理慢: 对每张图片的 ~2000个候选区域,都需要分别进行CNN前向传播来提取特征,存在巨大的计算冗余。处理一张图片需要几十秒。

    • 训练慢: 特征需要写入磁盘,占用数百GB空间,训练耗时数天。

  3. 扭曲缩放造成形变: 将任意形状的区域强行扭曲成正方形,会导致物体几何形变,影响特征提取的准确性。

演进与改进

正是这些缺点催生了R-CNN的快速演进:

  • Fast R-CNN: 主要解决速度问题。将整张图只输入CNN一次,得到一个共享的特征图,然后在特征图上映射每个候选区域,再通过一个RoI池化层为每个区域提取固定尺寸的特征。实现了大部分计算的共享,大幅提升了速度,并将分类和回归合并到一个网络中。

  • Faster R-CNN: 主要解决区域提议的瓶颈。引入区域提议网络(RPN),将区域提议这一步也融入到CNN中,实现了真正端到端的目标检测,速度进一步提升。

总结来说,R-CNN是一个划时代但效率低下的方法。它用“暴力”但有效的方式证明了CNN特征对于目标检测的优越性,为后续更优雅、高效的检测器铺平了道路。

更多推荐