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

PointCore——利用局部全局特征的高效无监督点云异常检测器论文与算法解读

概述

三维点云异常检测旨在从训练集中检测出异常数据点,是工业检测、自动驾驶等众多应用的基础。然而,现有的点云异常检测方法通常采用多个特征存储库来充分保留局部和全局特征表示,这带来了高昂的计算成本以及特征之间的不匹配问题。为解决这些问题,我们提出了一种基于联合局部 - 全局特征的无监督点云异常检测框架PointCore。具体而言,PointCore仅需一个存储库来存储局部(坐标)和全局(PointMAE)特征表示,并为这些局部 - 全局特征分配不同的优先级,从而降低推理过程中的计算成本和不匹配干扰。此外,为了增强对异常值的鲁棒性,我们引入了一种归一化排序方法,不仅可以将不同尺度的值调整到一个统一的尺度,还能将密集分布的数据转换为均匀分布。在Real3D - AD数据集上进行的大量实验表明,与最先进的Reg3D - AD方法及其他几种竞争方法相比,PointCore在推理时间上具有竞争力,并且在检测和定位方面均取得了最佳性能。

论文地址:https://arxiv.org/html/2403.01804v1

一、引言

异常检测旨在找出产品的异常区域,在工业质量检测、自动驾驶等多个领域发挥着重要作用。当前的异常检测方法大多是无监督的,主要针对二维图像,这些模型通常在具有成熟架构的图像上进行训练。对于基于三维点云的异常检测任务,目前相关文献的研究还相对较少。与二维图像相比,三维点云具有更丰富的结构信息,但同时也存在无序、高度稀疏和分布不规则的问题。为了有效地处理点云数据,人们应用了各种不同尺度的手工制作或基于深度学习的特征描述符。

最近,出现了一个大规模、高分辨率的三维异常检测数据集Real3D - AD。Real3D - AD数据集中的物体分辨率为0.001mm - 0.0015mm,具有360度覆盖范围和完美的原型。在相关研究中,作者将图像异常检测中的PatchCore方法应用于点云异常检测,并开发了一种基于通用配准的点云异常检测器Reg3D - AD。Reg3D - AD采用双特征表示方法来保留训练原型的局部和全局特征,检测精度较高,但推理速度较慢。目前的点云异常检测器主要可分为两类:
(1)基于重建的方法,这类方法通过自动编码器重建输入的点云数据,并通过比较原始数据和重建数据之间的偏差来识别异常。然而,这些方法对点云分辨率较为敏感,导致推理速度较慢且精度较差。
(2)基于存储库的方法,存储库可用于存储代表性特征,以隐式构建正态分布并查找分布外的缺陷。与前者相比,直接使用预训练的特征提取器构建存储库训练速度快,且不受点云分辨率的影响。除此之外,现有的点云异常检测器通常采用多个特征存储库来充分保留局部和全局特征表示,这带来了高昂的计算成本以及特征之间的不匹配问题。
在这里插入图片描述

图1:几种方法在Real3D - AD数据集上获得的异常得分热图。从可视化结果可以看出,与其他方法相比,本文提出的方法能够更准确地检测和定位异常数据点。

为解决上述问题,我们提出了一种基于联合局部 - 全局特征的无监督点云异常检测框架PointCore。具体而言,我们的贡献总结如下:

  1. PointCore仅需一个存储库来存储局部 - 全局特征表示,并为这些局部 - 全局特征分配不同的优先级,以降低推理过程中的计算成本和不匹配干扰。
  2. 我们提出了一种基于排序的归一化方法,以消除各种异常得分之间的分布差异,并应用点到平面迭代最近点(point - plane ICP)算法对 点云配准结果进行局部优化,从而做出更可靠的决策。
  3. 在Real3D - AD数据集上进行的大量实验表明,与最先进的Reg3D - AD方法及其他几种竞争方法相比,PointCore在推理时间上具有竞争力,并且在检测和定位方面均取得了最佳性能。

二、方法

2.1 全局和局部配准

