【多模态融合】MetaBEV 解决传感器故障 3D检测、BEV分割任务

前言

本文介绍多模态融合中,如何解决传感器故障问题;基于激光雷达和相机,融合为BEV特征,实现3D检测和BEV分割,提高系统容错性和稳定性。

会讲解论文整体思路、模型框架、论文核心点、损失函数、实验与测试效果等。

论文地址:MetaBEV: Solving Sensor Failures for BEV Detection and Map Segmentation

代码地址:https://github.com/ChongjianGE/MetaBEV

一、模型框架

MetaBEV整体流程如下图所示:

模型的框架流程:

  1. 输入数据,包括多视角相机的图像数据,激光雷达的点云数据。
  2. 对图像数据进行特征提取,预测每个像素的深度,投影到三维视锥空间,然后经过BEV池化,得到图像BEV特征。
  3. 对点云数据进行特征提取,使用体素化和稀疏3D卷积来编码,然后压缩Z维度,得到点云BEV特征。
  4. 通过跨模态可变形注意力,融合图像BEV特征和点云BEV特征。
  5. 经过几层的跨模态可变形注意力,然后来到自注意力层,进一步融合两种模态的信息。
  6. 得到BEV融合特征,后面接两个任务头,包括3D物体检测头、BEV语义分割头。
  7. 输出3D物体检测信息、BEV语义分割信息。

注意:这里的跨模态可变形注意力融合了MoE机制的,自注意力层也融合了MoE,后面详细讲。

BEV-Evolving Decoder,是论文的核心创新,由三个关键组成部分组成:跨模态注意力层、自注意力层和即插即用的M²oE块。

它用跨模态变形注意力机制,在相机和激光雷达间进行特征融合。然后经过自注意力层,进一步融合两种模态的信息。  

 二、核心内容——跨模态注意力+MoE

  • 此层首先初始化一组密集的BEV查询,称为Bm​,每个查询代表特定空间网格内的特征。
  • 这些查询通过位置编码(PE)进行增强,然后与相机BEV特征Bc​,激光雷达BEV特征Bl​,两者进行关联。
  • 跨模态融合,采用了可变形注意力(Deformable Attention, DAttn(·))。

2.1 跨模态注意力用公式表示:

  • 可变形注意力机制,首先从BEV查询特征Bm​中生成偏移量Δpx和注意力权重Ax,然后结合Bm​的像素坐标和相应的偏移量来定位采样的值特征。
  • 通过注意力权重Ax重新缩放采样特征后,Bm从传感器的信息特征中更新。
  • 公式中,其中m表示注意力头,K表示采样的键的数量,p表示参考点。Wm​和Wm′​是相关的权重矩阵。
  • 在公式中,输入特征x可以是Bc​、Bl​或两者的组合,这使MetaBEV能够灵活地在训练和测试期间使用多模态特征进行可变形注意力计算。

