【论文阅读笔记】Learning to sample

Learning to sample

  • 前沿
  • 引言
  • 方法
    • 问题声明
    • S-NET
    • 匹配
    • ProgressiveNet: sampling as ordering
  • 实验
    • 分类
    • 检索
    • 重建
  • 结论
  • 附录

前沿

这是一篇比较经典的基于深度学习的点云下采样方法

核心创新点:

  1. 首次提出了一种学习驱动的、任务特定的点云采样方法
  2. 引入了两种采样网络:
    S-NET:为不同采样大小训练独立网络
    ProgressiveNet:可以按重要性对点进行排序,实现任意采样比例
  3. 通过两个损失函数来优化采样:
    任务损失:使采样点适合特定任务
    采样损失:确保生成点接近原始点云

paper:https://arxiv.org/abs/1812.01659
code:

当点云数量较多时,不适合拿来直接做下游任务,流行的采样技术是最远点采样 (FPS)。然而,FPS 与下游应用程序(分类、检索等)无关。基本假设是,最小化最远点距离,如FPS所做的那样,是其他目标函数的一个很好的代理。我们提出了一个深度网络来简化三维点云。称为 S-NET 的网络采用点云并生成针对特定任务优化的较小点云。在两个标准数据集上进行实验,与 FPS 进行对比显示出更好的结果。

引言

点云数据近年来使用愈加频繁,点云数据的下采样方法也随之更加重要。可以降低功耗、计算成本和通信负载,等等。常规方法中,如随机采样、均匀采样、最远点采样(Farthest Point Sampling, FPS)。点云已被广泛用于分类、部分分割、语义分割、检索等任务,相关技术如自动编码、生成、补全和上采样也被广泛探索。但在这篇文章之前,还没有专门针对下采样的“学习类方法”。
我们提出了一种简化网络,称为S-NET,它基于PointNet[1]的体系结构学习生成一个较小的(简化的)点云,该点云针对下游任务进行了优化,例如分类、检索或重建。
简化的点云必须平衡两个相互冲突的约束。一方面,我们希望它保留原始形状的相似性。另一方面,我们希望将其优化为后续任务。
我们通过训练网络生成一组满足两个目标的点来解决这个问题:采样损失和任务的损失。采样损失驱动生成的点接近输入点云任务损失确保点最适合任务。

FPS的一个优点是它对原始点的子集进行采样。相比之下,S-NET 生成的简化点云不能保证是输入点云的子集,我们在推理时执行后处理步骤,我们将生成的点与输入点云进行匹配,并获得其中的一个子集,即一组采样点(见图 1)。实验表明,与 FPS 相比,使用我们的采样点实现了对多个任务的更好结果

我们的方法可以被认为是一种特征选择机制[27,28]。每个点都是底层形状的特征,我们试图选择对任务贡献最大的特征。它还可以解释为视觉注意的一种形式[29,30],将后续任务网络集中在重要点上

S-NET 被训练以输出固定的样本量,这意味着我们需要为每个目标大小训练不同的 S-NET。为了克服这个限制,我们引入了称为 ProgressiveNet 的 S-NET 的扩展。ProgressiveNet 对任务的重要性排序点。这允许在推理时选择样本大小,从而允许动态细节级别的管理

所提出的采样方法应用于三个不同的任务:点云分类、检索和重建。我们将我们的方法与常见的非数据驱动方法进行比较:随机抽样和 FPS。对于第一个任务,我们展示了更好的分类精度;在第二个任务中,我们展示了改进的检索结果;最后我们得到了更低的重建误差。

总而言之,我们的主要贡献是:
• 点云的特定任务数据驱动采样方法;
• 渐进式采样方法,根据点与任务的相关性对点进行排序;
• 使用采样点云进行点云分类、检索和重建的性能改进。

方法

问题声明

给定一个点集 P = p i ∈ R 3 , i = 1... n P = {p_i ∈ R^3, i = 1...n} P=piR3,i=1...n,样本大小 k ≤ n k ≤ n kn 和任务网络 T T T ,找到 k k k 个点的子集 S ∗ S^∗ S,以最小化任务网络的目标函数 f f f

S ∗ = arg min ⁡ S f ( T ( S ) ) , S ⊂ P , ∣ S ∣ = k < n . S^*=\argmin_S f(T(S)), S\subset P,|S|=k<n. S=Sargminf(T(S)),SP,S=k<n.

