前言
在计算机视觉领域,目标检测(Object Detection)始终是最核心的任务之一。当我们完成一个模型(如 YOLO 系列)的训练后,如何跳出主观视觉,客观、量化地评估其"找得准不准"与"找得全不全"?这就需要我们建立一套严谨的评估体系。
要评价模型,首先需要明确"什么是正确的检测"。在目标检测中,一个有效的预测必须同时满足两个条件:类别分类正确,且定位足够精准。这就引入了衡量预测框与真实框(Ground Truth)重叠程度的基础几何指标------IoU(交并比) 。IoU 的取值在 0 到 1 之间,越接近 1 代表定位越精准。在实际评估中,我们通常会设定一个IoU 阈值(如常规的 0.5,或 COCO 等严苛场景下的 0.75),作为判定预测是否达标的"及格线"。

基于 IoU 阈值,我们可以将模型的每一次预测结果划分为三种基础状态:TP(真正例) ,即类别正确且 IoU 达标,代表成功的检测;FP(假正例) ,即类别错误、IoU 未达标或同一目标的重复检测,代表"误报";以及 FN(假负例),即真实存在的目标被模型遗漏,代表"漏检"。
由此,我们可以推导出衡量模型表现的两个核心比率:精确率(Precision = TP / (TP + FP)) 反映了模型检出结果的可靠性,即"找得有多准";而 召回率(Recall = TP / (TP + FN)) 则反映了模型对真实目标的覆盖能力,即"找得有多全"。然而,这两个指标在实际应用中往往是相互制约的,其背后的"总开关"正是模型输出的置信度(Confidence Score)。当置信度阈值设定较高(如 0.9)时,模型极为谨慎,精确率虽高但容易漏检;反之,当阈值调低(如 0.1)时,模型变得激进,召回率提升的同时也会引入大量误报。
为了打破这种阈值带来的权衡困境,我们需要引入全局视角的客观评估方法。通过不断动态滑动置信度阈值,以召回率为横轴、精确率为纵轴,我们可以绘制出一条 P-R 曲线 。曲线越贴近右上角,说明模型的综合性能越优异。进一步地,我们将 P-R 曲线下的面积定义为 AP(平均精度) ,以此来综合评估模型在单一类别上的检测能力。而对于包含多个类别的复杂检测任务,我们最终会计算所有类别 AP 的算术平均值,即 mAP(平均精度均值)。作为目前目标检测领域最权威、最通用的行业标准,mAP 为我们提供了一把衡量模型绝对实力的"统一标尺"。
在深度学习目标检测的发展历程中,根据算法实现流程的不同,主要分为两阶段(Two-stage) 和**单阶段(One-stage)**两大技术流派。它们体现了在"检测精度"与"运行速度"之间的不同权衡与设计哲学。
Two-stage方法符合人类"先定位后识别"的认知逻辑,将检测任务明确划分为两个独立阶段,以实现更高的检测精度。第一阶段模型快速扫描整幅图像,生成所有可能包含物体的候选区域(即感兴趣区域RoIs),这相当于一个背景过滤机制,仅识别"可能存在物体"的区域而不判断具体类别。第二阶段则对候选区域进行精细分析,通过深度网络提取特征,完成最终的类别判定和边界框坐标微调(回归),确保检测框与目标精准匹配。典型算法包括R-CNN系列(R-CNN、Fast R-CNN、Faster R-CNN)及Mask R-CNN。
One-stage方法以"速度优先"为设计理念,采用更简洁高效的思路,取消了独立的区域提议步骤,实现"端到端"检测。该方法将目标检测视为单一回归问题,将图像像素或特征图划分为网格,在单次前向传播过程中同步预测每个位置是否存在目标、目标类别概率及边界框坐标。代表性算法有YOLO(You Only Look Once )系列和**SSD(Single Shot MultiBox Detector)**等。
R-CNN

R-CNN 的设计思路非常符合人类"先找后认"的直觉,其检测过程主要分为四个关键步骤:
1. 生成候选区域(Region Proposals) :
模型首先扫描输入图像,利用选择性搜索(Selective Search)算法进行图像分割,获取初始区域。随后采用合并策略对这些区域进行层次化整合,形成可能包含目标物体的区域结构。最终,系统会从图像中生成约2000个候选框(RoIs),作为潜在的物体检测区域。
2. 特征提取(Feature Extraction) :
将 2000 个候选区域裁剪后统一调整为 227×227 像素的标准尺寸,随后逐个输入预训练的卷积神经网络(如 AlexNet)进行前向传播,最终生成 2000×4096 维的特征矩阵。

