Two-Stage Object Detectors
两阶段目标检测器先提出候选区域,再对每个区域进行分类和细化。了解 Faster R-CNN 的工作原理、R-CNN 系列及其权衡。
两阶段目标检测器是将任务拆成两步的目标检测模型:第一阶段提出可能包含目标的图像区域,第二阶段对每个区域进行分类,并优化其边界框。R-CNN 系列在 2014 年至 2018 年间确立了这种设计,并在多年里引领目标检测和实例分割基准测试。单阶段目标检测器会跳过候选区域提议步骤,在一次处理中从密集网格直接预测所有边界框,因此大多数实时系统都采用这类检测器。
两阶段检测器的工作原理#
骨干网络中的卷积神经网络会对整张图像计算一次特征图,通常还会在其上添加特征金字塔网络(FPN)。第一阶段是区域提议网络(RPN):它会在每个特征图位置为一组锚框打分,判断其是否包含目标,并回归偏移量来调整锚框形状;Faster R-CNN 在每个位置使用九个锚框,即三种尺寸乘以三种宽高比。非极大值抑制(NMS)会移除重叠的候选区域,得分最高的区域会传入第二阶段;在原始论文的测试阶段,每张图像会保留 300 个区域。在第二阶段,RoI 池化或更精确的后续方法 RoIAlign 会为每个候选区域裁剪固定大小的特征网格;随后,小型检测头会为每个裁剪区域预测类别(包括背景类别)以及类别专属的边界框偏移量。
在 torchvision 的 Faster R-CNN 的 RPN 上注册前向钩子,可以看到第二阶段要处理多少工作:
import urllib.request
from PIL import Image
from torchvision.models.detection import FasterRCNN_ResNet50_FPN_V2_Weights, fasterrcnn_resnet50_fpn_v2
# Load Faster R-CNN with a ResNet-50 FPN backbone, pretrained on COCO
weights = FasterRCNN_ResNet50_FPN_V2_Weights.DEFAULT
model = fasterrcnn_resnet50_fpn_v2(weights=weights).eval()
image = Image.open(urllib.request.urlopen("https://ultralytics.com/images/bus.jpg"))
# Report how many regions the first stage, the region proposal network, passes on
model.rpn.register_forward_hook(lambda module, inputs, output: print(f"Stage 1: {len(output[0][0])} proposals"))
# The second stage classifies and refines every proposal
detections = model([weights.transforms()(image)])[0]
labels = detections["labels"][detections["scores"] > 0.5]
print(f"Stage 2: {len(labels)} objects {[weights.meta['categories'][i] for i in labels]}")它会输出 Stage 1: 1000 proposals 和 Stage 2: 6 objects ['person', 'bus', 'person', 'person', 'person', 'tie']:torchvision 在推理时会为每张图像保留 1,000 个候选区域,第二阶段再从中筛出六个置信度较高的检测结果。
R-CNN 系列#
- R-CNN(2014):选择性搜索会提出约 2,000 个区域;每个区域都经过变形以符合固定尺寸,再单独传入 CNN;支持向量机则对特征进行分类。因此,使用 VGG-16 骨干网络时,GPU 上每张图像的检测耗时为 47 秒。
- Fast R-CNN(2015):只计算一次特征图,并使用 RoI 池化从中提取每个候选区域的特征;与 R-CNN 相比,VGG-16 的训练速度提高了 9 倍,测试速度提高了 213 倍。
- Faster R-CNN(2015):RPN 取代了选择性搜索,并共享骨干网络的特征,因此生成候选区域几乎不增加成本,完整检测器的运行速度达到每秒 5 帧。
- Mask R-CNN(2017):第三个分支会为每个区域预测像素掩码,使检测器能够执行实例分割;RoIAlign 则在精确的分数位置采样特征,而 RoI 池化会将这些位置四舍五入。
- Cascade R-CNN(2018):三个第二阶段检测头分别以逐渐升高的 IoU 阈值 0.5、0.6 和 0.7 进行训练,每个检测头都会优化前一个检测头输出的边界框,从而提高定位精度。
两阶段与单阶段检测器#
RPN 会在分类器处理背景前舍弃大部分背景,因此第二阶段只在采样后的区域上训练;这些区域中目标所占比例固定,在 Fast R-CNN 中为 25%,并且每个区域都会使用从其精确位置池化得到的特征进行分类。单阶段检测器会对密集网格中的每个位置打分;在 RetinaNet 中,每张图像约有 100,000 个候选位置。直到 2017 年,焦点损失降低了容易识别的背景候选位置的权重,两阶段检测器的准确率才不再领先。如今,单阶段模型以低得多的延迟达到或超过两阶段模型的准确率,而且单个网络更容易导出到边缘硬件,因此两阶段模型现在主要作为研究基线,或用于 Detectron2 等库。Ultralytics 的 auto_annotate 将同样的“先提议、再优化”拆分应用于两个模型,以进行数据标注:YOLO26检测器提出边界框,Meta 的分割一切模型(SAM)则以每个边界框为提示,对框内目标进行分割并生成分割标签。