这个问题带来了挑战,因为采样似乎类似于池化,但在池化中,池化值是向前传播的,因此可以计算关于它的梯度。然而,离散采样类似于“argpooling”,其中传播的值不能增量更新。因此,不能直接训练采样操作。因此,我们提出了一个两步过程:首先,我们使用神经网络,即 S-NET,生成一组点。其次,我们将生成的点与输入点云进行匹配,得到其点的子集,即采样点
在这里插入图片描述

图 1 说明了该过程。S-NET 的输入是一组 n 个 3D 坐标,即点,表示 3D 形状。S-NET 生成点的输出。S-NET 后跟一个任务网络。任务网络在 n 个点的输入上进行了预训练,以在点云(即分类、检索或重建)上执行给定的任务。在 S-NET 的训练和测试期间保持固定。这确保了采样被优化到任务中,而不是被优化到任意采样的任务

在训练阶段,生成的点被馈送到任务网络。通过最小化任务损失,这些点一方面针对任务进行了优化。我们使用一个额外的采样正则化损失项,它鼓励每个生成的点接近输入点之一,并强制生成的点分布在输入点云上。在推理时,将生成的点与输入点云进行匹配,以获得其子集。这些是采样点,我们过程的最终输出。这些点通过任务网络,并评估其性能。
我们提出了两个采样版本:S-NET 和 ProgressiveNet。在第一个版本(图 1)中,我们
为每个样本大小训练不同的采样网络
。在第二个(图 2)中,我们训练了一个网络**,该网络可用于生成任何小于输入大小的样本量**。

S-NET

S-NET的体系结构遵循等PointNet 网络的体系结构。输入点经历一组 1×1 的卷积层,从而产生每个点的特征向量。然后,使用对称特征最大池化操作来获得全局特征向量。最后,我们使用几个全连接层最后一层的输出是生成的点集

让我们将生成的点集表示为 G G G,输入点集表示为 P P P。我们构建了一个采样正则化损失,由三项组成:

L f ( G , P ) = 1 ∣ G ∣ ∑ g ∈ G min ⁡ p ∈ P ∥ g − p ∥ 2 2 L_{f}(G, P)=\frac{1}{|G|} \sum_{g \in G} \min _{p \in P}\|g-p\|_{2}^{2} Lf(G,P)=G1gGpPmingp22
该公式最小化生成点 G 中的每个点 g 到 P 中最近点 p 的平方距离的平均值。

L m ( G , P ) = max ⁡ g ∈ G min ⁡ p ∈ P ∥ g − p ∥ 2 2 L_{m}(G, P)=\max _{g \in G} \min _{p \in P}\|g-p\|_{2}^{2} Lm(G,P)=gGmaxpPmingp22
该公式首先找到生成点集G 中每个点 g 到输入点集 P 中最近点 p 的平方距离,然后选取这些最小距离中的最大值。这样做是为了减少生成点集中最远的点与输入点集中最近点之间的距离,从而防止生成点集中的某些点远离输入点集,这会增加匹配过程中的不确定性。

L b ( G , P ) = 1 ∣ P ∣ ∑ p ∈ P min ⁡ g ∈ G ∥ p − g ∥ 2 2 L_{b}(G, P)=\frac{1}{|P|} \sum_{p \in P} \min _{g \in G}\|p-g\|_{2}^{2} Lb(G,P)=P1pPgGminpg22
该公式计算输入点 P 中每个点 p 到生成点 G 中最近点 g 的平方距离的平均值。

L f L_f Lf L m L_m Lm 使得 G G G 中的点在平均情况和最坏情况中分别接近 P i P_i Pi中的点。这旨在鼓励在随后的匹配过程中实现紧密匹配。我们发现混合平均和最大操作可以加速收敛 L b L_b Lb 确保生成的点在输入点上均匀分布,从而减少匹配过程中的冲突。采样正则化损失是这三项的加权和:

L s ( G , P ) = L f ( G , P ) + β L m ( G , P ) + ( γ + δ ∣ G ∣ ) L b ( G , P ) L_{s}(G, P) = L_{f}(G, P)+\beta L_{m}(G, P) +(\gamma+\delta|G|) L_{b}(G, P) Ls(G,P)=Lf(G,P)+βLm(G,P)+(γ+δG)Lb(G,P)

