Consistent Video Depth Estimation——视频深度一致估计

Paper | Code

文章核心

提出一种算法——重构单眼视频中所有像素稠密的几何一致的深度,其利用了传统的SFM(从运动中重构)来建立视频中像素的几何约束。与经典重建中的特殊先验不同的是,本文使用的是基于学习的先验(如:训练卷积神经网络来估计单张图像的深度)。在测试阶段,微调网络来满足特定输入视频的几何约束,同时保留其在约束较少的视频部分来合成看似合理的深度细节。定量分析,方法确实比以往的单眼重构方法具有更高的精度和更高的几何一致性。可视化的情况下,本文的结果也似乎更为稳定。本文的算法能够处理-手拍的中等程度运动的视频。面向的应用包括场景重建、视觉特效等。

介绍:

利用图像序列进行三维场景重建的研究屡见不鲜。最初,视频中的运动所带来的场景结构的估计不稳定,即模型鲁棒性差,使其只能在实验环境下,即具有高度校准和可预测的设置,才能表现良好。有时甚至产生的是稀疏结构(如:解决只跟踪一些孤立点的深度)。随后,由于高质量的开源重建系统和基于学习的技术的最新进展,从更随便得到的视频中,产生更密集的结构得到了良好的进展。

3D重建最简单的输入来源就是手机视频,其最为普遍。如果能从这样的输入中实现完全密集和准确的重建,这将是非常有用的——然而,这个过程是相当困难的。

任何图像重构系统都存在必须处理的典型问题,如纹理较差的区域、重复图案、遮挡;视频还存在更多的难题,比如更高的噪声等级、震动、运动模糊、滚动快门变形、相邻帧之间的小基线,包括动态的物体,比如人。因此,研究中总会遇到各种各样的问题,比如在深度图中缺失区域(b)、不一致的几何形状以及闪烁(c)等。

传统的方法:稀疏的SFM+密集的多视图点云——本质上匹配极线的补丁,如果匹配正确时,可以实现几何上准确的重建。但是,由于前面提到的复杂性,匹配通常是有噪声的,通常需要使用启发式平滑先验进行正则化。这通常会导致受影响区域出现不正确的几何形状,因此许多方法以低置信度完全丢弃像素,在重建中留下“洞”(如b1)。

最近,基于学习的单张图像方法得到巨大进展。这样就能摈弃启发式正则化(heuristic regularization),直接从数据中学习场景的先验,这样可以更好地在传统重建方法中,对先前弱甚至错误的部分能够进行更好地合成场景的可信深度。尤其,在重建动态场景方面表现出色,因为从单帧的角度,静态对象和动态对象是相同的。但是,如果对每帧都进行独立的处理,那么估计的深度经常不规律地闪烁,而且它也不是度量的,(即与单张缩放因子的真实深度无关),这实际上就是视频重建时几何上的不一致,就好像物体随相机在晃动,而不是在真实场景运动。

视频深度估计的方法有哪些呢?

  1. 通过递归神经网络隐式地解决随时间重建地几何一致性问题
  2. 明确的使用多视图重建

但是,解决的主要是静态场景。(静态场景还能算视频???小赵困惑,先留疑)

文章就提出了他们的方法:一种新的基于视频的重构系统——结合了传统方法的优势+基于学习的技术。具体而言:利用传统获得几何约束的方法,实现精确、一致的深度,利用基于学习的先验来合理的填充前者弱约束区域的方法。在测试时微调单个图像深度估计网络的权值,以便它学习满足特定场景的几何形状,同时保持其在必要时合成可信的新深度细节的能力。我们的测试时间训练策略允许我们同时使用短期和长期的约束,防止随时间的漂移。

结果:所得到的深度视频是完全密集和详细的,有清晰的物体边界。整个视频满足几何一致性,从而无闪烁出现。

  • 效果:静态物体投射到世界空间时,十分稳定。该方法甚至支持运动较缓慢的动态场景运动(如图),遗憾的是,运动剧烈时,其效果就急速下降。
  • 应用:深度视频的质量和几何一致性可以促进新应用的出现,如图密集场景内的内容交互,全自动视频特效。

相关工作:

