ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

自动驾驶感知进阶:从目标检测到场景理解的关键技术与实践

自动驾驶感知进阶:从目标检测到场景理解的关键技术与实践

前几年我在某智能驾驶团队做感知,一开始大家都觉得,把2D目标检测做到极致,mAP刷得够高,车就能开得稳。后来发现完全不是这么回事。模型指标很好看的那个版本,实际路测时频繁被接管,尤其到了城区路口,车就像个刚拿驾照的新手,看见所有东西都紧张,但完全判断不出哪些才真正需要优先应对。那时候我慢慢意识到一个道理:自动驾驶感知的瓶颈,早就不是“识别物体”这个层面,而是“理解场景”。一辆车需要的不是“这里有一位行人”这个标签,而是“这位行人在路边停了3秒,身体朝马路倾斜,正在看对面公交站,接下来5秒内有70%概率会横穿”——这中间的差距,就是识别物体和场景理解之间的鸿沟。

这篇内容就想把这个问题掰开讲清楚:为什么单靠物体识别撑不起自动驾驶,场景理解到底在理解什么,从模型到工程落地要做哪些事,以及我自己踩坑之后的排错经验。

1. 从“看见”到“看懂”:为什么感知要换思路

1.1 物体识别的天花板:只知道“是什么”,不知道“在干什么”

物体识别,也就是业界常说的目标检测,核心任务是输出三个东西:类别(人、车、自行车)、检测框(目标落在图像哪个位置)、置信度(模型有多大把握)。这套技术在高速领航场景里已经够用,因为高速公路结构封闭、目标类型相对固定、行驶规则简单,一个框加一个类别就能支撑自适应巡航和车道保持。

但到了城市公开道路,这套范式开始露怯。我见过太多这种case:一个倒地的骑行者,检测模型一会儿报“人”,一会儿报“自行车”,框的大小和位置来回跳,下游规划器根本不知道该按什么来处理。还有一个更典型的,高速路上掉下一个大纸箱,目标检测把它归为“未知物体”,这等于没检测。车看到的是“有个东西”,但没法回答“它会不会动”“我该压过去还是绕过去”“它占了我多少行驶空间”。这几个问题里,任何一个对控制都至关重要,检测框却一个都答不上来。

物体识别的问题本质,是把连续、充满上下文的世界,强行离散成独立的标签。这个思路在学术benchmark上够用,因为标注数据本来就是一个框一个类别,但在真实驾驶里,安全决策需要的是目标之间的关系、目标的运动趋势、目标占用的空间。标签化感知丢掉的,恰恰是这些高价值信息。

1.2 场景理解的五个层次

业内聊场景理解,其实没有一个统一标准定义,按我现在实践的经验,可以拆成五个层次,一层比一层更接近“驾驭一个动态物理世界”的需求:

第一层是几何结构。道路边界在哪、车道线是怎么走向的、路沿有多高、前方空间是否被占用。这层回答“车能往哪走”。

第二层是语义要素。不止是人、车这些目标,还包括红绿灯、标志牌、斑马线、施工区域等交通要素,以及它们的属性(红绿灯当前什么颜色、施工区域是否搭了围挡)。这层回答“道路规则允许我怎么走”。

第三层是拓扑关系。车与车之间是否构成碰撞风险、这个行人在不在我即将驶过的路径上、这条车道是不是被前车挡死了。关系比独立的对象更重要。

第四层是时序趋势。目标从哪里来、往哪里去、速度怎么变化、有没有急加速或频繁变道。这层回答“接下来可能发生什么”。

第五层是交互意图。对方知不知道我在场、他会不会让我、我如果减速了他会怎么应对。这层已经涉及博弈,是场景理解的天花板。

用语言做类比:物体识别等于认出一个一个单词,场景理解等于读懂一句话,甚至读懂了说话人的语气和潜台词。单词记再多,不理解语法和上下文,也无法对话。自动驾驶想在现实世界里游刃有余,就必须做语义和语用的理解。

1.3 安全兜底靠的是“模型的世界”,不是“模型的词汇表”

还有一个很容易被忽视的点:检测模型通常只能认出训练数据里见过的类别,但道路上的意外是没有穷尽的——掉落的轮胎、飞来的塑料袋、被风吹倒的施工牌、翻在路中间的电动车。这些都没有固定形状,也没有合适的标签,但自动驾驶必须对它们做出合理的反应。场景理解的核心优势在这里体现得很直接:它不依赖“这个东西叫什么名字”,而是依赖“这个空间区域能不能通过、是不是被占用了”。把感知从“分类任务”变成“空间占用+语义推断任务”,才是覆盖长尾场景的正确门路。