请注意,这是倒角距离(chamfer distance)的推广,当 β = 0 , γ = 1 和 δ = 0 β=0,γ=1和δ=0 β=0γ=1δ=0时实现。此外,我们将 L t a s k L_{task} Ltask表示为任务网络损失。S-NET 总损失为:

L S − N E T ( G , P ) = L task  ( G ) + α L s ( G , P ) L^{S-N E T}(G, P)=L_{\text {task }}(G)+\alpha L_{s}(G, P) LSNET(G,P)=Ltask (G)+αLs(G,P)

其中,α 控制正则化的权衡。S-NET 的输出是一个 k×3 的矩阵,其中 k 是样本大小,我们为每个 k 单独训练。

匹配

生成的点 G G G 不能保证为输入点 P P P 的子集。为了获得输入点的子集,我们将生成的点与输入点云进行匹配。

匹配两个点集的一种广泛使用的方法是地球移动距离(EMD)[17,23,26,40]。EMD 找到最小化对应点平均距离的集合之间的双射,而点集需要具有相同的大小。然而,在我们的例子中,G 和 P 的大小不同。我们研究了两种匹配方法。第一个将 EMD 适应不均匀的点集。第二个基于最近邻 (NN) 匹配。在这里,我们描述了后者,它产生了更好的结果。读者可以参考补充材料了解有关其他匹配方法的详细信息。

在基于 NN 的匹配中,每个点 x ∈ G 被替换为其最接近的欧几里得对应点 y^∗ ∈ P :

这里有点类似于 VQVAE 或者 VQGAN 中的量化操作

y ∗ = argmin ⁡ y ∈ P ∥ x − y ∥ 2 . y^{*}=\underset{y \in P}{\operatorname{argmin}}\|x-y\|_{2} . y=yPargminxy2.

由于 G 中的几个点可能最接近 P 中的同一点,因此唯一采样点的数量可能小于请求样本量

因此,我们删除重复点并获得初始采样集。然后,我们通过运行最远点采样(FPS)[2]来完成这个集合,直到G的大小,在每一步中,我们添加离当前采样集最远的P点。匹配过程仅在推理时应用,作为推理最后一步。在训练期间,生成的点由任务网络处理,因为匹配是不可微的,不能将任务损失传播回 S-NET。

ProgressiveNet: sampling as ordering

在这里插入图片描述
S-NET 被训练以将点采样为单个预定义的样本大小。如果需要多个样本量,则需要训练多个 S-NET。但是,如果我们想训练一个可以产生任何样本大小的网络,即以任何采样率对输入进行采样。为此,我们提出了 ProgressiveNet。ProgressiveNet被训练来取给定大小的点云并返回相同大小的点云,由相同的点组成。但是,虽然输入的点是任意排序的,但输出的点按其与任务的相关性排序。这允许对任何样本大小进行采样:为了获得大小为 k 的样本,我们只需取 ProgressiveNet 的输出点云的前 k 个点并丢弃其余部分。架构最后一个完全连接的层大小等于输入点云大小(有3n个元素)

为了训练 ProgressiveNet(图 2),我们定义了一组大小 C s = 2 1 , 2 2 , 。 . . , 2 l o g 2 ( n ) C_s = {2^1, 2^2,。.., 2^{log2(n)}} Cs=21,22,..,2log2(n)。对于每个大小 c ∈ C s c ∈ C_s cCs,我们计算任务损失项和采样正则化损失项,使得总 ProgressiveNet 的损失变为:

L ProgressiveNet  ( G , P ) = ∑ c ∈ C s L S − N E T ( G c , P ) L^{\text {ProgressiveNet }}(G, P)=\sum_{c \in C_{s}} L^{S-N E T}\left(G_{c}, P\right) LProgressiveNet (G,P)=cCsLSNET(Gc,P)

其中 L S − N E T L^{S-NET} LSNET 是等式 6 中定义的损失项, G C G_C GC 是 ProgressiveNet 生成的点的前 c 个点(输出层的前 3c 个元素)。这个损失函数定义了点子集的嵌套结构。例如,由两点组成的第一个子集在所有术语 L S − N E T ( G C , P ) L^{S-NET}(GC, P) LSNET(GC,P) 中用于 c ≥ 2。因为这个子集在所有术语中都使用,所以它包含在所有更大的子集中。类似地,前 4 个点定义了第二个子集,其中包括第一个子集并且是所有更大子集的一部分。