2.2 注意力中特定的MLP层:

  • 原始的DAttn(·)实现不适合处理任意输入,因为它使用统一的MLP层来采样参考点Δpx和注意力权重Ax。
  • 为了增加灵活性,引入了模型特定的MLP层(用于相机的C-MLP和用于激光雷达的L-MLP
  • 这里的"C-MLP"和"L-MLP"分别代表针对相机数据和激光雷达数据定制的MLP层。

通常,在一个多模态学习系统中,如果使用统一的MLP处理不同模态的数据,可能无法捕捉到每种模态独特的特征和数据分布。

例如,相机图像中的信息可能与颜色和纹理有关,而激光雷达数据可能更多地与空间和几何结构有关。

这两种类型的数据在特征空间中的表示可能完全不同。

如果使用同一个MLP层来处理这两种截然不同的数据类型,可能会导致模型无法充分学习到每种模态中的独特和有价值的信息。

为了解决这个问题,MetaBEV引入了模型特定的MLP层。这意味着:

  • C-MLP(Camera-specific MLP):专门设计用于处理相机BEV特征的MLP,它可以专注于学习和优化相机数据的处理,从而更好地捕捉图像中的色彩、纹理等视觉特征。

  • L-MLP(LiDAR-specific MLP):专门设计用于处理激光雷达BEV特征的MLP,它可以专注于学习和优化激光雷达数据的处理,从而更好地捕捉空间、几何等结构信息。

3.3 跨模态注意力集成MoE

如下图所示,是BEV-Evolving的结构图,展示了两种不同的Mixture of Experts (MoE)选项,并将这些结构集成到跨模态可变形注意力层中。

通过整合两种不同的MoE选项,可以在多任务学习中减少任务间的冲突。

RM²oE提供了一种通过路由机制选择专家的方式,而HM²oE提供了一种固定分配专家的方式。

首先看看RM²oE: Routing Multi-task Mixture-of-Experts

  • 由不同的“专家”组成,每个专家负责特定的任务(检测或分割)。

  • “路由器”负责决定对于每个任务应该使用哪个“专家”的输出。

  • 结构内的“加权求和”(Weighted Sum)和“加法”(Add)操作用于合并来自不同专家的信息。

再看看HM²oE: Hard MoE

  • 也是一个基于混合专家MoE的系统,但这里的每个专家是针对检测或分割任务分别设计的专用网络层(例如Det-FFN和Seg-FFN)

最后看看注意力中特定的MLP层

  • 使用模态特定的MLP层来灵活地计算采样偏移和注意力权重。
  • 引入了模态特定的注意力权重(如L-MLP用于激光雷达数据,C-MLP用于相机数据)
  • 通过引入模态特定的MLP,这种结构允许系统灵活地处理不同类型的传感器数据,以及不同模态下的采样偏移和注意力权重计算。

三、核心内容——自注意力+MoE

自注意力层,它是BEV-Evolving解码器的一部分。

  • 模型内部相关性:为了有效地建模查询之间的内部相关性,用BEV查询Bm​替换了之前公式中的输入特征 x。这意味着自注意力计算现在是基于BEV查询来进行的,从而能够捕捉不同查询(或特征)之间的相互关系。

  • 自注意力层数:在BEV-Evolving解码器中,只组装了2 层自注意力层,这样做是为了在性能和计算效率之间取得一个理想的平衡。

  • 模态间和查询内的关系建模:通过建模模态间(如相机和激光雷达)和查询内的相关性,融合的BEV特征最终被输出用于3D预测。

  • 混合设计:实验发现,将内部和跨模态相关性结合起来的混合设计为融合的BEV特征提供了全面的建模,这对于多种任务都是有益的。

四、MoE混合专家

Mixture of Experts (MoE) 是一种机器学习架构,通过将多个专家网络(即专家)的预测结合起来,来处理复杂的任务。

这种方法的核心思想是:不同的专家可以学习并成为任务的不同子部分的专家,而一个门控网络负责决定在给定的输入下哪个专家的建议最应该被采纳。

MoE架构在多任务学习、大规模语言模型以及其他需要处理广泛数据分布的应用中特别有用。

MoE的工作原理:

  • 专家网络:在MoE模型中,每个“专家”都是一个小型的神经网络,专门处理输入数据的一部分或某个特定任务。专家的设计允许模型在不同区域的输入数据上专业化,从而提高整体性能。
  • 门控机制:门控网络负责学习如何根据输入数据分配给每个专家的权重。这意味着它决定了哪些专家对当前任务最为重要,并相应地调整它们的输出贡献。
  • 输出融合:最后根据门控网络分配的权重,将选中的专家的输出加权融合,以产生最终预测。

MoE的优点:

  • 灵活性:MoE可以轻松扩展以包括更多的专家和更复杂的门控机制,使其能够处理非常复杂和多样化的数据集。

  • 专业化:通过将不同的专家专门用于数据的不同子集或不同任务,MoE能够在特定区域内达到更高的精确度。

  • 高效性:尽管MoE包含多个专家,但由于只有一部分专家被激活处理特定的输入,所以它可以在不显著增加计算成本的情况下提供定制化的输出。

五、背景与设计动机

  • 自动驾驶车辆的感知系统依赖于多模态传感器,如激光雷达和相机,以获得对周围环境的全面理解。这些传感器的信息被综合利用,以提高定位、导航和避障的准确性。
  • 然而,实际应用中的传感器故障和数据损坏问题,会使当前方法存在局限性。

1)特征错位和CNN的限制

  • 特征错位问题主要在多模态融合过程中,不同传感器数据的地理和几何对应关系难以精确匹配。
  • 当前流行的基于卷积神经网络(CNN)的融合方法虽然在特征提取方面表现出色,但它们在处理长距离依赖和动态调整对不同特征的关注程度方面存在局限。
  • 这是因为CNN主要关注局部特征,而自动驾驶场景下的物体识别和环境理解往往需要对更广泛区域的理解和整体上下文的分析。