1 Supervised monocular depth estimation——有监督的单眼深度估计

  • 早期基于学习的方法将局部图像特征回归到深度或离散的几何结构,然后进行一系列的后处理步骤。基于深度学习的模型已成功应用于单张图像深度估计,但是,训练这些模型需要难以获得的GT深度图。
  • 前人的工作有:
    • 基于域适应性训练合成数据集
    • 收集相对深度的注释
    • 使用传统的SFM与多视图点云算法从网络图像、3D电影,获取伪地面真实深度图

本文的方法建立在单图像深度估计的最新进展的基础上,进一步提高了视频深度估计的几何一致性。

2 Self-supervised monocular depth estimation——自监督的单眼深度估计

  • 训练的数据集需求大,但其收集并不容易,自监督学习的方法能够直接从原始立体对或单眼视频中进行单眼深度估计的学习,广受关注。核心思想:应用不同的扭曲和最小化光度再投影误差。
  • 最近用来训练提高性能的方法有:光流、物体移动、曲面法线、边缘、视觉度量;其他方面包括:立体信息、更好的网络架构和训练损失设计、尺度一致的自我运动网络、结合三维几何约束、以及从未知相机本质中学习。
  • 许多自监督的方法都使用了光度损失。但是,即使几何形状不一致(特别是在纹理较差的区域),也可以满足这些损失。此外,由于更大的外观变化,它们不能很好地适用于时间上跨度大的框架。同时,在消融研究中,表明:长期的时间约束对于获得良好的结果是重要的。

3 Multi-view reconstruction——多视点重建

  • 多视点立体算法利用从任意视点捕获的多张图像来估计场景深度。最近基于学习的方法利用传统的基于几何的方法中成熟的原则,在多视图重建中显示了最先进的性能。
  • 但是,这些多视图立体声技术假设的是一个静态场景。对于动态对象,这些方法要么产生错误的估计,要么以低置信度下降像素。

相比之下,我们的方法产生密集的深度,即使存在中等程度的动态场景运动

4 Depth from video——视频深度

  • 从单眼视频中恢复密集的深度是一个具有挑战性地问题。现有技术依赖于运动分割和对场景中的运动对象显式运动建模,进而处理移动的物体。也有方法通过使用两帧或多帧来合成运动估计和多视图重建来估计深度。现在流行估计视频深度方法——基于将附近帧扭曲到参考视点构建cost volume,回归深度(或预测深度的分布)。因此,该模型不考虑动态移动的对象。

相比之下,虽然本文也利用了来自多视图几何的约束,但深度是从(微调的)单图像深度估计模型中估计的,从而自然地处理动态对象,而不需要显式的运动分割。

5 Temporal consistency——时间一致性

  • 将视频的每一帧做单张图像深度估计,由于独立处理,就会导致整体看时,出现帧闪烁问题。由此,前人提出了一系列加强时间一致性的方法:样式转换的上下文、基于图像的图形应用程序、视频到视频的合成、与应用程序无关的后处理算法。
  • 核心思想是引入“时间一致性损失”(在训练或测试时间),从输入视频中估计时间对应的相似值。在视频深度估计的背景下,明确的应用基于光流的一致性损失含蓄的使用递归神经网络来表示时间一致性,使估计的深度更具有时间一致性。

本文工作的不同之处在于,目标是从一个几何一致的视频中产生深度估计。这对于随意捕捉的视频尤其重要,因为随着时间的推移,实际的深度可能在时间上不一致。

6 Depth-aware visual effects——深度感知视觉效果

  • 密集的深度估计有利于广泛的视觉效果,如合成景深、新视点合成、遮挡感知增强现实。

本文工作从随意捕获的视频实现深度一致的估计,能够实现视频特效。

7 Test-time training——测试时间训练

  • 基于测试数据的学习已经被用于几个不同的情况:视觉跟踪中的在线更新、将物体探测器从图像调整到视频、以及学习视频特定功能的重新识别。与本文最密切相关的工作是,通过使用测试视频序列微调预先训练好的模型来改进单眼深度估计结果。
  • 请注意,任何自监督的方法都可以在测试时进行训练。但是,以前的方法主要是实现每帧的精度,而本文的重点是实现具有全局几何一致性的精确预测。