在这个训练过程中,前 k 个生成点(对于任何 k)被优化为适合手头的任务作为一个独立集,并与前面的点集成以创建更大的集合,这将改善给定任务的结果。这确保了对任务更重要的点将出现在生成的点集中,而额外的点将给出边际效用递减,从而导致点云的面向任务的渐进分解[41]。在推理时,生成的点(ProgressiveNet 的输出层)与输入点云匹配,使用我们在第 3.2 节中用于 SNET 的相同匹配过程。我们将生成的点的顺序转移到它们的匹配点。为了获得特定的样本量 k,我们取前 k 个采样点。

实验

我们将 S-NET 应用于三个任务:点集分类 [1]、检索和重建 [17]。对于分类和检索,我们采用Qi等人[1]和PointNet[1]提供的ModelNet40[42]点云数据作为任务网络。对于重建,我们使用ShapeNet Core55存储库[43]和Achlioptas等人[17]的点集自动编码器。随机抽样和 FPS 被用作替代的非数据驱动采样方法,以便与我们提出的方法进行比较。为了公平比较,我们**只在匹配过程之后使用 S-NET 点,因此我们的采样点和替代方法的点都是输入点云的子集。**进一步的实验细节可以在补充材料中找到。

分类

我们报告了 ModelNet40 数据集上的实例分类结果,采用官方训练测试拆分。我们使用 PointNet 的完整版本作为 S-NET 的任务网络和 ProgressiveNet 的 PointNet 的普通版本(以节省训练时间),除非另有说明。
在这里插入图片描述

图 3 显示了 PointNet 在完整数据(每个点云 1024 个点)上进行训练并在不同大小的样本上进行测试时的分类精度。我们比较了几种不同的采样方法:随机采样与输入点上的均匀分布,FPS 和 S-NET。我们训练了 10 个不同的 S-NET,对于 k ∈ {2, 4, 8,., 1024} 分。采样率定义为 n/k = 1024/k。我们观察到,使用 S-NET 采样点的分类精度等于或优于在任何采样率下使用 FPS 的点,边距高达 34.2%(对于采样率 32)。
在这里插入图片描述
表 1 显示,当在 S-NET 采样的点上进行训练时,PointNet 的准确度也更高。此表中的每个数字代表一个不同的 PointNet,每个 PointNet 都在使用不同采样方法采样的特定大小的点云上进行训练和测试。例如,我们看到,在使用 S-NET 时,仅在 16 个点的点云上进行训练和测试的 PointNet 实现了 85.6% 的准确率,而 FPS 仅为 76.7%。这表明 S-NET 不过度拟合它所训练的分类器的特定实例。相反,它以使采样集易于分类的方式对点进行采样,从而在数据中的不同类别之间产生强烈的区分。
在这里插入图片描述

ProgressiveNet 在图 4 中,我们比较了 PointNet vanilla 在 S-NET 采样的点上的准确性(在这种情况下使用 PointNet vanilla 训练)与 ProgressiveNet 采样的点的准确性。评估是针对所有样本量完成的范围[2,1024]。S-NET 结果来自 10 个不同的 SNET,每个 NET 针对特定样本大小进行训练,大小为 k ∈ {2, 4, 8,., 1024} 分。对于这些值之间的样本量,我们采用针对较低样本量训练的 S-NET,然后使用 FPS 完成所需的大小。例如,为了获得大小为 48 的样本**,我们采用了 S-NET 采样的点,该点经过训练可以对 32 个点进行采样,然后进行 16 步 FPS。渐进式结果来自一个输出大小为 1024 的 ProgressiveNe**t,它使用大小为 Cs = {2, 4, 8, …, 1024}。

我们观察到 S-NET 对它训练的样本量具有更好的性能,而 ProgressiveNet 对介于两者之间的任何样本量都表现得更好。这显示了 ProgressiveNet 的优势,它按优先级对点进行排序,以便准确度在样本大小上近似单调增加。

S-NET 假设任务网络已经经过训练。这将导致在非常大的点云的情况下出现问题。我们表明,可以在 FPS 采样的点云上训练任务网络并使用它来训练 S-NET。然后可以使用生成的 S-NET 将任务网络重新训练为更高的准确性。
有关所提出的训练和测试过程的说明,请参见图 5。以下小规模模拟证明了这一点:我们使用 FPS 为每个点云采样 ModelNet40 到 k = 32 个点,并在这些采样点上训练 PointNet。这是我们的基线。基线在测试集上的准确率为 82.2%。当我们用大小为 1024 的点云馈送这个经过训练的 PointNet 时,准确率仅为 46.6%。然后,我们使用 32 大小的点云训练集和基线 PointNet 作为任务网络来训练 S-NET。然后我们使用 S-NET 再次采样 ModleNet40 的大小为 k = 32,这次使用 S-NET。最后,我们在 S-NET 采样的点上训练 PointNet。在测试集上重新训练 PointNet 的准确性提高到 86.0%。使用 S-NET 允许我们在不在更大的点云上进行训练的情况下提高 PointNet 的准确性。