与Reg3D - AD模型类似,我们应用快速点特征直方图(FPFH)特征描述符和随机抽样一致性(RANSAC)算法来实现点云的全局配准。为了增强点云配准的稳定性,引入了点到平面迭代最近点(point - plane ICP)算法对全局配准的输出进行局部优化。假设需要配准两个点云 X s X_{s} Xs(源点云)和 x t x_{t} xt(目标点云),具体步骤如下:

  1. 应用从全局配准获得的旋转矩阵和平移向量对 X s X_{s} Xs进行变换。
  2. x t x_{t} xt中搜索与 X s X_{s} Xs p i p_{i} pi距离最近的点 q i q_{i} qi,其中 q i q_{i} qi的法向量记为 n i n_{i} ni
  3. 假设最优旋转欧拉角 α \alpha α β \beta β γ \gamma γ趋近于0,此时 cos ⁡ ( θ ) → 1 \cos(\theta)\to1 cos(θ)1 sin ⁡ ( θ ) → 0 \sin(\theta)\to0 sin(θ)0 θ → 0 \theta\to0 θ0。旋转矩阵 R R R可近似表示为: R ≈ [ 1 − γ β γ 1 − α − β α 1 ] R \approx\left[\begin{array}{ccc}1 & -\gamma & \beta \\ \gamma & 1 & -\alpha \\ -\beta & \alpha & 1\end{array}\right] R 1γβγ1αβα1
  4. 假设最优平移向量为 t = [ t x , t y , t z ] t=[t_{x}, t_{y}, t_{z}] t=[tx,ty,tz] 。通过摩尔 - 彭罗斯逆将损失函数表示为最小二乘问题: E ( R , t ) = ∑ i = 1 n ( ( R p i + t − q i ) T n i ) 2 E(R, t)=\sum_{i=1}^{n}\left(\left(R p_{i}+t-q_{i}\right)^{T} n_{i}\right)^{2} E(R,t)=i=1n((Rpi+tqi)Tni)2
  5. 应用计算得到的旋转矩阵和平移向量对 X s X_{s} Xs进行变换,并重复步骤2 - 5,直到损失值低于预定义的阈值。需要注意的是,用于配准的目标点云 X t X_{t} Xt是固定的。

2.2 存储库构建

  1. 坐标采样:我们采用贪心下采样算法对 点云进行采样。给定 点云 X X X和点集 C a C_{a} Ca α \alpha α C a C_{a} Ca中的点数),我们的目标是从 C a C_{a} Ca中获取 S m a x S_{max} Smax个均匀分布的点。具体步骤如下:
    • C a C_{a} Ca中随机选择 S i n i t S_{init} Sinit个点构建初始点集 P i n i t = P 1 , P 2 , P 3 , … , P S i n i t P_{init }={P_{1}, P_{2}, P_{3}, \ldots, P_{S_{init }}} Pinit=P1,P2,P3,,PSinit
    • 计算 C a C_{a} Ca P i n i t P_{init } Pinit之间的距离,得到一个维度为 a × S i n i t a×S_{init } a×Sinit的矩阵 d 2 d d_{2d} d2d d 2 d = [ d 11 ⋯ d 1 S m a x ⋮ ⋱ ⋮ d a 1 ⋯ d a S m i n ] d_{2d}=\left[\begin{array}{ccc} d_{11} & \cdots & d_{1 S_{max }} \\ \vdots & \ddots & \vdots \\ d_{a 1} & \cdots & d_{a S_{min }}\end{array}\right] d2d= d11da1d1SmaxdaSmin
    • 计算矩阵 d 2 d d_{2d} d2d每一行的平均值,得到 d 1 d = [ d 1 m a n , d 2 m a n ⋯ , d a m a n ] d_{1d}=[d_{1_{man }}, d_{2_{man }} \cdots, d_{a_{man }}] d1d=[d1man,d2man,daman]
    • 找到矩阵 d 1 d d_{1d} d1d中的最大值,并将对应的点添加到 P i n i t P_{init } Pinit中。重复步骤2 - 4,直到 P i n i t P_{init } Pinit中的元素数量等于 S m a x S_{max} Smax
  2. 点特征插值:我们使用在ShapeNet数据集上预训练的点变换器(PointMAE)作为三维特征提取器。对于每个点云,我们将坐标采样阶段得到的坐标作为组中心点。每个中心点形成一个存储元素,将其与坐标和PointMAE特征绑定。这些元素构成了图2中的存储库。为了降低推理过程中计算PointMAE特征的计算复杂度,需要对 点云坐标进行下采样。因此,我们进一步进行点特征插值,为特征库中的每个坐标分配一个PointMAE特征值。特征插值方法如图3所示。

