Blog Logo

27 MAY 2026 ~ 20 min read

从 R-CNN 到 Faster R-CNN:两阶段目标检测演进


一、学习概述

本阶段在完成图像分类、CIFAR-10 分类实验、猫狗分类项目以及 ResNet18 迁移学习的基础上,开始进入目标检测方向的学习。与前面学习的图像分类任务不同,目标检测不仅需要判断图片中包含什么目标,还需要给出每个目标在图片中的具体位置。因此,目标检测任务的输出内容通常包括目标类别、置信度和边界框坐标。

本阶段首先学习了目标检测任务的基本概念,理解了图像分类和目标检测之间的区别。图像分类只需要对整张图片进行类别判断,而目标检测需要在一张图片中同时完成多个目标的识别和定位。随后,通过目标检测入门课程,学习了 VOC、COCO 和 YOLO 等常见目标检测数据集格式,初步掌握了不同标注格式中图片、类别和边界框信息的组织方式。

在基础概念方面,本阶段重点学习了 bbox 边界框、Ground Truth 真实框、预测框、IoU 交并比、NMS 非极大值抑制、confidence 置信度、Precision、Recall、AP 和 mAP 等内容。通过这些概念的学习,对目标检测模型从预测框生成到结果筛选,再到最终评价指标的基本流程有了更加清晰的认识。

在算法学习方面,本阶段重点学习了 R-CNN、Fast R-CNN 和 Faster R-CNN 三种经典两阶段目标检测方法。通过对比三种方法的流程和改进点,理解了 R-CNN 系列从“候选框逐个送入 CNN”,到“整张图共享特征图”,再到“使用 RPN 网络自动生成候选框”的发展过程。整体来看,本阶段完成了从图像分类任务到目标检测任务的过渡,为后续继续学习 YOLO 系列目标检测模型打下了基础。


二、具体学习内容

(1)目标检测任务与数据标注格式学习

目标检测任务的核心是同时完成两个任务:一是判断图像中出现了什么目标,二是判断目标位于图像中的什么位置。因此,一条典型的目标检测结果通常可以表示为:

类别 + 置信度 + 边界框

例如:

dog, 0.96, [100, 80, 300, 260]

表示模型认为图片中存在一只狗,置信度为 0.96,并且狗的位置由边界框 [100, 80, 300, 260] 表示。

在目标检测中,边界框通常被称为 bbox,即 Bounding Box。bbox 常见的表示方式主要有两种:一种是 [x1, y1, x2, y2],表示左上角坐标和右下角坐标;另一种是 [cx, cy, w, h],表示中心点坐标和宽高。前者更适合计算两个框之间的重叠区域,后者常用于 YOLO 等模型的标注格式。

通过目标检测入门课程的学习,本阶段进一步了解了 VOC、COCO 和 YOLO 三种常见标注格式。VOC 格式通常使用 XML 文件保存每张图片中的目标信息,标签文件中会记录图片尺寸、目标类别以及边界框坐标。COCO 格式通常使用 JSON 文件统一保存图片信息、类别信息和标注信息,更适合大规模数据集管理。YOLO 格式相对简洁,通常每张图片对应一个 txt 标签文件,每一行表示一个目标,格式一般为:

class_id cx cy w h

其中,class_id 表示类别编号,cx、cy、w、h 表示归一化后的中心点坐标和宽高。例如一张图片宽为 800,高为 600,某个目标框的中心点和宽高为 cx=350, cy=300, w=300, h=300,则其 YOLO 归一化坐标为:

cx_norm = 350 / 800 = 0.4375
cy_norm = 300 / 600 = 0.5
w_norm = 300 / 800 = 0.375
h_norm = 300 / 600 = 0.5

因此,该目标在 YOLO 标签文件中可以表示为:

class_id 0.4375 0.5 0.375 0.5

通过这一部分学习,进一步理解了目标检测数据集不仅需要类别标签,还必须保存目标在图片中的位置信息。


(2)IoU、NMS 与评价指标学习

IoU 全称为 Intersection over Union,中文称为交并比,用于衡量两个边界框之间的重叠程度。它的计算公式为:

IoU = 交集面积 / 并集面积

IoU 的取值范围为 0 到 1。若两个框完全不重叠,则 IoU 为 0;若两个框完全重合,则 IoU 为 1。IoU 越大,说明两个框越接近。在目标检测中,IoU 常用于判断预测框是否与真实框匹配。例如在 mAP@0.5 中,通常要求预测框和真实框之间的 IoU 大于等于 0.5,才认为该预测框的位置是合格的。

在计算 IoU 时,需要先确定两个框交集区域的左上角和右下角坐标。交集左上角坐标由两个框左上角坐标中的较大值得到,交集右下角坐标由两个框右下角坐标中的较小值得到。如果两个框没有重叠,则交集宽度或高度可能为负数,因此代码中通常会使用:

max(0, inter_x2 - inter_x1)
max(0, inter_y2 - inter_y1)

来避免出现负面积。

NMS 全称为 Non-Maximum Suppression,中文称为非极大值抑制。它的作用是从一组重复预测框中保留置信度最高的框,并删除与它重叠程度较高的低分框。目标检测模型在预测时,可能会对同一个目标输出多个相似的边界框,例如同一只狗可能被预测出多个位置相近、类别相同的框。如果不进行处理,最终结果中同一个目标会被重复框出多次。

NMS 的基本流程是:先按照置信度从高到低排序所有候选框,然后取出当前置信度最高的框并保留,再计算它与其他候选框之间的 IoU。如果某些框与当前高分框的 IoU 超过设定阈值,就认为它们是重复框,将这些低分框删除。重复这一过程,直到所有候选框处理完成。通过 NMS,模型最终可以得到更加简洁、合理的检测结果。

在评价指标方面,本阶段学习了 TP、FP、FN、Precision、Recall、AP 和 mAP。TP 表示检测正确的目标,FP 表示误检的目标,FN 表示真实存在但没有被检测出来的目标。Precision 表示预测出来的目标中有多少是真的,公式为:

Precision = TP / (TP + FP)

Recall 表示真实存在的目标中有多少被检测出来,公式为:

Recall = TP / (TP + FN)

AP 用于衡量某一个类别的综合检测效果,mAP 则是多个类别 AP 的平均值,是目标检测任务中常用的综合评价指标。通过练习可以看出,若真实目标有 10 个,模型预测出 12 个框,其中 8 个正确、4 个误检、2 个漏检,则:

TP = 8
FP = 4
FN = 2
Precision = 8 / (8 + 4) = 0.667
Recall = 8 / (8 + 2) = 0.8

(3)R-CNN 学习

R-CNN 全称为 Region-based Convolutional Neural Network,即基于候选区域的卷积神经网络。它是较早将 CNN 引入目标检测任务的方法,其核心思想是:先生成大量可能包含目标的候选区域,再分别对这些候选区域进行分类和边界框修正。

R-CNN 的主要流程可以概括为:

输入图片
→ Selective Search 生成候选区域
→ 裁剪并缩放每个候选区域
→ 每个候选区域分别送入 CNN 提取特征
→ 使用 SVM 判断候选区域类别
→ 使用 bbox regressor 修正候选框位置
→ 使用 NMS 删除重复框
→ 输出最终检测结果

在 R-CNN 中,Selective Search 负责生成候选框。每个候选框本身就带有初始坐标,例如 [90, 70, 310, 270]。CNN 并不直接生成边界框,而是对裁剪出来的候选区域提取特征。早期 R-CNN 中,每个候选区域经过 CNN 后可以得到一个高维特征向量,例如 4096 维特征。如果一张图片生成约 2000 个候选区域,那么整体可以理解为得到 [2000, 4096] 的特征表示。

SVM 在 R-CNN 中负责分类。它根据 CNN 提取出的特征判断该候选区域属于哪个类别,例如 dog、cat、car 或 background。需要注意的是,SVM 只负责判断类别,并不负责输出边界框位置。候选框的位置最初来自 Selective Search,后续由 bbox regressor 在原始候选框基础上进行修正。

bbox regressor 的作用是对候选框位置进行微调。例如某个候选框初始位置为 [90, 70, 310, 270],经过分类后被判断为 dog,但该框可能不够准确,因此边界框回归器会预测一组调整量,将它修正为更接近真实目标的位置,例如 [100, 80, 300, 260]。最后再通过 NMS 删除重复框,输出最终检测结果。

R-CNN 的主要贡献是将 CNN 强大的特征提取能力引入目标检测任务。但它也存在明显缺点:一张图片可能生成约 2000 个候选区域,每个候选区域都要单独通过 CNN,计算量非常大,速度较慢,同时训练流程也比较复杂。


(4)Fast R-CNN 学习

Fast R-CNN 是在 R-CNN 基础上的改进方法,主要解决 R-CNN 中每个候选框都要单独通过 CNN 导致速度慢的问题。它的核心思想是:整张图片只经过一次 CNN,得到共享特征图,然后在共享特征图上提取每个候选框对应的区域特征。

Fast R-CNN 的主要流程为:

输入图片
→ CNN 提取整图 feature map
→ Selective Search 生成候选框
→ 将候选框映射到 feature map 上
→ ROI Pooling 得到固定大小特征
→ 分类分支输出类别概率
→ bbox 回归分支修正位置
→ NMS 输出最终结果