PointNet 类网络的时间复杂度主要由它们的逐点卷积层组成,因此强烈依赖于输入点云的大小。S-NET 的空间复杂度是其输出大小 k 的线性函数。S-NET 在空间(参数数量)和推理时间(浮点运算的数量)之间进行权衡。例如,级联 S-NET 对 1024 到 16 个点的点云进行采样,与在完整点云上运行 PointNet 相比,使用以下 PointNet 将推理时间减少了 90% 以上,空间仅增加了 5%。请参阅补充材料中的全部细节。

在这里插入图片描述
在这里插入图片描述

我们应用匹配后处理步骤将自己与 FPS 直接比较。但是,可能存在 k 个输出点不必是原始点云的子集的设置。在这种情况下,我们可以直接使用 S-NET 生成的点,放弃匹配步骤。可以使用生成的点或采样点。第三种替代方法是在两者之间进行插值的,即使用离原始输入点很远的点。这是通过将每个生成的点与其匹配的采样点进行插值来完成的,以获得它们之间的直线上的第三个点,不超过采样点。**图 6 显示,当输入生成的点时,PointNet 的准确度更高。**对于归一化为单位球体的点云,我们发现选择 푡 = 0.05 会导致分类精度在采样点和生成点的准确度之间呈中间方向。请注意,푡 是在推理时设置的。

临界集采样 Qi等人[1]定义的临界集是导致最大池化特征的点集。我们的方法的一个合理替代方法可能是对贡献最多特征的临界点进行采样。我们尝试了这种方法,发现它仅在小采样率下是可行的。请参阅补充材料中的全部细节。

检索

在这里插入图片描述

我们现在表明,使用 S-NET 而不是 FPS 可以带来更好的检索结果。具体来说,我们采用用 PointNet 训练的 SNET 进行分类作为任务网络,而无需重新训练它。我们对点进行采样馈送到PointNet,并使用其倒数第二层作为形状描述符。检索是基于该形状描述符上的 L2 距离完成的。我们对 ModelNet40 测试集中的每个形状重复实验,用作查询形状。实验在 S-NET 和 FPS 的不同样本量下重复。表 2 总结了不同采样率和采样方法的平均精度 (mAP)。我们看到 S-NET 在大于 4 的采样率上表现更好,并且对采样率不太敏感。
在这里插入图片描述

图 7 显示了原始数据的精度-召回曲线和使用 FPS 和 S-NET 的采样数据,每个形状采样 tok=32 个点。我们在所有召回值上应用 S-NET 时观察到明显更好的精度

重建

我们学习使用自动编码器作为任务网络进行采样。我们使用了Achlioptas等人[17]提供的ShapeNet Core55点云数据及其自动编码器,并在表、汽车、椅子和飞机四个形状类上训练它。这些类有可用的模型。每个形状类都被分成 85%-5%-10% 用于训练验证测试集。自动编码器被训练来接收和重建2048个点的点云。自编码器的重构误差由倒角距离[17]测量。为了比较不同的采样方法,我们使用归一化重建误差 (NRE)。也就是说,我们从点的子集和完整点集重建完整的点集,并取两者之间的重构误差比。我们用以下样本大小训练了几个 S-NET:k ∈ {16, 32,., 2048},以及具有相同大小损失项的单个 ProgressiveNet。作为另一种采样方法,我们使用 FPS。

归一化重构误差 图 8 显示了 NRE 作为采样率的函数,其中采样率定义为 n/k = 2048/k。我们将 FPS 与 S-NET 和 ProgressiveNet 进行比较。对于小采样率,我们采样点的NRE类似于FPS。然而,随着采样率的增加,我们的采样方法优于 FPS。例如,在 32 的采样率下,FPS 的 NRE 略大于 2,而 S-NET 和 ProgressiveNet 的 NRE 分别约为 1.5 和 1.75。S-NET 实现了比 ProgressiveNet 更低的 NRE,因为前者针对每个采样率单独优化,从而提高了重建性能。我们学会从看不见的形状中采样点,从而实现更低的重建误差。