与以往的方法相比,我们的方法以更高的时间平滑度实现了精确和详细的重建,这对许多基于视频的应用非常重要。

除了这些目标之外,本文的方法和之前的方法之间还有一些重要的技术差异。前人的方法执行一个二进制对象级分割,并估计每个对象的刚性转换。这适用于刚性物体,如街景中的汽车,但不适用于高度变形的物体,如人。也有人使用了一个类似于本文的几何损失,然而,它们只对连续的帧对和相对姿态进行训练。本文使用绝对的姿态和长期的时间连接,消融实验证明了其对获得良好的结果是至关重要的。

总览:

本文的方法以单目视频作为输入,并估计每个视频帧的相机姿态以及密集的、几何上一致的深度图(达到比例模糊度)。术语几何一致性不仅意味着深度映射不会随时间而闪烁,而且还意味着所有的深度映射都是相互一致的。也就是说,可以通过像素的深度和相机姿态在帧之间精确地投射像素。例如,一个静态点的所有观测结果都应该映射到世界坐标系中的一个共同的3D点,而不会发生漂移。

当输入视频是随意捕获的,其深度估计具有很多挑战特性。因为它们经常是用手持、未校准的相机拍摄,拍摄的视频存在运动模糊和滚动快门变形。恶劣的照明条件可能会导致噪音水平的增加和额外的模糊。最后,这些视频通常包含动态移动的物体,如人和动物,从而打破了许多为静态场景设计的重建系统的核心假设。

传统方法:正如在前面几节中解释的,在场景中有问题的部分,传统的重建方法通常会产生“洞”(或者,如果被迫返回结果,估计非常嘈杂的深度)。但是,在这些方法有足够的信心返回结果的领域,它通常是相当准确和一致的,因为它们强烈依赖于几何约束。

基于学习方法:最近基于学习的方法具有互补特性,这些方法可以很好地处理上述的挑战,因为它们利用强大的数据驱动,然后从任何输入图像预测可信的深度映射。然而,这些方法对每个帧都独立地处理,会导致几何上不一致和时间闪烁的结果。

本文的想法是结合这两种方法的优势。利用现有的单图像深度估计网络,经过训练为一般颜色图像合成可信(但不一致)深度,使用传统重建方法从视频中提取的几何约束对网络进行微调。因此,该网络学会了在一个特定的视频上产生几何上一致的深度。


本文方法分为两个阶段:

预处理:

  • 作为提取视频帧间几何约束的基础,首先使用现成的开源软件COLMAP执行传统的动态结构(SfM)重建管道,为了改进动态运动视频的姿态估计,应用MaskR-CNN来获得对人进行分割并去除这些区域,以便更可靠的关键点提取和匹配,因为在我们的视频中,人占了动态运动的大部分。这一步提供了精确的内在和外在摄像机参数以及稀疏点云重建。同时,还利用光流估计了帧对之间的密集对应关系。相机校准和密集的对应关系,加在一起,进而能够制定本文的几何损失,如下所述。
  • SfM重建的第二个作用是提供场景的尺度。由于本文的方法适用于单眼输入,重建在尺度上是模糊的。基于学习的深度估计网络的输出也是尺度不变的。因此,为了限制网络必须改变的数量,调整了SfM重建的尺度,使其在鲁棒平均意义上匹配基于学习的方法。

测试时间训练:

  • 在这一阶段,主要是微调一个预先训练的深度估计网络,使它为特定的输入视频产生更几何一致的深度。在每次迭代中,采样一对帧,并使用当前的网络参数估计深度图。通过比较密集的对应关系使用当前的深度估计得到的重投影,可以验证深度图在几何上是否一致。本文提出了2种损失:spatial lossdisparity loss并将其反向传播以更新网络的权重(为所有帧共享)。随着时间的推移,对许多帧对进行迭代采样,损失被降低,网络学习估计该视频几何一致的深度,同时保持其在较少约束的部分提供合理的正则化的能力。
  • 本文最终的深度图在几何上是一致的,在整个视频的时间上是一致的,同时准确地描述了清晰的遮挡边界,即使是动态移动的物体。通过深度计算,可以获得适当的深度边缘的遮挡效果,并使真实场景的几何形状与虚拟对象进行交互。

预处理:

1 Camera registration——相机参数

  • 使用SFM和多视图立体重建软件COLMAP来估计N个视频的每张帧的相机内参、外参,以及一个半密集深度图,同时,将未定义深度的像素的值设置为零。
  • 由于动态对象在重构中会出现严重误差,因此应用MaskR-CNN独立分割每一帧的人(因为人是视频中最常见的“动态对象”),并抑制这些区域的特征提取(COLMAP提供了这个选项)。由于智能手机相机通常不会失真,本文使用SIMPLE_PINHOLE相机模型,并解决了所有帧的共享相机内部问题,以证明工作提供了一个更快、更健壮的重建。我们使用穷举匹配器并启用引导匹配。

2 Scale calibration——尺度校准

  • SfM的尺度和基于学习的重建通常不匹配,因为这两种方法都是尺度不变的。这表现在两种方法产生的深度图的不同值范围内。为了使尺度与几何损失相容,调整SfM尺度,这可以简单地通过将所有相机平移乘以一个因子来实现。(公式细说见文)

3 Frame sampling——帧采样

  • 在后续工作中中,需要计算特定帧对的密集光流。对于视频中的所有帧对,,其计算成本将非常高。因此,在此使用一个简单的层次方案来将帧对的集合进行优化。

4 Optical flow estimation——光流估计

  • 计算所有的帧对的密集光流场。因为当帧对尽可能对齐时,光流估计效果最好,所以首先利用
    homography warp对齐帧( 帧间距离可能遥远 ),进而消除两帧之间的自主运动(如,相机旋转),因此利用光流网络计算对齐帧之间的光流。为了考虑移动对象和遮挡/去遮挡(因为它们不满足几何约束或不可靠),应用 前向后一致性检查 ,并删除前向后误差大于1像素的像素,产生一个二进制映射。此外,观察到 帧对很少重叠的光流估计结果是不可靠的 ,因此,我们不考虑重叠面积 占图像面积的20% 的任何帧对。

关于输入视频的测试时间训练:

  • 测试时间训练过程,也就是说,如何通过微调深度网络来强制深度网络,从而为特定的输入视频产生更一致的深度。首先描述本文的几何损失,然后是整个优化过程。11

Geometric loss = spatial loss +disparity loss

  • 对于跟定的一对帧,光流场描述了哪些像素对显示了相同的场景点。可以使用光流来测试当前深度估计的几何一致性:如果光流是正确的,并且光流位移点深度重投影点相同,那么深度一定是一致的。
  • 本文方法的想法是,将其它作为一个几何损失,并通过网络反向传播任何一致性误差,从而迫使它产生比以前更一致的深度。几何损失由两部分组成,即图像空间损失和视差损失。

2 Discussion——讨论

  • 深度映射在假定为静态场景情况下,光流映射可以解决动态移动情况。这种情况下,如何还能产生一个准确的深度估计呢?存在有两种情况:
    • Consistent motion(例如,一辆移动的汽车)有时可以与极线几何对齐,但导致估计错误的深度。
    • Consistent motion-极线不对齐或运动不一致(例如,挥舞的手)导致冲突的约束;根据经验,测试时间训练可以容忍这些冲突的约束,并产生准确的结果。

3 Optimization——优化

  • 利用几何损失,使用标准的反向传播来微调网络的权重。使用预先训练好的深度估计模型初始化网络参数,从而能够实现迁移学习,以便在图像上生成可信的深度图,这对于传统的基于几何的重建系统具有挑战性。使用固定数量的epoch(所有实验设置为20个epoch)来微调网络。在实践中,发现,通过这个简单的微调步骤,网络训练不会过拟合数据,因为它不会失去在场景中无约束或弱约束部分合成合理深度的能力。同时,训练处理了一定数量的错误监督(例如,错误的信息传递)。

4 Implementation details——复现细节

  • 经实验了几种单眼深度估计结构和预先训练的权重。如果没有其他说明,论文中的结果和伴随的材料使用前人的网络(单图像模型)。如其所述,在评估中使用了其他网络。给定一个输入视频,一个epoch定义在s中的所有帧对。在所有的实验中,使用ADAM优化器为0.0004。对不同长度的视频进行测试时间训练的时间也有所不同。对于一个244帧的视频,在4个NVIDIATesla M40gpu上的训练需要40min。

结果与评价:

1 实验设置

  • 数据集:自定义立体视频数据集进行评估。测试集由静态和动态场景组成,带有中度运动的物体,此外,定量分析用到:the TUM dataset 、 the ScanNet dataset 、 the KITTI 2015 dataset。
  • 评估指标:为了评估和比较在本文自定义立体视频数据集上的单眼视频估计深度的质量,我们使用了以下三个不同的指标。
    • Photometric error  - 光度误差,使用光度误差来量化恢复深度的准确性。所有的方法都是从左视频流中估计深度的。使用估计的深度,将左侧视频流重新投影到右边的像素,并计算光度误差作为RGB差异的均方误差。因为深度图只能估计到尺度模糊。需要将估计的深度映射与立体视差对齐。具体地说,通过从立体对上的估计流中取水平分量来计算立体视差。对于每个视频帧,使用基于RANSAC的线性回归计算尺度和移位对齐到计算的立体视差。通过取所有帧的尺度/位移的平均值来获得全局(视频级)尺度和位移参数。
    • Instability-不稳定性,在一个视频中测量估计的深度图随时间的不稳定性如下。首先,使用一个标准的KLT跟踪器从输入的单目视频中提取一个稀疏的可靠跟踪集。然后,将2D轨迹转换为3D轨迹,使用相机姿态和校准深度将2D轨迹取消投影到3D。为了得到一个完美稳定的重建,每个3D轨道都应该聚合到一个单一的3D点。因此,可以通过计算每对连续帧的三维点的欧氏距离来量化不稳定性。
    • Drift-漂移程度,在许多情况下,虽然上面描述的3dtrack对于连续帧可能显得有些稳定,但误差可能会累积,并随着时间的推移导致漂移。为了测量一个特定的三维轨迹的漂移量,我们计算了由三维轨迹形成的协方差矩阵的最大特征值。直观地说,这测量的是3D点在时间上的传播程度。
对于静态序列,使用所有三个指标来评估估计的深度。对于动态序列,只评估光度误差和不稳定性,因为漂移度量不考虑在场景中动态移动的对象。

2 定量分析

比较方法:将本文的结果与目前最先进的三类深度估计算法进行了比较。

  • Traditional multi-view stereo system : COLMAP
  • Single-image depth estimation:Mannequin Challenge
  • Video-based depth estimation:WSVD and NeuralRGBD

Quantitative comparison:如上图所示,光度误差、不稳定性和漂移度量与完整性的关系图。在所有三个指标中,本文的方法都优于以前算法。当评估不稳定性和漂移指标时,本文结果特别突出,重点在于其一致性。如下表,描述的更为具体。

Visual comparison:如下图所示,对不同的深度估计方法做定性比较。传统的多视图立体方法在高纹理区域产生精确的深度,可以建立可靠的匹配。这些深度图包含大孔(黑色像素),如下图b所示。基于学习的单图像深度估计方法为每个单独的视频帧生成密集的、可信的深度图。然而,随着时间的推移,闪烁的深度会导致几何上不一致的深度重建。基于视频的方法,如NeuralRGBD可以了时间闪烁,但由于用于深度估计的时间窗口有限,会出现漂移。

3 消融实验

进行消融研究,以验证采用的几种设计选择的有效性。首先研究了损失的影响以及管道中不同步骤的重要性,包括尺度校准和重叠测试。在下表中总结了这些结果。下图也显示了各种模块的重要程度。

实验表明,使用长期约束有助于提高估计深度随时间变化的稳定性。由于视差损失也有助于减少时间闪烁,在下图中进一步研究了两种设计选择的影响。结果表明,包括来自长期帧对的约束将导致更尖锐和时间上更稳定的结果。相比之下,虽然添加视差损失可以减少时间闪烁,但当只使用连续的帧对时,它会产生模糊的结果。

4 对公共基准测试的定量比较

提供三个公开的基准数据集的定量结果,以评估本文的深度估计的性能。在所有的评估设置中,调整输入图像的大小,使最长的图像尺寸为384。微调了20个epoch的单眼深度估计网络(与立体视频数据集中使用的评估设置相同)。 

TUM-RGBD dataset:本文方法在所有的评估指标中都比之前的方法相比有很大的优势。特别是,提出的测试时间训练显著提高了Li等人的基线模型的性能

ScanNet dataset:本文方法实现了与最先进的算法的竞争性能,性能略低于在扫描网训练集上训练的DeepV2D方法。

 KITTI dataset:结果表明,我们的方法确实提高了在80%以上的测试帧的性能(即使当与具有高分辨率输出的模型相比)。然而,由于COLMAP在场景中具有大动态对象的序列中产生错误的姿态估计,微调方法不可避免地会产生具有非常大误差的深度估计。本文的方法也难以处理重要的动态场景运动。因此,当结果在所有的测试帧上被平均时,方法并没有得到明显的改进。

基于视频的视觉效果

一致的视频深度估计使有趣的基于视频的特殊效果。如下图显示了这些效应的样本。

缺陷:

所提出的视频深度估计方法存在一些局限性和缺点。

 Poses:方法目前依赖于COLMAP来从单眼视频中估计相机的姿态。然而,在具有挑战性的场景下,例如,有限的相机平移和运动模糊,COLMAP可能无法产生可靠的稀疏重建和相机姿态估计。较大的姿态误差对本文的结果有很强的退化效应。这限制了方法对此类视频的适用性。

Dynamic motion:本文方法仅支持包含适度物体运动的视频,不支持极端的物体运动。

Flow:本文依赖于FlowNet2来建立几何约束。不可靠的光流通过向前向后的一致性检查进行过滤,但它可能以一致的方式偶然错误。在这种情况下,将不能产生正确的深度。尝试使用稀疏流(在常规网格上对密集流进行子采样),但效果不佳。

Speed:当使用视频中的所有帧来提取几何约束时,不支持在线处理。例如,对于一个包含244帧和708个采样流对的视频,测试时间训练步骤大约需要40分钟。而在未来开发在线和快速的变体将对实际应用非常重要。

总结:

文章提出了一种简单而有效的方法来估计从单眼视频的一致深度。利用传统的多视图重建方法提取的几何约束,并使用它们来微调预先训练好的单幅图像深度估计网络。使用测试时间微调策略,网络学习在整个视频上产生几何上一致的深度估计。同时,进行了广泛的定量和定性评价。结果表明,本文方法优于几种最先进的深度估计算法。同时,一致的视频深度估计使引人注目的基于视频的视觉效果。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ConsistentHash是一种在分布式系统中解决数据分片、负载均衡的算法,用于解决数据分布和节点动态变化的问题。在Java中,可以通过实现ConsistentHash算法来分配数据并达到负载均衡的效果。 在Java中,可以使用TreeMap或者HashMap作为底层数据结构来实现ConsistentHash算法。TreeMap可以保证数据有序性,HashMap则可以提供更快的插入和查询速度。我们在这里以TreeMap为例来说明ConsistentHash的实现过程。 首先,我们需要创建一个哈希函数,将节点的IP地址或者ID映射为整数,作为节点的哈希值。然后,我们在TreeMap中存储节点的哈希值和对应的物理节点信息。 当有新的数据需要插入时,将数据的哈希值通过哈希函数计算得到对应的整数。然后,在TreeMap中找到大于等于该哈希值的最小键值对应的物理节点,将数据保存在该节点上。 当节点动态增加或删除时,我们需要重新计算所有已存在数据的哈希值,并将数据重新分配到新的节点上,以保持数据的均匀分布。 通过使用ConsistentHash算法,我们可以实现数据的分片存储和负载均衡,使得在节点动态变化的情况下,系统的性能和可扩展性得到有效的提升。 总之,ConsistentHash算法是一种在分布式系统中解决数据分片、负载均衡问题的算法。在Java中,我们可以通过实现ConsistentHash算法,使用TreeMap或者HashMap来实现数据分配和节点动态变化的管理。这样可以有效提高系统的性能和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MengYa_DreamZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值