2)完整模态的依赖性

  • 多模态融合策略对完整模态输入的依赖表明,一旦特定传感器数据不可用或损坏,系统的性能会显著下降。
  • 在现实世界中,传感器受环境因素影响而出现故障是不可避免的。例如,激光雷达可能因为雨雪或灰尘而失效,相机在低光照或直射阳光下可能无法捕捉清晰图像。
  • 因此,依赖于特定模态的融合策略在实际应用中面临重大挑战。

MetaBEV认为模态依赖方法的主要瓶颈是缺乏设计,提出了一个模态任意的BEV-Evolving解码器,使得融合模块能够独立融合不同模态。

原理:使用跨模态注意力,将可学习的BEV查询与单个相机BEV特征、激光雷达BEV特征或两者相结合,以消除瓶颈。

总结:为了解决上述特征错位和完整模态依赖问题,MetaBEV通过在统一的BEV表示空间中,进行模态任意和任务不可知的学习。 

3)多任务学习性能冲突

  • 考虑到实际中有限的计算资源,使用一个具有共享参数的单一框架来处理不同任务,比使用多个框架处理多个任务更为高效。
  • 然而,检测和分割的联合学习中的任务冲突经常导致严重的性能下降,现有方法很少分析和设计针对多任务学习(MTL)。

受到专为自然语言处理和自监督领域中的大型语言模型设计的专家混合(MoE)的启发MetaBEV引入了一个具有新的M2oE-FFN层的鲁棒融合模块。

主要目的是为了减轻检测和分割之间的梯度冲突,以实现更加平衡的性能。

MetaBEV是第一个将MoE引入3D目标检测和BEV地图分割作为一种多模态、多任务和鲁棒方法的框架。

六、模型细节信息

1)模型结构设计

  • 使用Swin-TVoxelNet作为相机和激光雷达的特征编码器。
  • BEV-Evolving解码器包含四个跨模态注意力层和两个自注意力层,用于生成融合的BEV。
  • 初始化分辨率为180x180的meta-BEV以捕捉细粒度的关联。
  • 使用FPN层生成融合BEV的多尺度特征。
  • 默认情况下使用变换器头部(Transformer head)进行3D检测,CNN头部用于地图分割。

2)数据集和评估指标:

  • nuScenes数据集上评估MetaBEV,这是一个大型多模态数据集。
  • 数据集被分为训练/验证/测试三部分,包含多种传感器数据。
  • 评估指标包括标准nuScenes检测得分(NDS)和平均精度(mAP)。
  • BEV地图分割使用mIoU(平均交并比)评估。

3)训练配置:

  • 遵循MMDetection3D的图像和激光雷达数据增强策略。
  • 使用AdamW优化器,权重衰减为0.05,并使用循环学习率计划。
  • 3D检测任务训练26个时代,地图分割任务训练20个时代。
  • 使用CBGS策略平衡数据采样。
  • MetaBEV在8个A100 GPUs上训练。
  • 切换模态训练的比例设置为相机/激光雷达/两者的1/3。

4) 切换模态训练(Switched Modality Training)

这种训练策略提供了对不同传感器数据类型的灵活性,从而允许模型更好地适应可能发生的传感器失效或数据损坏情况。

  • 模态特定模块: MetaBEV通过其BEV-Evolving块中的模态特定模块,可以灵活处理相机特征、激光雷达特征或两者的组合。

  • 训练方案: 提出了一种切换模态的训练方案,这种方案可以使用任意模态进行精确预测。这种训练方法通过在训练过程中随机使用预先确定概率的不同模态输入来模拟真实世界条件。

  • 任意模态推断: 作为结果,MetaBEV可以在任意输入模态上进行推断,这增加了它在自动驾驶中的实用性。

  • 部署效率: 重要的是,这种方法只需要一组预先训练好的权重,就可以用于模型的所有部署场景。

路由机制在切换模态训练中起到了关键作用。

  • 路由机制负责决定在给定输入时哪个模态特定的处理单元(或“专家”)应当被激活。
  • 这个决策过程对于模型能否有效处理多模态数据至关重要。
  • 在Mixture of Experts (MoE)模型中,路由器的设计至关重要,因为它决定了数据流向哪个专家,从而影响最终的输出质量和模型的鲁棒性。

