2D感知算法与任务
摘要:本文整理图像感知任务、数据集与检测评价方法,在 R-CNN 系列基础上补充 YOLO 与 CenterNet,重点理解网络预测什么、如何解码为检测框,以及不同检测思路的联系。
2D感知任务
输入:相机生成的单帧或连续图像数据
- 单张图像
- 图像序列
输出:
- 稀疏:物体的位置,大小,速度等
- 稠密:每个像素点的类别标签
算法:
- 物体检测
- 物体跟踪
- 语义分割
数据库和基准测试
通用数据库
- PASCAL-VOC,MS COCO,MOT等
自动驾驶数据库
- KITTI,NuScenes,Waymo
两者的区别
- 采集场景不同
- 采集环境不同
- 物体类别不同
- 物体位置分布不同
- 标注信息不同
.png)
数据集的划分
- 训练集、验证集和测试集
- 测试集:不同难度的子集(比如按照遮挡程度,物体大小)
性能指标
- 算法输出与手工标注的重合程度:Intersection over Union(IoU)
- 阈值设定:高于阈值则为正确检测,否则为无效检测
- True Positive(TP),False Positive(FP),False Negative(FN)
- Precision(P),Recall(R),PR曲线
- Average Precision(AP)
- mean AP(mAP)

物体检测算法
检测方法可以从候选区域、密集预测、中心点表示和集合预测等思路理解:R-CNN 系列逐步发展候选区域检测;YOLO 系列直接进行密集预测;本文的 CenterNet 用中心点表示目标;DETR 等方法使用 Transformer 进行集合预测。Anchor、后处理与运行速度取决于具体版本和实现,不能简单认为 YOLO 都使用 Anchor,或 Transformer 检测器都无法实时。
传统物体检测
候选窗口:滑动窗口(稠密),显著性图(稀疏)
特征提取:Haar特征,HOG特征
分类器:AdaBoost,Decision,SVM
问题:针对不同任务,需要手工设计不同的特征,选择不同的分类器
R-CNN算法
- 选择性搜索替代滑动窗口
- 卷积神经网络提取图像特征(ImageNet上预训练)
- 窗口特征采用SVM进行分类

问题:窗口数量重叠太多,导致特征提取的冗余,影响算法的运行效率(20s)
Fast R-CNN
- CNN提取全图的特征,避免冗余计算
- 在候选框中进行ROI Pooling
- 全连接网络进行分类和边框回归

问题:通过选择性搜索来得到候选区域,整个过程依然比较慢(2s)
FPN(Feature Pyramid Network)
- 特征提取阶段进行优化
- 金字塔结构提取多尺度信息
- 适应不同大小的物体
上述 算法改进对比:
.png)
YOLO:将目标检测转为密集预测
YOLO(You Only Look Once)的核心思路是通过一次网络前向计算预测类别与边界框,避免对大量候选区域分别提取图像特征。这里的“一次”不代表无需图像预处理、输出解码或后处理。参考:YOLO 原论文。

1. 先分清 YOLO 的不同版本
YOLO 是一系列检测方法,不是一套始终不变的输出格式。学习时应先注明版本,再讨论 Anchor、损失函数与 NMS。
| 方法 | 目标表示的特点 | 需要避免的误解 |
|---|---|---|
| YOLOv1 | 将图像分为网格,预测边界框与类别 | 不能用它的输出布局解释所有版本 |
| YOLOv2 / YOLOv3 | 使用 Anchor,围绕预设框预测位置和尺寸 | Anchor 是先验框,不是最终结果 |
| YOLOv8 检测模型 | 使用 Anchor-free 检测头 | Anchor-free 不等于没有特征网格或参考点 |
YOLOv8 的结构说明见 Ultralytics 官方文档。不同版本的训练标签分配、分类分数含义与框解码方式可能不同,不能拿同一段后处理代码直接套用。
2. 从输入图像到检测框
常见处理链可以概括为:
- 预处理:调整输入尺寸、填充边缘并归一化,保存缩放比例和填充量。
- Backbone:提取边缘、纹理以及更高层的语义特征。
- Neck:融合不同分辨率的特征,帮助处理不同尺寸的目标;具体结构依版本而定。
- Head:在特征位置预测类别、位置及版本相关的其他输出。
- 解码与筛选:恢复框坐标,按分数过滤,并按实现需要执行 NMS。
- 坐标还原:去除填充影响,映射回原始图像。
多尺度预测有助于兼顾大目标和小目标,但并不保证远处小物体一定能检出。输入分辨率、特征步长、遮挡和训练样本都会影响结果。
3. Anchor-based 是如何解码框的
以 YOLOv3 常见的框参数化为例,某个网格位置为 ,Anchor 尺寸为 ,网络输出为 :
其中 是 Sigmoid。中心位置使用特征网格单位时,还要乘以对应步长;Anchor 的宽高也必须使用一致单位。该公式解释的是特定版本的 Anchor 解码,不能直接用于 YOLOv8 等其他检测头。参考:YOLOv3 论文。
在带独立 objectness 输出的实现中,常用检测分数可以写为:
这说明“框里是否有目标”和“它属于哪个类别”可以分别预测。并非每个 YOLO 版本都输出独立 objectness;实际分数计算应以模型导出格式为准。
4. 为什么需要 NMS
同一个物体附近可能产生多个候选框。传统 NMS 按分数从高到低保留框,并抑制与已选框高度重叠的其他候选,通常按类别处理。
NMS 的 IoU 阈值越低,抑制通常越强,可能误删相邻或重叠目标;阈值越高,可能留下更多重复框。置信度阈值筛选低分预测,NMS 阈值处理重复预测,二者作用不同。还有采用其他去重或端到端输出设计的版本,不能将 NMS 当成所有 YOLO 的必需步骤。
系列算法对比:

CenterNet:将目标表示为中心点
本文的 CenterNet 指 Objects as Points,不要与其他同名方法混淆。它将每个目标表示为边界框中心,并预测宽高与中心偏移,从而恢复完整边界框。参考:CenterNet 原论文。
1. 网络需要预测什么
设输入图像大小为 ,输出步长为 ,类别数为 :
| 输出分支 | 常见形状(忽略 batch) | 含义 |
|---|---|---|
| 中心热力图 | 各类别中心位置的响应 | |
| 宽高 | 目标框宽度与高度 | |
| 中心偏移 | 补偿中心量化到整数网格带来的误差 |
表中为常见的类别共享宽高配置,具体实现也可能使用类别相关宽高。三个分支共用特征,输出的是互补信息:热力图决定“在哪里、是什么”,宽高决定“有多大”,偏移细化中心位置。
2. 训练时如何表示中心

设目标框中心为 ,在输出特征图中的连续位置为 ,量化后的整数网格位置为:
是偏移监督。热力图在对应类别中心处设置峰值,并在附近绘制高斯分布,以表达中心周围位置的训练权重;宽高和偏移主要在真实目标的中心位置计算回归损失。
总损失可以概括为:
中心热力图使用修改的 Focal Loss 思路处理大量背景位置,宽高和偏移采用回归损失。损失权重决定不同分支的训练贡献,并不表示输出框对应的物理单位。
3. 推理时如何解码
流程是:提取热力图局部峰值 → 选择高分候选 → 在对应位置读取偏移与宽高 → 恢复框坐标。
设峰值所在整数坐标为 ,偏移为 :
在原版常见实现中,宽高分支使用输出特征图尺度。设其预测为 ,先换算为网络输入像素单位: