欢迎光临
我们一直在努力

Mamba纯线性全局融合3D检测:MambaFusion(中科院&上海交大)混合Mamba块+高度保真编码,nuScenes 75.0 NDS SOTA!!!

🔥 本文定位:CSDN 原创干货 | 中科院自动化所&上海交大 纯Mamba多模态3D检测 SOTA 方案

🎯 核心收益:一次性解决LiDAR-Camera融合三大痛点——效率低、长程建模弱、高度信息丢失!基于混合Mamba块(Hybrid Mamba Block)+高度保真LiDAR编码(Height-Fidelity LiDAR Encoding)打造首个纯线性算子全局融合框架,Hilbert曲线序列化打通全场景信息交互,nuScenes验证集NDS 75.0(SOTA),测试集NDS 75.9,推理速度比IS-FUSION快50%,比SparseLIF快62%,完美适配自动驾驶实时感知、端到端运动规划、多传感器鲁棒部署、BEV分割、Waymo长程检测

📌 核心创新矩阵:

  • Hybrid Mamba Block(HMB)——Local Mamba捕获细粒度局部特征 + Global Mamba基于Hilbert曲线实现全场景密集交互,首次证明纯Mamba融合可达SOTA
  • Height-Fidelity LiDAR Encoding(HFL)——连续空间体素压缩保留精确高度信息,消除离散量化误差导致的多模态对齐偏差
  • Dense Global Fusion范式——统一Image+BEV双空间融合,每个位置可感知全部场景信息(高效+远见+全知),突破Local/Quasi/Sparse三类融合上限
  • 纯线性复杂度全局注意力——无需窗口切分、无需Transformer,Hilbert曲线序列化+Mamba双向扫描实现O(N)全局交互
  • ✅ 适配场景:自动驾驶实时3D感知 | 端到端运动规划 | LiDAR-Camera多传感器融合 | 极端天气鲁棒检测 | BEV语义分割 | 工业级低延迟部署


    🔖 前言

  • 现有融合策略三难困境:Dense Local Fusion(BEVFusion)高效但短视——每个位置只能看到局部邻域;Sparse Global Fusion(SparseFusion)远见但非全知——依赖物体提议丢弃关键背景信息;Quasi Dense Global Fusion(UniTR)折中但仍短视——窗口偏移无法直接触及全局。三者没有一种能同时做到高效+远见+全知。
  • Transformer全局注意力成本爆炸:BEV空间180×180=32400个token,self-attention复杂度O(N²)直接拉满显存,自动驾驶根本用不起。窗口切分能降成本但牺牲全局感知——大物体被切成多个碎片,跨窗口上下文丢失导致误检。
  • 高度信息在融合中被系统性丢弃:LiDAR backbone将3D体素反复沿高度维度压缩,每次压缩用离散坐标取整——量化误差层层放大。投影到图像平面时,高度偏差导致LiDAR特征落到错误的像素区域,直接引发假阳性、类别错误和尺度不准。
  •   本文介绍的 MambaFusion(Height-Fidelity Dense Global Fusion) 来自中科院自动化所模式识别国家重点实验室、上海交大和Anyverse Intelligence,arXiv 2025年7月提交,代码已开源(https://github.com/AutoLab-SAI-SJTU/MambaFusion)。核心洞察极为精准:Mamba的线性复杂度和长程建模能力天然适配全局融合——但直接替换会掉点,根因是高度信息丢失导致序列偏差。基于此,作者提出两大核心模块:Hybrid Mamba Block(HMB)用Hilbert曲线序列化实现全场景密集交互,Height-Fidelity LiDAR Encoding(HFL)在连续空间中保留精确高度。两者结合,首次证明纯线性算子融合框架可以超越所有Transformer方案。

      模型仅在nuScenes上训练,nuScenes验证集NDS 75.0(SOTA,超IS-FUSION +1.0),测试集NDS 75.9,推理速度4.7 FPS(比IS-FUSION快50%)。更在端到端运动规划任务上验证通用性——集成到FusionAD后碰撞率从0.12降至0.10。本文全程 论文 1:1 对齐 + 可运行完整代码复现 + 实验全解读,CSDN 最细最干货版本。


    🔖 一、MambaFusion 整体架构

    在这里插入图片描述

  • 双流特征提取(Stage 1):Camera侧——Swin Transformer提取多视图图像特征,LSS(Lift-Splat-Shoot)投影到BEV空间,输出 $F_c \\in \\mathbb{R}^{80\\times 180\\times 180}$;LiDAR侧——VoxelNet/LION backbone提取稀疏体素特征,输出 $F_l \\in \\mathbb{R}^{256\\times 180\\times 180}$,体素分辨率 [0.3m, 0.3m, 0.25m]。
  • 模态分布对齐(Stage 2):共享HMB(Hybrid Mamba Block)分别处理LiDAR和Camera特征,类似Normalization层统一两种模态的特征分布,为后续融合铺平道路。这个步骤至关重要——分布不一致直接融合会导致梯度冲突。
  • 双空间融合(Stage 3,核心):Raw Space融合——HFL编码的LiDAR体素特征投影到图像平面,与Camera特征在2D空间用HMB交互;BEV Space融合——Camera特征经LSS投影到BEV,与LiDAR BEV特征在3D空间用HMB交互。两个空间互补:Raw Space保细节,BEV Space保全局。
  • 检测头(Stage 4):TransFusion head从融合BEV特征预测3D框中心、尺寸、旋转角。
  • 核心设计亮点:整个框架的精髓在于"双空间互补"。Raw Space(图像平面投影)保留了体素特征在连续空间中的精确高度信息,适合细粒度对齐;BEV Space提供统一的俯视坐标系,适合大范围场景理解。HMB在两个空间中分别执行Local+Global Mamba序列化融合,形成"局部细节+全局上下文"的双层表征。相比UniTR的窗口Transformer(每个窗口独立、跨窗口靠移位),HMB的Hilbert曲线序列化让每个token都能直接与全场景任意位置交互,不存在窗口边界。


    🔖 二、核心模块逐行拆解

    2.1 Hybrid Mamba Block(HMB)——混合局部-全局Mamba融合

    在这里插入图片描述

    解决的4个核心问题:

    • 问题1:纯Mamba直接替换Transformer掉点严重——表2中Vanilla Mamba替换UniTR融合模块,mAP从70.6暴跌至65.8(-4.8),NDS从72.9跌至70.4(-2.5)。Mamba的单向感受野和序列偏差是根因
    • 问题2:局部和全局特征需要互补——只用Local Mamba(mAP 70.5/NDS 72.1)不如只用Global Mamba(mAP 71.5/NDS 73.7),两者结合达到71.9/74.3,证明互补
    • 问题3:2D/3D特征如何序列化——Mamba原生处理1D序列,需要用空间填充曲线将2D图像/BEV特征和3D体素特征展开为1D。Hilbert曲线保空间局部性最优
    • 问题4:单向感受野限制——Mamba默认单向扫描(从左到右),HMB采用双向策略:正向扫描+反向扫描(flip),每个token能看到两侧上下文
    Step 1:Global Mamba — Hilbert曲线全局序列化

      给定单模态或多模态特征 FFF 及其坐标 C={(xi,yi,zi)}i=1NfeatC = \\{(x_i, y_i, z_i)\\}_{i=1}^{N_{feat}}C={(xi,yi,zi)}i=1Nfeat,首先计算每个token的Hilbert索引:

    hi=HilbertIndex(xi,yi,zi)h_i = \\text{HilbertIndex}(x_i, y_i, z_i)hi=HilbertIndex(xi,yi,zi)

      HilbertIndex(·)将3D坐标映射为1D Hilbert曲线索引。Hilbert曲线作为空间填充曲线,保证相邻3D空间的点在1D序列中也相邻——这比简单的逐行扫描(row-major)或Z-order曲线更能保空间局部性。消融实验表5(b)证实:Hilbert曲线(71.9/74.3)> Z-order曲线(71.5/74.0)> 坐标排序(71.2/73.5)。

      随后添加位置编码保留原始坐标信息,再按Hilbert索引重排特征:

    F′←F+PosEmbedding(C),Fglobal=Mamba(F′,Ph)F' \\leftarrow F + \\text{PosEmbedding}(C), \\quad F_{global} = \\text{Mamba}(F', P_h)FF+PosEmbedding(C),Fglobal=Mamba(F,Ph)

      由于Mamba感受野单向,HMB采用双向扫描:正向Mamba处理Hilbert排序序列 → 反向Mamba处理翻转序列 → 两者结果叠加,实现真正的双向全局上下文。消融实验表5©证实双向显著优于单向。

    Step 2:Local Mamba — 局部窗口精细建模

      将特征空间划分为 w×ww \\times ww×w 的非重叠窗口,每个token计算其区域索引和区域内位置:

    ri=⌊xiw⌋×⌊yiw⌋+⌊yiw⌋,(xi′,yi′)=(xi mod w,yi mod w)r_i = \\lfloor\\frac{x_i}{w}\\rfloor \\times \\lfloor\\frac{y_i}{w}\\rfloor + \\lfloor\\frac{y_i}{w}\\rfloor, \\quad (x'_i, y'_i) = (x_i \\bmod w, y_i \\bmod w)ri=wxi×wyi+wyi,(xi,yi)=(ximodw,yimodw)

      组合区域索引和区域内位置得到新坐标 Pr={ri,xi′,yi′}P_r = \\{r_i, x'_i, y'_i\\}Pr={ri,xi,yi},然后在每个窗口内部用Mamba聚合:

    Flocal=LocalMamba(F,Pr)F_{local} = \\text{LocalMamba}(F, P_r)Flocal=LocalMamba(F,Pr)

      局部Mamba沿x和y两个方向分别扫描(见图3),捕获窗口内精细的纹理和边缘特征。与Global Mamba互补——Global捕获"这辆车在场景中的位置",Local捕获"这辆车的精确边界"。

    Step 3:HMB完整计算流程

    HMB(F)=GlobalMamba(F)+LocalMamba(F)\\text{HMB}(F) = \\text{GlobalMamba}(F) + \\text{LocalMamba}(F)HMB(F)=GlobalMamba(F)+LocalMamba(F)

      两个分支并行计算后叠加。HMB的设计高度灵活——可以独立处理单模态特征(分布对齐阶段),也可以联合处理拼接后的多模态特征(融合阶段)。当处理多模态时,Hilbert曲线将Image空间和BEV空间的特征统一序列化,Mamba在序列中自由交叉两个模态的信息。

    为什么不用Transformer?表7给出直接对比:窗口Transformer在相同融合空间下mAP 69.5/NDS 72.2,HMB达71.9/74.3——+2.4 mAP/+2.1 NDS。关键差异:窗口Transformer每个窗口独立计算attention,跨窗口信息靠窗口移位间接传递(信息衰减);HMB的Global Mamba通过Hilbert曲线一次性看到所有token,信息无损。


    2.2 Height-Fidelity LiDAR Encoding(HFL)——连续空间高度保真编码

    在这里插入图片描述

    解决的4个核心问题:

    • 问题1:体素生成阶段高度信息丢失——传统VoxelNet用体素质心坐标代表整个体素,忽略体素内部点分布。图5显示投影偏差直接导致假阳性和类别错误
    • 问题2:体素下采样引入量化误差——每次降采样取合并体素坐标的平均值,离散空间的取整操作层层累积误差
    • 问题3:体素生成冲突——LION backbone选取top-k显著特征生成新体素时,相邻体素可能重叠或冲突,引入额外偏差
    • 问题4:高度偏差如何影响融合——投影时高度坐标偏差导致LiDAR特征落在错误的图像像素上,Mamba的序列化会放大这种错位(比Transformer更敏感,因为自注意力有一定平移不变性)
    Step 1:连续空间体素生成

    CP0=ScatterMean(c,v0)CP_0 = \\text{ScatterMean}(c, v_0)CP0=ScatterMean(c,v0)

      v0v_0v0 是每个点分配的体素,c∈RNpoint×3c \\in \\mathbb{R}^{N_{point}\\times 3}cRNpoint×3 是点云坐标。与传统方法的关键区别:不取离散体素质心,而是在连续空间中计算体素内所有点的精确平均坐标。这个浮点坐标保留了亚体素级别的高度精度。

    Step 2:连续空间体素下采样

    CPs=ScatterMean(CPs−1,vs−1)CP_s = \\text{ScatterMean}(CP_{s-1}, v_{s-1})CPs=ScatterMean(CPs1,vs1)

      在第s阶段的体素合并中,基于原始连续坐标(而非离散坐标)重新计算合并后体素的位置。每次下采样都用浮点坐标追溯回原始点云,从根本上消除离散量化误差的累积。

    Step 3:冲突体素排除

    {(xi±1,yi±1,⌊zim⌋)}i=1k∉CPs\\{(x_i \\pm 1, y_i \\pm 1, \\lfloor\\frac{z_i}{m}\\rfloor)\\}_{i=1}^{k} \\notin CP_s{(xi±1,yi±1,mzi⌋)}i=1k/CPs

      LION backbone生成的top-k体素在坐标 (xi±1,yi±1)(x_i \\pm 1, y_i \\pm 1)(xi±1,yi±1) 周围,可能与现有体素重叠。HFL加冲突检测:排除会与周围体素合并的候选,只保留不重叠的新体素。mmm 是下采样尺度。

    Step 4:效果验证

      表6消融实验:backbone加HFL → +0.9 mAP/+0.7 NDS;VoxelVFE加HFL → +0.3 mAP/+0.1 NDS;冲突检测 → +0.4 mAP/+0.4 NDS。三项叠加从70.3/73.1提升至71.9/74.3。图5可视化:HFL投影更精确,LiDAR点云准确落在物体区域,而非漂移到背景。


    🔖 三、论文 1:1 对齐完整可运行 PyTorch 复现代码

    3.1 环境依赖

    # 基础环境
    conda create -n mambafusion python=3.8 -y
    conda activate mambafusion

    # PyTorch (CUDA 11.8)
    pip install torch==2.0.1 torchvision==0.15.2 –index-url https://download.pytorch.org/whl/cu118

    # Mamba核心依赖
    pip install mamba-ssm causal-conv1d

    # 3D检测框架
    git clone https://github.com/AutoLab-SAI-SJTU/MambaFusion.git
    cd MambaFusion
    python mambafusion_setup.py develop

    # 其他依赖
    pip install spconv-cu118 numba numpy llvmlite pyyaml easydict tqdm

    3.2 完整代码实现

    Hybrid Mamba Block 核心实现

    # ====== pcdet/models/backbones_3d/local_mamba.py ======
    import torch
    import torch.nn as nn
    import math
    from functools import partial
    from mamba_ssm.models.mixer_seq_simple import create_block

    class GlobalMamba(nn.Module):
    """
    Global Mamba: Hilbert曲线序列化 + 双向Mamba扫描
    实现 O(N) 复杂度的全场景密集交互
    """

    def __init__(self, d_model, ssm_cfg, norm_epsilon, rms_norm,
    down_kernel_size, down_stride, num_down, norm_fn,
    indice_key, sparse_shape, hilbert_config, downsample_lvl,
    residual_in_fp32=True, fused_add_norm=True,
    device=None, dtype=None, use_checkpoint=True):
    super().__init__()
    self.use_checkpoint = use_checkpoint
    factory_kwargs = {'device': device, 'dtype': dtype}

    # 🚀 正向Mamba层:处理Hilbert排序后的序列
    mamba_encoder_1 = create_block(
    d_model=d_model, ssm_cfg=ssm_cfg,
    norm_epsilon=norm_epsilon, rms_norm=rms_norm,
    residual_in_fp32=residual_in_fp32,
    fused_add_norm=fused_add_norm,
    layer_idx=0, **factory_kwargs)

    # 🚀 反向Mamba层:处理翻转序列,实现双向感受野
    mamba_encoder_2 = create_block(
    d_model=d_model, ssm_cfg=ssm_cfg,
    norm_epsilon=norm_epsilon, rms_norm=rms_norm,
    residual_in_fp32=residual_in_fp32,
    fused_add_norm=fused_add_norm,
    layer_idx=1, **factory_kwargs)

    self.mamba_encoder_list = nn.ModuleList(
    [mamba_encoder_1, mamba_encoder_2])

    # 下采样编码器
    self.conv_encoder = nn.ModuleList()
    for idx in range(len(down_stride)):
    self.conv_encoder.append(
    DownSp(d_model, down_kernel_size[idx],
    down_stride[idx], num_down[idx],
    norm_fn, f"{indice_key}_{idx}"))

    # 上采样解码器(跳跃连接)
    self.conv_decoder = nn.ModuleList()
    self.conv_decoder_norm = nn.ModuleList()
    downsample_times = len(down_stride[1:])
    for idx, kernel_size in enumerate(down_kernel_size[1:]):
    self.conv_decoder.append(
    post_act_block(d_model, d_model, kernel_size,
    norm_fn=norm_fn, conv_type='inverseconv',
    indice_key=f'spconv_{indice_key}_{downsample_timesidx}'))
    self.conv_decoder_norm.append(norm_fn(d_model))

    self.sparse_shape = sparse_shape
    self.downsample_lvl = downsample_lvl
    self.downsample_ori = 'curve_template_rank9'

    # LayerNorm
    norm_cls = partial(nn.LayerNorm, eps=norm_epsilon, **factory_kwargs)
    self.norm = norm_cls(d_model)
    self.norm_back = norm_cls(d_model)

    def forward(self, voxel_features, voxel_coords, batch_size,
    curt_spatial_shape, curve_template, hilbert_spatial_size,
    pos_embed, num_stage):

    mamba_layer1 = self.mamba_encoder_list[0] # 正向
    mamba_layer2 = self.mamba_encoder_list[1] # 反向

    # 构建稀疏卷积张量
    x = spconv.SparseConvTensor(
    features=voxel_features,
    indices=voxel_coords.int(),
    spatial_shape=curt_spatial_shape,
    batch_size=batch_size)

    # 下采样编码
    features = []
    for conv in self.conv_encoder:
    x = conv(x)
    features.append(x)

    feats_s1 = features[0].features # Level 1 特征
    coords_s1 = voxel_coords
    feats_s2 = features[1].features # Level 2 特征
    coords_s2 = features[1].indices

    # 🚀 计算Hilbert索引(CUDA加速)
    hilbert_s1, pos_embed_coords_s1 = fused_hilbert_pos_embed_cuda(
    coords_s1.long(), curve_template[self.downsample_ori],
    batch_size, *hilbert_spatial_size[self.downsample_ori],
    features[0].spatial_shape, (num_stage, num_stage, num_stage))

    hilbert_s2, pos_embed_coords_s2 = fused_hilbert_pos_embed_cuda(
    coords_s2.long(), curve_template[self.downsample_lvl],
    batch_size, *hilbert_spatial_size[self.downsample_lvl],
    features[1].spatial_shape, (num_stage, num_stage, num_stage))

    # 🚀 按Hilbert索引排序/逆排序映射
    out_feat_3d_s2 = torch.zeros_like(feats_s2)
    out_feat_3d_s1 = torch.zeros_like(feats_s1)

    # 位置编码注入
    pos_embed_s2 = pos_embed(pos_embed_coords_s2.float())
    feats_s2 = feats_s2 + pos_embed_s2

    for i in range(batch_size):
    b_mask = coords_s2[:, 0] == i
    # Hilbert排序
    sort_idx = torch.argsort(hilbert_s2[b_mask])
    unsort_idx = torch.argsort(sort_idx)
    feat_sorted = feats_s2[b_mask][sort_idx][None]

    # 🚀 正向Mamba扫描
    out_feat = mamba_layer1(feat_sorted, None)
    out_feat_3d_s2[b_mask] = out_feat[0].squeeze(0)[unsort_idx]

    # 反向扫描
    pos_embed_s1 = pos_embed(pos_embed_coords_s1.float())
    feats_s1 = feats_s1 + pos_embed_s1

    for i in range(batch_size):
    b_mask = coords_s1[:, 0] == i
    sort_idx = torch.argsort(hilbert_s1[b_mask])
    unsort_idx = torch.argsort(sort_idx)
    feat_sorted = feats_s1[b_mask][sort_idx][None]

    # 🚀 反向Mamba扫描(flip实现双向)
    feat_back = feat_sorted.flip(1)
    out_feat_back = mamba_layer2(feat_back, None)
    out_feat_3d_s1[b_mask] = (
    out_feat_back[0].squeeze(0).flip(0)[unsort_idx])

    # 跳跃连接 + 上采样
    x_s1 = replace_feature(features[0], self.norm_back(out_feat_3d_s1))
    x_s2 = replace_feature(features[1], self.norm(out_feat_3d_s2))

    x = x_s2
    for deconv, norm, up_x in zip(
    self.conv_decoder, self.conv_decoder_norm,
    [x_s1]):
    x = deconv(x)
    x = replace_feature(x, x.features + up_x.features)
    x = replace_feature(x, norm(x.features))

    return x.features, x.indices

    Height-Fidelity LiDAR Encoding

    # ====== HFL核心实现(伪代码,对齐论文 Sec.3.4)======
    def height_fidelity_voxel_generation(points, voxel_size):
    """
    连续空间体素生成,保留精确高度信息

    Args:
    points: (N, 4) – [x, y, z, intensity]
    voxel_size: [dx, dy, dz]
    Returns:
    voxel_features: (M, C)
    voxel_coords: (M, 3) – 连续空间坐标(非离散)
    """
    # 体素分配(离散索引仅用于分组)
    voxel_idx = (points[:, :3] / voxel_size).floor().long()

    # 🚀 关键:连续空间坐标 = 体素内所有点的精确平均
    # 传统方法:取体素质心(离散坐标 × voxel_size)
    # HFL方法:ScatterMean所有点的原始浮点坐标
    voxel_coords_continuous = scatter_mean(
    points[:, :3], voxel_idx, dim=0) # 连续空间!

    voxel_features = scatter_mean(points[:, 3:], voxel_idx, dim=0)

    return voxel_features, voxel_coords_continuous

    def height_fidelity_downsample(voxel_features, voxel_coords_cont,
    scale, child_voxel_idx):
    """
    连续空间下采样:基于原始连续坐标计算合并体素位置

    Args:
    voxel_coords_cont: 上一层连续空间坐标
    scale: 下采样尺度
    child_voxel_idx: 子体素到父体素的映射
    """
    # 🚀 关键:用原始连续坐标(非离散坐标)做ScatterMean
    parent_coords = scatter_mean(
    voxel_coords_cont, child_voxel_idx, dim=0)

    parent_features = scatter_mean(
    voxel_features, child_voxel_idx, dim=0)

    return parent_features, parent_coords

    def conflict_avoidance(topk_coords, existing_coords, scale):
    """
    体素冲突检测:排除与周围体素重叠的候选

    Args:
    topk_coords: LION生成的k个候选体素坐标
    existing_coords: 已存在的体素坐标
    scale: 降采样尺度
    """
    # 🚀 生成候选体素:(x±1, y±1, z//scale)
    candidates = []
    for x, y, z in topk_coords:
    for dx in [1, 1]:
    for dy in [1, 1]:
    cand = (x + dx, y + dy, z // scale)
    candidates.append(cand)

    # 🚀 排除与已存在体素冲突的候选
    valid_mask = torch.ones(len(candidates), dtype=torch.bool)
    for i, cand in enumerate(candidates):
    dist = torch.norm(existing_coords torch.tensor(cand), dim=1)
    if dist.min() < threshold:
    valid_mask[i] = False

    return topk_coords[valid_mask[:len(topk_coords)]]


    🔖 四、YOLO 一键迁移适配教程(即插即用,直接训练)

    Step 1:放入模块文件

      将 local_mamba.py(含 GlobalMamba、DownSp 等类)放入 ultralytics/nn/modules/ 目录。

    Step 2:注册 __init__.py

      在 ultralytics/nn/modules/__init__.py 中添加:

    from .local_mamba import GlobalMamba, DownSp, Sparse1ConvBlock

    Step 3:注册 parse_model

      在 ultralytics/nn/tasks.py 的 parse_model 函数中,elif 分支添加:

    elif m is GlobalMamba:
    c1 = ch[f]
    c2 = args[0]
    args = [c1, c2, *args[1:]]

    注意:MambaFusion 基于稀疏卷积框架(spconv),YOLO 是密集卷积框架。直接移植需要适配 BEV 空间表示。建议在 YOLO 的 Neck 层(PANet 替换为 HMB)或检测头前插入 GlobalMamba 作为全局上下文增强模块。完整 YAML 配置需根据具体 YOLO 版本调整输入通道和空间尺寸。


    🔖 五、实验结果全解析(论文 1:1 还原)

    5.1 nuScenes SOTA 对比

    方法发表分辨率模态NDS(val)mAP(val)NDS(test)mAP(test)FPS
    PointPainting CVPR’20 C+L 69.6 65.8
    TransFusion CVPR’22 800×448 C+L 71.3 67.5 71.6 68.9
    BEVFusion(PKU) NeurIPS’22 704×256 C+L 71.0 67.9 71.8 69.2 0.8
    DeepInteraction NeurIPS’22 800×448 C+L 72.6 69.9 73.4 70.8 2.6
    BEVFusion(MIT) ICRA’23 704×256 C+L 71.4 68.5 72.9 70.2 4.2
    CMT ICCV’23 1600×640 C+L 72.9 70.3 74.1 72.0 2.8
    SparseFusion ICCV’23 704×256 C+L 72.8 70.4 73.8 72.0 5.3
    UniTR ICCV’23 704×256 C+L 73.3 70.5 74.5 70.9 4.9
    IS-FUSION CVPR’24 1056×384 C+L 74.0 72.8 75.2 73.0 3.2
    DAL ECCV’24 1056×384 C+L 74.0 71.5 74.8 72.0 4.3
    SparseLIF ECCV’24 1600×640 C+L 74.6 71.2 2.9
    MambaFusion-Lite Ours 704×256 C+L 74.0 71.6 75.0 72.0 5.4
    MambaFusion-Base Ours 704×256 C+L 75.0 72.7 75.9 73.2 4.7

    ✅ 核心亮点:

    • MambaFusion-Base NDS 75.0 超越所有方法,包括使用更高分辨率输入的 IS-FUSION(1056×384 vs 704×256)
    • MambaFusion-Lite NDS 74.0 追平 IS-FUSION 和 DAL,但推理速度快 69% 和 26%
    • 比 SparseLIF(ECCV’24)快 62%,比 IS-FUSION(CVPR’24)快 50%
    • 首次证明:纯线性算子融合在性能和效率上同时超越 Transformer 融合

    5.2 消融实验

    编号BaselineHMB-MHMB-RHMB-BHFLmAPNDS
    67.7 70.9
    68.6 71.6
    66.9 70.2
    69.6 72.0
    70.3 72.7
    70.6 73.1
    71.4 73.6
    71.2 73.7
    71.9 74.3

    HMB-M=模态对齐阶段, HMB-R=Raw Space融合, HMB-B=BEV Space融合, HFL=高度保真编码。消融在50% nuScenes上进行。

    ✅ 核心亮点:

    • ③ vs ①:Raw Space融合单独用反而掉点(-0.8 mAP/-0.7 NDS),因为投影偏差被Mamba序列化放大——正是HFL要解决的问题
    • ⑤ vs ③:HFL修复后从66.9/70.2恢复至70.3/72.7(+3.4 mAP/+2.5 NDS)——HFL是关键修复
    • ⑨:所有模块叠加达71.9/74.3,比基线①提升4.2 mAP/3.4 NDS

    5.3 Linear Attention 方法对比

    方法直接替换UniTR+HFL+HMB
    RetNet 64.6/68.3 (-6.0/-4.6) 70.7/73.1 (+0.1/+0.2)
    RWKV 64.9/68.8 (-5.7/-4.1) 70.8/73.3 (+0.2/+0.4)
    Mamba 65.8/70.4 (-4.8/-2.5) 71.9/74.3 (+1.3/+1.4)

    ✅ 核心亮点:

    • 三种Linear Attention直接替换都掉点,但Mamba掉点最少(-4.8 mAP vs RetNet -6.0 vs RWKV -5.7)
    • HiPPO理论让Mamba在无显式时空先验时也能捕获长程依赖——这对稀疏点云的不规则间距至关重要
    • +HFL+HMB后,只有Mamba实现显著正提升(+1.3/+1.4),RetNet和RWKV勉强追平基线

    5.4 鲁棒性实验

    方法Clean缺失前摄仅前摄时间戳不同步
    mAP/NDS mAP/NDS mAP/NDS mAP/NDS
    TransFusion 66.9/70.9 65.3/70.1 64.4/69.3 65.9/70.2
    BEVFusion 67.9/71.0 65.9/70.7 65.1/69.9 66.2/70.3
    UniTR 70.5/73.3 68.5/72.4 66.5/71.2 68.1/71.8
    MambaFusion 72.7/75.0 70.6/74.1 67.9/72.3 71.3/74.2

    ✅ 核心亮点:

    • 时间戳不同步场景优势最大(+3.2 mAP vs UniTR),全局感知天然适应时序不对齐
    • 各类损坏场景下均优于所有对比方法,鲁棒性来自全局上下文——单个局部区域损坏不影响全局推理

    5.5 端到端运动规划通用性验证

    方法DEavg ↓CRavg ↓
    FusionAD 0.81 0.12
    +MambaFusion 0.70 0.10

    ✅ MambaFusion 集成到 FusionAD 后端到端运动规划:位移误差降 13.6%,碰撞率降 16.7%。证明 HMB 的长程建模能力对下游任务同样有效。


    🔖 六、总结

  • Hybrid Mamba Block(HMB)首次证明纯Mamba融合可达SOTA:Local Mamba(窗口内精细交互)+ Global Mamba(Hilbert曲线全局序列化)+ 双向扫描 = O(N)复杂度的全场景密集交互。比窗口Transformer快47%,mAP高2.4个点。
  • Height-Fidelity LiDAR Encoding(HFL)从根源解决多模态对齐偏差:连续空间体素生成→连续空间下采样→冲突体素排除,三级保真。可视化确认投影精度大幅提升,假阳性显著减少。
  • 双空间融合范式兼顾细节和全局:Raw Space(图像平面)保精确高度,BEV Space统一坐标系做大范围推理。两个空间互补,HMB在两个空间中共享架构。
  • nuScenes SOTA + 端到端通用:验证集NDS 75.0(超过所有方法),测试集NDS 75.9,FPS 4.7(比IS-FUSION快50%)。端到端运动规划集成有效。学术研究和工程落地都能直接用。
  • 🔖 收藏本文,纯Mamba多模态融合直接起飞!
    📌 标签:#Mamba状态空间模型 #LiDAR-Camera融合 #3D目标检测 #自动驾驶感知 #nuScenes

    赞(0)
    未经允许不得转载:171主机测评 » Mamba纯线性全局融合3D检测:MambaFusion(中科院&上海交大)混合Mamba块+高度保真编码,nuScenes 75.0 NDS SOTA!!!
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址