【多模态融合】MetaBEV 解决传感器故障 3D检测、BEV分割任务
前言
本文介绍多模态融合中,如何解决传感器故障问题;基于激光雷达和相机,融合为BEV特征,实现3D检测和BEV分割,提高系统容错性和稳定性。
会讲解论文整体思路、模型框架、论文核心点、损失函数、实验与测试效果等。
论文地址:MetaBEV: Solving Sensor Failures for BEV Detection and Map Segmentation
代码地址:https://github.com/ChongjianGE/MetaBEV
一、模型框架
MetaBEV整体流程如下图所示:
模型的框架流程:
- 输入数据,包括多视角相机的图像数据,激光雷达的点云数据。
- 对图像数据进行特征提取,预测每个像素的深度,投影到三维视锥空间,然后经过BEV池化,得到图像BEV特征。
- 对点云数据进行特征提取,使用体素化和稀疏3D卷积来编码,然后压缩Z维度,得到点云BEV特征。
- 通过跨模态可变形注意力,融合图像BEV特征和点云BEV特征。
- 经过几层的跨模态可变形注意力,然后来到自注意力层,进一步融合两种模态的信息。
- 得到BEV融合特征,后面接两个任务头,包括3D物体检测头、BEV语义分割头。
- 输出3D物体检测信息、BEV语义分割信息。
注意:这里的跨模态可变形注意力融合了MoE机制的,自注意力层也融合了MoE,后面详细讲。
BEV-Evolving Decoder,是论文的核心创新,由三个关键组成部分组成:跨模态注意力层、自注意力层和即插即用的M²oE块。
它用跨模态变形注意力机制,在相机和激光雷达间进行特征融合。然后经过自注意力层,进一步融合两种模态的信息。
二、核心内容——跨模态注意力+MoE
- 此层首先初始化一组密集的BEV查询,称为Bm,每个查询代表特定空间网格内的特征。
- 这些查询通过位置编码(PE)进行增强,然后与相机BEV特征Bc,或激光雷达BEV特征Bl,或两者进行关联。
- 跨模态融合,采用了可变形注意力(Deformable Attention, DAttn(·))。
2.1 跨模态注意力用公式表示:
- 公式中,其中m表示注意力头,K表示采样的键的数量,p表示参考点。Wm和Wm′是相关的权重矩阵。
- 在公式中,输入特征x可以是Bc、Bl或两者的组合,这使MetaBEV能够灵活地在训练和测试期间使用多模态特征进行可变形注意力计算。
- 思路流程1:可变形注意力机制,首先从BEV查询特征Bm中生成偏移量Δpx和注意力权重Ax,然后结合Bm的像素坐标和相应的偏移量来定位采样的值特征。
- 思路流程2:通过注意力权重Ax重新缩放采样特征后,Bm从传感器的信息特征中更新。
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包含多个专家,但由于只有一部分专家被激活处理特定的输入,所以它可以在不显著增加计算成本的情况下提供定制化的输出。
MoE(Mixture of Experts)模型在MetaBEV框架中应用,包括两种不同类型的M²oE实现:RM²oE和HM²oE。
- 在MetaBEV框架中,RM²oE是用来动态分配任务到不同的专家的复杂模型;
- 而HM²oE提供了一个去除路由机制的简化模型,可能在计算资源受限时更为有效。
- 两种模型都旨在解决多任务学习中的任务冲突问题,尽管它们在处理这些任务时的方法有所不同。
- RM²oE为复杂任务提供了更高的灵活性,而HM²oE在模型简化和计算效率方面可能更有优势。
RM²oE(Routing Mixture of Experts)
HM²oE(Hard Mixture of Experts):
- 简化模型: HM²oE是RM²oE的简化版本,它去除了路由功能,直接将任务固定分配给特定的专家,不再基于输入数据的内容进行动态决策。
- 固定专家数量: 当 t=1 时,这种模型简化到只有一个专家负责所有计算,这个专家的数量与任务数量相等。
五、背景与设计动机
- 自动驾驶车辆的感知系统依赖于多模态传感器,如激光雷达和相机,以获得对周围环境的全面理解。这些传感器的信息被综合利用,以提高定位、导航和避障的准确性。
- 然而,实际应用中的传感器故障和数据损坏问题,会使当前方法存在局限性。
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-T和VoxelNet作为相机和激光雷达的特征编码器。
- 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)传感器故障类型:
-
Limited Field (LF): 指的是由于硬件故障导致激光雷达(LiDAR)点云数据在某些角度上缺失,这种情况下数据收集不会覆盖完整的360度视角。在这项工作中,模拟了不同角度下的缺失LiDAR数据,包括360, 240, 180, 120度的情况。
-
Missing of Objects (MO): 在现实世界中,由于对象颜色和表面材质的不同等因素,激光雷达系统检测到的反射点数量可能会减少。这项工作通过按特定比例概率移除对象的点云数据来模拟对象点缺失,选定的比例包括0.0, 0.1, 0.3, 0.5, 0.7, 1.0。
-
Beam Reduction (BR): 感测系统中发生的一种现象,当可用的电源供应或传感器处理能力受限时,系统无法处理传感器收集的全部数据,导致处理的激光束数量减少。为了评估,选择了1, 4, 8, 16, 32束激光束进行评估。
-
View Noise (VN): 由于传感器噪声、电气干扰、大气条件或压缩伪影等多种因素,捕获的视图中包含随机变化或扭曲,这些变化或扭曲并不代表实际场景。通过用随机生成的噪声替换0到6个视图来模拟视觉噪声。
-
View Drop (VD): 指的是现实世界中的一种情况,摄像头没有捕捉到部分视觉场景,导致信息丢失。这可能是由于摄像头定位不正确或硬件故障等多种因素造成的。以类似于VN的方式,通过使用零初始化的输入来替代多达六个缺失的视图进行模拟。
-
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 nnclass 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 DeformableAttentionoutput = 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_flagself.seg = seg_flagself.multi_tasks = det_flag and seg_flagif 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.shapeif 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_feaelif self.det:x = self.det_expert(x)return xelif 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_utilsclass 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_layergate_type = kwargs['gate_type']experts = kwargs['experts']# Implemented using Microsoft-tutel: https://github.com/microsoft/tutelself._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 modeseeds=(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)
本文先介绍到这里,后面会分享“多模态融合”的其它数据集、算法、代码、具体应用示例。
相关文章:

【多模态融合】MetaBEV 解决传感器故障 3D检测、BEV分割任务
前言 本文介绍多模态融合中,如何解决传感器故障问题;基于激光雷达和相机,融合为BEV特征,实现3D检测和BEV分割,提高系统容错性和稳定性。 会讲解论文整体思路、模型框架、论文核心点、损失函数、实验与测试效果等。 …...

[通俗易懂]《动手学强化学习》学习笔记1-第1章 初探强化学习
文章目录 前言第1章 初探强化学习1.1 简介序贯决策(sequential decision making)任务:强化学习与有监督学习或无监督学习的**区别**:改变未来 1.2 什么是强化学习环境交互与有监督学习的区别1:改变环境 (说…...

centOS如何升级python
centOS下升级python版本的详细步骤 1、可利用linux自带下载工具wget下载,如下所示: 笔者安装的是最小centos系统,所以使用编译命令前,必须安装wget服务,读者如果安装的是界面centos系统,或者使用过编译工具…...

【MYSQL锁】透彻地理解MYSQL锁
🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …...

【静态分析】静态分析笔记01 - Introduction
参考: BV1zE411s77Z [南京大学]-[软件分析]课程学习笔记(一)-introduction_南京大学软件分析笔记-CSDN博客 ------------------------------------------------------------------------------------------------------ 1. program language and static analysis…...

使用的sql
根据CODE去重 SELECT * FROM ( SELECT count( camera_code ) AS count, camera_code FROM n_camera_basic GROUP BY camera_code ) t WHERE t.count >1 DELETE FROM n_camera_basic WHERE camera_id NOT IN (SELECT dt.minno…...

【ZZULIOJ】1052: 数列求和4(Java)
目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 输入n和a,求aaaaaa…aa…a(n个a),如当n3,a2时,222222的结果为246 输入 包含两个整数,n和a,含义如上述,你可以假定n和a都是小于10的非负整…...

【Linux】tcpdump P3 - 过滤和组织返回信息
文章目录 基于TCP标志的过滤器格式化 -X/-A额外的详细选项按协议(udp/tcp)过滤低详细输出 -q时间戳选项 本文继续展示帮助你过滤和组织tcpdump返回信息的功能。 基于TCP标志的过滤器 可以根据各种TCP标志来过滤TCP流量。这里是一个基于tcp-ack标志进行过滤的例子。 # tcpdump…...

vscode免费登录ssh ,linux git配置免密码
1、vscode远程ssh免密 在windows下生成密钥 , cmd窗口下执行 ssh-keygen -t rsa 在C:\Users\xxxx\.ssh目录下生成 在linux下面 cd .ssh 创建authorized_keys 文件, 把之前windows下生成的 id_rsa.pub内容复制进去 2、gitlab 配置。 在linux下面 ssh-keygen -t rs…...

Netty 心跳(heartbeat)——服务源码剖析(上)(四十一)
剖析目的 Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一个服务----心跳机制 heartbeat.通过心跳检査对方是否有效,这是 RPC 框架中是必不可少的功能。下面我们分析一下 Netty 内部心跳服务源码实现。 源…...

C语言—每日选择题—Day65
前言 我们的刷题专栏又又又开始了,本专栏总结了作者做题过程中的好题和易错题。每道题都会有相应解析和配图,一方面可以使作者加深理解,一方面可以给大家提供思路,希望大家多多支持哦~ 第一题 1、如下代码输出的是什么…...

【环境变量】基本概念理解 | 查看环境变量echo | PATH的应用和修改
目录 前言 基本概念&理解 注意的点 查看环境变量的方法 PATH环境变量 PTAH应用系统指令 PTAH应用用户程序 命令行参数的修改(内存级) 配置文件的修改 windows环境变量 大家天天开心🙂 bash进程的流程。环境变量在系统指…...

5.7Python之元组
元组(Tuple)是Python中的一种数据类型,它是一个有序的、不可变的序列。元组使用圆括号 () 来表示,其中的元素可以是任意类型,并且可以包含重复的元素。 与列表(List)不同,元组是不可…...

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 一、简单介绍 二、简单视频放大抖动效果实现原理 三、简单视频放大…...

如何通过VPN访问内网?
VPN(Virtual Private Network)是一种通过公共网络建立私有网络连接的技术,可以在不同地点的网络中建立安全通道,实现远程访问内网资源的目的。本文将介绍如何通过VPN访问内网,并介绍一款名为“天联”的VPN服务。 什么是…...

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表
RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表 文章目录 RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表1. MQTT概览2. MQTT 5.0 特性1. 特性概要2. Docker中安装RabbitMQ及启用MQTT5.0协议 3. MQTT 5.0 功能列表1. 消息过期1. 描述2. 举例3. 实现 2. 订阅标识…...

常用脚本01 - 生成证书
1 生成证书 第一步、准备脚本文件 [rootharbor-01 ssl]# vim gencert.sh #!/usr/bin/env bash set -eDOMAIN"$1" IP"$2" WORK_DIR"$(mktemp -d)"if [ -z "$DOMAIN" ]; thenecho "Domain name needed."exit 1 fiecho "…...

【jQuery】jQuery框架
目录 1.jQuery基本用法 1.1选择器 1.2jQuery对象 1.3事件绑定 1.4链式编程 1.5过滤方法 1.6样式操纵 1.6属性操纵 1.7操作value 1.8查找方法 1.9类名操纵 1.10事件进阶 1.11触发事件 1.12window事件绑定 2.节点操作与动画 2.1获取位置 2.2滚动距离 2.3显示/隐…...

使用OMP复原一维信号(MATLAB)
参考文献 https://github.com/aresmiki/CS-Recovery-Algorithms/tree/master MATLAB代码 %% 含有噪声 % minimize ||x||_1 % subject to: (||Ax-y||_2)^2<eps; % minimize : (||Ax-y||_2)^2lambda*||x||_1 % y传输中可能含噪 yyw % %% clc;clearvars; close all; %% 1.构…...

Linux安装最新版Docker完整教程
参考官网地址:Install Docker Engine on CentOS | Docker Docs 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.6 系统,内核版本为3.10 1.3 安装依赖包 …...

iOS object-c self关键字总结
在Objective-C中,self 关键字是一个指向当前对象的指针。它是对象自身实例的别名,通常在对象内部的方法中使用,以提供一个指向当前对象的引用。使用 self 可以帮助你访问对象的属性和方法,特别是在处理消息传递和方法调用时。 以…...

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽
京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽,配置为:16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京,京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图: 京东云16核64G云服务器…...

hive管理之ctl方式
hive管理之ctl方式 hivehive --service clictl命令行的命令 #清屏 Ctrl L #或者 ! clear #查看数据仓库中的表 show tabls; #查看数据仓库中的内置函数 show functions;#查看表的结构 desc表名 #查看hdfs上的文件 dfs -ls 目录 #执行操作系统的命令 !命令…...

cpp 内存分区模型
c程序在执行前,将内存大方向划分为4个区域。 1.代码区:存放函数的二进制代码,有操作系统进行管理 2.全局区:存放全局变量和静态变量以及常量 3.栈区:由编译器自动分配释放,存放的函数参数和局部变量 4.…...

44.网络游戏逆向分析与漏洞攻防-角色管理功能通信分析-角色创建服务器反馈数据包分析
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 现在的代码都是依据数据包来写的,如果看不懂代码,就说明没看懂数据包…...

web安全学习笔记(6)
记一下第十节课的内容。 一.PHP语言中的if else判断 语法和c语言中非常类似,不再赘述,也可以使用if...elseif...elseif...else 1.True和False 2.,和 一个等号是赋值 两个等号是比较 三个等号是全等(内容相等,数…...

揭秘“二次放号查询接口”:为您的通信安全保驾护航
在信息化社会中,手机号码已成为我们日常生活中不可或缺的身份标识。然而,您是否了解过“二次放号”这一现象,以及它可能对您的信息安全带来的影响?今天,我们将为您揭开“二次放号查询接口”的神秘面纱,揭示…...

字节8年经验之谈 —— 如何实现高效的自动化渗透测试?
随着当前网络安全威胁的不断扩展与升级,开展渗透测试工作已经成为广大企业组织主动识别安全漏洞与潜在风险的关键过程。然而,传统的人工渗透测试模式对测试人员的专业能力和经验水平有很高的要求,企业需要投入较大的时间和资源才能完成。在此…...

ElasticSearch分词检索
1. 倒排索引:表示一种数据结构,分词词条与文档id集合的隐射关系 2. 它跟关系型数据库是一种互补的关系,因为关系型数据库支持事务操作,满足ACID原则 3. 索引库的文档字段只允许新增不允许修改 1.创建索引库 put /索引库名称2.1 …...

每日三道面试题之 Java并发编程 (四)
1.什么是线程死锁 线程死锁是并发编程中一个常见问题,它发生在两个或多个线程永久性地阻塞彼此,等待对方释放锁,但没有任何一方先行释放锁的情况下。简单来说,每个线程都持有对方需要的资源而等待对方释放资源,导致所…...