目标检测
概述
目标检测(Object Detection)是计算机视觉中的核心任务之一,目标是在图像中同时完成定位(localization)和分类(classification)——即找出图像中所有感兴趣的物体,并为每个物体输出一个边界框(bounding box)和类别标签。
与图像分类只需输出一个标签不同,目标检测需要同时回答两个问题:
- 图像中有哪些物体?
- 这些物体分别在哪里?
评估指标
IoU(Intersection over Union)
IoU 是衡量预测框与真实框重叠程度的标准指标:
其中 \(B_{\text{pred}}\) 是预测边界框,\(B_{\text{gt}}\) 是真实边界框(ground truth)。IoU 值域为 \([0, 1]\),通常认为 \(\text{IoU} \geq 0.5\) 为一次成功检测。
Precision 与 Recall
- Precision(精确率):在所有预测为正的样本中,真正正确的比例
- Recall(召回率):在所有真正的正样本中,被正确预测的比例
AP 与 mAP
AP(Average Precision) 是单个类别的 Precision-Recall 曲线下面积:
mAP(mean Average Precision) 是所有类别 AP 的平均值,是目标检测最常用的综合评估指标:
不同数据集对 mAP 的定义略有不同:PASCAL VOC 使用 \(\text{IoU} = 0.5\)(即 mAP@0.5),COCO 使用多个 IoU 阈值的平均(mAP@[0.5:0.95])。
两阶段检测器(Two-Stage Detectors)
两阶段检测器的核心思想是:先生成候选区域(region proposals),再对每个候选区域进行分类和回归。
R-CNN(2014)
R-CNN(Regions with CNN features)是将深度学习引入目标检测的开创性工作:
- 选择性搜索(Selective Search):在输入图像上生成约 2000 个候选区域
- 特征提取:将每个候选区域缩放到固定尺寸,送入 CNN(如 AlexNet)提取特征
- 分类:用 SVM 对每个候选区域的特征进行分类
- 边界框回归:用线性回归器微调边界框位置
缺点:每个候选区域都要单独过一遍 CNN,速度极慢(一张图约 47 秒)。
Fast R-CNN(2015)
Fast R-CNN 的关键改进是共享卷积计算:
- 整图卷积:先对整张图像运行一次 CNN,得到全图特征图(feature map)
- RoI Pooling:将每个候选区域投影到特征图上,通过 RoI Pooling 层提取固定长度的特征向量
- 多任务损失:同时训练分类头和回归头,使用联合损失函数
其中 \(L_{\text{cls}}\) 为分类损失(交叉熵),\(L_{\text{loc}}\) 为边界框回归损失(Smooth L1)。
速度提升:训练比 R-CNN 快约 9 倍,推理快约 213 倍。
Faster R-CNN(2015)
Faster R-CNN 用区域提议网络(Region Proposal Network, RPN) 替代了选择性搜索,实现了端到端训练:
RPN 的工作原理:
- 在特征图的每个空间位置上,放置 \(k\) 个预设的锚框(anchors)(不同尺度和长宽比的组合,通常 \(k=9\))
- 对每个锚框预测: - 前景/背景二分类得分(是否包含物体) - 边界框偏移量(4 个值:\(\Delta x, \Delta y, \Delta w, \Delta h\))
- 选取得分最高的候选区域送入后续的分类和回归头
锚框回归:给定锚框 \((x_a, y_a, w_a, h_a)\),预测偏移量 \((t_x, t_y, t_w, t_h)\):
Faster R-CNN 在 PASCAL VOC 上达到了接近实时的速度(约 5 fps),同时保持了高精度。
单阶段检测器(One-Stage Detectors)
单阶段检测器跳过候选区域生成步骤,直接从图像预测边界框和类别,因此速度更快。
YOLO v1(2016)
YOLO(You Only Look Once) 是单阶段检测器的代表性工作,其核心思想极为简洁:
核心机制:
- 网格划分:将输入图像划分为 \(S \times S\) 的网格(grid),每个网格单元(grid cell)负责检测中心落在该单元内的物体
- 每个网格单元预测: - \(B\) 个边界框,每个框包含 5 个值:\((x, y, w, h, \text{confidence})\) - \(C\) 个类别条件概率 \(P(\text{Class}_i | \text{Object})\)
- 输出张量:\(S \times S \times (B \times 5 + C)\)
其中置信度(confidence)定义为:
最终每个边界框的类别特定置信度为:
损失函数(多任务损失):
对宽高取平方根是为了缓解大小物体的尺度不平衡问题。
优缺点:
- 优点:速度极快(45 fps),全局推理减少背景误检
- 缺点:对小物体和密集物体检测效果较差;每个网格单元只能预测有限数量的物体
YOLO v2 / YOLO9000(2017)
YOLOv2 在 v1 基础上进行了多项改进:
- Batch Normalization:在每个卷积层后加 BN,提升收敛速度和精度
- 高分辨率分类器:先在 \(448 \times 448\) 上微调分类网络,再用于检测
- Anchor Boxes:借鉴 Faster R-CNN,使用预设锚框替代直接预测边界框
- 维度聚类(Dimension Clusters):用 K-Means 在训练集上聚类得到最优锚框形状
- 多尺度训练:训练时随机切换输入分辨率(\(320\) ~ \(608\))
YOLO v3(2018)
YOLOv3 的核心改进是多尺度预测(Multi-Scale Prediction):
- 在 3 个不同尺度的特征图上进行检测(类似 FPN 思想)
- 小尺度特征图检测大物体,大尺度特征图检测小物体
- 使用 Darknet-53 作为骨干网络(引入残差连接)
- 多标签分类:用独立的 Logistic 分类器替代 Softmax,支持多标签
YOLO v5(2020)
YOLOv5 由 Ultralytics 发布,虽然没有发表论文,但因其工程优化而被广泛使用:
- 使用 PyTorch 实现(此前版本基于 Darknet/C)
- 自动锚框计算:根据数据集自动优化锚框
- 数据增强:Mosaic 增强(4 张图拼接)、MixUp、随机仿射变换
- 模型缩放:提供 n/s/m/l/x 五种不同大小的模型
- 训练策略:余弦退火学习率、预热(warmup)、EMA
YOLO v8(2023)
YOLOv8 是 Ultralytics 推出的最新架构,主要改进:
- Anchor-Free 检测头:摒弃锚框,直接预测物体中心和宽高
- 解耦头(Decoupled Head):分类和回归使用独立的卷积分支
- C2f 模块:改进的 CSP 瓶颈结构,更高效的特征提取
- Distribution Focal Loss:用于边界框回归
- 统一框架:同时支持检测、分割、分类、姿态估计等多种任务
SSD(Single Shot MultiBox Detector, 2016)
SSD 是另一种重要的单阶段检测器:
核心思想:在多个不同分辨率的特征图上同时进行检测,每个特征图负责检测不同尺度的物体。
架构要点:
- 基础网络:使用 VGG-16(截断全连接层)作为特征提取器
- 多尺度特征图:在基础网络之后添加多个逐渐减小的卷积层(如 \(38 \times 38\)、\(19 \times 19\)、\(10 \times 10\)、\(5 \times 5\)、\(3 \times 3\)、\(1 \times 1\))
- 默认框(Default Boxes):在每个特征图位置上预设不同长宽比的默认框(类似锚框)
- 预测:对每个默认框预测类别得分和边界框偏移量
损失函数:
其中 \(L_{\text{conf}}\) 为分类置信度损失,\(L_{\text{loc}}\) 为定位损失,\(N\) 为匹配到的默认框数量。
SSD 使用困难负样本挖掘(Hard Negative Mining):按置信度损失排序负样本,保持正负样本比例约 \(1:3\)。
非极大值抑制(Non-Maximum Suppression, NMS)
NMS 是目标检测中去除冗余检测框的关键后处理步骤:
算法流程:
- 将所有检测框按置信度降序排列
- 选择置信度最高的框,加入最终结果
- 计算该框与其余所有框的 IoU
- 删除 IoU 大于阈值 \(\tau\)(通常 \(\tau = 0.5\))的所有框
- 重复步骤 2-4,直到所有框被处理
Soft-NMS:标准 NMS 直接删除高重叠框,可能误删密集场景中的正确检测。Soft-NMS 改为降低重叠框的置信度:
其中 \(M\) 是当前最高分框,\(b_i\) 是其他框,\(\sigma\) 控制衰减速率。
Focal Loss 与类别不均衡
问题背景
单阶段检测器在密集采样时会产生大量负样本(背景区域),正负样本比例可达 \(1:1000\)。大量容易分类的负样本会主导损失函数,淹没有用的学习信号。
Focal Loss(2017, RetinaNet)
Focal Loss 在标准交叉熵损失的基础上增加了一个调制因子,降低容易分类样本的权重:
其中:
- \(p_t\) 是模型对真实类别的预测概率
- \((1 - p_t)^{\gamma}\) 是调制因子,\(\gamma \geq 0\) 为聚焦参数
- \(\alpha_t\) 是类别平衡权重
当 \(\gamma = 0\) 时退化为标准交叉熵。当 \(\gamma = 2\)(常用值)时:
- 对于容易分类的样本(\(p_t = 0.9\)),权重为 \((1-0.9)^2 = 0.01\),损失大幅降低
- 对于困难样本(\(p_t = 0.1\)),权重为 \((1-0.1)^2 = 0.81\),损失基本保持
RetinaNet 使用 Focal Loss + FPN(Feature Pyramid Network)骨干网络,首次使单阶段检测器在精度上超越了两阶段检测器。
Anchor-Free 方法
Anchor-Free 方法不依赖预设的锚框,避免了锚框设计中的超参数调节问题。
CenterNet(2019)
CenterNet 将目标检测建模为关键点检测问题:
- 用热力图(heatmap)预测每个物体的中心点
- 在中心点位置回归物体的宽高
- 无需 NMS 后处理(或使用简单的峰值提取)
损失函数使用修改后的 Focal Loss 用于热力图,L1 损失用于尺寸回归。
FCOS(Fully Convolutional One-Stage Detection, 2019)
FCOS 提出了一种完全基于像素级预测的检测方法:
- 对特征图上的每个位置,预测到边界框四条边的距离 \((l, t, r, b)\)
- 引入 Center-ness 分支,抑制低质量的远离中心的预测:
- 结合 FPN 进行多尺度预测,不同层负责不同尺度的物体
总结与对比
| 方法 | 类型 | 速度 | 精度 | 特点 |
|---|---|---|---|---|
| Faster R-CNN | 两阶段 | 中 | 高 | RPN + RoI Pooling |
| YOLO v1 | 单阶段 | 快 | 中 | 全局推理,简洁 |
| YOLO v8 | 单阶段 | 快 | 高 | Anchor-Free,多任务 |
| SSD | 单阶段 | 快 | 中 | 多尺度特征图 |
| RetinaNet | 单阶段 | 中 | 高 | Focal Loss + FPN |
| FCOS | 单阶段 | 快 | 高 | Anchor-Free,逐像素 |
目标检测的发展趋势:
- 从两阶段到单阶段:速度与精度的平衡不断优化
- 从 Anchor-Based 到 Anchor-Free:减少超参数,简化设计
- 多任务统一:检测、分割、姿态估计等任务在统一框架下完成
- Transformer 的引入:DETR(Detection Transformer)等工作将注意力机制引入检测,消除了 NMS 等手工设计的后处理步骤