5)传感器故障类型:

  1. Limited Field (LF): 指的是由于硬件故障导致激光雷达(LiDAR)点云数据在某些角度上缺失,这种情况下数据收集不会覆盖完整的360度视角。在这项工作中,模拟了不同角度下的缺失LiDAR数据,包括360, 240, 180, 120度的情况。

  2. Missing of Objects (MO): 在现实世界中,由于对象颜色和表面材质的不同等因素,激光雷达系统检测到的反射点数量可能会减少。这项工作通过按特定比例概率移除对象的点云数据来模拟对象点缺失,选定的比例包括0.0, 0.1, 0.3, 0.5, 0.7, 1.0。

  3. Beam Reduction (BR): 感测系统中发生的一种现象,当可用的电源供应或传感器处理能力受限时,系统无法处理传感器收集的全部数据,导致处理的激光束数量减少。为了评估,选择了1, 4, 8, 16, 32束激光束进行评估。

  4. View Noise (VN): 由于传感器噪声、电气干扰、大气条件或压缩伪影等多种因素,捕获的视图中包含随机变化或扭曲,这些变化或扭曲并不代表实际场景。通过用随机生成的噪声替换0到6个视图来模拟视觉噪声。

  5. View Drop (VD): 指的是现实世界中的一种情况,摄像头没有捕捉到部分视觉场景,导致信息丢失。这可能是由于摄像头定位不正确或硬件故障等多种因素造成的。以类似于VN的方式,通过使用零初始化的输入来替代多达六个缺失的视图进行模拟。

  6. Obstacle Occlusion (OO): 当场景中的对象部分被遮挡物或遮挡所遮盖时发生的感知现象。通过使用一组预定义的蒙版进行alpha混合来模拟这种现象,从而生成一个被遮挡的视图。

七、实验测试与效果

7.1)在nuScenes验证集上的性能比较,包括3D检测、分割。

  • Modality: 表示使用的传感器类型,C表示相机,L表示激光雷达,L+C表示两者的组合。
  • MTL: 表示是否使用了多任务学习(Multi-Task Learning),勾选表示是。
  • mAP(val): 表示在验证集上的平均精度(mean Average Precision),是3D检测任务的一个常用指标。
  • NDS(val): NuScenes检测评分(NuScenes Detection Score),是NuScenes数据集专用的综合性能评价指标。
  • Drivable/Ped.Cross/Walkway 等: 表示在特定类别上的分割性能,比如可驾驶区域、行人穿越道、人行道等。
  • Mean: 所有场景分割性能的平均值。

7.2)MetaBEV在面对极端传感器缺失情况下的性能表现,与其他方法(如TransFusion和BEVFusion)进行了比较。

  • 这些评估基于三种不同的场景:正常使用相机和激光雷达的情况,缺失相机,以及缺失激光雷达。
  • MetaBEV系统能够在传感器数据缺失时,完全不使用缺失的特征进行推断,表现出较强的鲁棒性。

7.3)自动驾驶的感知模型中,考虑不同类型的传感器故障:

  • Limited Field of LiDAR (LF): 由于收集错误或硬件损坏,激光雷达数据只能从视场的一部分收集到。

  • Missing of Objects (MO): 由于某些物质阻止激光雷达点被反射,导致无法检测到一些物体。

  • Beams Reduction (BR): 由于供电或传感器处理能力有限,激光雷达的光束数量减少。

  • View Drop (VD)View Noise (VN): 这两种都是由于相机故障造成的,VD是指相机视图突然丢失,而VN是指相机视图带有噪声。

  • Obstacle Occlusion (OO): 这是一个现实世界中的现象,即物体被遮挡导致相机无法检测到。

  • Missing Camera(MC): 相机完全丢失的情况。

  • Missing LiDAR(ML): 激光雷达完全丢失的情况。 

下面表格展示了MetaBEV和BEVFusion在各种传感器损坏情况下的性能比较 :

  • 在零样本测试中,MetaBEV在所有类型的传感器损坏情况下的NDS和mIoU性能均优于BEVFusion。
  • 在领域内测试中,MetaBEV同样展示了优于BEVFusion的性能,尤其在mIoU指标上有显著提升。
  • 在视野限制和物体遮挡的情况下,MetaBEV的性能提升尤为明显,这表明MetaBEV在处理这些特定损坏情况下具有更强的鲁棒性。

