深度学习(RCNN)
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 使用的是 选择性搜索 算法。
-
如何工作:
-
根据像素的颜色、纹理、大小和形状兼容性,使用分割算法将图像分成许多小区域。
-
不断地合并这些相似的小区域,形成更大的区域。
-
在合并过程中产生的所有区域,都作为候选区域提议。
-
-
输出: 最终会产生大约 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的训练也是一个多步骤的过程,并非端到端:
-
有监督预训练: 在一个大型分类数据集(如ImageNet)上预训练一个CNN(如AlexNet)。这一步让网络学会了强大的通用图像特征。
-
特定领域微调:
-
为了让我们预训练的CNN适应新的检测任务和数据集(如PASCAL VOC),我们需要在扭曲后的候选区域上对其进行微调。
-
关键:定义正负样本。将与真实框重叠度(IoU)大于0.5的候选区域作为正样本(标签为该真实框的类别),将与所有真实框IoU都小于0.3的作为负样本(标签为“背景”)。
-
将CNN原本的1000类输出层替换为(N+1)类输出层(N是目标类别数,+1是背景)。
-
-
训练SVM分类器:
-
使用微调后的CNN为每个候选区域提取特征。
-
为每个类别训练一个SVM。正样本是该类别的真实框,负样本是与所有真实框IoU小于0.3的候选区域(这是一个更严格的标准,与微调时不同)。
-
-
训练边界框回归器:
-
对于每个类别,使用与该类别的真实框有较高重叠(IoU > 0.6)的候选区域及其对应的真实框调整量,来训练回归器。
-
R-CNN 的显著贡献与致命缺点
贡献:
-
开创性: 首次将CNN引入目标检测,在PASCAL VOC数据集上将mAP从35.1%提升至53.7%,性能提升巨大。
-
证明了迁移学习的威力: 通过在大型分类数据集上预训练,然后在小型检测数据集上微调,可以有效解决检测数据不足的问题。
-
奠定了两阶段检测器的基础: 其“区域提议 + 深度特征分类”的思想影响了后续一系列工作。
致命缺点:
-
训练复杂、多阶段: 需要独立训练CNN、SVM和边界框回归器三个模块,管道冗长,存储和部署麻烦。
-
训练和测试速度极慢:
-
推理慢: 对每张图片的 ~2000个候选区域,都需要分别进行CNN前向传播来提取特征,存在巨大的计算冗余。处理一张图片需要几十秒。
-
训练慢: 特征需要写入磁盘,占用数百GB空间,训练耗时数天。
-
-
扭曲缩放造成形变: 将任意形状的区域强行扭曲成正方形,会导致物体几何形变,影响特征提取的准确性。
演进与改进
正是这些缺点催生了R-CNN的快速演进:
-
Fast R-CNN: 主要解决速度问题。将整张图只输入CNN一次,得到一个共享的特征图,然后在特征图上映射每个候选区域,再通过一个RoI池化层为每个区域提取固定尺寸的特征。实现了大部分计算的共享,大幅提升了速度,并将分类和回归合并到一个网络中。
-
Faster R-CNN: 主要解决区域提议的瓶颈。引入区域提议网络(RPN),将区域提议这一步也融入到CNN中,实现了真正端到端的目标检测,速度进一步提升。
总结来说,R-CNN是一个划时代但效率低下的方法。它用“暴力”但有效的方式证明了CNN特征对于目标检测的优越性,为后续更优雅、高效的检测器铺平了道路。
更多推荐
所有评论(0)