给定包含所有中心点坐标的点集 P c e n t r a l P_{central } Pcentral,其对应的PointMAE特征集为 M i n i t M_{init } Minit 。以一个非中心点 P e P_{e} Pe为例,我们使用k近邻算法在点集 P c e n t r a l P_{central } Pcentral中获取三个最近邻点 [ P k 1 , P k 2 , P k 3 ] [P_{k1}, P_{k2}, P_{k3}] [Pk1,Pk2,Pk3] 。它们对应的欧氏距离和PointMAE特征值分别为 [ D k 1 , D k 2 , D k 3 ] [D_{k1}, D_{k2}, D_{k3}] [Dk1,Dk2,Dk3] [ M k 1 , M k 2 , M k 3 ] [M_{k1}, M_{k2}, M_{k3}] [Mk1,Mk2,Mk3] 。通过公式(3),我们可以得到 P e P_{e} Pe的PointMAE特征 M e M_{e} Me 。重复此过程,直到所有非中心点都获得其对应的PointMAE特征。 M e M_{e} Me的计算公式为: M e = D k 1 D k 2 M k 3 + D k 1 D k 3 M k 2 + D k 2 D k 3 M k 1 D k 1 D k 2 + D k 1 D k 3 + D k 2 D k 3 M_{e}=\frac{D_{k1} D_{k2} M_{k3}+D_{k1} D_{k3} M_{k2}+D_{k2} D_{k3} M_{k1}}{D_{k1} D_{k2}+D_{k1} D_{k3}+D_{k2} D_{k3}} Me=Dk1Dk2+Dk1Dk3+Dk2Dk3Dk1Dk2Mk3+Dk1Dk3Mk2+Dk2Dk3Mk1

2.3 推理模块

  1. 多特征异常得分计算:存储库由元素集组成,即 M t r a i n = { ( M 1 c , l M 1 p ) , ( M 2 c , M 2 p ) , … , ( M n c , M n p ) } M_{train }=\{(M_{1_{c}}, l M_{1_{p}}),(M_{2_{c}}, M_{2_{p}}), \ldots,(M_{n_{c}}, M_{n_{p}})\} Mtrain={(M1c,lM1p),(M2c,M2p),,(Mnc,Mnp)} ,其中 M i c M_{i_{c}} Mic表示第 i i i个点的坐标, M i p M_{i_{p}} Mip表示第 i i i个点的PointMAE特征。测试特征库定义为 F t e s t = { ( F 1 c , F 1 p ) , ( F 2 c , F 2 p ) , … , ( F m c , F m p ) } F_{test }=\{(F_{1_{c}}, F_{1_{p}}),(F_{2_{c}}, F_{2_{p}}), \ldots,(F_{m_{c}}, F_{m_{p}})\} Ftest={(F1c,F1p),(F2c,F2p),,(Fmc,Fmp)} ,其中 F j c F_{j_{c}} Fjc是第 j j j个点的坐标, F j p F_{j_{p}} Fjp是第 j j j个点的PointMAE特征。对于 F t e s t F_{test } Ftest中的一个元素 ( F j c , F j p ) (F_{j_{c}}, F_{j_{p}}) (Fjc,Fjp) ,我们使用其坐标信息 F j c F_{j_{c}} Fjc M t r a i n M_{train } Mtrain中找到三个最近邻点,记为 ( M i c , M i p ) (M_{i_{c}}, M_{i_{p}}) (Mic,Mip) ( M o c , M o p ) (M_{o_{c}}, M_{o_{p}}) (Moc,Mop) ( M u c , M u p ) (M_{u_{c}}, M_{u_{p}}) (Muc,Mup) 。使用欧氏距离,得到它们的坐标距离 { D C 1 , D C 2 , D C 3 } \{DC_{1}, DC_{2}, DC_{3}\} {DC1,DC2,DC3}和特征距离 { D P 1 , D P 2 , D P 3 } \{DP_{1}, DP_{2}, DP_{3}\} {DP1,DP2,DP3} 。最终的坐标异常得分 S c = m e a n ( D C 1 , D C 2 , D C 3 ) S_{c}= mean(DC_{1}, DC_{2}, DC_{3}) Sc=mean(DC1,DC2,DC3),PointMAE异常得分 S p = m i n ( D P 1 , D P 2 , D P 3 ) S_{p}=min (DP_{1}, DP_{2}, DP_{3}) Sp=min(DP1,DP2,DP3)
  2. 排序模块:由于两种异常得分在尺度和分布上存在差异,因此需要对它们进行归一化处理。传统的归一化方法通常采用区间缩放法。对于一组数据 S l i s t S_{list } Slist,区间缩放过程为 S n o r m = S l i s t − m i n ( S l i s t ) m a x ( S l i s t ) − m i n ( S l i s t ) S_{norm }=\frac{S_{list }-min (S_{list })}{max (S_{list })-min (S_{list })} Snorm=max(Slist)min(Slist)Slistmin(Slist) 。如图4所示,区间缩放法可以消除两种异常得分之间的尺度差异,但无法解决分布差异问题。当坐标异常得分存在两个异常值时,最终的异常得分会远小于PointMAE异常得分,这对基于算术运算的集成策略有显著影响。为解决这一问题,我们设计了一种基于排序的归一化方法,其中 S o r t _ r a n k ( S l i s t ) Sort\_rank (S_{list }) Sort_rank(Slist)用于获取 S l i s t S_{list } Slist中每个值的排名, l e n ( S l i s t ) len(S_{list }) len(Slist) S l i s t S_{list } Slist的长度,即: S n o r m = S o r t _ r a n k ( S l i s t ) l e n ( S l i s t ) S_{norm }=\frac{ Sort\_rank \left(S_{list }\right)}{len\left(S_{list }\right)} Snorm=len(Slist)Sort_rank(Slist)

