简介:本文系统拆解自动驾驶占据感知网络(OCC)识别动态物体的完整技术链路:自车运动补偿如何统一时空参考系、多帧特征如何对齐与融合、占据流如何以逐体素运动矢量量化运动状态,并进一步梳理工程落地中的关键权衡,帮助读者建立对四维时空感知的体系化认知。
传统三维目标检测路线依赖预先定义的类别集合:网络在图像或点云中寻找车辆、行人、骑行者等已知类别,并用立方体框将其框定。这条路线在规则物体上表现良好,但真实道路环境远比标准数据集复杂,侧翻的货车、散落的石块、施工临时摆放的围挡、倾倒的树木,既没有规整的几何外形,也难以归入预设类别。检测框范式面对这类“长尾障碍物”往往力不从心,而这恰恰是安全攸关的场景。
占据感知网络(Occupancy Network,OCC)提供了另一种思路:它不再回答“这里是什么物体”,而是回答“这个空间位置是否被占据”。系统将自车周围的三维空间切分为海量微小体素(可理解为三维像素),网络对每个体素输出被占据的概率,部分方案还会附加语义类别。这种表征不依赖类别假设,任何形状不规则、类别未知的障碍物,只要在物理上占据空间,就会被如实刻画出来,从而显著提升对通用障碍物的感知能力。
需要强调的是,自动驾驶场景下的感知对象绝大多数是动态的:车辆在移动、行人在穿行、骑行者在变向。因此对占据网络的讨论必须建立在动态物体感知的前提之上。动态物体的难点在于,其空间位置随时间持续变化,且形状、速度各不相同。OCC并不是通过简单的逐帧对比来应对这些变化,而是构建了“自车运动补偿—时序特征融合—运动矢量预测”的完整机制,将感知从三维空间扩展到四维时空(三维空间+时间)。下面逐一拆解这条技术链路。
自动驾驶车辆在行驶过程中,自身坐标系持续变动:本帧观测到的某个体素位置,与几百毫秒前观测到的“同一物理位置”,在传感器坐标系或特征空间中并不重合。若直接将多帧特征叠加融合,静止的地面与建筑也会被“抹花”,物体真实运动与自车运动相互混叠,网络无从分辨。因此第一步是建立统一的时间参考系,以当前帧的自车坐标系为锚点,把历史帧特征“搬运”到当前坐标系下。
实现上,系统利用惯性测量单元的角速度与加速度、轮式里程计,必要时辅以卫星定位或建图模块输出的位姿,估计相邻帧之间自车的相对位姿变化。该变化可表示为一个刚体变换,由旋转矩阵与平移向量构成。将历史帧特征按这一变换进行投影,即所谓特征对齐:由于变换后的采样点通常不落在规则网格上,需要通过插值获得对齐后的特征值。
对齐带来的直接收益是“变化浮现”:静止背景在时间轴上完全重叠,叠加后表现为稳定的强响应;而真实运动的物体在历史帧与当前帧之间产生位移,其特征残差显著凸显,网络由此获得了区分“动”与“不动”的基础。这一步对精度要求极高:以高速行驶为例,位姿估计若存在厘米级误差,映射到几十米外的远距离格点上会被放大为明显错位,使对齐后的特征出现拖影。因此工程上还需解决多传感器时间戳同步、位姿平滑等问题,否则后续融合环节会在“脏”的对齐结果上放大误差。
完成对齐后,网络进入时序特征融合阶段,常见方式有三类:
无论采用哪种方式,融合的本质都是使网络突破单帧观测的固有局限,把物体运动在时间维度上串联为连续线索。其收益体现在三个层面:
当然,时序融合并非“越长越好”。回看窗口越长,内存占用与时延越高,且过旧的信息可能因场景剧变而失效。实践中通常采用固定长度的特征队列,将回看时长控制在几百毫秒到一秒量级,配合队列管理机制在精度与实时性之间取得平衡。
仅仅知道某个格点正在移动并不够,预测与规划模块需要明确其运动的方向和快慢。为此,OCC在输出占据概率之外,还会为每个被判定为占据的体素附加一个三维运动矢量,即占据流。
运动矢量由专门的预测分支生成:在网络后端,算法计算当前体素特征与对齐后历史体素特征之间的关联性,直觉上,若能在历史帧中找到与当前体素高度相似的对应体素,两者在变换后坐标系中的位置差即该体素的瞬时位移。对全部占据体素执行这一关联推理,便得到稠密的逐体素速度场。
逐体素输出运动的价值在于“细粒度”。传统做法通常在检测框级别给出一个整体速度,但真实物体并非刚体:行人的躯干与四肢运动状态不同,转弯车辆的头部与尾部速度矢量并不一致,拖挂车甚至存在显著的相对运动。逐体素运动矢量能够刻画这些内部差异;即便物体被部分遮挡,未被遮挡部分的体素仍可独立提供可靠的运动信息,无需依赖对物体整体边界的完整还原。
对下游而言,占据流是衔接感知与预测的关键接口:预测模块可基于稠密速度场外推各区域/物体的未来状态,规划模块据此评估可行域的演化趋势,实现“感知—预测—规划”之间更顺畅的信息传递。
上述链路可用示意性伪代码概括:
# OCC 时序建模流程(示意性伪代码)memory = deque(maxlen=N) # 历史特征与位姿队列for t in range(T):feat = image_encoder(images[t]) # 提取当前帧特征warped = []for f_hist, pose_hist in memory:delta = relative_pose(pose_hist, ego_pose[t]) # 帧间相对位姿warped.append(warp(f_hist, delta)) # 平移+旋转对齐fused = temporal_fusion(feat, warped) # 三维卷积 / 时序注意力occ = occupancy_head(fused) # 每个体素的占据概率flow = flow_head(fused, warped) # 每个体素的三维运动矢量memory.append((feat, ego_pose[t]))
从自车运动补偿到时序特征融合,再到逐体素运动矢量,占据网络用一套严密的机制把“动态”这一感知难题转化为可计算的问题:先统一参考系让变化可辨,再融合时序让线索充分,最后量化运动让下游可用。随着端到端架构的发展,时序建模与运动预测将进一步前移并深度融合,占据流所承载的稠密运动信息,会在感知与决策之间扮演愈发重要的角色。对于从事自动驾驶研发的工程师而言,理解这条技术链路,是评估与构建动态感知能力的必要基础。