其中,feature map 是 CNN 对整张图片提取出的特征图。与 R-CNN 不同,Fast R-CNN 不再将 2000 个候选区域分别送入 CNN,而是先对整张图片提取一次特征,然后将候选框映射到 feature map 上,从对应区域中提取特征。

ROI 是 Region of Interest 的缩写,可以理解为感兴趣区域,在 Fast R-CNN 中基本对应候选框。由于不同候选框大小不同,而后续全连接层需要固定大小的输入,因此 Fast R-CNN 使用 ROI Pooling 将不同大小的候选区域统一转换为固定大小特征,例如 7×7×C

Fast R-CNN 相比 R-CNN 有两个重要改进。第一,它共享了整张图的 CNN 特征,避免了每个候选框重复计算 CNN 特征;第二,它不再单独使用 SVM 和独立的 bbox regressor,而是将分类分支和边界框回归分支放入同一个网络中进行联合训练。因此,Fast R-CNN 的训练和推理速度相比 R-CNN 有明显提升。

不过,Fast R-CNN 仍然存在一个问题:候选框依然由 Selective Search 生成。Selective Search 是传统图像处理算法,速度较慢,并且不能和神经网络一起训练,因此候选框生成过程仍然是瓶颈。


(5)Faster R-CNN 学习

Faster R-CNN 是在 Fast R-CNN 基础上的进一步改进。它最大的变化是使用 RPN 网络代替 Selective Search 来生成候选框,使候选区域生成过程也由神经网络完成。

RPN 全称为 Region Proposal Network,中文称为区域候选网络。它的作用是在 CNN 提取出的 feature map 上自动判断哪些位置可能存在目标,并生成候选框。Faster R-CNN 的整体结构可以理解为:

Faster R-CNN = Backbone CNN + RPN + Fast R-CNN 检测头

其主要流程为:

输入图片
→ Backbone CNN 提取共享 feature map
→ RPN 在 feature map 上生成 anchors
→ RPN 判断 anchor 是前景还是背景
→ RPN 修正 anchor 得到 proposals
→ ROI Pooling / ROI Align 提取固定大小特征
→ 检测头进行分类和 bbox 回归
→ NMS 删除重复框
→ 输出最终检测结果

在 Faster R-CNN 中,Anchor 是预先设置在 feature map 每个位置上的参考框。由于图片中的目标可能具有不同大小和长宽比,因此通常会在每个位置设置多个不同尺度和形状的 anchor。RPN 会判断每个 anchor 中是否包含目标,并预测该 anchor 应该如何调整才能更接近真实目标框。

因此,Faster R-CNN 中边界框位置的变化可以理解为:

anchor → RPN 修正 → proposal → 检测头再次修正 → final bbox

这说明 Faster R-CNN 中最终预测框并不是一次直接生成的,而是经过 RPN 和检测头两次修正得到的。RPN 负责生成较高质量的候选框,检测头则进一步判断每个候选框的具体类别,并再次修正位置。

Faster R-CNN 是典型的两阶段检测器。第一阶段由 RPN 生成候选框,第二阶段由检测头对候选框进行分类和边界框回归。相比 Fast R-CNN,它进一步解决了 Selective Search 速度慢的问题,使目标检测流程更加统一和高效。


三、学习过程中的重点理解

通过本阶段学习,首先明确了图像分类和目标检测的区别。图像分类只需要输出类别,而目标检测不仅要输出类别,还要输出目标位置。因此,目标检测任务比图像分类更复杂。

其次,理解了目标检测标注格式的重要性。VOC、COCO 和 YOLO 虽然都服务于目标检测任务,但它们组织标签的方式不同。VOC 通常使用 XML,COCO 通常使用 JSON,YOLO 则使用 txt 文件保存类别编号和归一化边界框坐标。

再次,理解了 bbox、IoU 和 NMS 在检测流程中的作用。bbox 用于表示目标位置,IoU 用于衡量预测框和真实框之间的重叠程度,NMS 用于删除同一目标上的重复预测框。

最后,理解了 R-CNN 系列方法的演进关系。R-CNN 的问题是每个候选区域都要单独通过 CNN,速度较慢;Fast R-CNN 通过共享整张图片的 feature map 减少重复计算;Faster R-CNN 则使用 RPN 网络替代 Selective Search,使候选框生成也由神经网络完成。


四、后续学习安排

后续将在本阶段目标检测基础和 R-CNN 系列学习的基础上,继续学习 YOLO 系列目标检测方法。下一阶段重点理解 YOLO 作为一阶段检测器的基本思想,包括网格划分、边界框预测、置信度计算、类别预测以及 NMS 后处理流程。


Chillist 的 GitHub 头像

你好,我是 Chillist。我在这里记录深度学习、编程实践与个人成长。 如果你想看看我正在做的项目,欢迎访问我的 GitHub