当前位置: 首页 > news >正文

断其一指,无惧!ProFusion3D: 相机或者激光失效仍高效的多传感器融合3D目标检测算法

Abstract

多传感器融合在自动驾驶中的3D目标检测中至关重要,摄像头和激光雷达是最常用的传感器。然而,现有方法通常通过将两种模态的特征投影到鸟瞰视角(BEV)或透视视角(PV)来进行单视角的传感器融合,从而牺牲了高度或几何比例等互补信息。为了解决这个问题,我们提出了ProFusion3D,一种渐进融合框架,它在中间特征和目标查询级别中同时结合了BEV和PV中的特征。我们的架构通过分层融合局部和全局特征,提高了3D目标检测的鲁棒性。此外,我们引入了一种自监督掩码建模预训练策略,通过三个新的目标来提高多模态表示学习和数据效率。基于nuScenes和Argoverse2数据集的大量实验证明了ProFusion3D的有效性。此外,ProFusion3D在传感器失效时也表现出强大的鲁棒性,即使仅有一种模态可用时,仍能保持较好的性能。

代码获取:http://profusion3d.cs.uni-freiburg.de

 欢迎加入自动驾驶实战群

Introduction

可靠的目标检测对于自动驾驶至关重要,因为它能够帮助车辆通过准确识别和定位周围的物体来安全导航环境。为了增强鲁棒性,激光雷达与摄像头的融合成为了主流范式,利用来自不同模态的互补信息。然而,由于这些模态本质上的差异,其数据分布也不同,这带来了显著的挑战。为了解决这一问题,已经探索了各种多模态融合策略,这些策略主要在以下方面存在差异:融合的表示形式(鸟瞰视角BEV或透视视角PV),以及融合的阶段(原始输入、中间特征或目标查询)。虽然使用单一表示形式可以通过将两种模态的特征映射到一个公共空间中来简化融合过程,但也会导致信息丢失,比如在BEV中的高度信息丢失,以及PV中的遮挡和透视失真。同样,在原始输入阶段进行融合可能会引入传感器噪声和无关信息。在中间特征融合时,可能会丢失模态特定的信息,而在目标查询级别进行融合则允许集成高级语义信息,但过度依赖这些信息的质量,可能会影响鲁棒性。本文提出了一种渐进式融合方法,在中间特征和目标查询级别中,同时融合BEV和PV中的特征。这种渐进的集成使得模型能够有效结合并利用不同视角和融合阶段的优势。

最近,自监督学习方法如掩码图像建模(MIM)和掩码点建模(MPM)在从大规模无标签数据中提取强表示方面取得了巨大成功,尤其是在图像和点云方面。这些方法提高了下游任务的微调表现,并改善了数据效率。这引发了一个重要的问题:类似的技术是否可以应用于汽车场景中的多模态传感器融合,以实现3D目标检测?虽然一些之前的工作已经探索了在无标签数据集上进行激光雷达-摄像头融合的预训练,但它们通常设计用于小型、密集的点云,这些点云具有室内环境中的均匀点密度。然而,这些方法并不适用于涉及较大、更稀疏和更异构数据的汽车环境。为了解决这一问题,我们提出了一种适用于稀疏室外点云的有效多模态掩码建模预训练框架。

本文提出了ProFusion3D框架,该框架执行渐进式激光雷达-摄像头传感器融合,并引入了一种新颖的自监督掩码建模预训练策略,以提高3D目标检测的性能。我们的模型在中间特征级别和目标查询级别同时融合BEV和PV中的特征。这种综合的融合策略使得我们的模型能够有效利用局部和全局特征,显著提高了3D目标检测的准确性和鲁棒性,即使在传感器故障的情况下也能保持良好的性能。

3.Method

在本节中,我们首先介绍提出的ProFusion3D框架的架构,它利用渐进融合进行3D目标检测,如图2a所示。接着我们详细介绍其主要组件:模态内外融合模块和解码器。最后,我们引入ProFusion3D的多模态掩码建模方法(见图5),并详细说明三种预训练目标。

图片

图片

3.1 ProFusion3D架构

ProFusion3D架构以LiDAR点云和多视角相机图像作为输入,使用相应的编码器对每种模态进行编码,以计算LiDAR模态的BEV(鸟瞰视角)特征

图片

和相机模态的PV(透视视角)特征

图片

。我们将属于某个视角的模态称为模态内特征。例如,对于BEV空间,

图片

被视为模态内特征,而对于PV空间,

图片

则为模态内特征。接下来,我们通过投影将

图片

映射到PV,将

图片

映射到BEV,这些映射特征被称为每个视角空间的模态外特征:

图片

图片

。然后,我们使用提出的模态内外融合模块在每个特征空间中融合两种模态。融合后的特征

图片

 和

图片

被传递给解码器,它执行目标查询级别的融合。

LiDAR BEV到PV的映射(MBEV→PV):对于给定LiDAR BEV特征的每个像素(ib, jb),我们首先计算相应的(x, y)度量位置。接着,我们检索所有非空体素的z坐标,这些体素的BEV投影落在(x, y)中。最后,我们使用相机的外参和内参将得到的3D点投影到相机图像坐标系(ic, jc)中。

相机PV到BEV的映射(MPV→BEV):我们“抬升”相机PV特征到BEV,方法是为每个相机像素预测一个固定离散深度集上的深度分布。利用相机的内参和外参以及预测的深度分布,我们将图像PV特征转换为3D以获得体素网格

图片

。我们通过将

图片

重新排列并应用3D卷积来减少通道维度,从而将这些体素特征编码为BEV空间特征。

模态内外融合:我们提出的模态内外融合模块IIF(Fintra, Finter)以Fintra和Finter特征作为输入,这些特征分别由BEV空间的Fl_bev和Fc_bev,PV空间的Fc_pv和Fl_pv表示。具体来说,在BEV空间中,LiDAR表示模态内特征,而相机表示模态外特征;在PV空间中,情况正好相反。图2b展示了我们的融合模块架构,其中使用了两个模态内外基础单元。

第一个模态内外基础单元应用了两个连续的窗口注意力层,随后是一个带有残差连接的前馈网络(FFN),如图2c所示。更确切地说,它将Finter和Fintra连接起来以获得Funified,然后将特征图划分为大小为M×M的非重叠窗口,用于Funified和Fintra。在此过程中,Funified用于获得窗口注意力的键(Kunified)和值(Vunified),而Fintra用于获取查询(Qintra)。根据,我们添加了一个相对位置偏置B∈RM²×M² 以提供位置信息。使用这些键、查询和值矩阵在相应分区之间应用注意力,实际上构成了窗口注意力,可以定义如下:

图片

其中d是嵌入维度。之后,Funified特征通过

图片

的偏移操作来获取另一个窗口注意力层的键和值。前一个窗口注意力层的输出通过一个FFN层后,作为新窗口注意力层的查询。通过在保持查询特征固定的同时偏移键和值特征,我们可以创建跨窗口连接,从而有效地增加跨模态的注意力范围。然后我们应用公式(1)中定义的注意力机制,随后是另一个FFN层。

第二个模态内外基础单元与第一个单元类似,主要区别在于融合特征Funified在传递给第二单元之前,首先经过一系列卷积层处理。这种方法允许第二单元捕获全局增强的空间上下文,而第一个单元专注于捕获局部上下文。我们将这些单元的输出连接起来,形成融合模块的最终输出。

总的来说,我们的融合模块有效地整合了两种模态的特征,并以模态内特征为条件,生成全面的融合特征。这种分层方法在捕获局部模式(识别和区分对象的关键)和获得场景及对象之间关系的更广泛上下文理解之间实现了平衡。需要注意的是,我们在BEV和PV中都使用了我们的融合模块实例来融合视角特定的特征。

解码器:我们网络的解码器使用两组平行的标准transformer解码器,分别与BEV和PV中的融合特征进行交互。每组包含两个解码器层。这些独立视角特定解码器的更新查询随后被合并,并传递通过另外两个解码器层,在这里查询同时与融合的BEV和PV特征进行交互。

3D位置感知特征:在将从PV和BEV空间提取的特征传递给解码器之前,我们通过编码3D位置信息来增强它们。我们首先为每个相机i生成一个均匀间隔的网格Gi,以及一个BEV网格Gbev。我们在各自相机的视锥空间中定义

图片

,其中Wf是宽度,Hf是高度,Df是视锥的深度。网格中的每个点a可以表示为

图片

,其中

图片

代表相机PV(透视图)中的像素坐标,da表示深度值。最后,使用相机和LiDAR传感器之间的外部校准参数,可以计算相应的3D坐标

图片

同样,在BEV网格中,任意点b可以表示为

图片

,其中

图片

是BEV特征空间中的像素位置,hb是高度值。通过将BEV像素位置乘以BEV网格的尺寸(sx, sy),可以简单地计算出相应的3D点

图片

。这些代表每个视图的3D点随后会被传递到一个MLP(多层感知机)网络中,并转换为3D位置嵌入(3D Positional Embeddings (PE))。融合的特征Fbev和Fpv通过一个1 × 1的卷积层处理,随后与相应视图的3D位置嵌入相加,从而生成3D位置感知特征

图片

图片

查询初始化: 我们首先在标准化的3D世界坐标系中以均匀分布初始化一组可学习的锚点。这些3D锚点的坐标会被传递到一个小型MLP(多层感知机)网络中,经过两层线性层处理后生成初始的对象查询Q0。

查询优化: 我们分别在每个视图中独立优化初始对象查询Q0,得到优化后的查询Qbev(用于鸟瞰图BEV)和Qpv(用于透视图PV),通过两个DETR风格的解码层进行优化。接着,我们将视图特定的分支Qbev和Qpv连接起来,得到联合查询

图片

,并将联合特征

图片

结合。我们使用两个额外的解码层来预测最终的对象类别和边界框。

在训练过程中,我们使用Hungarian算法来找到预测对象与真实对象之间的最佳匹配。对于分类任务,我们采用focal loss(焦点损失),对于3D边界框回归任务,我们采用L1 loss。

3.2 LiDAR 和多视角相机掩码建模

对于多模态掩码建模预训练,我们首先将来自多视角相机的图像进行分块,并将LiDAR的点云进行体素化处理。为简单起见,我们将这些称为“tokens”(标记),使用一种模态无关的术语。然后,我们应用一种不对称的掩码策略,随机掩盖每种模态中的tokens,其中一种模态被随机选择,其掩码率比另一种模态高。接下来,我们对未被掩码的tokens添加高斯噪声。随后,我们为这些tokens添加位置编码,并通过每个模态的编码器进行处理。接着,模态内外融合模块执行多模态融合,并在顶部添加简单的解码器,以学习三个预训练目标。图5展示了我们多模态掩码建模的流程。

掩码标记重构:我们从PV分支重建每个被掩码的图像块,并从BEV分支重建体素,以加强空间相关性的学习。对于前者,我们在被掩码像素的预测值与相应的RGB值之间使用L1损失。对于后者,我们使用Chamfer距离进行监督,该距离用于测量两组点之间的距离。

未掩码标记去噪:我们为每个未掩码的图像块和体素引入了去噪目标,以增强高频组件的学习,如细节和表面变化。对于未掩码的图像块,我们在预测噪声与实际添加的噪声之间使用L1损失。类似地,对于未掩码的体素,我们计算去噪损失,类似于Chamfer距离,真实值表示每个点实际添加的噪声。

掩码标记的跨模态属性预测:我们引入了一个跨模态属性预测任务,用于利用未掩码模态tokens中的互补信息预测被掩码tokens的属性。通过上述不对称的掩码策略,掩码率较高的模态中的被掩码tokens将有更高概率与另一模态中未被掩码的点相对应。这种设置允许我们创建一个明确鼓励模型利用未掩码tokens的跨模态信息来预测被掩码tokens属性的目标。具体来说,我们为被掩码体素中的点添加了对应像素强度的预测任务。对于被掩码的图像块,我们预测深度值。这通过利用跨模态协同作用确保了更有效的多模态表示学习。对于深度训练,我们使用深度损失。对于像素强度预测,我们将一个L1损失项添加到掩码标记重构的Chamfer距离损失中。我们在补充材料中详细列出了预训练目标的每个损失项。在预训练过程中,我们将所有单独的损失相加,以计算总的预训练损失。

4.Experiment

4.1 基准测试结果

在表1中,我们将提出的方法与其他最先进的方法在nuScenes(表1a)和Argoverse 2(表1b)数据集上的3D目标检测进行了比较。此外,对于nuScenes数据集,我们还评估了ProFusion3D的鲁棒性(表1c),研究当LiDAR或相机输入不可用时性能的影响。我们的方法在nuScenes上达到了71.1%的mAP,在Argoverse2上达到了37.7%的mAP,分别比表现最好的基准方法UniTR和CMT高出0.6%和1.6%。在这两个数据集上的持续性能提升表明,使用渐进融合最小化了信息损失,而多模态掩码建模能够学习到更丰富的多模态表示。在表1c中展示的鲁棒性评估中,我们使用鲁棒性训练策略训练了我们的模型。在相机传感器失效的情况下,我们的方法比BEVFusion高出0.9%。在LiDAR失效的情况下,它比CMT高出0.7%。虽然基准融合方法在不同传感器失效时表现出可变的鲁棒性,但我们的方法在每种情况下都始终保持较高的性能,并在接近最先进的单模态方法时表现出相对稳定的性能。

图片

4.2 消融研究

我们首先研究了多模态掩码建模流程对下游3D目标检测任务的数据效率的影响,并评估了每个预训练目标。随后,我们讨论了渐进融合方法中各个组件的影响。

图片

数据效率:使用自监督学习的主要好处之一是减少了对标注数据的需求。为了研究各种数据集大小的影响,我们使用不同的标注数据子集分别训练了两个版本的模型,其中一个模型是随机初始化的,另一个模型使用自监督目标在整个数据集上进行预训练。请参阅补充材料了解数据子集的编译策略。实验结果显示,使用多模态掩码初始化的80%数据集训练的模型优于使用100%数据训练的模型。在标注数据最少的情况下,性能提升最显著,表明在低数据设置下,多模态潜在表示学习效果最佳。此外,所有预训练模型在所有标注比例上均优于随机初始化的对照组。

预训练目标的作用:为了研究预训练目标的协同作用,我们使用不同的目标组合预训练了模型,重点研究了20%标注数据的子集。结果显示,仅使用掩码标记重构目标训练时,表现出稳固的基线,通过融合模块展示了有效的多模态表示。添加未掩码标记去噪目标后,由于增强了对噪声的鲁棒性,细节提取得到了改善,mAP增加了0.8%。跨模态标记属性预测结果提高了1.1%,进一步增强了模型利用互补模态特征的能力。结合这两个目标,mAP增加了1.5%,表明这些预训练目标的协同作用通过提高鲁棒性和跨模态理解来提升了模型性能。

两种视图空间中的融合影响:表2c展示了仅在BEV空间进行融合与在BEV和PV空间同时融合的结果。我们的模态内外融合(IIF)模块在BEV空间中的mAP比非融合对照组高出4.8%,证明了其有效性。在BEV和PV空间中执行融合进一步带来了1%的mAP提升,表明使用两个视图空间比单一视图空间能保留更多信息。

模态内外融合的重要性:为了研究模态内外注意力的影响,我们将融合模块替换为多种配置,如表2d所示。我们最初在每个视图空间中将模态内和模态外特征进行连接作为融合。接着,我们对模态内特征应用自注意力,再使用模态外特征的交叉注意力进行融合。然后我们实验使用两个连续的模态内外基础单元(见第3节),第一个单元在模态内特征上执行窗口自注意力,第二个单元在模态内和模态外特征上执行窗口交叉注意力。最终,我们使用模态内外融合(IIF)模块。结果显示,作为融合块的模态内外基础单元优于其他变体,而IIF模块实现了最佳性能,突显了局部和全局空间上下文的重要性。

视图特定解码器的必要性:表2e比较了同时与融合视图空间特征交互的视图无关解码器与我们提出的配置(视图特定解码器后跟视图无关解码器)之间的性能差异。我们配置中的更高mAP表明,直接通过目标查询进行融合会导致不平衡,BEV特征会压倒PV特征。

结论

本文的主要贡献如下:

(1) 我们提出了ProFusion3D,一种新颖的激光雷达-摄像头3D目标检测方法,该方法在不同阶段和不同视角中进行融合。
(2) 提出了一个新颖的模态内和模态间融合模块,执行视角特定特征的自窗口和交叉窗口注意力。
(3) 提出了一个用于室外激光雷达-摄像头融合方法的自监督预训练策略。
(4) 对ProFusion3D在nuScenes和Argoverse2基准数据集上的广泛评估和消融研究。

文章引用:
Progressive Multi-Modal Fusion for Robust 3D Object Detection

最后别忘了,帮忙点“在看”。  

您的点赞,在看,是我创作的动力。

AiFighing是全网第一且唯一以代码、项目的形式讲解自动驾驶感知方向的关键技术。

长按扫描下面二维码,加入知识星球。

相关文章:

断其一指,无惧!ProFusion3D: 相机或者激光失效仍高效的多传感器融合3D目标检测算法

Abstract 多传感器融合在自动驾驶中的3D目标检测中至关重要,摄像头和激光雷达是最常用的传感器。然而,现有方法通常通过将两种模态的特征投影到鸟瞰视角(BEV)或透视视角(PV)来进行单视角的传感器融合&…...

CCS字体、字号更改+CCS下载官方链接

Step1、 按照图示箭头操作 step2 Step3 点击确定,点击Apply(应用),点击Apply and close(应用和关闭) 4、历代版本下载链接 CCS下载:官方链接https://www.ti.com/tool/CCSTUDIO The last but not least 如果成功的解决了你的问题&#x…...

YOLO11改进|注意力机制篇|引入SEAM注意力机制

目录 一、【SEAM】注意力机制1.1【SEAM】注意力介绍1.2【SEAM】核心代码二、添加【SEAM】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4三、yaml文件与运行3.1yaml文件3.2运行成功截图一、【SEAM】注意力机制 1.1【SEAM】注意力介绍 下图是【SEAM】的结构图,让我们简单分析一下…...

简历修订与求职经历 - Chap04

节后第一周有点山中无甲子的状况。Oct08,节后第一天几乎全天处于心流状态。上午下午很快时间就结束了。 周五,按照既有的面试频次,感觉可以做点别的。然后就联系了附近的驾校,打算把摩托车驾驶证拿了。然后几乎到了驾校&#xff…...

鸿蒙开发案例:推箱子

推箱子游戏(Sokoban)的实现。游戏由多个单元格组成,每个单元格可以是透明的、墙或可移动的区域。游戏使用Cell类定义单元格的状态,如类型(透明、墙、可移动区域)、圆角大小及坐标偏移。而MyPosition类则用于…...

mysql--表的约束

目录 理解表的约束和操作 如何理解? 1、空属性null 2、默认值default 3、列描述comment 4、自动填充zorefill 5、主键primary key (1)创建表时指定可以 (2)创建表后指定key (3)删除主…...

Ubuntu 上安装 docker 并配置 Docker Compose 详细步骤

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...

MySQL去除空白字符(如非标准空格、制表符等)

在 MySQL 中,需要去除 site_name 字段的空格,可以使用 TRIM() 函数。这个函数可以去掉字符串开头和结尾的空格。以下是一个示例查询,演示如何选择去除空格后的 site_name: SELECT TRIM(site_name) AS site_name FROM site_info;如…...

2063:【例1.4】牛吃牧草

【题目描述】 有一个牧场,牧场上的牧草每天都在匀速生长,这片牧场可供15头牛吃20天,或可供20头牛吃10天,那么,这片牧场每天新生的草量可供几头牛吃1天? 【输入】 (无) 【输出】 如题…...

QT开发:深入掌握 QtGui 和 QtWidgets 布局管理:QVBoxLayout、QHBoxLayout 和 QGridLayout 的高级应用

目录 引言 1. QVBoxLayout:垂直布局管理器 基本功能 创建 QVBoxLayout 添加控件 添加控件和设置对齐方式 设置对齐方式 示例代码与详解 2. QHBoxLayout:水平布局管理器 基本功能 创建 QHBoxLayout 添加控件 添加控件和设置对齐方式 设置对齐…...

Bootstrapping、Bagging 和 Boosting

bagging方法如下: bagging和boosting比较...

板块龙头公司

高通 高通(Qualcomm)是一家总部位于美国加利福尼亚州的全球领先半导体和电信设备公司。成立于1985年,高通专注于无线通信技术的研发和创新。 移动处理器: 高通开发的骁龙(Snapdragon)系列芯片广泛用于智能手机和平板电…...

Java项目-基于Springboot的招生管理系统项目(源码+说明).zip

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...

使用 MongoDB 构建 AI:利用实时客户数据优化产品生命周期

在《使用 MongoDB 构建 AI》系列博文中,我们看到越来越多的企业正在利用 AI 技术优化产品研发和用户支持流程。例如,我们介绍了以下案例: Ventecon 的 AI 助手帮助产品经理生成和优化新产品规范 Cognigy 的对话式 AI 帮助企业使用任意语言&a…...

【React】React18核心源码解读

前言 本文使用 React18.2.0 的源码,如果想回退到某一版本执行git checkout tags/v18.2.0即可。如果打开源码发现js文件报ts类型错误请看本人另一篇文章:VsCode查看React源码全是类型报错如何解决。 阅读源码的过程: 下载源码 观察 package…...

部署私有仓库以及docker web ui应用

官方地址:https://hub.docker.com/_/registry/tags 一、拉取registry私有仓库镜像 docker pull registry:latest 二、运⾏容器 docker run -itd -v /home/dockerdata/registry:/var/lib/registry --name "pri_registry1" --restartalways -p 5000:5000 …...

DAY57WEB 攻防-SSRF 服务端请求Gopher 伪协议无回显利用黑白盒挖掘业务功能点

知识点: 1、SSRF-原理-外部资源加载 2、SSRF-利用-伪协议&无回显 3、SSRF-挖掘-业务功能&URL参数 SSRF-原理&挖掘&利用&修复 漏洞原理:SSRF(Server-Side Request Forgery:服务器端请求伪造) ,一种由攻击者构造形成由服务…...

光盘刻录大文件时分卷操作

可以使用 split 命令来将大文件 finetune.tar 分卷为适合光盘大小的文件片段,然后在离线服务器上合并这些分卷文件。以下是具体的操作步骤: 步骤1:分卷文件 假设你的文件 finetune.tar 大小为35GB,并且你想分卷为每个4.7GB&…...

Kafka系列之:生产者性能调优

Kafka系列之:生产者性能调优 一、producer.type二、request.required.acks三、max.request.size四、batch.size五、buffer.memory一、producer.type 在Kafka中,producer.type是一个配置属性,用于指定Producer的类型。它有两个可能的值: sync:同步发送模式。当设置为sync时…...

【linux】进程创建与进程终止

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.进程创建02.进程终止异常终止如何终止exit()_exit() 01.进程创建 #include <unistd.h> pid_t fork(void);返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...