在这里插入图片描述

样本和重建可视化 图9比较了整个点云到来自 64 个点的样本量的重建结果,其中样本由 S-NET 或 FPS 产生。使用 S-NET 时的重建质量高于使用 FPS 和使用整个点云的方法。有趣的是,S-NET采样的点分布不均匀,而FPS采样的点的均匀分布更均匀

在这里插入图片描述
对抗简化 在这个概念证明中,我们展示了如何欺骗自动编码器。我们将点云简化为视觉上类似于一个类,但由自动编码器重构为来自不同类的形状。我们用一对输入和目标形状训练 S-NET,其中输入是一个类的形状,目标是另一个类的形状。采样损失介于 S-NET 生成的输入和点之间。重建损失在目标形状和重建形状之间。图 10 显示了将飞机变成汽车的结果

在这里插入图片描述

顶行:输入形状(蓝色)和 256 个生成点(红色)。底行:从生成的点重建目标形状和重建。虽然简化的点云类似于输入飞机形状,但它被重建为完全不同的形状——汽车!

结论

我们提出了一种学习如何对针对下游任务优化的点云进行采样的方法。该方法包括一个简化网络 S-NET,然后是一个后处理匹配步骤。我们还提出了一个称为 ProgressiveNet 的网络,用于根据每个点对任务的贡献对点云进行排序。在几个任务中,所得到的方法在采样点上优于FPS:点云的分类、检索和重建。

该方法是通用的,可以产生一个小的点云,它由不一定是原始输入形状一部分的点组成。输出点云相对于输入点云最小化几何误差,同时优化下游任务的目标函数。我们已经表明,学习样本可以改善结果并与各种应用结合使用。

附录

Todo

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

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

相关文章

[AIGC知识] layout理解

前言 要开组会了&#xff0c;随便讲个凑数吧。 参考论文 https://arxiv.org/html/2303.17189? 什么是layout数据&#xff1f; 像下图这样&#xff0c;Layout是每个图片的布局&#xff0c;其中包含一些物体的相应边界框和类别 layout信息如何整合表示并作为条件加入到网络…

【macos java反编译工具Java Decompiler】

mac上能用的反编译工具 https://java-decompiler.github.io/

C#+OpenCv深度学习开发(常用模型汇总)

在使用 OpenCvSharp 结合深度学习进行机器视觉开发时&#xff0c;有许多现成的模型可以使用。以下是一些常用的深度学习模型&#xff0c;适用于不同的机器视觉任务&#xff0c;包括物体检测、图像分类和分割等。 使用示例 在 OpenCvSharp 中加载和使用这些模型的基本示例&…

【生成模型之七】Classifier-free diffusion guidance

论文&#xff1a;classifier-free diffusion guidance 一、Background 分类器引导是一种最近引入的方法&#xff0c;用于在训练后的条件扩散模型中权衡样本丰富度和样本保真度&#xff0c;其思想与其他类型生成模型中的低温采样或截断相同。 分类器引导将扩散模型的分数估计…

【LeetCode每日一题】——415.字符串相加

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 字符串 二【题目难度】 简单 三【题目编号】 415.字符串相加 四【题目描述】 给定两个字符…

Why SAP TM?

最近发现跟 SAP TM 的集成越来越多了&#xff0c;并且发现这模块还挺大&#xff0c;很难一下子理解。TM&#xff08;Transportation Management&#xff09;- 顾名思义就是“运输管理”。起初很难想象为啥 SAP 会浪费大量的时间和精力开发“运输管理”&#xff0c;从而只是为了…

开源鸿蒙 5.0 正式版发布

在2024年的开放原子开发者大会上&#xff0c;开源鸿蒙5.0版本正式发布啦&#xff01;这个版本是一个比较大的升级&#xff0c;性能和功能都上了一个新台阶&#xff0c;让我们一起来看看都有哪些亮点。 首先&#xff0c;开源鸿蒙这个项目&#xff0c;从最初的700万行代码&#x…

直流有刷电机多环控制(PID闭环死区和积分分离)

直流有刷电机多环控制 提高部分-第8讲 直流有刷电机多环控制实现(1)_哔哩哔哩_bilibili PID模型 外环的输出作为内环的输入&#xff0c;外环是最主要控制的效果&#xff0c;主要控制电机的位置。改变位置可以改变速度&#xff0c;改变速度是受电流控制。 实验环境 【 &…