补充介绍:

  • 零样本测试(zero-shot test):这种测试是为了评估模型处理前所未见的损坏或缺失数据的能力。MetaBEV在没有见过的损坏数据上直接评估训练好的模型。
  • 领域内测试(in-domain test):在这种测试中,MetaBEV在随机损坏的数据上进行训练,然后在带有特定噪声等级的数据上进行评估。
  • 在这两种测试中,MetaBEV在11/12种传感器损坏情形的零样本评估上都优于BEVFusion。

7.4)MetaBEV在多任务学习的实验和结果,比较了两种不同的专家混合(MoE)结构。

  • 实验考虑了两种MoE结构:H-MoE和R-MoE。
  • 在仅进行检测任务时,mAP为67.6%,NDS为71.0%。
  • 在仅进行分割任务时,mIoU为70.4%。
  • H-MoE在多任务学习环境中提供了一定程度的性能提升,R-MoE提供了更显著的性能增益。

7.5) MetaBEV模型的消融研究,以评估不同的架构设计和训练策略对性能的影响。

  • 图(a)展示了不同数量的跨模态和自注意力层对mAP和NDS的影响。 结果显示,“2自注意力层+4跨模态注意力层”的组合在NDS指标上达到了最高值69.3。
  • 图(b)测试了不同参考点数量对性能的影响。 结果表明,使用8个参考点时,NDS达到最高值68.2。
  • 图(c)研究了不同数量的专家对mAP和mIoU的影响。 结果显示,“1/2 Expert”设置在mAP上达到了最高值69.8,而“1/8 Expert”设置在mIoU上达到了最高值66.4。
  • 图(d)对比了使用标准训练(Vanilla training)与切换模态训练(Switched Modality Training)在传感器完全失效时的表现。
    • 在LiDAR完全失效的情况下, 使用切换模态训练的NDS和mAP指标显著提高(+32.8和+36.1)。
    • 在相机完全失效的情况下, 切换模态训练同样显著提高了性能(+1.0和+1.2)。
    • 在模态齐全的情况下(Full), 切换模态训练在NDS上有所提高,但在mIoU上略有下降(-1.9)。

小结: 

  • 发现几层跨模态注意力层足以产生有效的预测,而增加更多层并不一定能提高模型的能力。
  • 发现仅增加自注意力层可以显著提高预测性能。
  • 使用2/8专家配置(在八个专家中选择得分最高的两个)可以获得最佳性能。
  • 使用切换模态训练策略,模拟传感器缺失的情况,与常规全模态训练相比,能够显著提高3D检测和BEV地图分割的性能。
  • 在LiDAR缺失和相机缺失的场景下,分别有+32.8%和+1.0%的NDS改善,以及分割性能的显著提升。
  • 甚至在完整模态下,这种训练策略也能从71.0%的NDS提升到71.5%。

补充一下:

  • “Expert number”是在Mixture of Experts (MoE)模型中专家(expert)的数量。
  • 在表格中的“Expert number”列可能展示了不同的配置,比如使用“1/2专家”、“1/4专家”、“1/8专家”等,这些配置指的是在模型中有多少比例的专家参与了最终的决策过程。
  • 这里的比例通常是用于控制模型复杂度和计算资源分配的一个方式。

7.6)MetaBEV和BEVFusion 在不同摄像头噪声条件下的地图分割结果的比较

不同的环境条件包括:

  • 亮度调整(Brightness)
  • 对比度调整(Contrast)
  • 饱和度调整(Saturation)
  • JPEG压缩噪声(JPEG Compression)
  • 雪(Snow)
  • 雾(Fog)
  • 霜冻(Frost)
  • 飞溅(Splatter)
  • 运动模糊(Motion Blur)
  • 焦外模糊(Defocus Blur)
  • 玻璃模糊(Glass Blur)
  • 高斯模糊(Gaussian Blur)

  • 使用的指标是mean Intersection over Union (mIoU),它是衡量分割质量的常用指标。 
  • 左侧雷达图展示了不同图像退化条件下的mIoU分数。
  • 右侧雷达图展示了相同条件下模型性能保持的程度。

在左图中,MetaBEV在大多数条件下相比BEVFusion有更高的得分,这表明MetaBEV在处理图像噪声时能够更好地保持地图分割性能。