三、实验

3.1 实验细节

  1. 数据集:Real3D - AD数据集总共包含1254个样本,分布在12个不同的类别中。每个特定类别的训练集仅包含四个样本,类似于二维异常检测中的少样本场景。这些类别包括飞机、糖果棒、鸡肉、钻石、鸭子、鱼、宝石、海马、贝壳、海星和太妃糖。Real3D - AD数据集中的所有类别均为生产线的玩具。数据集中的物体分辨率为0.001mm - 0.0015mm,具有360度覆盖范围和完美的原型。
  2. 基线方法:我们与BTF、M3DM、PatchCore进行比较,以评估我们方法的性能。根据所使用的点云特征,它们可以分为7种不同的基线方法,即BTF(Raw)、BTF(FPFH)、M3DM(PointMAE)、PatchCore(FPFH)、PatchCore(FPFH + Raw)、PatchCore(PointMAE)、PatchCore(PointMAE + RAW),其中Raw表示使用坐标信息。PointMAE和FPFH是两种不同的特征描述符。
  3. 评估指标:所有评估指标与相关研究中的完全相同。我们通过接收者操作特征曲线下面积(AUROC)和精确率 - 召回率曲线下面积(AUPR/AP)来评估对象级异常检测性能和点级异常检测性能。AUROC和AUPR越高,异常检测性能越好。所有实验均在第12代英特尔酷睿i9 - 12900K CPU、64G DDR4 SDRAM和英伟达GeForce RTX 3090平台上进行。

3.2 Real3D - AD数据集上的异常检测

我们将我们的方法与Real3D - AD数据集上的几种方法进行比较,表1展示了对象级AUROC(O - AUROC)的异常检测结果。FPFH和PointMAE特征分别与Raw特征结合。结果表明,基于PointMAE的组合表现更好。对于所提出的PointCore架构,点云的坐标信息是不可或缺的。表2展示了我们的模型与最先进方法之间更全面的比较。PointCore在所有指标上都取得了有竞争力的性能,包括在O - AUROC指标上提升了17.75%。点级AUROC(P - AUROC)、对象级AUPR(O - AUPR)和点级AUPR(P - AUPR)的性能进一步证明了我们方法在异常检测方面的优越性能。表3列出了BTF、M3DM和PatchCore之间推理时间的比较。可以看出,表3中的BTF虽然速度快,但在O - AUROC和P - AUROC方面表现一般甚至较差。除BTF外,我们的方法是最快的。

3.3 消融实验

在本节中,我们在表4的3视图设置下对基于Reg3D - AD的设计选择进行消融实验。

  1. 局部优化(LO)的有效性:Reg3D - AD模型采用FPFH + RANSAC方法进行配准,其中RANSAC算法通过迭代寻找最优位姿矩阵。然而,RANSAC每次迭代中随机选择点的方式会导致最终配准结果存在显著差异。我们对太妃糖数据集中的一对点云进行了20次实验,结果表明即使参数相同,也会有很大的变化。引入局部优化算法是为了提高配准过程的稳定性。欧拉角的方差从1.1058°降至 ( 7.7796 × 1 0 − 6 ) c (7.7796×10^{-6})^{c} (7.7796×106)c ,得分达到0.642±0.01。关于局部优化方法,我们在不同程度的高斯噪声下对点点ICP和点面ICP算法进行了配准误差测试。结果表明,在较低噪声水平下,点面ICP配准方法通常能得到更准确的结果。Reg3D - AD数据集中的异常样本类似于低噪声水平的点云,因此选择点面ICP作为局部优化方法。
  2. PointCore架构的有效性:与Reg3D - AD架构相比,PointCore架构可以更好地利用点云的坐标信息,实现更快、更准确的点云异常检测。在速度方面,我们通过绑定点的坐标信息和PointMAE特征信息加速了推理过程,减少了后续PointMAE寻找最近邻时引入的大量计算成本。相比之下,Reg3D - AD架构将坐标信息和PointMAE特征信息分别存储在不同的存储库中,推理时每个坐标和PointMAE都必须在相应的存储库中寻找最近邻,这带来了巨大的计算挑战,尤其是PointMAE特征有1154维。在准确性方面,我们增强了坐标信息的主导地位,避免了PointMAE特征中明显的不匹配。具体来说,在Reg3D - AD架构中,测试点云的PointMAE特征必须在不利用任何坐标信息的情况下在PointMAE存储库中寻找最近邻,这会导致局部相似组之间的错误匹配。通过严格限制坐标的匹配范围,我们显著降低了不匹配的概率。
  3. 排序模块(RB)的有效性:从表4可以看出,排序模块显著提高了对象级AUROC和对象级AUPR,但在点级指标上的提升有限。这是因为排序模块主要用于减轻异常值对不同异常分数分布的重大影响。它在对象级异常分数中起着重要的平衡作用,因为对象级异常分数的样本量相对较小。相比之下,点级异常分数本身样本众多,异常值的影响极小。

