计算机视觉 - 物体检测 开山鼻祖 R-CNN系列:Fast R-CNN、Faster R-CNN、Mask R-CNN

特性 R-CNN Fast R-CNN Faster R-CNN
区域提议方法 选择性搜索(传统算法) 选择性搜索(传统算法) 区域提议网络(RPN)(深度学习)
特征提取方式 每个候选区域独立提取(极度冗余) 整张图像提取一次(共享特征图) 整张图像提取一次(共享特征图)
训练流程 多阶段Pipeline(繁琐复杂) 单阶段,近似端到端 端到端(统一网络)
关键创新 首次将CNN用于特征提取 共享特征图 解决计算冗余。 RoI Pooling,多任务损失。 RPN,锚点框,特征共享。 提升提议效率。

目录

[R-CNN: Regions with CNN features](#R-CNN: Regions with CNN features)

[1. 步骤简述](#1. 步骤简述)

[2. R-CNN的训练三步走](#2. R-CNN的训练三步走)

[3. 与 OverFeat 比较,未来优化加速版本伏笔](#3. 与 OverFeat 比较,未来优化加速版本伏笔)

[Fast R-CNN 特征图共享 + 池化](#Fast R-CNN 特征图共享 + 池化)

[Faster R-CNN RPN网络进行提议生成](#Faster R-CNN RPN网络进行提议生成)

[端到端的进化:区域提议网络 RPN & 参数共享](#端到端的进化:区域提议网络 RPN & 参数共享)

[Mask R-CNN 实例分割](#Mask R-CNN 实例分割)

[损失函数 + 并行解耦](#损失函数 + 并行解耦)

[掩码卷积 + RolAlign](#掩码卷积 + RolAlign)

[下期预告后续 YOLO系列 + SSD](#下期预告后续 YOLO系列 + SSD)


R-CNN: Regions with CNN features

https://arxiv.org/pdf/1311.2524

核心贡献:通过"区域提议+CNN特征"的架构和"预训练+微调"的策略, 首次证明深度学习在目标检测 上的巨大潜力**。**

1. 步骤简述

步骤一:生成区域提议

  • 目标 : 找出图像中所有可能包含物体的区域,避免使用暴力穷举的滑动窗口法。

  • 具体操作

    1. 使用一种类别无关的区域提议算法 (在R-CNN原文中主要使用的是 Selective Search)。

    2. Selective Search 的工作方式是:首先根据像素颜色、纹理等信息将图像分割成许多小区域 ,然后通过一种自底向上 的策略,不断地合并最相似的小区域,形成更大的区域。在每一次合并过程中,都会将新产生的区域作为一个候选框输出。

    3. 这个过程最终会生成大约 2000个 质量较高的候选区域提议。这些提议可能包含物体,但还不知道是什么物体。

  • 特点 : 这一步是"盲目的",它只关心"这里可能有个东西",而不关心"这个东西是什么"。它的优势在于召回率高,即真正物体被包含在这些提议中的概率很高。

步骤二:用CNN提取每个提议的特征

  • 目标 : 将每个区域提议 转换为一个固定长度的、能够代表该区域内容的特征向量

  • 具体操作

    1. 图像变换 : 由于CNN的全连接层需要固定大小的输入 ,而区域提议是任意形状的,因此需要对每个提议进行缩放(Warping)

    2. 前向传播 : 将缩放后的 227x227 图像输入到一个预训练好 的大型CNN中(例如AlexNet)。网络最终在最后一个全连接层输出一个 4096维的特征向量

  • 核心创新 : 这是首次将如此深层的CNN 网络应用于区域级别的特征提取 ,所得到的特征比手工设计的特征(如HOG、SIFT)强大得多。

步骤三:用SVM对每个特征进行分类打分

  • 目标 : 判断每个区域提议属于哪个特定类别(如猫、狗、汽车等)还是背景。

  • 具体操作

    1. 训练类别专用的SVM : 为PASCAL VOC数据集中的每一个类别 (共20类)训练一个线性SVM分类器。例如,有一个"猫"SVM,一个"狗"SVM等。

    2. 分类打分 : 将步骤二中提取的每个区域提议的4096维特征向量,分别输入到所有21个SVM分类器(20个物体类 + 1个背景类)中。

  • 注意点: 为什么用SVM而不是直接用CNN本身的Softmax分类器?在原始论文中,作者发现正负样本的定义(IoU阈值)对性能影响很大,使用SVM并采用一种特定的正负样本定义(IoU<0.3为负样本)能取得更好的效果。

步骤四:应用非极大值抑制(NMS)去除重复检测

  • 目标 : 对同一物体产生的多个重叠的、重复的检测框进行清理,只保留最好的一个。

  • 具体操作对每个类别独立进行):

    1. 将所有被分类为"猫"的区域提议,按照"猫"SVM的得分从高到低排序。选中得分最高的那个提议,确认它检测到了一个物体。

    2. 计算这个最高分提议 与剩余所有"猫"提议的交并比(IoU) 。如果某个提议与最高分提议的IoU超过一个预设阈值(如0.3),则认为它检测的是同一个物体,于是将其删除(抑制掉)。

  • 结果 : 经过NMS后,每个物体理论上只对应一个最准确的检测框,消除了大量重复框。

步骤五:边界框回归(BBox Regression)进行微调

  • 目标 : 进一步精修 步骤四保留下来的检测框的位置和大小,使其更贴合物体的真实边界。

  • 具体操作

    1. 训练回归器 : 为每个类别 单独训练一个线性回归模型 。这个模型的输入是区域提议的CNN特征(4096维),输出是4个值 (Δx, Δy, Δw, Δh),分别表示对原始框中心点 坐标(x, y)和宽高(w, h)需要进行微调的量。

    2. 应用回归器 : 对于NMS后留下的一个被判定为"猫"的检测框,使用"猫"类别的边界框回归器,根据其特征预测出微调量 (Δx, Δy, Δw, Δh)

    3. 执行微调: 使用特定的公式(例如,中心点偏移用加法,宽高缩放用指数函数)将微调量应用到原始检测框上,生成最终更精确的边界框。

2. R-CNN的训练三步走

  1. 用大型图片分类数据集(如ImageNet)预训练 一个CNN网络,让它学会识别通用物体特征。
  2. 用目标检测数据集中的候选区域 对这个预训练网络进行微调 ,把它的分类头 从1000类换成检测所需的类别数(如20类+背景),并用宽松的标准(与真实框重叠度≥0.5)定义正负样本来调整网络参数。
  3. 用微调后的CNN提取区域特征,并以更严格的标准(仅用真实框作正样本,重叠度<0.3的为负样本)为每个类别训练一个线性SVM分类器,来完成最终的物体分类。

3. 与 OverFeat 比较,未来优化加速版本伏笔

  • 速度 : OverFeat更快(约快9倍,2秒/图 vs R-CNN的十几秒/图)。

    • 原因 : OverFeat通过卷积方式全图 上直接计算,天然地共享了重叠窗口的计算 ,效率极高。而R-CNN需要将每个提议单独扭曲再送入CNN,计算重复度高。
  • 精度 : 如前文所示,R-CNN的精度显著更高(31.4% vs 24.3%)。

    • 隐含原因

      • 提议质量 : 选择性搜索产生的提议质量更高,减少了搜索空间,降低了分类器的负担。

      • 训练策略 : R-CNN使用了更精细的训练策略针对检测任务的微调 、使用SVM等)。

Fast R-CNN 特征图共享 + 池化

https://arxiv.org/pdf/1504.08083

通过一种统一的、端到端的训练框架,加速&提升性能。

R-CNN 的核心问题:

  1. 重复计算: 对约2000个区域提议中的每一个,都需要独立地通过CNN进行前向传播,计算冗余度极高。

  2. 多阶段训练 : 流程割裂,需要分步训练CNN、SVM和边界框回归器,非常繁琐。

  3. 存储空间大 : 每个区域提议的特征向量需要写入磁盘,占用大量空间

Fast R-CNN 的解决方案:

  1. 特征图共享(核心创新)

    • 做法 : 将整张图像一次 通过CNN,得到一个共享的卷积特征图

    • 效果: 避免了重复计算,这是速度提升的根本原因。

  2. 兴趣区域池化层 Rol

    • 问题 : 区域提议是任意大小的,如何从共享特征图上为每个提议提取固定长度的特征向量?

    • 做法 : 引入 RoI Pooling 层 。该层将每个区域提议在特征图上对应的区域,统一池化成一个固定大小(如7x7)的特征网格。这样,不同大小的提议都能输出相同维度的特征。

  3. 端到端的联合训练:(合并上面的3-5步)

    • 做法 : 将分类任务 (是什么物体)和边界框回归任务(精修位置)合并到一个网络结构中。

    • 在RoI Pooling层之后,网络有两个并列的输出层 :一个用于Softmax 分类(代替SVM),一个用于边界框回归。合并损失函数 L = L_cls(分类损失) + λ * L_loc(回归损失)。

  4. Fast R-CNN 的高效训练方法:分层采样

    • 做法 : 先随机采样 N 张图片 (例如 N=2),然后从每张图片中采样 R/N 个 RoI(例如 128/2=64)来组成一个批次。
    • 优势 : 来自同一张图片的 RoI 在向前和向后传播时,可以共享计算和内存(因为它们来自同一张共享特征图)。这极大地减少了计算量,比 R-CNN/SPPnet 的策略快约64倍。

Faster R-CNN RPN网络进行提议生成

https://arxiv.org/pdf/1506.01497

端到端的进化:区域提议网络 RPN & 参数共享

1. 卷积层 -> 特征图; 2. RPN -> 候选框; 3. Rol 池化成统一特征;

(分支合并的箭头 代表RPN 和 R-CNN共享特征参数。)

  1. 全连接层 FC 并行输出 类别和边框回归
模块 任务 分类 (cls) 内容 回归 (reg) 内容
RPN 区域提议 二分类:物体 vs 背景 类别无关:调整锚点框逼近物体
Fast R-CNN 精确检测 多分类:具体是哪个物体类别 类别特定:为每个类别精细调整框位
  1. 区域提议网络(RPN Region Proposal Network**,革命性创新)**:

    • 目标 : 用神经网络自己学习生成区域提议

    • 做法

      • RPN 在最终的共享卷积特征图上滑动一个小网络

      • 在每个滑动窗口的中心,预设多种不同大小和长宽比的框,称为锚点框

      • RPN 同时为每个锚点框输出两个预测:① 这个框是"物体"的置信度 ;② 对这个框进行微调的回归参数

    • 效果区域提议的生成也变成了一个可微分的、可由网络学习的部分。这意味着它可以在GPU上高速运行,并且能和检测网络一起被优化。

  2. 共享卷积特征

    • 做法 : RPN 和 Fast R-CNN 的检测网络(分类+回归)共享同一张卷积特征图

    • 效果 : 避免了为两个任务分别计算特征,防止计算冗余和特征不一致

  3. 训练技巧

    • 4步交替训练:

      • 使用预训练的 ImageNet 模型(如 VGG)初始化共享卷积层。

      • 仅针对区域提议任务 训练 RPN

      • 用第一步 RPN 生成的提议框来训练 Fast R-CNN,使其学会分类和精修边界框。

      • 将第二步训练好的 Fast R-CNN 的卷积层参数复制过来,作为 RPN 的新的共享卷积层初始值。保持这些共享卷积层的参数不变,只微调 RPN 特有的层(即 cls 和 reg 层)。

      • 只微调 Fast R-CNN特有的层。

    • 样本平衡 : 一张图像会产生约 20000 个锚点框,但大部分是负样本(背景)。直接训练会导致模型偏向于预测背景 。因此,每个 mini-batch 从一张图像中随机采样 256 个锚点框,并保证正负样本的比例最高为 1:1。如果正样本不足 128 个,就用负样本填充。

Mask R-CNN 实例分割

https://arxiv.org/pdf/1703.06870

  1. 在 Faster R-CNN 框架上增加了一个并行的掩码预测分支 ,从而将目标检测 扩展为了实例分割

  2. 不同于那些 先分割 再分类的复杂方法,Mask R-CNN 的掩码预测与分类是解耦的(并行互不依赖)。

  3. 提出了 RoIAlign 层 ,解决了 Faster R-CNN 中 RoI Pooling 操作造成的空间不匹配问题,极大地提升了像素级定位的精度

损失函数 + 并行解耦

新损失函数 分类损失 + 边界框回归损失 + 新增的掩码损失。

  • 对于每个 RoI,掩码分支会输出一个大小为 K × m × m 的张量。

  • K 是总类别数(比如 COCO 数据集有 80 类)。

  • 这意味着网络会为每一个类别都生成一个独立的、分辨率为 m × m 的二值掩码。例如,对于同一个物体,网络会同时生成一个"猫"的掩码、一个"狗"的掩码、一个"车"的掩码等等。

实现 并行解耦

  • 掩码分支的责任 : 专注于学习如何描绘物体的形状,而不用关心这个物体是什么。它只需要为每个类别生成高质量的轮廓模板。

  • 分类分支的责任 : 专注于判断物体的类别

掩码卷积 + RolAlign

掩码是空间信息,空间信息需要用能保持空间结构的全卷积网络 FCN 来建模。

RoIPool 的操作流程里,有两步强制 "量化"(把连续的坐标 / 尺寸,变成离散的整数),误差会使得掩码出问题。

RoIAlign 计算 RoI 在特征图上的位置时,不做取整; 周围取点,进行双线性插值

因为 bin 的尺寸是连续的(比如 1.457 像素宽),而特征图的像素是离散的(每个像素是一个固定点)

下期预告后续 YOLO系列 + SSD

R-CNN 属于二阶段目标检测算法,其核心是分两步完成检测任务:

第一步先通过选择性搜索 等方法生成大量可能包含目标的候选区域(Region Proposal)

第二步再对这些候选区域进行特征提取、分类与边界框回归

整体流程存在 "生成候选区 - 精细检测" 的明显阶段划分,精度高,但速度相对较慢。

而SSD 和 YOLO 系列属于单阶段目标检测算法:

它们摒弃了 "先找候选区" 的步骤,直接在网络对图像提取的特征图上 ,通过预设的锚点或网格,同步完成目标类别预测与边界框位置回归

整个检测过程端到端一次完成,无需分阶段处理,因此检测速度远快于 R-CNN。

相关推荐
视觉AI2 小时前
如何实现 5 μm 精度的视觉检测?不仅仅是相机的事
人工智能·机器人·视觉检测·相机
这张生成的图像能检测吗2 小时前
(论文速读)DiffBlender:可组合和通用的多模态文本到图像扩散模型
人工智能·深度学习·计算机视觉·文生图·扩散模型
清***鞋3 小时前
转行AI产品如何准备面试
人工智能·面试·职场和发展
AI_Gump3 小时前
Qwen-image-edit在ComfyUI部署使用
人工智能·comfyui
飞哥数智坊3 小时前
打造我的 AI 开发团队(三):bmad 如何实现规划与开发闭环
人工智能·ai编程
哈泽尔都3 小时前
运动控制教学——5分钟学会样条曲线算法!(三次样条曲线,B样条曲线)
c++·人工智能·算法·机器学习·matlab·贪心算法·机器人
Python极客之家3 小时前
基于机器学习的智能贫血分析预测系统
人工智能·python·机器学习·数据挖掘·毕业设计·数据可视化分析
lisw054 小时前
编程语言top5对比分析!
大数据·人工智能·程序人生·机器学习·软件工程
打码人的日常分享4 小时前
信息化系统安全建设方案
大数据·数据库·人工智能·安全·系统安全