例如,在亮度和对比度调整条件下,MetaBEV的性能明显优于BEVFusion。

右图显示的性能保持度(retention)与左图类似,也显示了MetaBEV在大多数条件下的性能都优于BEVFusion。

模型效果:

八、关键模块代码

Cross-Attention Modules 示例代码如下所示:

import torch
import torch.nn as nn

class CrossAttention(nn.Module):
    def __init__(self, d_model=264, n_heads=8, n_points=4, lidar_flag=False, camera_flag=False, **kwargs):
        super().__init__()
        if camera_flag:
            self.offsets_camera = nn.Linear(d_model, n_heads * n_points * 2)
            self.attention_weights_camera = nn.Linear(d_model, n_heads * n_points)
        
        if lidar_flag:
            self.offsets_lidar = nn.Linear(d_model, n_heads * n_points * 2)
            self.attention_weights_lidar = nn.Linear(d_model, n_heads * n_points)
        
        self.value_proj = nn.Linear(d_model, d_model)
        self.output_proj = nn.Linear(d_model, d_model)
    
    def forward(self, query, reference_points, x, camera_flag=False, lidar_flag=False):
        value = self.value_proj(x)
        if camera_flag and lidar_flag:
            offsets_camera = self.offsets_camera(query)
            offsets_lidar = self.offsets_lidar(query)
            offsets = torch.cat([offsets_camera, offsets_lidar])
            attention_weights_camera = self.attention_weights_camera(query)
            attention_weights_lidar = self.attention_weights_lidar(query)
            attention_weights = torch.cat([attention_weights_camera, attention_weights_lidar], dim=3)
        elif camera_flag and not lidar_flag:
            offsets = self.offsets_camera(query)
            attention_weights = self.attention_weights_camera(query)
        elif lidar_flag and not camera_flag:
            offsets = self.offsets_lidar(query)
            attention_weights = self.attention_weights_lidar(query)
        
        attention_weights = F.softmax(attention_weights)
        sampling_locations = reference_points + offsets
        
        # MSDeformAttnFunction is implemented by DeformableAttention
        output = MSDeformAttnFunction.apply(value, sampling_locations.float(), attention_weights, output_mask)
        output = self.output_proj(output)
        return x

HMoE示例代码如下所示:

import torch
import torch.nn as nn
import torch.nn.functional as F

# HMoE: Hard MoE
class MultiTaskExpertMlp(nn.Module):
    def __init__(self, in_features=256, hidden_features=None, out_features=None, act_layer=nn.GELU(), drop=0., det_flag=False, seg_flag=False, **kwargs):
        super().__init__()
        self.det = det_flag
        self.seg = seg_flag
        self.multi_tasks = det_flag and seg_flag
        
        if self.multi_tasks:
            self.det_expert = nn.Sequential(
                nn.Linear(in_features, hidden_features), act_layer, nn.Dropout(drop),
                nn.Linear(hidden_features, out_features), nn.Dropout(drop)
            )
            self.seg_expert = nn.Sequential(
                nn.Linear(in_features, hidden_features), act_layer, nn.Dropout(drop),
                nn.Linear(hidden_features, out_features), nn.Dropout(drop)
            )
            self.fuse = nn.Sequential(nn.Linear(out_features*2, out_features),)
            self.norm = nn.LayerNorm(out_features)
        elif self.seg:
            self.seg_expert = nn.Sequential(
                nn.Linear(in_features, hidden_features), act_layer, nn.Dropout(drop),
                nn.Linear(hidden_features, out_features), nn.Dropout(drop)
            )
        elif self.det:
            self.det_expert = nn.Sequential(
                nn.Linear(in_features, hidden_features), act_layer, nn.Dropout(drop),
                nn.Linear(hidden_features, out_features), nn.Dropout(drop)
            )

    def forward(self, x):
        b, n, c = x.shape
        if self.multi_tasks:
            det_fea = self.det_expert(x)
            seg_fea = self.seg_expert(x)
            fuse_fea = self.norm(self.fuse(torch.cat([det_fea, seg_fea], dim=2)))
            return fuse_fea
        elif self.det:
            x = self.det_expert(x)
            return x
        elif self.seg:
            x = self.seg_expert(x)
            return x

RMoE示例代码如下所示:

import torch
import torch.nn as nn

