当前位置:首页>自动驾驶>自动驾驶之感知算法篇(下):检测与跟踪

自动驾驶之感知算法篇(下):检测与跟踪

  • 2026-10-13 05:35:06
自动驾驶之感知算法篇(下):检测与跟踪
前言:上一篇《感知算法篇》以"处理目的"为主线,展开了语义分割、实例分割和车道线检测的算法细节。但那篇文章聚焦的是静态环境感知——路面在哪、车道线在哪,这些是不动的。自动驾驶还需要回答另一个问题:路上有什么在动?它们要去哪?这就是本篇要讲的动态物体检测和多目标跟踪。欢迎大家评论及纠正~

一、上篇回顾与本篇定位

先理清两篇文章的关系:

感知算法篇(上)

感知算法篇(下)

感知范畴

静态环境感知

动态物体感知

覆盖任务

分割(语义分割 + 实例分割)

检测 + 跟踪

典型应用

车道线检测、可行驶区域

车辆/行人检测、轨迹预测

感知对象

不动的环境要素

运动的交通参与者

上篇讲的四大基础任务——分类、分割、检测、跟踪——上篇深入了"分割",本篇展开"检测"和"跟踪"。两篇合在一起,四大任务就全覆盖了。
静态和动态的区别也很直观:车道线不会动,检测一次就行;但前方车辆每秒都在变位置,不仅要检测出来,还得在后续帧里持续追踪,才能预测它的运动轨迹。

二、"有什么东西,在哪"——目标检测

2.1 检测要解决什么问题

目标检测的输入是一张图片,输出是每个物体的边界框(Bounding Box)+ 类别标签。和分割的区别在于精度:分割是像素级(每个像素都标),检测是区域级(画个框圈住就行)。

维度

分割

检测

精度

像素级

区域级(边界框)

输出

每个像素的类别

框坐标 + 类别

计算量

大

相对小

适用场景

需要精确轮廓

需要知道"有什么、在哪"

自动驾驶中,检测要找的动态物体主要是:车辆、行人、自行车、摩托车、交通锥等。知道它们在哪、是什么类别,后续才能做轨迹预测和避障规划。

2.2 两阶段检测:先找区域再分类

两阶段检测的思路是——先找出可能有物体的区域,再对每个区域做分类。代表算法是R-CNN系列:

算法

年份

核心改进

解决了什么痛点

R-CNN

2014

Selective Search生成候选区域 → CNN提取特征 → SVM分类

首次将CNN引入检测,但每张图要跑约2000次CNN前向传播,极慢

Fast R-CNN

2015

在共享特征图上做RoIPooling,端到端训练

特征只算一次,速度快了上百倍

Faster R-CNN

2015

RPN(区域生成网络)替代Selective Search

候选区域也由网络生成,真正端到端

候选区域的生成方式从"外部工具"逐步搬进了"网络内部":
R-CNN 用 Selective Search(一种传统图像处理算法)先生成约 2000 个候选区域,每个区域单独过一次 CNN——算量大得离谱。
Fast R-CNN 把整张图过一次 CNN 得到特征图,然后在特征图上截取候选区域对应的位置(RoIPooling),不用重复计算。
Faster R-CNN 进一步把候选区域生成本身也交给网络——RPN(Region Proposal Network)直接在特征图上预测"哪里可能有物体",连 Selective Search 都不用了。
打个比方:R-CNN 是一个个翻抽屉找东西,Fast R-CNN 是先把所有抽屉拍张照再在照片上找,Faster R-CNN 是训练了一条狗帮你闻出哪个抽屉有东西。

2.3 单阶段检测:一步到位

两阶段虽然精度高,但速度受限。单阶段检测直接在一张特征图上同时预测所有物体的位置和类别,不需要先找候选区域。

算法

年份

核心思路

特点

YOLO

2016

将图片分成 S×S 网格,每个网格直接预测框和类别

速度极快(45 FPS),但小物体检测弱

SSD

2016

多尺度特征图预测,不同层检测不同大小的物体

速度和精度兼顾

RetinaNet

2017

引入 Focal Loss 解决正负样本不均衡

单阶段首次匹配两阶段精度