2. 三维空间感知:从检测框到占用网格和BEV

2.1 为什么自动驾驶必须从2D走向3D

2D检测框是图像坐标系里的矩形,它本身不携带物理尺寸和真实位置信息。规划控制模块要的是“目标在地球坐标系下的坐标、朝向、速度和尺寸”,而不是“图像第300到500列有一个行人”。所以感知系统必须把信息投影到三维世界。这件事过去多靠激光雷达点云,雷达测距准、受光照影响小,但雷达也有明显短板:分辨率低,无法识别颜色、文字、灯光,远处的行人点云极其稀疏,成本也高。纯视觉方案想做3D,就得解决从二维像素恢复到三维几何这个本质上的病态问题——一个像素可能对应近处小物体,也可能对应远处大物体,尺度是不确定的。

解决这个问题,行业里经历了几个阶段:早期是单目3D检测,靠几何先验和网络直接回归目标的中心点和尺寸,精度勉强可用但鲁棒性差。后来出现伪激光雷达,也就是先用深度估计网络生成密集深度图,再转成伪点云做3D检测,虽然比直接回归准一些,但深度估计本身的误差会同时被放大。到现在主流的做法,是直接在鸟瞰视角(BEV)下统一建模。

2.2 占用网络:把空间切成豆腐块

我对占用网络的理解,简单说就是:把车辆周围的3D空间划分成一个个小体素(voxel),然后把感知问题变成“每个体素是否被占用、如果占用属于什么类别”的逐点预测。这个思路相比物体检测有本质优势:它不产生“目标框”,而是产生一张“空间占用地图”。路边停着的三轮车、草丛里的水泥墩、伸到路面上的树枝、半挂在空中的电缆,都能被表达为“某些体素被占了”,而且是几何级精确的表达。

具体参数上,常见的做法是把车辆前方和四周60到100米范围内的空间,按0.3到0.5米的体素分辨率切分。以0.4米分辨率、感知范围60米×60米×6米为例,就是150×150×15个体素,大约33万个位置需要预测。工程上不会对每个体素独立做分类,而是在BEV特征图上用卷积或Transformer解码器,一次性输出所有体素的占用概率和语义概率。增益很明显:检测框能做到的事情它都能做到,检测框做不到的(把挂车、货物、非结构化障碍物准确围住)它也能做到。

2.3 BEV视角:为什么世界要摊平了看

BEV全称Bird‘s Eye View,鸟瞰视角,相当于把摄像头拍到的画面投射成一张“从天上往下看的俯视图”。选择BEV而不是直接在透视图像上做感知,最核心的原因是空间关系一致。透视图像近大远小,同一个物体离车1米和10米占的像素尺寸完全不同,网络很难学透这种尺度变化。而在BEV特征图里,1米就是1米,车道偏移、相对距离、目标尺寸全部是等比例的,下游规划控制可以直接拿这个特征做决策。

多路摄像头融合进BEV,主流方案是Transformer的交叉注意力机制:每路环视相机的图像特征,根据其内外参被映射到一个统一的BEV网格上,查询BEV中某个位置需要什么特征,就去对应的图像位置“取”信息。这里有两个细节决定了效果上限:一是相机的内外参标定必须精确,外参偏差哪怕0.1度,到了60米外就是十几厘米的位置漂移;二是多相机时间戳要对齐,否则车辆转弯时同一目标在相邻相机里的位置会撕裂。

我实际踩过的坑是,外参标定板做得不严谨,导致BEV里车道线在相机拼接区域出现重影。后来排查发现,是后视相机在长时间运行后支架轻微移位造成的。所以做BEV的第一课不是网络结构,而是标定和机械结构可靠性。这一点很多论文不会告诉你,但在车上是真实发生的事。

3. 时序与交互:场景理解的决定性一半

3.1 单帧感知的致命短板

只看一帧画面,感知系统永远处于“盲人摸象”状态。一个站在路边的行人,单帧图像里就是“静止行人”,但如果你看他连续几帧的运动:他的头先转向马路,然后身体重心前移,右脚已经迈到路沿边上——这些信息在单帧里也都有,但没有时间维度比较,网络无法建立“他开始行动了”的认知。真正危险的情况往往就是这一秒到两秒的时间窗口,等检测框出现明显位移再报警,就已经晚了。

还有一个工程上的实际问题:从传感器曝光、模型推理、目标跟踪到传给规划器,整个链路有一两百毫秒的延迟,车在高速行驶时这100毫秒已经开出去好几米。如果模型只有当前帧目标信息,规划器拿到的位置其实是“过去的位置”,必须用预测的结果做补偿。

