Deep Active Contours for Real-time 6-DoF Object Tracking
这篇论文解决了从RGB视频进行实时6自由度(6-DoF)物体跟踪的问题。此前的基于优化的方法通过对齐投影模型与图像来优化物体姿态,这种方法依赖于手工设计的特征,因此容易陷入次优解。最近的基于学习的方法使用神经网络来预测姿态,但它们在泛化能力或计算效率上有所欠缺。我们提出了一种基于学习的主动轮廓模型,以充分利用这两种方法的优点。具体来说,给定一个初始姿态,我们将物体模型投影到图像平面上以获得初始轮廓,并使用一个轻量级网络预测轮廓如何移动以匹配真实的物体边界,从而提供优化物体姿态的梯度。我们还设计了一种高效的优化算法,以姿态监督的方式对我们的模型进行端到端训练。实验结果表明,在半合成和真实的6自由度物体跟踪数据集上,我们的模型在姿态精度上比最先进的方法有显著的提升,同时在移动设备上实现了实时性能。代码可以在我们的项目页面上获取: Deep Active Contour for Real-time 6-DoF Object Tracking.
-
引言
基于视频的6自由度(6-DoF)物体跟踪任务旨在从RGB图像序列中跟踪刚性物体的姿态,前提是已知预定义的物体CAD模型和第一帧中的初始姿态。这项任务有着广泛的应用,包括增强现实、机器人操作和人机交互。这些应用要求跟踪算法能够实时运行,并避免需要针对特定物体进行训练。
主流的6-DoF物体跟踪方法通常基于关键点、边缘或区域特征来优化物体姿态。关键点方法[34, 42, 18, 17, 43, 27]涉及在2D图像和3D真实模型之间匹配关键点。诸如SIFT[25]、ORB[30]或BRISK[19]等关键点特征被广泛应用于这些任务中。然而,这些方法依赖于丰富的纹理,这限制了它们的适用性。相比之下,基于边缘的跟踪方法[6, 33, 53, 32]依赖于边缘(显式或隐式)来计算两幅连续图像之间的相对姿态。不幸的是,这些方法在处理背景杂乱和运动模糊时面临挑战,从而限制了其有效性。为了解决这一问题,较新的基于边缘的方法[46, 44, 14, 13, 39]进一步结合了局部颜色信息以提高精度。最近的进展主要由基于区域的方法[28, 40, 41, 36]推动。其基本前提是物体区域的颜色统计信息可以与背景区分开来。随着近年来的不断发展,基于区域的方法现在具备了即使在嘈杂和杂乱的图像中,也能仅利用无纹理的3D模型高效且准确地跟踪物体的能力。然而,这些基于优化的方法的一个缺点是需要手工设计特征和精心调整的超参数,这在实际场景中可能不够稳健。
最近,端到端的基于学习的方法被提出,以增强6-DoF物体检测和跟踪的鲁棒性。这些方法回归几何参数,如相机姿态[54, 16]和物体坐标[3, 12, 45],或采用渲染与比较[23, 15, 55, 24, 48]的策略迭代优化姿态。尽管这些方法取得了有希望的结果,但姿态回归方法表现出有限的精度和较差的泛化能力,而渲染与比较方法则计算量大,不适用于实时应用。
在本文中,我们提出了一种基于学习的主动轮廓模型(DeepAC),用于实时的6-DoF物体跟踪。通过结合传统的基于优化和基于学习的方法的优势,DeepAC同时实现了鲁棒性和实时性能。受到基于区域的方法RBGT[35]的启发,DeepAC将投影轮廓周围的局部区域作为输入,预测轮廓更新的方向。与依赖于手工设计特征和统计假设的传统方法不同,我们采用网络来估计方向,如图1所示。具体来说,所提出的方法呈现了一个三阶段的流程。首先,DeepAC使用FPN-Lite网络与MobileNetV2[31]提取当前图像的多层次特征,并通过投影3D物体模型来获取上一帧姿态的2D轮廓。然后,设计了一个边界预测网络,利用轮廓周围局部区域的特征作为输入,输出真实边界位置的概率分布。最后,使用基于边界概率的牛顿法优化6-DoF物体姿态。这个优化过程相对于网络输出是可微分的,允许使用真实姿态作为监督信号来训练特征提取和边界预测网络,从而消除了对手工设计中间监督的需求。
我们在半合成和真实的6-DoF物体跟踪数据集上验证了所提出方法的有效性。结果表明,DeepAC在姿态精度上大幅超越了其他基于优化和基于学习的基准方法。此外,我们展示了该算法在移动设备上的实时性能,在iPhone 11上实现了25帧/秒的帧率。请参见补充材料中的演示视频。
我们的主要贡献总结如下:
- 一种用于实时6-DoF物体跟踪的新型基于学习的主动轮廓模型。
- 一个基于图像特征演化轮廓的轻量级网络,确保了鲁棒性和高效性。
- 一个高效的优化算法,允许整个流程在姿态监督下进行端到端训练。
-
相关工作
基于关键点的优化。 早期的基于关键点的方法[25, 30, 19]通过利用局部特征匹配[34, 42, 18, 17]或光流技术[11, 43, 27]来建立2D-3D对应关系。尽管这些方法展现了显著的性能,但它们需要存在有纹理的物体模型。
基于边缘的优化。 为了减轻对有纹理模型的需求,研究人员转向了基于边缘的方法,这些方法通常依赖于分析物体边缘的位移。例如,RAPiD[6]通过在投影边缘的垂直方向上寻找显著的梯度来估计连续帧之间的相对姿态。为了增强跟踪的稳定性,Simon和Berger[33]实施了稳健的估计技术,以减少异常值对RAPiD优化的影响。进一步的改进包括结合局部颜色信息[32],集成粒子滤波器进行初始化[44, 39],以及在姿态优化中添加边缘权重[44, 14]。然而,基于边缘的方法在处理背景杂乱和运动模糊时仍然面临困难。
基于区域的优化。 近来,基于区域的方法在复杂环境中跟踪无纹理物体方面表现出了显著的成功。该研究可以追溯到PWP3D[28]的工作,该方法有效地结合了颜色分割统计模型和物体渲染边界距离场来优化物体姿态。后续的RBOT估计[40]和RBOT跟踪[41]工作扩展了这一方法,结合了时间一致的局部颜色直方图,并利用高斯-牛顿法来优化能量函数。RBGT[35]引入了多个视点的预计算稀疏对应线,并建立了符合高斯分布的概率模型。这使得使用牛顿法的物体姿态快速收敛成为可能。该领域的最新进展SRT3D[36]引入了平滑的阶跃函数,考虑了全局和局部不确定性,相较于现有方法提供了显著的改进。ICG方法[37]通过将深度信息与区域统计相结合,获得了比多个基于学习的方法更好的性能。然而,基于区域的物体跟踪的性能常常因为需要定义多个手工设计的特征和参数而受到影响,这在实际应用中是一个显著的限制。
基于学习的方法。 近年来,基于深度学习的6自由度物体姿态估计方法取得了显著进展。一种方法是直接预测旋转和平移参数,如[54, 16]的工作所示。另一种方法[3, 12, 45]是通过回归每个像素对应的物体坐标来生成2D-3D对应关系,然后通过PnP求解器估计6自由度姿态。然而,在单次处理设置中准确估计物体姿态可能具有挑战性。为了解决这一问题,各种研究[23, 15, 55, 24, 48]利用了迭代优化技术,产生更精确的结果。这种方法的关键思想是一个迭代的“渲染与比较”方案。在每次迭代中,使用当前的物体姿态估计来渲染3D模型,并将渲染的图像与实际图像进行比较,以获得姿态更新,从而改善两者之间的对齐。PoseRBPF[4]通过训练代码库来估计用于实例级物体跟踪的粒子滤波器后验概率。最近的物体跟踪方法[47, 49, 50]结合了深度信息,从而不再需要CAD模型。当前基于学习的方法的主要缺点是需要使用高端GPU,使其不适合在移动应用中部署,例如增强现实。我们的框架通过将轻量级神经网络集成到基于优化的方法中,解决了这一限制,允许在移动设备上快速处理,同时在姿态精度上取得显著改进。
实验
4.1. 评估协议
数据集
我们在三个标准的目标跟踪基准数据集上评估了我们的方法,即RBOT [41]、BCOT [21]和OPT [52]数据集。RBOT数据集包含18个不同的物体,每个物体有4个序列,具有不同的变化场景,包括常规、动态光照、噪声和遮挡场景。BCOT数据集由20个无纹理物体、22个场景和404个视频序列组成,总共包含126K帧,均在现实环境中捕捉,涉及各种相机设置、室内/室外场景和运动模式。OPT数据集包含6个物体和552个现实世界的序列,这些序列具有多样的光照条件,并由机器人手臂记录的预设轨迹。
基线方法
我们将提出的方法与以下基线方法进行了比较,分为两类:1) 基于优化的基线方法,包括基于关键点的方法 [51, 26, 1],基于边缘的方法 [22, 2, 14, 38, 44, 39] 和基于区域的方法 [28, 41, 56, 57, 13, 20, 35, 36],这些方法的设置与我们的方法相似。2) 基于学习的基线方法 [23, 24],这些方法利用“渲染与比较”的框架来估计单张图像与预定义纹理模型之间的相对姿态。我们将这些基于学习的基线方法纳入分析,以展示我们提出的方法在未见过物体上的优越泛化性能。需要注意的是,我们的方法可以在移动设备上实时运行,并且仅依赖于无纹理的物体,而 [23, 24] 由于时间开销大且需要纹理模型,无法实现这一点。
实验
4.1. 评估协议
数据集
我们在三个标准的目标跟踪基准数据集上评估了我们的方法,即RBOT [41]、BCOT [21]和OPT [52]数据集。RBOT数据集包含18个不同的物体,每个物体有4个序列,具有不同的变化场景,包括常规、动态光照、噪声和遮挡场景。BCOT数据集由20个无纹理物体、22个场景和404个视频序列组成,总共包含126K帧,均在现实环境中捕捉,涉及各种相机设置、室内/室外场景和运动模式。OPT数据集包含6个物体和552个现实世界的序列,这些序列具有多样的光照条件,并由机器人手臂记录的预设轨迹。
基线方法
我们将提出的方法与以下基线方法进行了比较,分为两类:1) 基于优化的基线方法,包括基于关键点的方法 [51, 26, 1],基于边缘的方法 [22, 2, 14, 38, 44, 39] 和基于区域的方法 [28, 41, 56, 57, 13, 20, 35, 36],这些方法的设置与我们的方法相似。2) 基于学习的基线方法 [23, 24],这些方法利用“渲染与比较”的框架来估计单张图像与预定义纹理模型之间的相对姿态。我们将这些基于学习的基线方法纳入分析,以展示我们提出的方法在未见过物体上的优越泛化性能。需要注意的是,我们的方法可以在移动设备上实时运行,并且仅依赖于无纹理的物体,而 [23, 24] 由于时间开销大且需要纹理模型,无法实现这一点。
与基于优化的方法的比较
在RBOT数据集中,准确性计算遵循之前的研究[41],采用标准的5cm-5°评分。表1展示了我们提出的方法与各种对比方法的比较。实验结果表明,对于常规、动态光照和遮挡场景,现有的基于优化的方法已经达到了性能的瓶颈,成功率超过了95%。在这种情况下,DeepAC表现出了类似的性能。然而,在噪声场景中,我们的方法显著提升了性能,平均成功率从83.2%提高到88.0%。这一观察结果表明了DeepAC在应对噪声方面的优越鲁棒性。
在BCOT数据集中,我们采用ADD得分和厘米-度得分来量化姿态误差。与RBOT基准不同,我们采用更严格的标准来评估跟踪性能,包括ADD-0.02d、ADD-0.05d和2cm-2°评分,以评估高精度的跟踪能力。结果如表2所示,DeepAC在所有ADD和厘米-度评分上均表现出优于所有基线方法的性能。值得注意的是,我们的方法在非常严格的ADD标准上表现出显著的优势,包括在ADD-0.02d上的9.1%提升、ADD-0.05d上的14.1%提升和ADD-0.1d上的9.6%提升。这些结果表明,我们的方法在高精度跟踪方面非常有效。此外,我们选择了三个表现最好的方法,即SRT3D[36]、LDT3D[39]和DeepAC,比较了在RBOT和BCOT数据集中姿态重置的次数以及不进行任何姿态重置的跟踪结果,如表3所示。除了在BCOT数据集上的5cm-5°评分外,DeepAC在所有指标上均取得了最佳结果,并且在其他两个基线方法上取得了较大幅度的优越表现。
在OPT数据集中,按照[52]的方法,我们采用AUC(0, 0.2)评分作为评估目标跟踪性能的指标。表4显示,我们的方法在所有六个物体上均优于当前最先进的基于优化的方法。这些结果强调了DeepAC在现实应用中的有效性。此外,我们观察到LDT3D[39]在RBOT和BCOT中排名第二,但在OPT数据集上的性能显著下降。该结果可能归因于OPT数据集相对较小的帧差异,其中LDT3D采用的非局部优化对其性能产生了负面影响。
与基于学习的方法的比较
为了展示DeepAC的泛化能力,我们在RBOT数据集上与两种基于学习的方法[23, 24]进行了对比实验,尽管它们的时间成本很高。具体来说,我们使用DeepIM [23]的官方代码库1,在YCB-V [54]数据集上训练模型,同时测试了[24]提供的预训练模型2,该模型在YCB-V [54]数据集上进行了训练。为了公平比较,我们在相同的训练配置下,在YCB-V [54]数据集上训练了我们的DeepAC模型,称为DeepAC−。表5显示的实验结果表明,即使在为[24]提供了真实物体掩码的情况下,DeepAC−在性能上仍然显著优于基于学习的基线方法[23, 24],展示了我们跨数据集泛化的能力。
消融实验
我们验证了DeepAC中的设计选择:1)统计信息组合,2)多层次特征,3)对应线不确定性,4)对应线的数量,以及5)每条对应线上的样本数量。我们使用与RBOT和BCOT数据集上的6-DoF物体跟踪相同的训练和评估协议进行这些实验。表6中展示的结果表明,DeepAC中的所有设计选择都带来了显著的性能提升。表7提供了关于对应线数量和每条线上样本数量的影响结果,使我们能够在精度和效率之间取得平衡。
4.3. 移动设备上的实现
除了在桌面上实现DeepAC外,我们还将其移植到移动设备(iPhone 11)上。具体来说,我们使用coremltools3来促进DeepAC网络的部署,并使用C++实现了补充模块。
姿态初始化
为了在第一帧中初始化姿态,我们通过预定义的姿态将3D模型投影到手机屏幕上,并要求用户手动移动手机以匹配实际物体和投影模型。该过程在补充材料中的演示视频中有所说明。初始化的成功判定方式如下。首先,我们使用神经网络估计边界位置μi和不确定性σi²。然后,我们计算边界位置和对应线中点之间的平均距离以及平均不确定性。如果计算的距离低于某个阈值,我们将使用此姿态作为初始化并开始跟踪。
运行时间
我们分析了DeepAC在iPhone 11上每个模块的时间成本。图像预处理和FPN-Lite网络模块分别耗时6ms和8.1ms。提取对应线、轮廓特征和边界图的模块分别需要5.1ms、3.7ms和4.2ms。姿态优化耗时4.2ms,颜色直方图更新耗时0.7ms。总体而言,将所有这些模块结合在一起的整个流程平均运行速度大约为25帧每秒。
5. 结论
本文提出了一种名为DeepAC的基于学习的主动轮廓模型,用于从RGB视频中进行实时6-DoF物体跟踪。通过初始姿态,提出的DeepAC使用三阶段流程来跟踪物体:轮廓特征图提取、边界图预测和姿态优化。实验表明,DeepAC在多个半合成和真实的6-DoF物体跟踪数据集上实现了最先进的结果,超越了传统的基于优化的方法和最近的基于学习的方法,同时能够在移动设备上实时运行。
相关文章:

Deep Active Contours for Real-time 6-DoF Object Tracking
这篇论文解决了从RGB视频进行实时6自由度(6-DoF)物体跟踪的问题。此前的基于优化的方法通过对齐投影模型与图像来优化物体姿态,这种方法依赖于手工设计的特征,因此容易陷入次优解。最近的基于学习的方法使用神经网络来预测姿态&am…...

IDEA安装教程配置java环境(超详细)
引言 IntelliJ IDEA 是一款功能强大的集成开发环境(IDE),广泛用于 Java 开发,但也支持多种编程语言,如 Kotlin、Groovy 和 Scala。本文将为你提供一步一步的指南,帮助你在 Windows 系统上顺利安装 Intelli…...

Excel文档的读取(1)
熟悉使用Excel的同学应该都知道,在单个Excel表格里想要分商品计算总销售额,使用数据透视表也可以非常快速方便的获得结果。但当有非常大量的Excel文件需要处理时,每一个Excel文件单独去做数据透视也会消耗大量的时间。就算使用Power Query这样…...

Linux:体系结构和操作系统管理
目录 一、冯诺依曼体系结构 1.问题1 2.问题2 二、操作系统管理 一、冯诺依曼体系结构 本章将会谈论一下对冯诺依曼计算机体系结构的理解。 在2024年,几乎所有的计算机,都遵守冯诺依曼体系结构。 冯诺依曼体系结构是应用在硬件层面的,而硬…...