Odrive源码分析(四) 位置爬坡算法

Odrive中自带一个简单的梯形速度爬坡算法&#xff0c;本文分析下这部分代码。 代码如下&#xff1a; #include <cmath> #include "odrive_main.h" #include "utils.hpp"// A sign function where input 0 has positive sign (not 0) float sign_ha…

电视大全 1.3.8|汇聚多频道资源,秒切换流畅播放

电视大全TV版是一款功能丰富的TV端直播软件&#xff0c;由悠兔电视的同一开发者打造。最新版本更新了更多频道&#xff0c;包括央视、卫视和地方频道等&#xff0c;提供了多线路流畅播放体验&#xff0c;并支持节目回看、线路选择、开机自启等功能。该应用免登录且无购物频道&a…

JAVAweb学习日记(二)JavaScript

一、概念 二、JavaScript引入方式 三、JavaScript书写语法 输出语句&#xff1a; 变量&#xff1a; 数据类型、运算符、流程控制语句&#xff1a; 数据类型&#xff1a; 运算符&#xff1a; 字符串如果是 数字字符构成&#xff0c;先把读到的数字转为数字类型&#xff0c;后续…

深圳龙岗戴尔dell r730xd服务器故障维修

深圳龙岗一台DELL POWEREDGE R730XD服务器系统故障问题处理&#xff1a; 1&#xff1a;客户工厂年底产线整改&#xff0c;时不时的会意外断电&#xff0c;导致服务器也频繁停机&#xff0c; 2&#xff1a;多次异常停机后导致服务器开机后windows server系统无法正常启动了&…

Ansible 批量管理华为 CE 交换机

注&#xff1a;本文为 “Ansible 管理华为 CE 交换机” 相关文章合辑。 使用 CloudEngine - Ansible 批量管理华为 CE 交换机 wsf535 IP 属地&#xff1a;贵州 2018.02.05 15:26:05 总体介绍 Ansible 是一个开源的自动化运维工具&#xff0c;AnsibleWorks 成立于 2012 年&a…

2024年Python最新下载安装教程,附详细图文,持续更新

大家好&#xff0c;我是Python老安&#xff0c;今天为大家带来的是Windows Python3下载、安装教程&#xff0c;适用于 Python3 所有版本&#xff0c;包括 Python3.7,Python33.8,Python33.10 等版本。希望对大家有所帮助 Python目前已支持所有主流操作系统&#xff0c;在Linux,…

《点点之歌》“意外”诞生记

世界是“点点”的&#xff0c;“点点”是世界的。 (笔记模板由python脚本于2024年12月23日 19:28:25创建&#xff0c;本篇笔记适合喜欢诗文的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 …

网络安全检测

实验目的与要求 (1) 帮助学生掌握木马和入侵的防护和检测方法、提高学习能力、应用能力和解决实际问题的能力。 (2) 要求学生掌握方法, 学会应用软件的安装和使用方法, 并能将应用结果展示出来。 实验原理与内容 入侵检测是通过对计算机网络或计算机系统中若干关键点收集信…

c++------------------函数

函数定义 语法格式 函数定义包括函数头和函数体。函数头包含返回类型、函数名和参数列表。函数体是用花括号{}括起来的代码块&#xff0c;用于实现函数的功能。例如&#xff0c;定义一个计算两个整数之和的函数&#xff1a; int add(int a, int b) {return a b; }这里int是返回…

Java WEB:从起源到现代的传奇之旅

Java Web 起源于上世纪 90 年代&#xff0c;随着网络和浏览器的飞速发展&#xff0c;Java 为应对动态处理网页的需求&#xff0c;推出了 Servlet 技术。 1. Servlet 出现之前 在 Servlet 出现之前&#xff0c;用户请求主要是静态资源&#xff0c;如 html、css 等。此时的网络…

社区管理系统:实现社区信息数字化管理的实践

3.1可行性分析 开发者在进行开发系统之前&#xff0c;都需要进行可行性分析&#xff0c;保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该社区管理系统所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识&#xff0c;同…

DataV的安装与使用(Vue3版本)

1、DataV(vue3)地址&#xff1a;DataV Vue3TSVite版 | DataV - Vue3 2、使用 npm install kjgl77/datav-vue3 安装 3、全局引入。 4、此时就可以按需使用了~