本节摘要:目标检测是自动驾驶感知的基础——找出路上的车、人、自行车。本节讲检测在自动驾驶的应用、挑战和实时要求。
阅读完本节,你应当能够:
自动驾驶要避让障碍物,先得检测出"有什么、在哪"。目标检测输出路上所有目标的边界框和类别,是感知的基础。

自动驾驶主要检测:
| 挑战 | 说明 |
|---|---|
| 光照变化 | 强光、阴影、夜间、逆光 |
| 遮挡 | 车辆互相挡、行人被挡 |
| 小目标 | 远处行人/自行车像素少 |
| 密集 | 拥堵场景多目标重叠 |
| 天气 | 雨、雾、雪降低可见度 |
| 长尾 | 罕见场景(如奇特车辆) |
自动驾驶检测必须实时:
精度和速度权衡,不能只追求精度。
2D 检测只给图像框,自动驾驶要知道目标在 3D 空间的位置(距离、3D 框)。这催生 3D 检测(2.4 节)和 BEV 架构。
⚠️ 漏检致命:自动驾驶检测漏检一个行人可能出事故,召回率比精度更重要。阈值设低,宁可误检不可漏检。
💡 关键直觉:检测找路上目标(车/人/自行车),输出框+类别,是避障基础。挑战多(光照/遮挡/小目标/天气),实时要求高(30Hz),YOLO 主流。漏检致命,召回优先。2D 不够需 3D 检测。
下一节讲语义分割。
YOLO 的核心思路是"把检测当作回归问题一次性解决":输入整张图,输出所有目标的类别概率和边界框。第一代 YOLO 把图像分成 S×S 网格,每个网格负责预测若干个框,速度远超两阶段方法,但精度一般、小目标差。后续版本持续改进:YOLOv3 引入多尺度特征金字塔,在每个尺度分别检测不同大小的目标;YOLOv5 在工程上做了大量优化(自适应锚框、数据增强、模型缩放),成为社区应用最广的版本;YOLOv8 转向 anchor-free,直接用中心点加宽高的方式预测。
# 伪代码:一个简化的 anchor-free 检测头 for scale in [P3, P4, P5]: # 多尺度特征 for (i, j) in all_cells(scale): # 每个位置 cls = classifier(scale[i, j]) # 类别置信度 box = regressor(scale[i, j]) # (cx, cy, w, h) keep_topk(cell) # 每位置保留 TopK # 后处理:非极大值抑制,去掉互相重叠的低分框
检测的损失通常分三块:分类损失、定位损失、目标存在性损失。分类用交叉熵;定位常用 IoU 家族的损失(GIoU/CIoU),它不只惩罚框的位置偏差,还考虑框的重叠程度,训练更稳定;目标性损失解决"背景像素远多于目标像素"的不平衡。评价指标上,mAP 是主流——先按置信度排序,画出 PR 曲线,计算各 IoU 阈值下的平均精度。自动驾驶还特别关注两个衍生指标:小目标召回率(远处行人)和 3D 框的朝向平均相似度,这两个指标直接对应实际路测中的危险场景。
再补充训练层面的细节。检测模型在小目标上的表现很大程度上取决于特征金字塔的浅层特征质量——小目标在浅层特征上像素多、语义弱,很多方案会加大浅层特征在损失里的权重,或者在浅层额外加深特征融合(如 BiFPN 反复双向融合高低层特征)。另外,训练时的多尺度采样也很关键:把输入图按 0.5 到 1.5 倍随机缩放,能让模型对目标大小更不敏感,是提升小目标召回性价比最高的手段之一。数据层面,长尾类别(锥桶、施工机械、罕见车型)要专门做类别均衡采样,否则模型在它们上的召回会很低,而恰恰是这些类别在真实路测里最容易引起接管。