【动态三维重建】Deformable 3D Gaussians 可变形3D GS用于单目动态场景重建(CVPR 2024)

主页:https://ingra14m.github.io/Deformable-Gaussians/
代码:https://github.com/ingra14m/Deformable-3D-Gaussians
论文:https://arxiv.org/abs/2309.13101

在这里插入图片描述


文章目录

  • 摘要
  • 一、前言
  • 二、相关工作
    • 2.1 动态场景的神经渲染
    • 2.2 神经渲染加速
  • 三、方法
    • 3.1 正则空间三维GS的可微渲染
    • 3.2 可变形的3D高斯
    • 3.3 退火平滑训练
  • 四、实验
    • 4.1 实施细节
    • 4.2 合成数据集的比较
    • 4.3 真实数据集比较
    • 4.4 消融实验
  • *总结与局限性
  • * 一些demo


摘要

提示:这里是大概内容:

  隐式神经表示为动态场景重建和渲染的新方法铺平了道路。尽管如此,先进的动态神经渲染方法很大程度依赖这些隐式表示,经常难以捕捉场景中物体的复杂细节。此外,隐式方法在一般动态场景中实现实时渲染,限制了它们在各种任务中的使用。为了解决这一问题,我们提出了一种可变形的三维高斯分布的splatting 方法,该方法使用三维高斯分布来重建场景,并在具有变形场的规范空间中学习它们,以建模单目动态场景。我们还引入了一种没有额外开销的退火平滑训练机制,它可以减轻不准确的姿态对真实世界数据集中时间插值任务的平滑性的影响。通过微分高斯光栅化器,可变形三维高斯不仅获得更高的渲染质量,而且实时渲染速度。实验表明,我们的方法在渲染质量和速度方面都显著优于现有的方法,使其非常适合于新视图合成、时间插值和实时渲染等任务

一、前言

   从一组输入图像中获得的动态场景的高质量重建和逼真渲染对各种应用都至关重要,包括增强现实/虚拟现实(AR/VR)、3D内容制作和娱乐。以前用于建模这些动态场景的方法在很大程度上依赖于基于网格的表示,如文献[9,14,18,40]的方法所示。然而,这些策略经常面临固有的限制,如缺乏细节和真实性,缺乏语义信息,以及难以适应拓扑变化。随着神经渲染技术的引入,这种范式经历了一个重大的转变。隐式场景表示,特别是由NeRF [28]实现的,在新颖视图合成、场景重建和光分解等任务中显示出了值得称赞的功效。

   为了提高基于NeRF 的静态场景中的推理效率,研究人员开发了多种加速方法,包括基于网格的结构[7,46]和预计算策略[44,52]。值得注意的是,通过合并哈希编码,Instant-NGP[29]已经实现了快速训练。在质量改进方面,MipNeRF [2]率先采用了一种有效的抗混叠方法,后来由ZipNeRF [4]将其纳入到基于网格的方法中。3D-GS [15]最近将基于点的渲染扩展到高效的三维高斯CUDA实现,它可以在匹配甚至超过Mip-NeRF [2]的质量时实现实时渲染。然而,这种方法是为表示静态场景而设计的,其高度定制的CUDA栅格化管道降低了其可伸缩性。

  隐式表示已经被越来越多地用于建模动态场景。 为了处理动态场景中的运动部分entangled(纠缠) 方法[43,49]将NeRF设置在一个时间变量上。相反,disentangled 解纠缠方法[23,30,31,34,39]通过在给定时间映射到该空间的点坐标来建模规范空间中的场景。这种解耦的建模方法可以有效地表示具有非戏剧性动作变化的场景。然而,无论如何分类,对动态场景采用隐式表示往往被证明是低效和无效的(缓慢的收敛速度,以及明显的过拟合敏感性)。从NeRF加速研究中获得灵感,许多关于动态场景建模的研究已经整合了离散的结构,如体素网格[11,38],或plane[6,36]。这种集成提高了训练速度和建模精度。然而,挑战仍然存在。 利用离散结构的技术,面临实时渲染和产生足够细节的高质量输出的双重约束问题 多个方面支撑着这些挑战:首先,射线投射,作为一种渲染模式,经常变得低效,特别是当缩放到更高的分辨率时。其次,基于网格的方法依赖于一个低秩的假设。与静态场景相比,动态场景具有更高的秩,这阻碍了这种方法可达到的质量上限

  本文扩展了静态三维-gs,提出了一个可变形的三维高斯框架来建模动态场景。为了提高模型的适用性,我们特别关注了单目动态场景的建模。不同于逐帧重建场景,我们 以时间为3D高斯的条件,在正则空间中与可学习的三维高斯联合训练纯隐式变形场。这两个分量的梯度是由一个定制的微分高斯栅格化管道得到的。此外, 为了解决在重构过程中由于不准确的姿态而引起的时间序列抖动,我们采用了退火平滑训练(AST)机制。这种策略不仅提高了时间插值任务中帧之间的平滑性,而且还允许渲染更多的细节

  

二、相关工作

2.1 动态场景的神经渲染

  最近,NeRF [28]通过使用MLPs促进了逼真的新视图的合成。随后的研究将NeRF的应用扩展到各种应用,包括从图像集合[20,45]中进行网格重建,反渲染[5,25,54],相机参数[21,47,48]的优化和 few-shot学习等任务

  构建动态场景的辐射场是NeRF发展的一个关键分支,对重要的应用意义。渲染这些动态场景的一个主要挑战是对时间信息的编码和有效利用,特别是单目动态场景的重建,一个任务本质上涉及从单一视角的稀疏重建。 一类动态NeRF方法通过将时间 t 作为辐射场的额外输入来模拟场景形变 。然而,这种策略将由时间变化引起的位置变化与辐射场结合起来,缺乏关于时间对现场影响的几何先验信息。因此,需要大量的正则化来确保渲染结果的时间一致性。 另一类方法[30,31,34]引入了一个变形场来解耦时间和辐射场,通过变形场将点坐标映射到与时间t对应的规范空间 。这种解耦的方法有利于学习明显的刚性运动,并且足够多样化,以适应发生拓扑变化的场景。 其他方法从各个方面提高动态神经渲染的质量,包括分割场景[39,42]中的静态和动态对象,结合深度信息[1]引入几何先验,引入2D CNN编码场景先验[22,33],利用多视点视频[19]中的冗余信息设置关键帧压缩存储 ,从而加快渲染速度

  然而,现有的基于MLP(多层感知器)的动态场景建模的渲染质量仍然不理想。在这项工作中,我们将专注于单眼动态场景的重建。我们继续解耦变形场和辐射场。为了提高动态场景中中间状态的可编辑性和渲染质量,我们采用了这种建模方法,以适应基于可微点的渲染框架。

2.2 神经渲染加速

  实时渲染长期以来一直是计算机图形学领域的一个关键目标,这也是神经渲染领域的一个目标。许多致力于NeRF加速的研究已经细致地导航了空间和时间效率之间的权衡。

  预计算的方法[12,35]利用空间加速度结构,如球谐系数[52]和特征向量[13],缓存或从隐式神经表示中提取,而不是直接使用神经表示本身。这一类中一个突出的技术[Mobilenerf]将NeRF场景转换为粗的mesh和特征纹理的合并,从而提高渲染速度。然而,这种预先计算的方法可能需要对单个场景的大量存储容量。虽然它在推理速度方面具有优势,但它需要延长的训练时间,并表现出相当大的开销。

  混合方法[4,7,24,27,41,46]在显式的grid 中包含了一个神经组件,具有双重好处,即加速训练和推理阶段,同时产生与高级框架[2,3]相同的结果。这主要归因于网格的强大的表示能力。这种基于grid或plane的策略已扩展到,动态场景建模和时间条件压缩的四维动态场景建模中的时间条件四维特征的加速或表示

  近年来,一些研究[16,53]已经将连续辐射场从隐式表示发展为可微的基于点的辐射场,显著提高了渲染速度。3D-GS [15]进一步创新了基于点的渲染,引入了一个定制的基于古巴的可微高斯栅格化管道。这种方法不仅在新视图合成和场景建模等任务中取得了优越的结果,而且促进了每分钟量级的快速训练时间,并支持超过100 FPS的实时渲染。然而,该方法采用了一个定制的微分高斯栅格化管道,这使其直接扩展到动态场景变得复杂。受此启发,我们的工作将利用基于点的渲染框架,3D-GS,来加快动态场景建模的训练和渲染速度


三、方法

  方法的概述如图2。 输入是一组单目动态场景的图像,以及SfM [37]校准的时间标签和相应的相机 pose,也产生稀疏点云 。从这些点出发,我们 创建了一组三维高斯 G(x,r,s,σ),由中心位置x、不透明度σ和由四元数r 和 缩放s得到的三维协方差矩阵Σ。每个三维高斯的视图相关外观通过球谐波(SH)表示。为了模拟随时间变化的动态三维高斯分布,我们解耦了三维高斯分布和变形场。 变形场以三维高斯分布的位置和当前时间t作为输入,输出δx、δr和δs。随后,将变形的三维高斯 G (x+δx, r+δr, s+δs, σ) 放入高效微分高斯栅格化管道中,这是一个基于tile瓦片的光栅化器,允许各向异性splats的α混合。

在这里插入图片描述

  通过跟踪累积的α值,并对高斯密度进行自适应控制,共同优化了三维高斯分布和变形网络。实验结果表明,经过30k的训练迭代,三维高斯分布的形状稳定,正则空间(canonical space)也稳定,间接证明了我们设计的有效性。

3.1 正则空间三维GS的可微渲染

   为了在规范空间中优化三维高斯图像的参数,必须对这些三维高斯图像的二维图像进行可微渲染 。在本工作中,我们采用了原始GS提出的微分高斯栅格化管道。按照论文[Ewa volume splatting],三维高斯分布可以被投影到二维,并使用以下二维协方差矩阵Σ‘对每个像素进行渲染:

在这里插入图片描述

  其中,J为投影变换的仿射近似的雅可比矩阵;V表示视图矩阵,从世界坐标过渡到摄像机坐标;Σ表示三维协方差矩阵

  为了使三维高斯分布的学习更容易,Σ被分为两个可学习的分量:四元数r表示旋转,三维向量s表示缩放。然后将这些分量转换为相应的旋转和缩放矩阵R和s,得到的Σ可以表示为:

在这里插入图片描述

  图像平面上的像素的颜色,用p表示,用基于点的体渲染技术按顺序渲染:

在这里插入图片描述
其中,Ti是由 在这里插入图片描述定义的透射率,ci 表示沿射线的高斯分布的颜色;µi 表示投影到二维图像平面上的三维高斯分布的uv坐标。

  在优化过程中,自适应密度控制成为一个关键的组成部分,使三维高斯分布的渲染能够达到理想的结果。该控制具有双重目的:首先,它要求基于σ对透明高斯分布进行剪枝。其次,它对高斯分布的稠密化 这填补了几何复杂的区域,同时细分了高斯分布较大并表现出显著重叠的区域。值得注意的是,这些区域倾向于显示出明显的位置梯度。按照原始GS,使用tpos = 0.0002给出的阈值来识别需要进行调整的三维高斯分布。对于不足以捕捉几何细节的小高斯分布,我们克隆高斯分布,并在位置梯度的方向上移动一定的距离。相反,对于那些明显大且重叠的,我们将它们分割,并除以超参数ξ = 1.6

  很明显,三维高斯分布只适用于表示静态场景对每个三维高斯分布应用一个时间条件的可学习参数,不仅与可微高斯栅格化管道的原始意图相矛盾,而且会导致 运动的时空连续性的损失 。为了使三维高斯能够表示动态场景,同时保留其个别可学习组件的实际物理意义,我们决定在规范空间中学习三维高斯,并使用一个额外的变形场来学习三维高斯的位置和形状变化。

3.2 可变形的3D高斯

  使用三维高斯模型建模动态场景的一个直观解决方案是在每个时间依赖的视图集合中分别训练3D-GS集,然后在这些集之间执行插值作为后处理步骤。虽然这种方法对于离散时间的MVS捕获是可行的,但无法在一个时间序列内进行连续的单眼捕获 (it falls short for continuous monocular captures)

  我们通过利用一个变形网络和三维高斯分布来解耦运动和几何结构,将学习过程转换为一个正则空间,以获得与时间无关的三维高斯分布。这种解耦方法引入了场景的几何先验,将三维高斯分布位置的变化,与时间和坐标联系起来。变形网络的核心是一个MLP。在我们的研究中,我们没有使用应用于静态NeRF的grid/plane来加速渲染和提高质量。这是因为这种方法是在低秩假设下运行的,而动态场景具有更高的秩。基于显式点的渲染进一步提高了场景的秩

  给定时间 t 和三维高斯的中心位置 x 作为输入,MLP产生偏移量,然后将canonical 3D GS 转换到de formed space:
在这里插入图片描述
在这里插入图片描述

其中,sg(·) 表示停止梯度操作,γ表示位置编码。在合成场景中,x采用L = 10,t的L=6;真实场景中,x和t都为L = 10。变形网络的深度D = 8和隐藏层的维数W = 256。实验表明,对变形网络的输入端应用位置编码可以增强渲染结果的细节。

3.3 退火平滑训练

  真实数据集,在不精确姿态下的训练会导致训练数据的过拟合,动态场景中非常明显。正如HyperNeRF [31]中提到的,真实数据集的不精确pose 会导致每帧的空间抖动;渲染时,测试与Groudtruth明显偏差。以前使用隐式表示的方法得益于MLP固有的平滑性,这使得这种微小的偏移量对最终渲染结果的影响相对不明显。然而,显式的基于点的渲染倾向于放大这种效果 对于单目动态场景,在固定时间内的新视图渲染不受影响。然而,对于涉及插值时间的任务,这种不同时间的不一致场景会导致不规则的渲染抖动。

  为解决问题,提出退火平滑训练(AST)机制,专门为现实世界的单目动态场景设计:

在这里插入图片描述
X(i)表示第i个训练步的线性衰减高斯噪声;N(0,1)是标准高斯,β是经验比例因子(0.1),∆t代表平均时间间隔,τ是退火平滑训练的iteration阈值(经验设为20k)。

  与[D-nerf、Tensor4d]方法引入的平滑损失相比,我们的方法不会产生额外的计算开销。它可以在训练早期增强模型的时间泛化,防止后期过度平滑,从而保留动态场景中对象的细节。同时,它减少了在时间插值任务期间在真实数据集中观察到的抖动。

  


四、实验

  在基准测试上评估,基准包括来自D-NeRF [34]的合成数据集和来自HyperNeRF [31]和NeRF-DS [50]的真实数据集。 训练和测试部分的划分,以及图像分辨率,与原论文完全一致。

4.1 实施细节

   使用PyTorch [32]实现框架,并通过合并深度可视化来修改可微高斯栅格化。训练共40k次迭代,前3k次迭代只训练三维高斯分布来获得相对稳定的位置和形状。随后,我们联合训练三维高斯分布和变形场。对于优化,使用一个Adam优化器[17],但每个组件的学习率不同:三维高斯的学习率与官方实现完全相同,而变形网络的学习率经历指数衰减,从8e-4到1.6e-6。Adam的β值范围设置为(0.9,0.999)。合成数据集的实验都是在黑色背景下进行的,全分辨率为800x800。所有的实验都是在NVIDIA RTX 3090上进行的。

4.2 合成数据集的比较

  D-NeRF 的单目合成数据集,定量比较见表1。图3中提供了定性结果,显示了高保真的动态场景建模能力(确保了增强的一致性,并在新视图渲染中捕获了复杂的渲染细节)
在这里插入图片描述

在这里插入图片描述

4.3 真实数据集比较

  NeRF-DS [50]和HyperNeRF [31]的单目真实数据基线进行了比较。 注意,一些HyperNeRF数据集的相机姿态是非常不准确的。考虑到像PSNR这样的旨在评估图像渲染质量的指标,倾向于惩罚轻微的偏差而不是模糊,我们没有在定量分析中纳入HyperNeRF。详细信息见表2和图5。这些结果证明了我们的方法在应用于真实世界的场景时的鲁棒性,即使相关的pose并不完全准确
在这里插入图片描述
在这里插入图片描述

渲染效率。渲染速度与三维高斯的数量相关。总的来说,当三维高斯数低于250k时,我们的方法可以在NVIDIA RTX 3090上实现超过30 FPS的实时渲染

深度可视化。图6中合成数据集场景的深度可视化,以证明我们的变形网络很好地适合产生 temporal transformation,而不是依赖于基于颜色的硬编码。精确的深度强调了我们的几何重建的准确性,证明了非常有利于新视图合成任务。

4.4 消融实验

  退火平滑训练如图4和表2,这种机制促进了对复杂区域的收敛,有效地减轻了真实数据集中的过拟合趋势。此外,从我们的观察中可以明确地清楚地看出,这种策略显著地支持了变形场的时间平滑性。
在这里插入图片描述

*总结与局限性

  局限性:通过实验评估,观察到三维高斯分布的收敛性受到视角多样性的深刻影响。因此,具有稀疏视点和有限视点覆盖范围特征的数据集可能会导致我们的方法遇到过拟合的挑战 。此外, 我们的方法的有效性取决于姿态估计的准确性 。当我们的方法在Nerfes/HyperNeRF数据集上没有达到最优PSNR值时,这种依赖性很明显,这归因于COLMAP姿态估计的偏差。此外, 我们的方法的时间复杂度与三维高斯分布的量成正比。在具有大量3D高斯函数数组的场景中,训练时间和记忆消耗都有潜在的升级。最后, 我们的评估主要围绕着具有中等运动动力学的场景。这种方法在处理复杂的人体动作,如微妙的面部表情,仍然是一个悬而未决的问题

提示:这里对文章进行总结:

  本文介绍了一种新的可变形的三维GS方法,专门为单目动态场景建模而设计,它在质量和速度上都超过了现有的方法。通过在正则空间中学习三维高斯分布,我们增强了动态捕获单目场景的三维-gs可微渲染管道的通用性。与隐式表示相比,基于点的方法更加重要,它更易于编辑,更适合于后期生产任务。此外,我们的方法结合了一个退火平滑训练策略,旨在减少与时间编码相关的过拟合,同时保持复杂的场景细节,而不增加任何额外的训练开销。


* 一些demo

1.D-NeRF Datasets:

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

2.HyperNeRF Datasets:

在这里插入图片描述

3.真实场景:

在这里插入图片描述

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

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

相关文章

mac硬盘拷贝到另外硬盘 苹果电脑怎么拷贝到移动硬盘

在当今的信息时代,数据的存储和传输是我们日常生活和工作中不可或缺的一部分。我们经常需要使用各种硬盘来保存和备份我们的数据,比如内置硬盘、移动硬盘、U盘等。但是,不同的硬盘可能使用不同的文件系统,这给我们的数据拷贝带来了…

java 数据结构 排序算法

目录 排序 插入排序 直接插入排序 希尔排序( 缩小增量排序 ): 直接选择排序 堆排序 交换排序 冒泡排序 快速排序递归 Hoare法 挖坑法 前后指针法 快速排序优化 快速排序非递归 归并排序 归并排序非递归 排序算法复杂度及稳定性分析 计数排序 排序…

【论文阅读】Masked Autoencoders Are Scalable Vision Learners

Masked Autoencoders Are Scalable Vision Learners 引用: He K, Chen X, Xie S, et al. Masked autoencoders are scalable vision learners[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2022: 16000-16009. 论文链…

wireshark抓tcp包使用指南

本博文源于笔者不断探索加上去网络总结获得的经验,撰写wireshark如何抓tcp包 文章目录 1、打开wireshark2、选择网络源3、搜索ip地址与tcp条件4、看灰色的条纹 1、打开wireshark 2、选择网络源 选择自己当前的ip地址适用于的网络源,比如这里选择“以太…

ETH Gas 之 Base Fee Priority Fee

前情回顾 ETH网络 之 Gas EIP-1559 EIP-1559 EIP-1559是以太坊改进提案(Ethereum Improvement Proposal),旨在改进以太坊的交易费用机制。该提案引入了一种新的交易费用模型,以提高交易费用的可预测性和网络的效率。我们本文各…

故障诊断 | 一文解决,GRNN广义回归神经网络的故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,GRNN广义回归神经网络的故障诊断(Matlab) 专栏介绍

拥抱DevOps,开启数字化转型的加速器

在数字化浪潮席卷全球的今天,企业面临着前所未有的挑战与机遇。为了保持竞争力并适应快速变化的市场需求,数字化转型已成为企业发展的必由之路。而在这一过程中,DevOps作为一种全新的开发与运维理念,正逐渐成为推动企业数字化转型…

数据库设计三大范式

第一范式 确保每列保持原子性 即数据库表中的所有字段值都是不可分解的原子值 如果地址这个字段频繁访问, 则将地址这个属性重新划分为 省份 城市,详细地址等部分进行存储,这样才算是满足数据库的第一范式 第二范式 确保表中的每列都和主…

Python基础入门 --- 6.数据容器

文章目录 Python基础入门第六章:6.数据容器6.1 列表6.1.1 列表下标索引6.1.2 列表常用操作查找指定某元素的下标修改指定位置的元素值插入元素追加元素方式1追加元素方式2删除元素删除某元素在列表中的第一个匹配项清空列表统计某元素在列表中的数量统计列表元素个数…

vue+elementUI实现树形穿梭框

1.实现效果 2.整体思路 将左侧选中的节点移动到右侧,还要保持树结构,意味着移动子节点,需要把该子节点对应的父节点甚至父节点的父节点一并移到右侧形成一个新的树结构,树结构的层级和原来的树保持一致,只是右侧展示…

全国媒体公关服务资源分析,媒体邀约资源包括哪些?-51媒体网

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 全国媒体公关服务资源分析是一个涵盖多方面的复杂议题,主要涉及到不同媒体类型、传播渠道、以及公关策略等多个维度。在当前媒体环境下,媒体公关服务资源主要包括…

机器人路径规划:基于斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

【论文阅读】通过组件对齐评估和改进 text-to-SQL 的组合泛化

Measuring and Improving Compositional Generalization in Text-to-SQL via Component Alignment NAACL 2022| CCF B Abstract 在 text-to-SQL 任务中,正如在许多 NLP 中一样,组合泛化是一个重大挑战:神经网络在训练和测试分布不同的情况…

Python 深度学习第二版(GPT 重译)(二)

四、入门神经网络:分类和回归 本章涵盖 您的第一个真实世界机器学习工作流示例 处理矢量数据上的分类问题 处理矢量数据上的连续回归问题 本章旨在帮助您开始使用神经网络解决实际问题。您将巩固从第二章和第三章中获得的知识,并将所学应用于三个新…

数据之王国:解析Facebook的大数据应用

引言 作为全球最大的社交媒体平台之一,Facebook拥有庞大的用户群体和海量的数据资源。这些数据不仅包括用户的个人信息和社交行为,还涵盖了广告点击、浏览记录等多方面内容。Facebook通过巧妙地利用这些数据,构建了强大的大数据应用系统&…

T470 双电池机制

ThinkPad系列电脑牛黑科技双电池管理体系技术,你知道吗? - 北京正方康特联想电脑代理商 上文的地址 在放电情况下:优先让外置电池放电,当放到一定电量后开始让内置电池放电。 在充电情况下:优先给内置电池充电,当充…

uboot - pinctrl - FPGA回片前测试阶段 - 设置GPIO引脚复用失败

问题描述 pinctrl设置引脚复用失败,没有调用到controller中的set_groups_function函数。 问题定位 pinctrl如何注册dm节点如何进行设备树中各个设备节点下的复用配置为什么没调用到控制器实现的set_groups_function函数 &gpio0 {status "okay";p…

web自动化3-pytest前后夹具

一、pytest前后置(夹具)-fixture 夹具的作用:在用例执行之前和之后,需要做的准备工作之前和收尾工作。 用于固定测试环境,以及清理回收资源。 举个例子:访问一个被测页面-登录页面,执行测试用…

阿里云镜像仓库服务--推送docker image到远程仓库

一、背景 阿里云对于镜像仓库服务的使用文档已比较完善,结合它给的示例。 本文是站在小白用户的视角,梳理整个的使用过程以及遇到的问题。 二、使用步骤 阿里云镜像仓库服务和harbor、nexus等私有仓库等并没有什么大差不差之处,仍旧是四步走…

Java设计模式 | 工厂方法模式

工厂方法模式 针对简单工厂模式案例中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则。简单工厂模式只有一个工厂类,负责创建所有产品,如果要添加新的产品,就需要修改工厂类的代码。而工厂方法模式引入了…