四、结论

我们提出了一种无监督点云异常检测器 PointCore,它基于单存储库开发,利用局部 - 全局特征来存储输入点云的多尺度信息。在 Real3D - AD 数据集上进行的大量实验表明,我们的方法具有更高的召回率和更低的误报率,在需要精确检测缺陷样本的实际应用中更具优势。此外,由于局部 - 全局特征存储库和多特征异常分数计算方法都降低了计算成本,所提出的框架效率较高。

相关文章:

PointCore——利用局部全局特征的高效无监督点云异常检测器论文与算法解读

概述 三维点云异常检测旨在从训练集中检测出异常数据点,是工业检测、自动驾驶等众多应用的基础。然而,现有的点云异常检测方法通常采用多个特征存储库来充分保留局部和全局特征表示,这带来了高昂的计算成本以及特征之间的不匹配问题。为解决…...

洛谷P1177【模板】排序:十种排序算法全解(1)

扯谈 之前我已经把十大排序算法全讲了一遍(具体详见专栏C排序算法),今天我们来用一道简单的题目总结实战一下。 算法实现 一、桶排序(Bucket Sort) ‌适用场景‌:数据范围已知且较小(需根据测试数据调整…...

Graham Scan算法求解二维凸包

一、凸包及其概念 凸包(Convex Hull)是计算几何中的一个重要概念。在一个实数向量空间中,对于给定的点集,凸包是指包含这些点的最小凸多边形。在二维平面上,凸包可以形象地理解为用一个橡皮圈将所有点紧紧包裹起来&am…...

【java实现+4种变体完整例子】排序算法中【希尔排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

以下是希尔排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、希尔排序基础实现 原理 希尔排序是插入排序的改进版本,通过分步缩小增量间隔,将数组分成多个子序列进行插入排序&#…...

【文件操作与IO】详细解析文件操作与IO (二)

本篇博客是上一篇文章的续写,重点介绍数据流,还包括三道练习题. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心…...

【java实现+4种变体完整例子】排序算法中【基数排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

基数排序详解及代码示例 基数排序原理 基数排序通过处理每一位数字进行排序,分为 LSD(最低位优先) 和 MSD(最高位优先) 两种方式。核心步骤: 确定最大值:计算数组中最大数的位数。逐位排序&am…...

Java中的函数式编程详解

Java中的函数式编程是一个在Java 8中引入的特性,它将计算视为数学函数的求值,避免使用可变状态和数据。其核心特性包括Lambda表达式、函数式接口和Stream API。以下将结合代码示例和具体场景详细讲解这些特性。 1. Lambda表达式 Lambda表达式是Java 8引…...

专精特新政策推动,B端UI设计如何赋能中小企业创新发展?

在当前数字化转型浪潮下,专精特新政策为中小企业提供了强大的支持,助力其在细分领域实现专业化、精细化、特色化和创新化发展。B端UI设计作为提升企业数字化产品用户体验和工作效率的重要手段,能够有效赋能中小企业创新发展。本文将探讨专精特…...

从零开始学A2A四:A2A 协议的高级应用与优化

A2A 协议的高级应用与优化 学习目标 掌握 A2A 高级功能 理解多用户支持机制掌握长期任务管理方法学习服务性能优化技巧 理解与 MCP 的差异 分析多智能体场景下的优势掌握不同场景的选择策略 第一部分:多用户支持机制 1. 用户隔离架构 #mermaid-svg-6SCFaVO4oDU…...

海关总署广东:广东外贸一季度进出口2.14万亿元 同期增长4.2%

大湾区经济网湾区财经报道,据海关总署广东分署统计,今年一季度,广东外贸进出口2.14万亿元,较去年同期(下同)增长4.2%,增速高于全国2.9个百分点。其中,出口1.34万亿元,增长…...

C++代码优化

前段时间写了一些代码&#xff0c;但是在运算过程中发现有些代码可以进行改进以提高运行效率&#xff0c;尤其是与PCL相关的部分&#xff0c;可以进行大幅度提高&#xff0e;特意在此进行记录&#xff0c;分享给大家&#xff0c;也供自己查看&#xff0e; pcl::PointCloud< …...

Manim教程:第七章 坐标系统

#什么是坐标系统?特点是什么? 坐标系统是一个用于确定空间中点位置的数学工具。它通过一组数值(坐标)来描述一个点在某个空间中的位置。不同类型的坐标系统可以用于不同的应用场景,最常见的包括: 笛卡尔坐标系:使用直角坐标系,通常用坐标轴(如x轴和y轴)来表示二维空间…...

U盘实现——双盘符实现

文章目录 双盘符实现描述符类特殊命名get max luninquiry上一篇文章中介绍了 U 盘的枚举过程 U盘实现——U 盘枚举过程 双盘符实现 描述符 双盘符的时候中,描述符的实现与上节完全一致,不同的只有类特殊命令 设备描述符配置描述符接口描述符输出端点描述符输入端点描述符上…...

【Linux】【阿里云服务器】【树莓派】学习守护进程编程、gdb调试原理和内网穿透信息

目录 一. 守护进程的含义及编程实现的主要过程 1.1守护进程 1.2编程实现的主要过程 二、在树莓派中通过三种方式创建守护进程 2.1nohup命令创建 2.2fork()函数创建 2.3daemon()函数创建 三、在阿里云中通过三种方式创建守护进程 3.1nohup命令创建 3.2fork()函数创建 …...

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 + 解析

青少年软件编程(Python)等级考试试卷(二级) 分数:100 题数:37 一、单选题(共25题,共50分) 1. 老师要求大家记住四大名著的作者,小明机智地想到了可以用字典进行记录,以下哪个选项的字典格式是正确?( ) A. [‘曹雪芹’:‘红楼梦’, ‘吴承恩’:‘西游记’, ‘罗贯…...

【Linux系统篇】:System V IPC核心技术解析---从共享内存到消息队列与信号量

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 一.System V共享内存&#xff08;重点&#xff09;1.基本概念和原理…...

关于GPU的涡轮散热与被动散热

显卡涡轮散热与被动散热的深度解析 一、涡轮散热的定义与工作原理 涡轮散热技术是通过高速旋转的涡轮风扇配合封闭式风道设计,将冷空气吸入并强制排出热量的主动散热方案。其核心原理包含以下关键点: 气流动力学设计:涡轮风扇采用精密叶片(如离心式结构),在相同尺寸下能…...

namesapce、cgroup

dd&#xff1a; 制作磁盘镜像&#xff1a;借助 dd 指令能够把整个磁盘或者分区的数据复制到一个文件里&#xff0c;形成磁盘镜像文件。此镜像文件可用于备份数据或者在其他系统中恢复磁盘。 恢复磁盘镜像&#xff1a;可以把之前创建的磁盘镜像文件恢复到磁盘或者分区 磁盘初始…...

C++23 新特性:行拼接前去除空白符 (P2223R2)

文章目录 1\. 什么是行拼接前去除空白符2\. 为什么需要这一特性3\. 示例代码输出结果 4\. 编译器支持5\. 优势与应用场景5.1 提高代码可读性5.2 减少潜在错误5.3 适用于多行字符串 6\. 其他相关特性7\. 总结 C 语言一直在不断进化&#xff0c;以满足现代软件开发的需求。C23 标…...

算法思想之链表

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之链表 发布时间&#xff1a;2025.4.18 隶属专栏&#xff1a;算法 目录 算法介绍常用技巧 例题两数相加题目链接题目描述算法思路代码实现 两两交换链表中的节点题目链接题目描述算法思路代码实现 重排链表…...

《软件设计师》复习笔记(11.5)——测试原则、阶段、测试用例设计、调试

目录 1. 测试基础概念 2. 测试方法分类 3. 测试阶段 真题示例&#xff1a; 题目1 题目2 题目3 4. 测试策略 5. 测试用例设计 真题示例&#xff1a; 6. 调试与度量 真题示例&#xff1a; 1. 测试基础概念 定义&#xff1a;系统测试是为发现错误而执行程序的过程&…...

工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)

模式定义 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;通过定义抽象工厂接口将对象创建过程延迟到子类实现&#xff0c;实现对象创建与使用的解耦。该模式特别适合需要动态扩展产品类型的场景。 自动驾驶感知场景分析 自动驾…...

Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇

各位Java开发者们好&#xff01;&#x1f680; 2025年的Java世界正在经历一场前所未有的技术变革。作为深耕Java领域多年的技术博主&#xff0c;今天我将带大家深入探索Java生态即将迎来的5大技术趋势&#xff0c;特别是Kotlin的深度融合和AI技术的新篇章。准备好了吗&#xff…...

抗辐照设计优化:商业航天高可靠系统设计的关键路径

随着商业航天领域的快速发展&#xff0c;航天器的可靠性和抗辐照能力已成为系统设计的核心需求。在严苛的太空辐射环境中&#xff0c;电子设备面临着单粒子效应、总剂量效应和位移损伤效应等多重挑战。抗辐照设计优化不仅是确保航天器任务成功的关键路径&#xff0c;更是推动商…...

颚式破碎机的设计

一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备&#xff0c;其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高&#xff0c;设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力&#xff1a;根据目…...

1panel第三方应用商店(本地商店)配置和使用

文章目录 引言资源网站实战操作说明 引言 1Panel 提供了一个应用提交开发环境&#xff0c;开发者可以通过提交应用的方式将自己的应用推送到 1Panel 的应用商店中&#xff0c;供其他用户使用。由此衍生了一种本地应用商店的概念&#xff0c;用户可以自行编写应用配置并上传到自…...

ObjectOutputStream 深度解析

ObjectOutputStream 深度解析 ObjectOutputStream 是 Java IO 体系中的一个关键类,用于序列化(将对象转换为字节流),通常与 ObjectInputStream 配合使用,实现对象的持久化存储或网络传输。 1.作用:完成对象的序列化过程 2.它可以将JVM当中的Java对象序列化到文件中/网…...

如何学习和研究量子计算与量子计算机:从理论到实践的完整路径

量子计算作为量子力学与计算机科学的交叉领域&#xff0c;正在迅速改变我们对计算能力的认知。无论是破解经典加密算法&#xff0c;还是加速药物分子模拟&#xff0c;量子计算都展现出巨大的潜力。然而&#xff0c;学习这一领域需要系统化的理论知识和实践能力。以下是基于最新…...

数据结构学习笔记 :二叉搜索树与高效查找算法详解

目录 二叉搜索树&#xff08;BST&#xff09;实现 1.1 顺序存储实现 1.2 链式存储实现查找算法 2.1 顺序查找 2.2 折半查找 2.3 哈希查找总结与应用场景代码示例与完整实现 一、二叉搜索树&#xff08;BST&#xff09;实现 1. 顺序存储实现 BST的顺序存储基于完全二叉树的特…...

广搜bfs-P1443 马的遍历

P1443 马的遍历 题目来源-洛谷 题意 要求马到达棋盘上任意一个点最少要走几步 思路 国际棋盘规则是马的走法是-日字形&#xff0c;也称走马日&#xff0c;即x,y一个是走两步&#xff0c;一个是一步 要求最小步数&#xff0c;所以考虑第一次遍历到的点即为最小步数&#xff…...

Ubuntu22.04安装QT、px4安装环境

Ubuntu22.04安装QGC编译环境、QT、px4编译环境 安装QGC安装Ubuntu安装QT配置px4安装环境出现错误怎么办 安装QGC 我使用的是pixhawk V5飞控&#xff0c;在QGC4.4 Guide里&#xff0c;说 安装Ubuntu 直接去清华源里将Ubuntu镜像下载下来&#xff08;网址&#xff1a;清华源下…...

【IDEA2020】 解决开发时遇到的一些问题

目录 一、批量更新数据库数据 逐条更新 Db.updateEntitiesBatch() 二、Error running&#xff0c;Command line is too long. Shorten command line 报错场景 报错分析 解决方法 一、批量更新数据库数据 逐条更新 List<UserModel> ums userMapper.selectListBy…...

基于autoware1.14的实车部署激光雷达循迹,从建图、定位、录制轨迹巡航点、到实车运行。

1.首先安装autoware &#xff0c;大家可以以下一下博客进行安装&#xff0c;如果缺少库什么的直接问ai安装对应的库就行。ubuntu18.04安装Autoware1.14---GPU版 最全环境配置说明_autoware1.14安装教程-CSDN博客 安装成功后运行&#xff1a; source install/setup.bash roslau…...

抽象类和接口的区别

1. 定义 抽象类&#xff1a;用于描述一类事物的共性接口&#xff1a;用于描述行为。 2. 方法和变量 抽象类&#xff1a; 可以有普通方法和抽象方法。可以有普通成员变量和静态常量。 接口&#xff1a; JDK 8之前只支持抽象方法&#xff0c;JDK 8后支持默认方法和静态方法…...

自注意力机制self-attention

目录 简介&#xff1a; 输入和输出方式&#xff1a; Sequence Labeling&#xff1a; self-attention运作方式&#xff1a; 一&#xff1a;怎么从vector得到b1 二&#xff1a;利用矩阵的方法怎么得到 Multi-head Self-attention&#xff1a; positional encoding&#x…...

《Operating System Concepts》阅读笔记:p735-p737

《Operating System Concepts》学习第 62 天&#xff0c;p735-p737 总结&#xff0c;总计 3 页。 一、技术总结 1.distributed system (1)定义 A collection of loosely coupled nodes interconnected by a communication network(一组通过通信网络相互连接的松散耦合节点)…...

2025-04-19 Python 强类型编程

文章目录 1 方法标注1.1 参数与返回值1.2 变参类型1.3 函数类型 2 数据类型2.1 内置类型2.2 复杂数据结构2.3 类别选择2.4 泛型 3 标注方式3.1 注释标注3.2 文件标注 4 特殊情形4.1 前置引用4.2 函数标注扩展4.3 协变与逆变4.4 dataclass 5 高级内容5.1 接口5.2 泛型的协变/逆变…...

RVOS的任务调度优化

12.系统优化–任务调度 12.1 改进任务管理功能 在原有基础上进⼀步改进任务管理功能。具体要求&#xff1a;改进 task_create()&#xff0c;提供更多的参数&#xff0c;具体改进后的函数如下所⽰&#xff1a; int task_create(void (*task)(void* param),void *param, uint8…...

【论文阅读20】-CNN-Attention-BiGRU-滑坡预测(2025-03)

这篇论文主要探讨了基于深度学习的滑坡位移预测模型&#xff0c;结合了MT-InSAR&#xff08;多时相合成孔径雷达干涉测量&#xff09;观测数据&#xff0c;提出了一种具有可解释性的滑坡位移预测方法。 [1] Zhou C, Ye M, Xia Z, et al. An interpretable attention-based deep…...

图像预处理-图像噪点消除

一.基本介绍 噪声&#xff1a;指图像中的一些干扰因素&#xff0c;也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器&#xff1a;也可以叫做卷积核 - 低通滤波器是模糊&#xff0c;高通滤波器是锐化 - 低通滤波器就…...

PP-OCR的安卓端部署

EMO了几天 我浪费了几天的生命&#xff0c;去研究PP-OCR的模型微调、从训练模型导出预测模型&#xff0c;结果一个坑接着一个坑&#xff0c;没有善终。 找了好多资料&#xff0c;得到一些负面信息&#xff0c;比如说飞浆的团队修复问题不及时啦&#xff0c;代码仓库有好多年不…...

2048小游戏C++板来啦!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…...

研0大模型学习(第四、五天)

学习CSDN教程&#xff1a;VSCode Debug指南 但里面貌似主要是针对nodejs的&#xff0c;所以我在 CSDN教程&#xff1a;VSCode调试python程序 中学习&#xff0c;刚开始调试报错python版本太低&#xff0c;于是我安装了旧版本的pythondebugger&#xff0c;再把python解释器从原…...

编程规范之整数运算

在表达式中混用有符号数和无符号数时&#xff0c;可能会因隐式转换而导致非预期的结果。因此应尽量在表达式中使用相同符号类型的 变量。 对于无法使用相同符号类型的场景&#xff0c;应将不同类型的变量显式转换为相同类型&#xff0c;当表达式中的无符号数隐式转换为另一个有…...

【零基础】基于 MATLAB + Gurobi + YALMIP 的优化建模与求解全流程指南

MATLAB Gurobi YALMIP 综合优化教程&#xff08;进阶&#xff09; 本教程系统介绍如何在 MATLAB 环境中使用 YALMIP 建模&#xff0c;并通过 Gurobi 求解器高效求解线性、整数及非线性优化问题。适用于工程、运营研究、能源系统等领域的高级优化建模需求。 一、工具概览 1.…...

C++17 信号量模拟实现

C17 信号量模拟实现 一、实现原理 C17 标准库没有原生信号量(C20才有)&#xff0c;但可以通过 std::mutex std::condition_variable 模拟实现。以下是核心逻辑&#xff1a; #include <mutex> #include <condition_variable>class CountingSemaphore { private:…...

LINUX学习——守护进程的含义及编程实现

实验目的 理解守护进程的含义。掌握编程实现守护进程的主要步骤。 实验步骤 守护进程的含义&#xff1a; 守护进程是运行在后台的一种特殊进程&#xff0c;独立于控制终端&#xff0c;周期性地执行任务或等待处理事件。守护进程通常以 d 结尾&#xff0c;如 httpd、sshd 等。…...

Json 在线格式化 - 加菲工具

Json 在线格式化 打开网站 加菲工具 选择“Json 在线格式化” 或者直接进入 https://www.orcc.top/tools/json 输入Json&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果...

final关键字带来的问题

定义了一个配置类&#xff1a; public class EsignConfig { public static final String EsignOrgId "*****"; // 应用ID public static final String EsignAppId "*****"; // 应用密钥 public static final String EsignAppSecret…...

Flash存储器(一):接口标准全解析

目录 一.接口类型与协议标准 二.应用场景 Flash存储器的接口设计直接影响其性能、应用场景及系统集成复杂度。以下从接口类型、协议标准及应用场景三个方面进行系统阐述。 一.接口类型与协议标准 Flash接口类型与协议标准 序号接口类型协议标准特点1并行接口…...