# RMoE: Routing MoE
from tutel import moe as tutel_moe
from tutel import moe_utils

class MultiTaskRouteMoEMlp(nn.Module):
    def __init__(self, in_features=256, hidden_features=None, out_features=None, drop=0., act_layer=nn.GELU(), **kwargs):
        super().__init__()
        self.act = act_layer
        gate_type = kwargs['gate_type']
        experts = kwargs['experts']

        # Implemented using Microsoft-tutel: https://github.com/microsoft/tutel
        self._moe_layer = tutel_moe.moe_dp_layer(
            gate_type=gate_type,
            experts={
                'type': experts.type,
                'count_per_node': experts.count_per_node,
                'hidden_size_per_expert': hidden_features,
                'activation_fn': lambda x: self.act(x),
                'dropout_fn': lambda x: nn.Dropout(drop)(x)
            },
            model_dim=out_features,
            scan_expert_func=None,
            group=net.create_groups_from_world(group_count=1).data_group, # used for DistributedDataParallel mode
            seeds=(1, dist.get_rank() + 1, 1),
            a2a_ffn_overlap_degree=experts.a2a_ffn_overlap_degree,
            parallel_type=experts.parallel_type,
            use_2d=experts.use_2dh,
        )

    def forward(self, x, gate_index):
        return self._moe_layer(x, gate_index=gate_index)

本文先介绍到这里,后面会分享“多模态融合”的其它数据集、算法、代码、具体应用示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/520855.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 基于列表实现的通讯录管理系统(有完整源码)

目录 通讯录管理系统 PersonInformation类 ContactList类 menu函数 main函数 程序的运行流程 完整代码 运行示例 通讯录管理系统 这是一个基于文本的界面程序,用户可以通过命令行与之交互,它使用了CSV文件来存储和读取联系人信息,这…

浅谈Redis和一些指令

浅浅谈一谈Redis的客户端 Redis客户端 Redis也是一个客户端/服务端结构的程序。 MySQL也是一个客户端/服务端结构的程序。 Redis的客户端也有多种形态 1.自带命令行客户端 redis-cli 2.图形化界面的客户端(桌面程序,web程序) 像这样的图形…

3d代理模型怎么转换成标准模型---模大狮模型网

在当今的虚拟世界中,3D建模技术被广泛运用于游戏开发、电影制作、工业设计等领域。在3D建模过程中,有时会遇到需要将代理模型转换成标准模型的情况。模大狮将从理论和实践两方面,介绍如何将3D代理模型转换成标准模型,以帮助读者更…

推荐一款免费开源引擎:批量识别PDF及图片表格及文字(可本地化部署)

在数字化时代,信息的快速处理和高效管理成为企业和个人的重要需求。表格文字识别技术作为一项关键的技术,能够将纸质或图片中的表格数据快速转换为结构化的电子数据,极大地提高了数据处理的效率和准确性。本文将对思通数科的表格文字识别技术…

MySQL复制拓扑2

文章目录 主要内容一.配置基本复制结构1.分别在三台主机上停止mysqld服务,并对状态进行确认:代码如下(示例): 2.对三个MySQL服务器的配置文件分别进行编辑,在[mysqld] 选项组中添加以下红色条目:3.在数据目…

淘宝优惠券领取软件叫什么?

草柴返利APP是一款淘宝优惠券领取软件。用户可以通过草柴淘宝优惠券领取软件轻松查找领取淘宝大额隐藏优惠券,领取成功后再购物可享受券后价优惠。同时,通过草柴APP领券购买成功,确认收货后再回到草柴APP提取购物返利,享受双重省钱…

【自用笔记】【大数据】

1 mapreduce (1)Map任务的数量:由输入数据的大小决定的,如文件数量和大小、HDFS块大小以及FileInputFormat的设置等。每个MapSlot可以运行一个Map任务 (2)Reduce任务的数量(分区数)&…

DHCP-PXE

Dynamic Host Configuration Protocol 动态主机配置协议 1.Selinux 调试为Permission 防火墙配置 搭建DHCP的主机必须有一个静态地址,提前配置好 安装DHCP软件 服务名为dhcpd DHCP地址分配四次会话, DISCOVERY发现 OFFER 提供 REQUEST 回应 A…

vue使用iview导航栏Menu activeName不生效

