跳转至

目标检测

概述

目标检测(Object Detection)是计算机视觉中的核心任务之一,目标是在图像中同时完成定位(localization)和分类(classification)——即找出图像中所有感兴趣的物体,并为每个物体输出一个边界框(bounding box)和类别标签。

与图像分类只需输出一个标签不同,目标检测需要同时回答两个问题:

  1. 图像中有哪些物体?
  2. 这些物体分别在哪里

评估指标

IoU(Intersection over Union)

IoU 是衡量预测框与真实框重叠程度的标准指标:

\[ \text{IoU} = \frac{|B_{\text{pred}} \cap B_{\text{gt}}|}{|B_{\text{pred}} \cup B_{\text{gt}}|} \]

其中 \(B_{\text{pred}}\) 是预测边界框,\(B_{\text{gt}}\) 是真实边界框(ground truth)。IoU 值域为 \([0, 1]\),通常认为 \(\text{IoU} \geq 0.5\) 为一次成功检测。

Precision 与 Recall

  • Precision(精确率):在所有预测为正的样本中,真正正确的比例
  • Recall(召回率):在所有真正的正样本中,被正确预测的比例
\[ \text{Precision} = \frac{TP}{TP + FP}, \quad \text{Recall} = \frac{TP}{TP + FN} \]

AP 与 mAP

AP(Average Precision) 是单个类别的 Precision-Recall 曲线下面积:

\[ \text{AP} = \int_0^1 P(R) \, dR \]

mAP(mean Average Precision) 是所有类别 AP 的平均值,是目标检测最常用的综合评估指标:

\[ \text{mAP} = \frac{1}{C} \sum_{i=1}^{C} \text{AP}_i \]

不同数据集对 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)是将深度学习引入目标检测的开创性工作:

  1. 选择性搜索(Selective Search):在输入图像上生成约 2000 个候选区域
  2. 特征提取:将每个候选区域缩放到固定尺寸,送入 CNN(如 AlexNet)提取特征
  3. 分类:用 SVM 对每个候选区域的特征进行分类
  4. 边界框回归:用线性回归器微调边界框位置

缺点:每个候选区域都要单独过一遍 CNN,速度极慢(一张图约 47 秒)。

Fast R-CNN(2015)

Fast R-CNN 的关键改进是共享卷积计算

  1. 整图卷积:先对整张图像运行一次 CNN,得到全图特征图(feature map)
  2. RoI Pooling:将每个候选区域投影到特征图上,通过 RoI Pooling 层提取固定长度的特征向量
  3. 多任务损失:同时训练分类头和回归头,使用联合损失函数
\[ L = L_{\text{cls}}(p, u) + \lambda \cdot [u \geq 1] \cdot L_{\text{loc}}(t^u, v) \]

其中 \(L_{\text{cls}}\) 为分类损失(交叉熵),\(L_{\text{loc}}\) 为边界框回归损失(Smooth L1)。

速度提升:训练比 R-CNN 快约 9 倍,推理快约 213 倍。

Faster R-CNN(2015)

Faster R-CNN 用区域提议网络(Region Proposal Network, RPN) 替代了选择性搜索,实现了端到端训练:

RPN 的工作原理

  1. 在特征图的每个空间位置上,放置 \(k\) 个预设的锚框(anchors)(不同尺度和长宽比的组合,通常 \(k=9\)
  2. 对每个锚框预测: - 前景/背景二分类得分(是否包含物体) - 边界框偏移量(4 个值:\(\Delta x, \Delta y, \Delta w, \Delta h\)
  3. 选取得分最高的候选区域送入后续的分类和回归头

锚框回归:给定锚框 \((x_a, y_a, w_a, h_a)\),预测偏移量 \((t_x, t_y, t_w, t_h)\)

\[ \hat{x} = t_x \cdot w_a + x_a, \quad \hat{y} = t_y \cdot h_a + y_a \]
\[ \hat{w} = w_a \cdot e^{t_w}, \quad \hat{h} = h_a \cdot e^{t_h} \]

Faster R-CNN 在 PASCAL VOC 上达到了接近实时的速度(约 5 fps),同时保持了高精度。


单阶段检测器(One-Stage Detectors)

单阶段检测器跳过候选区域生成步骤,直接从图像预测边界框和类别,因此速度更快。

YOLO v1(2016)

YOLO(You Only Look Once) 是单阶段检测器的代表性工作,其核心思想极为简洁:

核心机制

  1. 网格划分:将输入图像划分为 \(S \times S\) 的网格(grid),每个网格单元(grid cell)负责检测中心落在该单元内的物体
  2. 每个网格单元预测: - \(B\) 个边界框,每个框包含 5 个值:\((x, y, w, h, \text{confidence})\) - \(C\) 个类别条件概率 \(P(\text{Class}_i | \text{Object})\)
  3. 输出张量\(S \times S \times (B \times 5 + C)\)

其中置信度(confidence)定义为:

\[ \text{Confidence} = P(\text{Object}) \times \text{IoU}_{\text{pred}}^{\text{truth}} \]

最终每个边界框的类别特定置信度为:

\[ P(\text{Class}_i | \text{Object}) \times P(\text{Object}) \times \text{IoU}_{\text{pred}}^{\text{truth}} = P(\text{Class}_i) \times \text{IoU}_{\text{pred}}^{\text{truth}} \]

损失函数(多任务损失):

\[ L = \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \right] \]
\[ + \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] \]
\[ + \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} (C_i - \hat{C}_i)^2 + \lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{noobj}} (C_i - \hat{C}_i)^2 \]
\[ + \sum_{i=0}^{S^2} \mathbb{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} (p_i(c) - \hat{p}_i(c))^2 \]