3.2 轨迹预测不是锦上添花,是刚需

轨迹预测要解决的就是“目标接下来几秒钟会去哪里”。主流做法是给每个目标输出多条概率轨迹,比如top5,每条轨迹附带一个概率和协方差。协方差这词听起来唬人,你可以理解成“我这个预测有多确定”:高速直线开前车,预测很集中,协方差小;一个在路口犹豫要拐不拐的行人,预测分布发散,协方差大。规划器拿到的不该是孤零零的一条轨迹,而是一团“概率云”,这样决策才有依据。

场景理解在这里发挥关键作用。感知系统不是把每个目标单独拎出来预测,而是把车道拓扑、路权关系、红绿灯相位、目标之间的相对位置编码进一个场景向量,让模型学“在这个场景下,目标大概会怎么走”。比如右转车辆碰到直行自行车,模型要学的是直行车大概率不让行,右转车只能等;而左转车碰到对向直行车,同样需要交互判断。这些不能靠规则枚举,规则遇到真实长尾时根本写不完,必须让模型从数据里学到场景级别的交互模式。

3.3 交互博弈:预测别人,也预测别人怎么看我

更高阶的预测涉及博弈:自车的意图本身会影响对方的决策。举个环岛例子:自车在入口准备汇入,主路上有一辆车正开过来。如果自车还是一辆接一辆地等,对方司机会觉得“这个车没有汇入意图”,于是继续加速通过;如果自车开始缓慢向前试探,对方反而会减速让行。这个“试探—反馈—再决定”的过程,本质是连续的交互博弈。

工程实现上,第一步是建立多智能体联合预测,也就是把所有目标的预测放在同一个空间里做联合推理,避免各自独立预测导致轨迹重叠打架。第二步是让自车的候选轨迹参与目标预测,通过跨注意力模块把自车规划路径“告诉”预测模型,模型输出“如果你这样走,他可能会那样反应”。第三步是跟规划器配合做闭环验证,选择一条“即使对方误判也不会撞”的安全轨迹。目前这一步很多团队还在探索,但方向已经非常明确:高级别自动驾驶的场景理解,必须从“单向预测”升级到“双向交互推理”。

4. 从模型到系统:端到端、数据闭环与工程落地

4.1 模块化架构的演进与信息损失问题

传统自动驾驶的感知、预测、规划是独立的模块,每个模块各自训练、各自优化。好处是便于调试和分工,坏处是模块之间的通信接口会损失信息。感知模块最后输出的通常是一堆检测框和轨迹概率,但规划器真正需要的很多信息——比如目标检测置信度随时间的变化、目标外观特征、感知模型底层特征——在接口处就丢了。

所以行业里出现了“模块接口重新设计”的探索方向:不再用检测框作为感知和规划之间的唯一语言,而是用所谓向量化场景表示(vectorized scene representation)。简单说,就是把车道线、路沿、目标、红绿灯、路权关系组织成统一的场景图/场景结构,让下游直接看到“这个场景里发生了什么”,而不是一串孤立的目标列表。这本质上就是把场景理解内嵌到感知的最终输出格式里。

4.2 端到端方案的取舍:完全融合但不一定激进

端到端方案更进一步:把摄像头输入直接映射到驾驶决策,中间不再人为划分感知、预测、规划。最大优点是信息无损——模型自己决定用哪种特征、如何权衡目标,而且一旦训练出来,推理效率非常高,没有模块间延迟。缺点同样明显:没有模块边界,出现bad case时很难定位责任;数据需求量大到普通团队无法承受;安全问题难解释,监管和保险层面都很难接受。

我个人更认可的是折中路线:感知和预测做深度联合建模,场景理解一步到位,但规划层面保留规则兜底和可解释的安全检查。这个架构既享受了端到端感知的信息无损优势,又保留了模块化的可控性。实际体验下来,模型的可调试性比纯端到端好很多,出问题时可以快速判断是感知场景理解错了,还是预测交互没学对,还是规控逻辑太保守。

4.3 数据闭环:场景理解的真正壁垒

模型结构大家都发论文,差距主要在数据。公开数据集里的场景,不管多丰富,都只是道路真实分布的极小样本。实际驾驶中,绝大多数时间都是通畅道路、跟车、标准红绿灯路口,真正稀奇古怪的corner case占比可能不到1%。这1%才是决定一个自动驾驶系统安全上限的关键。