c++ install boost lib
同步系统上的软件包列表 sudo apt-update 整个库安装: sudo apt-get install libboost-all-dev 安装部分库: sudo apt-get install libboost-thread-dev sudo apt-get install libboost-filesystem-dev 链接时加上: -lboost_filesystem -lboost_system 例如: g -Wall -o bo…...

文件加密最简单的方法有哪些?十个电脑文件加密方法【超详细】
在当今数字化和信息化的时代,数据已成为企业最重要的资产之一。内部数据外泄不仅可能导致商业秘密的丧失,还可能对企业的声誉和财务健康造成严重影响。为了有效防止内部数据外泄,企业需要实施综合的防泄密解决方案。以下是十大最佳防泄密解决…...

IPv6地址的表示方法
IPv6地址总长度为128比特,通常分为8组,每组为4个十六进制数的形式,每组十六进制数间用冒号分隔。 例如:2409:8745:039a:c700:0000:0000:0162,这是IPv6地址的首选格式。 为了书写方便,IPv6还提供了压缩格式…...

Kubernetes 之 kubelet 与 CRI、CNI 的交互过程
序言 当一个新的 Pod 被提交创建之后,Kubelet、CRI、CNI 这三个组件之间进行了哪些交互? Kubelet -> CRI -> CNI 如上图所示: Kubelet 从 kube-api-server 处监听到有新的 pod 被调度到了自己的节点且需要创建。Kubelet 创建 sandbo…...