3. 类别分类(Classification) :
将2000x4096的特征矩阵与20个SVM分类器组成的4096x20权值矩阵相乘,得到一个2000x20的概率矩阵。随后,对该概率矩阵的每一列(对应一个类别)进行非极大值抑制处理,剔除重叠建议框,最终保留每列中得分最高的若干建议框。


4. 边界框回归与 NMS(Bounding Box Regression & NMS) :
经过 NMS 处理的候选框会与真实框(Ground Truth)计算 IoU 值。仅当某候选框的 IoU 超过预设阈值(如 0.6)时,才会被保留为正样本;未达标的则被剔除。这些筛选出的高质量候选框将由 20 个独立的回归器分别处理,最终输出各类别中修正得分最高的边界框。

但是该算法存在三大问题:
1. 测试速度慢
这是 R-CNN 最致命的缺陷。在测试阶段,算法需要对选择性搜索生成的约 2000 个候选框,逐一 裁剪、缩放,然后单独 送入 CNN 进行前向传播提取特征。这导致了极其严重的重复计算。因为相邻的候选框之间有大量重叠的像素区域,这些区域被反复提取了特征。
2. 训练过程极其复杂
R-CNN 的训练不是"一步到位"的,而是被割裂成了多个独立的阶段。这种"拼凑式"的训练方式不仅极其繁琐、占用大量存储空间(需要把 2000 个框的特征保存在硬盘上),而且各个模块无法进行联合优化,限制了模型整体性能的上限。
3. 空间复杂度高
R-CNN 必须把 2000 个候选框的特征全部提取出来,并存储在硬盘上供后续 SVM 和回归器读取。对于包含大量图片的数据集(如 VOC 或 COCO),这种中间特征的存储和读取会产生巨大的 I/O 开销和内存/硬盘占用,导致训练过程极其笨重且低效。
Fast R-CNN

- 生成候选区域(Region Proposals)
采用外部算法"选择性搜索(Selective Search)"处理原始图像,生成约2000个候选框(RoIs)。
- 整图特征提取(Feature Extraction)
区别于R-CNN的关键改进:仅对原始图像进行一次CNN处理,输出全局特征图(Feature Map)。这种方法完全避免了重复计算,显著提升了处理速度。
- 感兴趣区域池化(RoI Pooling)
引入RoI Pooling层:
- 将2000个候选框坐标等比映射到全局特征图上
- 通过最大池化统一缩放为固定尺寸(如7×7)
确保输入全连接层的特征维度一致。

- 类别分类与边界框回归(Classification & Bounding Box Regression)
取代SVM的全新方案:
- 分类分支:Softmax层直接输出各类别(含背景)的概率

- 回归分支:全连接层输出边界框坐标偏移量(dx, dy, dw, dh)用于位置微调
两个分支并行处理RoI Pooling后的结果。 

- 非极大值抑制(NMS)
基于Softmax输出结果:
- 按类别筛选置信度
- 通过NMS消除冗余框
保留最优预测结果。
模型训练关键依靠损失函数,损失函数定义如下:


Faster R-CNN

Faster R-CNN 的核心突破在于引入了区域提议网络(RPN),彻底替代了传统耗时的选择性搜索算法,实现了真正的端到端检测。其完整的算法流程分为以下五个核心步骤:
第一步:全局特征提取(Feature Extraction)
原始图像首先输入到预训练的卷积神经网络(如 VGG16 或 ResNet)主干网络(Backbone)中。经过一系列卷积和池化操作后,整张图像被一次性处理,输出一张包含了丰富语义信息的全局共享特征图(Feature Map)。
第二步:候选区域生成(Region Proposal Generation)
这是 Faster R-CNN 最核心的创新步骤。一个轻量级的全卷积网络------区域提议网络(RPN)直接在第一步生成的全局特征图上滑动一个 3×3 的窗口。

- 锚框(Anchor Boxes)机制:在特征图的每个滑动窗口位置,RPN 会预设多个不同尺度和长宽比的锚框(例如 3种尺度 × 3种比例 = 9个锚框)。


