十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sparse4D多模态融合:用稀疏查询替代BEV的3D目标检测工程实践

Sparse4D多模态融合:用稀疏查询替代BEV的3D目标检测工程实践 Sparse4D 多模态融合这个概念最近在 3D 目标检测圈子里讨论度很高。我们团队去年做新一代感知方案选型时把这条基于稀疏查询的路线和基于稠密 BEV 的融合路线放在同一份训练数据上对比结果差异非常明显稠密方案在近距离小目标上确实稳但推理显存吃紧、远程目标漏检压不下去Sparse4D 这边资源占用低一个量级远程小目标的召回率反而更好。也就是从那次评测开始我把 Sparse4D 多模态融合从论文到工程完整过了一遍。这篇文章不打算复述公式而是想按我实际理解这条技术路线的顺序聊聊它为什么用稀疏查询替代 BEV、多模态融合为什么应该放在查询层级做、前向过程的机制细节以及工程落地时那些论文里不会写的坑。适合正在做感知选型、想把相机和 LiDAR 融合接进现有检测框架、或者刚接触稀疏检测方案的同学参考。1. 稀疏查询为什么在工程上更香稠密 BEV 表示的三笔隐形账单1.1 第一笔账单显存和算力直接跟分辨率绑定先说一个论文里感受不到、一到部署就头疼的问题。稠密 BEV 方案不管走 LSS 还是 BEVFormer 那套都得先把多视角图像特征体素化到一个规则的 BEV 栅格上。典型配置下 BEV 特征图是 200×200 起步拉到 300×300 也很常见这个尺寸再乘上通道数和 batch一张 BEV 特征图就是几百 MB 的显存开销。这还只是一帧。Sparse4D 的核心思路是绕开先建图、再检测这个中间步骤——不显式构造稠密 BEV而是让每个查询自己去图像特征和点云特征上做按需采样。特征不需要完整铺满整个空间哪里需要算哪里计算量和分辨率解耦。这一点在多模态融合场景里体会更深。加了一路 LiDAR 体素特征之后稠密方案相当于在 BEV 上叠了两层大尺寸特征图融合层还要再起一层卷积把两者对齐显存账单直接翻倍。而查询级方案里LiDAR 特征只需要在查询锚点附近的小邻域里采样整个训练流程的显存峰值要平滑很多。1.2 第二笔账单跨模态对齐被栅格化误差绑架稠密方案做多模态融合最常见的方式是把图像特征和 LiDAR 特征在 BEV 空间里做 concat。这个做法听起来直接实际很尴尬图像特征投影到 BEV 时深度估计误差会在长距离上被放大LiDAR 特征虽然位置准但点云本身的稀疏性导致 BEV 栅格里大量格子是空的需要额外填充或者靠卷积去补。两个模态在栅格上对不齐后面的融合网络要花很大容量去学一个修正映射而这个修正映射换个场景、换个传感器布局往往就不 work 了。反观稀疏查询每个查询在 3D 空间里定义了一个明确的位置图像侧和点云侧都是围绕这个精确位置做采样几何对齐的负担从整个网格变成了单个点。如果某个位置点云恰好没覆盖到那就只采图像特征如果图像投影点超出相机视野那就只用 LiDAR 特征。这种按需组合的灵活性是稠密网格结构给不了的。1.3 第三笔账单传感器失效时稠密特征图容易直接塌方实际路测里相机和 LiDAR 都有掉线或者出问题的时刻。稠密融合方案里如果某个相机掉线对应视角的图像特征缺失BEV 特征图的对应区域就出现一个空洞下游检测头只能对一片未知区域做猜测预测结果往往不可信。而查询级方案里传感器缺失只需要在采样阶段做 mask能采的视角正常采采不到的视角跳过查询照样可以从其他视角和其他模态拿到足够信息。这个属性对工程落地来说价值极高我们后面专门针对它做了训练策略上的设计第四节会细说。2. 多模态融合选在哪一层做我做过一次系统的路线对比2.1 输入级、特征级、查询级三条路线的本质区别多模态融合也就是相机和 LiDAR 两种传感器信息的组合方式按融合发生的位置可以分为三条路线。我把它们的特性整理成了下面这个表融合层级典型做法优点难点输入级点云投影到图像生成深度通道输入图像骨干改动小、实现快两种传感器噪声在底层纠缠骨干网络难以解耦特征级各模态提取特征后在 BEV 空间投影对齐并拼接模块化强、骨干可单独预训练跨模态对齐误差难处理栅格化代价高查询级稀疏查询同时在多模态特征上采样特征在查询层汇合对齐精准、容错强、显存友好实现复杂度高需要以检测器为核心整体设计输入级融合是最偷懒的做法条件允许的情况下改动量最小但问题也最明显深度估计误差、点云遮挡造成的空洞都会直接污染图像特征提取过程两个传感器的噪声从一开始就被纠缠在一起后面很难再分开。特征级融合是目前工业界用得最多的好处是模块化程度高视觉和 LiDAR 骨干可以单独预训练和替换坏处就是前面说的对齐问题。查询级融合则是完全顺着稀疏检测器的思路走我们把三组方案在同样配置下做完对比之后基本可以确认查询级融合的精度上限最高而且和 Sparse4D 的结构最匹配。2.2 查询级融合为什么和 Sparse4D 天然契合这个契合本质上是坐标系的契合。Sparse4D 的查询本质上是一组带几何属性的 3D 空间假设包含目标的位置、尺寸、朝向、速度等属性它自带一个统一的 3D 坐标系。做多模态融合的时候不管图像特征还是点云特征都需要一个访问坐标而查询恰好就是这个坐标——它可以直接投影到图像平面去采样像素特征也可以映射到体素空间去采样点云特征不需要任何额外的对齐模块。我实际改造框架的时候融合路径加得很顺解码器的每一层查询先把自己锚点的 3D 坐标分别投影到所有相机视图和 LiDAR 体素空间分别采样得到图像特征和点云特征然后 concat 起来过一个线性层再和查询自身特征做融合。整个改动只是在原有单模态采样之后加了一个分支解码器结构和损失函数都不用动。代码改造大概两周就完成了大部分时间反而花在调试 LiDAR 采样坐标变换的细节上。2.3 融合前的硬前提外参标定和时间同步决定了效果上限融合的效果上限在数据采集那一刻就基本定死了。相机和 LiDAR 的外参标定如果存在偏差图像采样点和点云采样点的位置就会对不齐后面网络能力再强也补不回来。时间同步同样关键LiDAR 有旋转扫描周期相机有曝光延迟两个传感器的时间戳如果没有校准高速场景下目标已经移动了一个身位融合出来的特征自然对不上。我们在这上面实实在在吃过亏。有一批训练数据换过标定文件版本但没同步更新到训练代码里导致融合模型在特定路段上的 mAP 掉了 4 个点。排查了整整一周最后发现是标定文件加载路径写错了加载的是旧版本。这种问题论文里永远不会写但工程里非常常见。所以我的建议是在融合框架里固化一套标定文件的格式和加载逻辑验收数据时专门写一个脚本做跨模态投影可视化图像上的车道线和点云的地面点必须能在同一张图里对得上再开始训练。3. Sparse4D 多模态融合完整链路拆解从锚点初始化到跨模态时序解码3.1 锚点怎么定义一个查询到底在描述什么一个查询对应的锚点通常包含位置 (x, y, z)、尺寸 (w, l, h)、朝向角 yaw、速度 (vx, vy)一共 9 个自由度。这些属性一方面被编码成查询的初始特征向量另一方面承担了跨模态采样的索引功能图像路径靠它做相机投影点云路径靠它定位体素坐标。锚点的初始化方式对收敛速度影响很大。纯随机初始化会让训练初期大量查询指向无意义区域浪费解码层数。更常用的做法是统计训练集里 GT 框的分布用 k-means 聚类生成一组锚点先验保证初始状态下大部分查询都落在物体可能出现的空间区域。这个细节在小目标场景下尤其重要因为远处目标在图像上可能只有十几个像素如果锚点先验分布离目标太远采样到的特征就基本是背景。3.2 图像特征采样路径从 3D 点到像素的可变形注意力图像侧的采样流程可以拆成两步。第一步是把锚点中心坐标通过相机内外参投影到第 i 个相机的像素坐标系得到投影点。第二步是关键围绕投影点做可变形注意力采样也就是让网络先预测一组二维偏移量通常是 3×3 或者 4×4 的网格然后用偏移量修正投影点的位置再去图像特征图上做双线性插值采样。为什么不用简单的双线性采样而要学偏移量因为相机投影存在标定误差、目标存在遮挡特征最丰富的位置不一定正好在投影点上。可变形注意力给了网络一个自由度让它自己决定该往哪里看这也是 Sparse4D 系列能保持较高精度的原因之一。这里有一个每个查询都要处理的细节锚点不一定在所有相机视野内。所以采样前必须先做可见性判断对每个相机生成一个 mask投影点超出图像边界就跳过该相机的采样。这个 mask 在推理时直接由投影点位置决定在训练时也可以用 GT 框的位置做辅助监督。3.3 点云特征采样路径体素化特征如何被查询复用LiDAR 侧的采样路径我试过两种。第一种是走点云体素化用类似 VoxelNet 或 SECOND 的体素编码器把点云编码成 3D 体素特征然后把锚点坐标映射到体素坐标系在锚点周围取 3×3×3 的体素特征做采样。这种方式的特征表达能力强能保留高度方向的信息对卡车、客车这类高大型目标的检测更友好代价是多一层体素化网络的计算量。第二种是简化路径直接把点云投影成 BEV 特征把锚点的 (x, y) 映射到 BEV 网格坐标取周围 3×3 网格的特征。这种方式几何信息密度高、实现简单但丢失了高度维度对纵向堆叠的目标不太友好。我最终选的是体素路径精度比 BEV 路径高尤其是行人和骑行者这类目标上。视觉特征的语义信息丰富但是几何精度不足点云特征正好反过来两种特征在查询层互补这本身就是多模态融合最大的价值所在。3.4 时序融合机制4D 里的时间是如何在查询上展开的Sparse4D 之所以叫4D核心就在于时序维度。时序融合部分我单独拆开讲因为它是整个方案里设计最巧妙的地方。具体机制是这样的系统维护一个帧级实例记忆用一个 FIFO 队列缓存最近 T 帧的查询特征及其锚点。当前帧到来时先把历史锚点通过自车位姿变换变换到当前帧坐标系下——这一步要用到 IMU 或里程计提供的 4×4 变换矩阵把历史锚点的位置和朝向旋转平移到当前帧。然后当前帧的每个查询与所有历史查询做 cross-attention把时间上下文聚合到当前查询特征里。这个设计和 BEV 方案里的多帧 BEV 特征对齐后叠通道完全不是一回事。稀疏方案直接把时间信息嵌进了查询特征历史信息在解码迭代中自动参与更新不需要额外维护大尺寸的历史特征图。内存和算力上的优势是数量级的。需要注意的是历史帧数不是越多越好。我们测过从 2 帧到 12 帧4 到 8 帧是比较合理的区间再多的话过去太久的目标外观和当前位置差异太大反而给当前帧引入噪声。3.5 解码器迭代更新与损失函数组成在解码器每一层里查询按照前文流程完成图像和点云特征采样然后先做 self-attention 在查询之间交换空间信息再做 cross-attention 聚合时序记忆最后通过一个 FFN 预测锚点偏移量、类别分数和属性残差。预测出来的偏移量会更新锚点更新后的锚点进入下一层解码。一般 6 层解码是个合理的平衡点再多了收益边际递减。损失函数由几部分组成分类用 focal loss回归用 smooth-L1 加旋转框的 IoU loss速度单独做 L1 回归。多模态融合改造并不会改变损失函数的结构。有一点可以额外做在分类置信度的计算里加入模态置信度的感知比如当某个模态特征缺失时分类分数应该相应降低这个信息对后端的决策模块很有价值。4. 工程落地最容易翻车的四个细节4.1 外参标定误差会被可变形注意力短暂掩盖的隐患前面已经说过标定重要这里补充一个我印象很深的案例。Sparse4D 图像采样用的可变形注意力有个特性它的偏移网络有很强的自适应能力能学会即使投影点偏了也通过学出来的偏移量把采样点移回目标附近。这意味着如果标定存在系统性误差训练 loss 看起来可能完全正常模型也能收敛。但一上测试集、遇到训练分布外的场景偏移网络没见过这么大偏移量就会失效漏检率骤增。我建议在融合框架里加一道标定自校验流程训练完一个 checkpoint 之后拿几个典型场景做可视化把锚点投影到图上同时画出图像采样点和点云采样点的位置。如果两者系统性偏移超过两三个像素就要回头查标定。另外实车在颠簸路面长时间行驶后LiDAR 支架松动造成的外参微小变化也会导致精度下降前视相机和近距 LiDAR 的融合对这个尤其敏感。有条件的话要么定期离线复核标定要么上在线标定方案。4.2 数据增强必须做多模态一致性变换多模态训练里最容易写出隐蔽 Bug 的地方就是数据增强。随机翻转图像的同时如果只翻转了图像和对应的 2D 语义标签忘了翻转点云的 x 轴模型就会看到图像里的车头朝左、点云里的车头朝右这种自相矛盾的数据。这种矛盾不会让训练崩溃但会悄悄拉低模型的模态置信度而且非常难排查因为单看 loss 曲线不会有明显的异常。我的做法是写一个统一的数据增强模块它同时接收图像、点云、3D 标签生成一组共用的随机种子翻转轴、旋转角度、缩放系数所有模态在同一个函数里一起变换从根上杜绝各模态增强参数不一致的问题。看起来是个小工具但它值得被固化成一个统一的库函数不要让它散落在不同人的数据加载代码里。团队里不同人各写一套的话迟早会在某个版本上翻车。4.3 单传感失效的降级策略训练时就要做模态随机丢失前面提到查询级融合天然能容忍单模态缺失但有一个条件训练时不能只在双模态都正常的数据上训练否则推理时遇到相机掉线采样结果和训练时的分布不一致模型会输出非常离谱的结果。建议在训练时加入模态随机丢失以一定概率把某个视角的图像特征置为 0或者把 LiDAR 采样特征置为不可用让模型学会在信息不完整时仍然保持基本输出。这个策略在量产项目里非常实用。我们的路测统计显示单个相机掉线的概率虽然不高但一旦发生感知系统不应该整片失效。有了训练时的模态丢失掉线时刻模型会自然退化成接近纯 LiDAR 或者纯视觉的表现而不是输出一个置信度很高但完全错误的结果。4.4 显存和训练效率多视角采样的开销控制Sparse4D 多模态融合最大的工程痛点在图像侧。一个查询要遍历全部 6 到 8 个相机视角每个视角算一次可变形注意力的偏移和采样查询数量稍多训练时的中间计算量就相当可观。实测下来有效的优化手段有三条第一采样前做视角过滤。根据锚点在图像上的投影和可见性 mask先过滤掉明显看不见该锚点的相机只对相关视角做采样能省掉大约一半的无效计算。第二把采样逻辑写成批次化的矩阵运算避免逐查询的 Python 循环这里优化空间非常大。第三训练时开混合精度加梯度检查点前者能省 40% 左右显存后者用时间换空间适合大 batch 训练。推理时还有一个额外手段做解码剪枝前几层就已经预测出低置信度的查询直接砍掉不再进入后续层实测能把推理时延降低 20% 以上。5. 效果评估、调参经验与可扩展方向5.1 我们实测下来的指标规律在自建数据集上我们跑了三组对比纯视觉 Sparse4D、单 LiDAR 检测器、Sparse4D 多模态融合。多模态融合相比纯视觉mAP 提升约 7 个百分点NDSnuScenes 风格的驾驶评分提升约 5 个百分点主要涨点集中在近场行人、骑行者和雨雾等图像质量退化场景。相比纯 LiDAR 方案多模态融合在中远距离目标上的召回率更高因为图像在远距离上的纹理信息更丰富对几何特征不足的点云是很好的补充。有一个规律值得提前知道多模态融合增益最明显的是 40 到 60 米这个中距离区间因为在这个范围内图像和点云的分辨率都还够用互补性最强。到了 100 米以外两种模态的空间分辨率都在下降融合带来的增益也会递减。这个规律在做方案预期管理、跟项目组对齐目标时非常有用避免以为融合是万能药。5.2 调优的关键旋钮和参考配置调参过程中影响最大的几个旋钮按优先级排列参数低配置高配置备注查询数量300900从 300 到 900 大概涨 3 个点 mAP超过 900 饱和且自注意力开销增大图像采样点8/视角16/视角8 到 16 有明显收益超过 32 几乎无变化体素采样窗口3×3×35×5×53×3×3 性价比最高大窗口对内存不友好解码层数4 层6 层6 层是平衡点更少未收敛更多边际收益极低时序历史帧2 帧4-8 帧超过 8 帧反而引入陈旧信息干扰查询数量要看场景复杂度。城市复杂路口、遮挡严重的场景建议调到 800 到 900高速等道路结构简单的场景500 左右就够。这个没有统一标准需要在验证集上打点观察。5.3 两个值得继续扩展的方向最后聊两个我觉得后续值得做的方向。第一是把 4D 毫米波雷达也纳入这个查询级融合框架。毫米波点云稀疏、噪声大但查询级采样天然对稀疏输入友好而且毫米波提供的速度信息非常准能补足视觉和 LiDAR 在恶劣天气下的短板。第二是难例挖掘式的训练策略统计融合模型中哪些样本是两个模态单独都检测不出来、但融合后能检测出来的这些样本往往最考验融合模块的设计针对性地加大它们的采样权重比盲目调整网络结构更有效。最后说点个人体会。从开始接触 Sparse4D 到把多模态融合版本跑上实车最大的感受是这套方案真正的价值不只在 mAP 数字上而在于它的工程边界非常清晰——传感器缺失、外参偏差、显存受限这些量产问题都被变成了可以单独处理的问题而不是纠缠在一起的死结。如果你正准备在现有框架里引入多模态融合我的建议是先把单模态 Sparse4D 完整跑通、可视化采样点确认没有明显问题再加 LiDAR 路径。一次只引入一个变量排查问题的时候能省下大量时间。
返回列表