【python】OpenCV—Age and Gender Classification
文章目录 1、任务描述2、网络结构2.1 人脸检测2.2 性别分类2.3 年龄分类 3、代码实现4、结果展示5、参考 1、任务描述 性别分类和年龄分类预测 2、网络结构 2.1 人脸检测 输出最高的 200 个 RoI,每个 RoI 7 个值,(xx,xx&#x…...

python安装换源
安装 python 使用演示的是python 3.8.5 安装完成后,如下操作打开命令行:同时按 “WindowsR” > 输入 “cmd” -> 点击确定 python换源 临时换源: #清华源 pip install markdown -i https://pypi.tuna.tsinghua.edu.cn/simple # 阿里…...

JavaScript练手小技巧:利用鼠标滚轮控制图片轮播
近日,在浏览网站的时候,发现了一个有意思的效果:一个图片轮播,通过上下滚动鼠标滚轮控制图片的上下切换。 于是就有了自己做一个的想法,顺带复习下鼠标滚轮事件。 鼠标滚轮事件,参考这篇文章:…...

搭建Eureka高可用集群 - day03
全部代码发出来了 搭建服务提供者 步骤: 1.创建项目,引入依赖 2.添加Eureka相关配置 3.添加EnableEurekaClient注解 4.测试运行 步骤1:创建项目,引入依赖 使用Spring Initializr方式创建一个名称为eureka-provider的Sprin…...

并行程序设计基础——并行I/O(2)
目录 一、显式偏移的并行文件读写 1、阻塞方式 1.1 MPI_FILE_READ_AT 1.2 MPI_FILE_WRITE_AT 1.3 MPI_FILE_READ_AT_ALL 1.4 MPI_FILE_WRITE_AT_ALL 2、非阻塞方式 2.1 MPI_FILE_IREAD_AT 2.2 MPI_FILE_IWRITE_AT 3、两步非阻塞组调用 3.1 MPI_FILE_READ_AT_ALL_BEG…...

Java三种创建多线程的方法
线程是什么: 进程是程序的一次动态执行的过程,线程是进程中执行运算最小单位,一个进程在其执行过程中可以产生多个线程,而线程必须在某个进程内执行。 如果在一个进程中同时运行了多个线程(必须包含一个主线程&#…...

828华为云征文 | 云上私人数据管家,jMalCloud个人网盘在华为云Flexus的Docker化部署实践
华为云服务器Flexus X实例介绍 华为云Flexus云服务器X实例,是由国家科技进步奖获得者、华为公司Fellow、华为云首席架构师顾炯炯牵头研发。它基于擎天QingTian架构、瑶光云脑、盘古大模型等根技术创新,是业界首款应用驱动的柔性算力云服务器,…...

C# 开源教程带你轻松掌握数据结构与算法
目录 前言 项目介绍 项目特点 项目展示 1、内容导图 2、部分目录 3、源码示例 项目地址 最后 前言 在项目开发过程中,理解数据结构和算法如同掌握盖房子的秘诀。算法不仅能帮助我们编写高效、优质的代码,还能解决项目中遇到的各种难题。 给大家…...

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(五)
概述 在 WWDC 24 中,苹果推出了数据库框架 SwiftData 2.0 版本。其新加入的历史记录追踪(History Trace)机制着实让秃头码农们“如痴如醉”了一番。 我们在之前的博文中已经介绍了 History Trace 是如何处理数据新增操作的。而在这里,我们将再接再厉来完成数据删除时的全盘…...

python爬虫基础:了解html
编辑器vscode <!DOCTYPE html> <html><head><title>第一个网页</title></head><body><h1>字体</h1><h2>字体</h2><h3>字体</h3><p>Lorem, ipsum dolor sit amet consectetur adipisicing…...

spring security OAuth2 客户端接入gitee
一、简介 OAuth 是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像、照片、视频等),并且在这个过程中无须将用户名和密码提供给第三方应用。通过令牌(token)可以实现这一功能,每一个令牌授权一个特定的…...

阿里云镜像报错 [Errno 14] HTTP Error 302 - Found 问题解决记录
1、问题背景和解决思路 在本地安装 CentOS7 后,网络已调通可正常上网,但切换阿里云镜像后,使用 yum 安装软件时出现 “[Errno 14] HTTPS Error 302 - Found Trying other mirror.” 报错,原因是 yum 源配置问题。给出了详细的解决…...

《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.18.1容器版分布式ACL集群》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…...

深入剖析嵌套调用和链式访问,以及函数的声明和定义(超全面覆盖)
1. 前情提要 在上一篇博客中,我们大致了解了函数的种类,以及自定义函数中形参和实参的具体区别 我们知道实参是需要传递给形参的,但其实形参和实参占据的是完全独立的内存空间 x,y在执行过程中会得到a和b的值,但是x…...

浏览器百科:网页存储篇-IndexedDB介绍(十)
1.引言 在现代网页开发中,数据存储需求日益增多和复杂,传统的客户端存储技术如localStorage和sessionStorage已难以满足大型数据的存储和管理需求。为了解决这一问题,HTML5 引入了 IndexedDB,在本篇《浏览器百科:网页…...

Java语言程序设计基础篇_编程练习题*18.22 (将十进制數转换为十六进制数)
题目:*18.22 (将十进制數转换为十六进制数) 编写一个递归方法,将一个十进制数转换为一个十六进制数的字符串。方法头如下: public static String dec2Hex(int value)编写一个测试程序,提示用户输入一个十进制数,然后显示等价的十…...

蓝桥杯3. 压缩字符串
题目描述 实现一个算法来压缩一个字符串。压缩的要求如下: 需要判断压缩能不能节省空间,仅在压缩后字符串比原字符串长度更短时进行压缩。 压缩的格式是将连续相同字符替换为字符 数字形式,例如 "AAABCCDDDD" 变为 "A3BC2D…...

Java设计模式之责任链模式详细讲解和案例示范
在本文中,我们将详细讲解Java设计模式中的责任链模式,探讨其基本概念、使用场景、常见问题和解决方式。同时,我们还会介绍责任链模式与策略模式的区别,并结合电商交易系统的示例进行说明。此外,我们还会探讨责任链模式…...

ubuntu_如何解决apt install时报错:Waiting for cache lock: Could not get lock
当你在 Ubuntu 上运行 apt 时,遇到类似 Waiting for cache lock: Could not get lock 错误,通常是因为另一个进程正在使用 apt 或者类似的包管理器工具。你可以按照以下步骤来查找并解决这个问题: 1. 查询哪个进程正在使用锁 系统中的锁文件…...

软件测试(D5)
步骤: 设计测试-->发现缺陷-->测试报告 Day1 target 1.复述软件测试的定义 2.7种软件测试分类的区别 3.质量模型的重点5项 4.测试流程的6个步骤 5.测试模板的8个要素 认识软件及测试 软件: 控制硬件的工具 应用软件系统软件࿰…...

CSS 圆角渐变边框
<div class"contact-box"><div class"contact-item">联系我们</div> </div>.contact-item{width: 194px;height: 48px;border-radius: 20px 20px 20px 20px;background-color: #000000;color: #BDBDBD;font-weight: 500;font-size…...

骑砍2霸主MOD开发(26)-使用TrfExporterBlender制作TRF文件
一.Blender导入TRF文件 import bpytrf_meshes = []trf_contents = []trf_import_path = D:\pt_ladder.trftrf_export_path = D:\pt_ladder_morph_keys.trfclass TrfMesh:def __init__(self):self.mesh_name = self.mesh_materials = []self.vertex_cnt = 0self.vertex_fvf_cnt…...