- 双分支并行处理 :RPN 对每个锚框进行两个任务的预测:
- 分类分支:判断该锚框属于"前景(包含目标)"还是"背景"的概率。
- 回归分支:输出坐标偏移量(dx, dy, dw, dh),用于初步调整锚框的位置和大小。
- 初步筛选:经过初步的非极大值抑制(NMS)和排序,RPN 会从成千上万个锚框中筛选出约 300 个高质量、最可能包含目标的候选区域(RoIs)。
第三步:兴趣区域池化(RoI Pooling)
为了将大小不一的候选区域送入后续的全连接层,RoI Pooling 层会将 RPN 输出的候选框坐标等比例映射回共享特征图上。随后,通过最大池化操作,将这些随机大小的特征区域统一裁剪并缩放为固定的尺寸(如 7×7),从而保证了特征维度的统一。
第四步:目标识别与定位(Object Detection)
经过 RoI Pooling 提取出的固定尺寸特征图会被展平,并输入到全连接层(Detection Head)中进行深度特征编码。随后,网络分出两个并行的分支输出最终结果:
- 分类分支:通过 Softmax 层输出该候选区域属于各个具体类别(如猫、狗、车等)以及背景的概率。
- 回归分支:同步输出针对当前候选框的精细化边界框坐标偏移量,进一步微调框的位置,使其更紧密地贴合真实目标。
第五步:结果精炼(Non-Maximum Suppression, NMS)
在得到所有候选框的类别概率和微调后的坐标后,模型会针对每一个具体的类别,根据置信度分数从高到低进行排序。通过执行非极大值抑制(NMS)算法,剔除掉高度重叠的冗余框,最终只保留置信度最高的最优预测结果,完成整个目标检测任务。
但是,模型一开始是个"瞎子",它不知道什么是目标,什么是背景。我们需要通过正负样本给它提供"标准答案(Ground Truth)":
- 正样本(Positive):告诉模型"看!这个框里有你要找的目标,你要努力学会认出它,并把框画准!"(产生分类的正向 Loss + 回归 Loss)。
- 负样本(Negative):告诉模型"看!这个框里什么都没有,是纯背景,你要学会忽略它!"(产生分类的负向 Loss)。
通过不断计算预测结果与正负样本标签之间的误差(Loss),模型通过反向传播更新权重,最终就能学会"指哪打哪"。
在 Faster R-CNN 中,正负样本的生成主要发生在 RPN(区域提议网络) 阶段。因为 RPN 此时还不知道具体的类别 (比如猫还是狗),它只负责区分**"前景(有东西)"** 和**"背景(没东西)"**。
具体生成步骤如下:
- 锚框(Anchor)与真实框(Ground Truth)的匹配
RPN 会在特征图上生成成千上万个锚框(比如一张图可能产生 20000 个)。我们需要拿这些锚框去和真实的标注框(Ground Truth)计算 IoU(交并比)。
- 制定严格的划分规则
根据计算出的 IoU,算法会给每一个锚框打上标签(Label):
- 正样本(Foreground / 前景) :
- 与任意一个 真实框的 IoU ≥ 0.7 的锚框。
- 补充保底规则 :即使 IoU 都没到 0.7,但只要是与某个真实框 IoU 最大的那个锚框,也会被强制设为正样本。(这是为了防止某些极小或形状奇特的目标找不到匹配的正样本)。
- 负样本(Background / 背景) :
- 与所有 真实框的 IoU 都 < 0.3 的锚框。
- 中性样本(Neutral / 忽略) :
- IoU 介于 0.3 到 0.7 之间 的锚框。这些框既不像目标,也不像纯背景,属于"模糊地带"。在计算 Loss 时,直接丢弃它们,不参与训练。
- 样本采样(Sampling):解决正负样本极度不平衡
当前面临一个关键的技术难题:在实际图像中,真实目标通常只占据极小区域。按照常规处理方式,可能导致19000个负样本和仅100个正样本的极端不平衡情况。如果直接用于训练,模型会倾向于"偷懒"策略------将所有预测都判定为背景,这样看似能达到99%的准确率,但实际上毫无价值。
为解决这个问题,我们采取以下策略:
- 每次训练仅从20000个锚框中随机选取256个样本计算损失值
- 严格控制正负样本比例不超过1:1(即正样本最多128个,不足部分用负样本补充)
- 当正样本不足128个时,相应减少负样本数量,始终保持总样本数为256