activeName不生效 一、问题一、解决方案, 一、问题 根据ivew官网的提示,设置了active-name和open-names以后,发现不管是设置静态是数据还是设置动态的数据,都不生效 一、解决方案, 在设置动态名称的时候&#xff0c…

修复打印机显示为脱机的几种方法,总有一种适合你

打印机显示为脱机有几个可能的原因。在大多数情况下,只要对症下药,问题就很容易解决。下面解释了打印机脱机的原因,以及如何使其联机并再次打印。 “打印机脱机”是什么意思 当打印机显示为脱机时,这意味着它当前未通过电缆或Wi-Fi网络连接到计算机。它无法与你的计算机通…

Feign(黑马程序员)

Feign是代替RestTemplate进行http请求的。 定义和使用 Feign 客户端&#xff1a; 1 引入依赖&#xff1a; <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </depe…

Autosar BswM 模式管理

EcuMs管理ECU上下电状态,BswM管理模式,协同工作。当使用EcuM - Fixed时,它将向BswM指示当前ECU状态 有了BswM,从图可以更加直观看出,BswM管理各个模块,每个模块独立,降低耦合。 BswM 的主要功能包括: 模式管理:BswM 可以管理和控制 ECU 的不同模式,例如正常模式、备…

2024.4.5|牛客小白月赛90

2024.4.5|牛客小白月赛90 A.小A的文化节 B.小A的游戏 C.小A的数字 D.小A的线段&#xff08;easy version&#xff09; E.小A的任务 F.小A的线段&#xff08;hard version&#xff09; 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c…

【鸿蒙 HarmonyOS】获取设备的地理位置

一、背景 获取移动设备的地理位置&#xff0c;包含&#xff1a;经度、维度、具体地理位置等&#xff0c;地理位置信息能在许多业务场景中被应用&#xff0c;如导航、地图服务、位置服务、社交媒体等。 下面以一个Demo例子&#xff0c;来实现获取设备地理位置的功能 官方文档…

无头单向非循环链表的实现

1.链表的结构 在用代码实现之前&#xff0c;我们要先了解这种链表的逻辑结构和物理结构&#xff0c; 在逻辑上我们能知道这种链表能够通过前一个节点的 next 来存储下一个节点的地址&#xff0c;从而能够找到下一个数据&#xff0c;这就是一种线性结构&#xff0c;我们可以把数…

智能感应门改造工程

今天记录一下物联网专业学的工程步骤及实施过程 智能感应门改造工程 1 规划设计1.1 项目设备清单1.2项目接线图 软件设计信号流 设备安装与调试工程函数 验收 1 规划设计 1.1 项目设备清单 1.2项目接线图 软件设计 信号流 设备安装与调试 工程函数 工程界面: using System; …

循环队列的实现及应用——桶排序bucket_sort、基数排序radix_sort

一、循环队列的实现 代码解释 1、完成初始化 2、定义方法 3、测试实例 4、完整代码 class AQueue:def __init__(self, size=10):self.__mSize = sizeself.__front=0self.__rear = 0self.__listArray = [None] * size#清空元素def clear(self):self.__front = 0self.__rear =…

腾讯游戏革命:手游内400+AI角色个性化成长,成本削减90%|TodayAI

在全球游戏开发者大会&#xff08;GDC&#xff09;上&#xff0c;腾讯游戏以一场技术革新的展示&#xff0c;震撼了整个游戏界。最令人瞩目的是&#xff0c;《火影忍者》手游中包含了超过400个AI角色&#xff0c;每个角色都拥有独特的个性。这一成就得益于腾讯新开发的大规模强…

江协科技STM32:TIM输出比较

输出比较模块的主要功能&#xff1a;输出一定频率和占空比的PWM波形 CC是捕获比较的意思,R是Register&#xff0c;寄存器的意思&#xff0c;CCR捕获比较寄存器它是输入捕获和输出比较共用的 当使用输入捕获&#xff0c;它就是捕获寄存器 当使用输出比较&#xff0c;它就是比…

RK3588 NPU 研究(二)

RK提供了两个模型&#xff0c;mobilenet和YOLO5。 mobilenet模型相对小&#xff0c;使用起来不是很明显yolo5模型大一些&#xff0c;可以对88种目标进行检测&#xff0c;提供检测的结果包括类别、包围框坐标、可信度等信息。基于rknn_yolov5_demo进行分析。 rknn_yolov5_demo基…