对宽高取平方根是为了缓解大小物体的尺度不平衡问题。

优缺点

  • 优点:速度极快(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 是另一种重要的单阶段检测器:

核心思想:在多个不同分辨率的特征图上同时进行检测,每个特征图负责检测不同尺度的物体。

架构要点

  1. 基础网络:使用 VGG-16(截断全连接层)作为特征提取器
  2. 多尺度特征图:在基础网络之后添加多个逐渐减小的卷积层(如 \(38 \times 38\)\(19 \times 19\)\(10 \times 10\)\(5 \times 5\)\(3 \times 3\)\(1 \times 1\)
  3. 默认框(Default Boxes):在每个特征图位置上预设不同长宽比的默认框(类似锚框)
  4. 预测:对每个默认框预测类别得分和边界框偏移量

损失函数

\[ L = \frac{1}{N} (L_{\text{conf}} + \alpha \cdot L_{\text{loc}}) \]

其中 \(L_{\text{conf}}\) 为分类置信度损失,\(L_{\text{loc}}\) 为定位损失,\(N\) 为匹配到的默认框数量。

SSD 使用困难负样本挖掘(Hard Negative Mining):按置信度损失排序负样本,保持正负样本比例约 \(1:3\)


非极大值抑制(Non-Maximum Suppression, NMS)

NMS 是目标检测中去除冗余检测框的关键后处理步骤:

算法流程

  1. 将所有检测框按置信度降序排列
  2. 选择置信度最高的框,加入最终结果
  3. 计算该框与其余所有框的 IoU
  4. 删除 IoU 大于阈值 \(\tau\)(通常 \(\tau = 0.5\))的所有框
  5. 重复步骤 2-4,直到所有框被处理

Soft-NMS:标准 NMS 直接删除高重叠框,可能误删密集场景中的正确检测。Soft-NMS 改为降低重叠框的置信度:

\[ s_i = s_i \cdot e^{-\frac{\text{IoU}(M, b_i)^2}{\sigma}} \]

其中 \(M\) 是当前最高分框,\(b_i\) 是其他框,\(\sigma\) 控制衰减速率。


Focal Loss 与类别不均衡

问题背景

单阶段检测器在密集采样时会产生大量负样本(背景区域),正负样本比例可达 \(1:1000\)。大量容易分类的负样本会主导损失函数,淹没有用的学习信号。

Focal Loss(2017, RetinaNet)

Focal Loss 在标准交叉熵损失的基础上增加了一个调制因子,降低容易分类样本的权重:

\[ \text{FL}(p_t) = -\alpha_t (1 - p_t)^{\gamma} \log(p_t) \]

其中:

  • \(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 分支,抑制低质量的远离中心的预测:
\[ \text{centerness} = \sqrt{\frac{\min(l, r)}{\max(l, r)} \times \frac{\min(t, b)}{\max(t, b)}} \]
  • 结合 FPN 进行多尺度预测,不同层负责不同尺度的物体

总结与对比

方法 类型 速度 精度 特点
Faster R-CNN 两阶段 RPN + RoI Pooling
YOLO v1 单阶段 全局推理,简洁
YOLO v8 单阶段 Anchor-Free,多任务
SSD 单阶段 多尺度特征图
RetinaNet 单阶段 Focal Loss + FPN
FCOS 单阶段 Anchor-Free,逐像素

目标检测的发展趋势:

  1. 从两阶段到单阶段:速度与精度的平衡不断优化
  2. 从 Anchor-Based 到 Anchor-Free:减少超参数,简化设计
  3. 多任务统一:检测、分割、姿态估计等任务在统一框架下完成
  4. Transformer 的引入:DETR(Detection Transformer)等工作将注意力机制引入检测,消除了 NMS 等手工设计的后处理步骤

评论 #