数据闭环的标准流程,我梳理下来是四步:第一,路采车采集原始数据,设置触发条件自动截取片段,比如急刹、驾驶员接管、近距离冲突、预测置信度骤降,这些片段往往是最有价值的。第二,自动化标注,用离线的大模型、激光雷达点云、高精地图和后续帧信息,给这些片段生成多帧一致性的场景真值——包括目标的3D轨迹、占用网格、车道拓扑。第三,回放和变异,在仿真环境里重放真实片段,甚至把天气、光照、交通流做变化,制造出更多变体场景。第四,重训练和评估,把新挖出的难例加入训练数据集,重新迭代模型,再用一个包含大量corner case的评测集做回归,防止模型学了新场景就忘了老场景。

这里有个容易被忽视的细节:场景理解的训练数据和2D检测非常不同,它需要的是“连续帧完整的鸟瞰视角真值”,而不是一帧帧独立框。标注一个连续轨迹真值比标一帧检测框贵得多,所以自动化标注在数据闭环里的价值特别大。我见过有团队在数据闭环上投入精力不足,最后模型在公开测试集上表现很好,一到自家路测就被各种小概率场景打穿,就是这个环节没做好。

5. 典型失效案例与排错经验

5.1 三个亲历的翻车场景

第一个是半挂车拼接问题。目标检测框在卡车转弯时,经常只框住车头,后面的挂车区域被当成可行驶空间,导致自车在近距离并行时产生“明明离挂车很近却感知不到”的危险。换上占用网络之后,挂车也作为一个整体被体素占用覆盖,这个问题才算彻底解决。

第二个是夜间逆光。摄像头在逆光、眩光条件下,目标检测召回率会明显下降,因为图像对比度太低。但场景理解中的语义分割和占用估计却没有完全失效,原因是它们利用的是更大的空间纹理上下文,而不是某一小块的局部外观。这个案例让我明白,多类感知任务互为冗余,是提高系统鲁棒性的重要设计。

第三个是时间戳不同步。多路摄像头和雷达各自有自己的时钟,如果不同步,车辆在颠簸或急转弯时,同一个目标在不同传感器里的位置看起来差了一截,融合后轨迹会跳变。排查过程一度很痛苦,最后发现是采集端的PTP时间同步配置有误,导致激光雷达和相机的时间偏差在30毫秒以上,车辆高速运动时空间误差被放大。

5.2 排错速查表

我自己整理了下面这个表格,每次感知系统出现诡异表现时都先查这几项,省了很多时间:

现象可能原因排查建议
BEV车道线重影相机外参漂移检查机械固定件、重新跑标定
目标轨迹跳变传感器时间戳不同步检查PTP配置、各传感器时间偏差
预测轨迹突然大转向类别切换(自行车→摩托)或跟踪ID丢失检查目标跟踪一致性、类别平滑策略
夜间目标漏检图像过曝/欠曝尝试HDR策略、利用占用网络兜底
静止目标被滤掉速度估计错误检查是否将静态目标聚类过滤逻辑过强
环岛匯入频繁急刹模型没学到交互博弈补充环岛场景数据、训练联合预测
雨天后感知变差相机污损/雨滴遮挡检查清洁喷嘴、雨滴检测模型、图像增强

5.3 入门实践建议

如果你想自己动手接触场景理解,我建议的路线是:先找一个公开自动驾驶数据集(比如nuScenes这种带多相机和雷达数据的),在仿真工具或自己搭的推理框架上跑一版BEV感知基线,理解多相机融合是怎么把透视图像转到俯视图的。然后试着加上时序模块,把连续几帧的BEV特征做对齐和融合,看看对静态目标的稳定性提升有多大。最后再加一个简单的目标轨迹预测模块,按概率输出几条轨迹,把评估焦点从“检测准不准”转向“预测对下游决策有没有帮助”。

评估指标方面,别只盯着检测的mAP。对一个自动驾驶系统来说,更有意义的指标包括:每千公里接管次数、规划碰撞率、预测轨迹误差对最终制动的超前性、以及感知结果的平滑性。平滑性这个东西特别重要,模型即使偶尔错一次,只要错得不剧烈,规划器还能靠保守策略兜住;最怕的是同一目标这一帧在左下一帧在右,规划器会直接傻掉。

最后再分享一个小经验:新手做场景理解,别一上来就整那种超大参数的端到端模型。我见过太多次,模型在训练集上完美拟合,上了车才发现对场景关系一无所知。先把几何、语义、时序三层基础打扎实,比模型花哨重要得多。自动驾驶的安全性从来不靠某一个点状突破,而是靠整套系统对场景的持续、一致、可预判的理解。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进