3、时序融合基础:时序信息的重要性、多帧融合策略、滑动窗口机制、时序对齐方法

各位同学,咱们今天聊聊时序融合。说实话,这个知识点在Occupancy网络里,属于那种「看着不起眼,但少了它寸步难行」的东西。

我刚开始做Occupancy感知那会儿,也犯过傻——单帧预测做得挺漂亮,一上实车就露馅。为什么?因为单帧信息太有限了。你想想看,一个物体被遮挡了,单帧里它就是凭空消失,但时序信息能告诉你「它刚才还在那儿,现在大概率还在」。这就是时序融合的价值所在。

3.1 时序信息的重要性

时序信息到底重要在哪?我总结了三层:

  • 补全遮挡:动态物体被短暂遮挡时,时序信息能维持它的存在。我在项目中遇到过,一辆公交车从侧面驶过,单帧里行人被完全挡住,但时序融合后,行人的Occupancy依然被保留。
  • 消除歧义:单帧里,一个模糊的轮廓可能是车,也可能是广告牌。但多帧一看,它在移动,那肯定是车。说白了,运动信息是消除语义歧义的利器。
  • 提升稳定性:单帧预测容易抖动,尤其是远距离区域。时序融合相当于做了个「时间上的平滑滤波」,让输出更稳。

核心观点:时序信息不是锦上添花,而是雪中送炭。没有时序融合的Occupancy网络,在动态场景下基本不可用。

3.2 多帧融合策略

多帧融合,说白了就是怎么把过去几帧的信息「揉」到当前帧里。我见过的主流做法有三种:

策略 原理 优缺点
特征级融合 将多帧特征图对齐后拼接或加权 精度高,但计算量大
结果级融合 分别预测每帧的Occupancy,再投票或平均 实现简单,但信息利用率低
隐式融合 用RNN/Transformer等时序模型隐式建模 端到端,但可解释性差

我个人习惯用特征级融合。为什么?因为它在精度和灵活性之间取得了最好的平衡。举个例子,我在BEVFormer的时序版本里,就是把前几帧的BEV特征通过可变形注意力对齐到当前帧,效果比结果级融合好一大截。

小技巧:特征级融合时,别忘了给不同帧加权重。我一般给当前帧权重0.6,前一帧0.3,再前一帧0.1。这个比例不是固定的,得根据场景调。

3.3 滑动窗口机制

滑动窗口,嗯,这个名字很形象。就是一个固定大小的窗口,随着时间不断向前滑动,窗口里始终装着最近的N帧数据。

为什么要用滑动窗口?两个原因:

  • 控制计算量:如果所有历史帧都参与融合,计算量会随时间无限增长。滑动窗口把历史帧数固定住,计算量就可控了。
  • 聚焦近期信息:太老的帧对当前预测帮助不大,甚至可能引入噪声。滑动窗口天然地「遗忘」了过时信息。

窗口大小怎么选?我踩过坑。一开始我设了10帧,结果计算量爆炸,而且老帧里的物体早就跑远了,融合进来反而造成拖影。后来我改成3帧,效果反而更好。

避坑指南:窗口大小不是越大越好。我曾经在高速场景试过5帧窗口,结果因为车辆运动太快,前后帧对齐误差太大,Occupancy预测反而变差了。建议根据场景动态调整——低速场景用大窗口,高速场景用小窗口。

3.4 时序对齐方法

时序对齐,说白了就是把不同时刻的观测「挪」到同一个坐标系下。这一步做不好,后面的融合全是白搭。

对齐的核心是运动补偿。我常用的方法有两种:

  1. 基于里程计的对齐:利用IMU+轮速计或激光雷达里程计,估计出自车运动,然后把历史帧的Occupancy变换到当前帧坐标系下。
  2. 基于光流/场景流的对齐:直接估计场景中每个点的运动,然后逐点对齐。这种方法更精细,但计算量也更大。

我在实际项目中,通常两种方法结合用。里程计提供粗对齐,场景流做细调。你想想看,如果只靠里程计,动态物体的运动是估计不出来的——比如对面来车,里程计只知道自车在动,不知道对面车也在动。这时候场景流就派上用场了。

# 伪代码:时序对齐流程
def temporal_alignment(feature_t, feature_t_1, ego_motion, scene_flow):
    # 1. 基于里程计做全局对齐
    feature_t_1_warped = warp_by_ego_motion(feature_t_1, ego_motion)
    
    # 2. 基于场景流做局部对齐
    feature_t_1_aligned = warp_by_scene_flow(feature_t_1_warped, scene_flow)
    
    # 3. 融合对齐后的特征
    feature_fused = fuse(feature_t, feature_t_1_aligned)
    
    return feature_fused

关键点:对齐的精度直接决定了融合效果。我见过一个项目,时序融合效果差,查了半天发现是里程计标定出了问题,导致对齐误差达到了半米。所以,做时序融合之前,先确保你的对齐模块是靠谱的。

好了,时序融合的基础就聊到这儿。下一节咱们会深入讲具体的网络结构设计,到时候我会拿BEVFormer和OccNet的时序版本做对比分析。有什么问题,咱们课后交流。