其中YOLO(You Only Look Once)是单阶段检测的开山之作。它的思路非常直觉:把图片画成网格,每个网格负责预测"我这里有没有物体、是什么、框在哪"。一次前向传播就出所有结果,所以叫"You Only Look Once"。
YOLO 的短板是小物体检测能力弱——因为网格分得不够细时,小物体容易被忽略。后续版本(YOLOv2 到 YOLOv8)通过多尺度预测、Anchor 机制、更优的骨干网络等方式逐步改进。
RetinaNet解决的是单阶段检测器的另一个痛点:正负样本不均衡。一张图里可能有上万个候选位置,但只有几十个真正有物体(正样本),其余全是背景(负样本)。大量简单负样本淹没了真正有用的梯度。Focal Loss的做法是——对已经分得很好的样本降低损失权重,让网络"别在简单样本上浪费时间,把注意力放在难分样本上"。

2.4 Anchor-free:不用预设框

前面提到的方法都依赖Anchor——预设的一组参考框(不同大小、不同长宽比),网络在这些参考框的基础上做微调。但 Anchor 需要人工设计,而且数量多了计算量也大。
Anchor-free 方法直接预测物体的关键点或中心点,不需要预设框:

算法

年份

核心思路

通俗理解

CenterNet

2019

预测物体中心点的热力图 + 尺寸回归

找到物体的"重心",再往外推算大小

FCOS

2019

逐像素预测:这个像素是否在物体内部 + 到框边的距离

每个像素都投一票,投票决定框的边界

FCOS 的思路和分割很像——逐像素做预测,只不过分割输出的是类别,FCOS 输出的是"到物体边界的距离"。这也说明检测和分割在底层逻辑上是相通的。

2.5 三条路线对比

维度

两阶段

单阶段

Anchor-free

精度

高

中(RetinaNet后追平)

中高

速度

慢

快

快

设计复杂度

高

中

低(不用设计Anchor)

代表

Faster R-CNN

YOLO/SSD/RetinaNet

CenterNet/FCOS


三、从2D到3D——自动驾驶的特殊需求

3.1 为什么2D检测不够

上面的算法都在 2D 图像上做检测——输出的是图片上的矩形框。但自动驾驶需要的是3D 空间中的信息:

信息

2D检测能提供

自动驾驶需要

位置

图片上的像素坐标

真实世界坐标(距离自车多少米)

大小

像素宽高

真实尺寸(长×宽×高)

朝向

无

车头朝哪个方向(航向角)

速度

无

多少km/h、往哪开

所以自动驾驶的检测必须从 2D 升级到 3D,输出的是3D 边界框(3D Bounding Box):包含中心坐标、尺寸、朝向角。

3.2 3D检测的三条路线

路线

输入数据

代表方法

特点

基于LiDAR

点云

VoxelNet、PointPillars、CenterPoint

精度高,但依赖激光雷达

基于摄像头

图像

FCOS3D、SMOKE

成本低,但深度估计不准

多模态融合

图像 + 点云

BEVFusion

融合两者优势,当前主流方向

基于 LiDAR 的方法中,PointPillars是一个工程上很成功的方案:把点云按垂直方向压缩成"柱子"(Pillar),再拼成一张伪图像,用成熟的 2D CNN 处理。速度快,部署友好。
CenterPoint把 2D 检测中的 CenterNet 思路搬到了 3D——预测物体在鸟瞰图上的中心点,再回归 3D 尺寸和朝向。
多模态融合方面,BEVFusion把摄像头和 LiDAR 的特征统一到鸟瞰图(BEV)空间做融合,是当前的主流方向。上篇结尾提到的"从 2D 到 3D"趋势,在 3D 检测这里体现得最直接。

四、"还是那个吗"——多目标跟踪

4.1 跟踪要解决什么问题

检测只告诉你"这一帧有什么",但自动驾驶需要知道"这辆车和上一帧的是同一辆吗"。如果前方有一辆白车,第 1 帧检测到了,第 2 帧它移动了一点又检测到了——怎么知道这是同一辆车在移动,而不是两辆不同的车?
这就是多目标跟踪(MOT,Multi-Object Tracking)要解决的问题:在连续视频帧中,为每个物体维持一个持续的标识(ID),形成运动轨迹。

场景

只有检测

检测 + 跟踪

前方车辆变道

每帧重新检测,不知道是同一辆

追踪ID不变,知道是同一辆在变道

行人被遮挡后重现

遮挡时丢失,重现后当新车

可以维持ID(如果算法够好)

预测前车行为

没有时序信息

有历史轨迹才能预测

4.2 主流范式:Tracking-by-Detection

当前主流的 MOT 方案叫Tracking-by-Detection(先检测再跟踪):先用检测器逐帧检测出所有物体,再用跟踪器把相邻帧的检测结果关联起来。
核心问题就一个:当前帧的检测框和历史轨迹怎么匹配?

4.3 SORT:用卡尔曼滤波做跟踪

SORT(Simple Online and Realtime Tracking,2016)是 Tracking-by-Detection 的经典基线,思路非常简洁:

步骤

做什么

通俗理解

1. 预测

用卡尔曼滤波根据历史轨迹预测下一帧位置

导航软件根据你的速度方向预测你5秒后在哪

2. 匹配

用匈牙利算法将预测框和检测框做最优匹配

相亲匹配,目标是总配对代价最小

3. 更新

用匹配到的检测框修正预测

GPS更新后修正你的实际位置

4. 生灭

新检测创建新轨迹,连续多帧没匹配上的轨迹删除

新面孔登记入场,消失太久注销

其中卡尔曼滤波是核心——它假设物体做近似匀速运动,根据历史位置和速度预测下一帧在哪。匈牙利算法解决的是"谁配谁"的分配问题,用 IoU(框的重叠度)作为匹配代价,目标是让总代价最小。
SORT 的优点是极快(跟踪部分 260 FPS),缺点也很明显:只用运动信息,没有外观特征。一旦两辆车交叉走过,或者一辆车被短暂遮挡,卡尔曼滤波的预测就会偏,很容易发生ID Switch(把 A 认成 B)。

4.4 DeepSORT:加入外观特征

DeepSORT(2017)在 SORT 基础上加了一个关键模块——深度外观特征:

维度

SORT

DeepSORT

运动信息

卡尔曼滤波

卡尔曼滤波

外观信息

无

ReID 特征(深度网络提取)

匹配代价

IoU 距离

运动距离 + 外观相似度的加权组合

ID Switch

多(遮挡时容易搞混)

少(即使遮挡也能靠外观认出来)

DeepSORT 为每个检测框提取一个ReID 特征向量(用一个深度网络把物体外观编码成一组数字),匹配时同时考虑"位置预测准不准"和"长得像不像"。这样即使车辆被短暂遮挡后重现,也能靠外观特征重新认出来。

4.5 ByteTrack:不丢弃低分检测

ByteTrack(2022)的洞察非常巧妙——低置信度的检测不一定是噪声,可能是被遮挡的物体。
比如一辆车被前车挡住了一半,检测器的置信度可能从 0.9 掉到 0.4。传统做法直接把低分检测丢掉,这辆车就"消失"了。ByteTrack 的做法:

阶段

做什么

通俗理解

第一轮匹配

高分检测框 vs 所有轨迹

先把确定的配好

第二轮匹配

低分检测框 vs 剩余未匹配轨迹

再用低分检测"捞回"被遮挡的物体

两轮匹配下来,被遮挡的物体不会因为检测分数低就丢失,大幅减少了轨迹断裂。

4.6 联合检测与跟踪

前面讲的都是"先检测再跟踪"——检测和跟踪是分开的两步。JDE(Joint Detection and Embedding,2020)和FairMOT(2021)把这两步合到一个网络里:

方案

检测

ReID特征

特点

传统方案

独立检测器

独立ReID模型

两个网络,慢

JDE

一个网络输出

同一个网络输出

共享特征,快

FairMOT

一个网络输出

同一个网络输出

额外解决检测和ReID的任务冲突

FairMOT 名字里的"Fair"指的是——检测任务和 ReID 任务在一个网络里会互相抢资源,FairMOT 通过设计让两个任务"公平"地共享特征,减少冲突。

4.7 跟踪算法对比

算法

年份

核心创新

速度

ID保持能力

SORT

2016

卡尔曼滤波 + 匈牙利算法

极快

弱(遮挡就丢)

DeepSORT

2017

+ 深度外观特征

快

强

ByteTrack

2022

两轮匹配,不丢低分检测

快

强

FairMOT

2021

联合检测与跟踪

快

强


五、总结

把检测和跟踪的处理目的和对应方案串起来:
和上篇合在一起,感知算法的四大任务就完整了:

任务

上篇/下篇

核心算法

分类

上篇概述

CNN 系列

分割

上篇深入

FCN / U-Net / DeepLab / PSPNet / Mask R-CNN

检测

本篇深入

R-CNN系列 / YOLO / CenterNet / PointPillars

跟踪

本篇深入

SORT / DeepSORT / ByteTrack / FairMOT

一句话总结:检测解决"有什么在哪",跟踪解决"还是那个吗",两个任务串联起来,自动驾驶才能从"看到"动态物体进化到"追踪并预测"它们的运动。

谢谢观看,码字不易。如果觉得文章对您有帮助,感谢您点个在看,转发分享!

最新文章

随机文章