关于语义分割的亿点思考

欢迎关注『CVHub』官方微信公众号!

推陈出新

上面笔者已经简单的为大家过一篇语义分割的简略发展史,下面将带大家追本溯源,一步一步的探讨出语义分割未来发展的诸多可能性。

先来简单总结下传统图像分割。对于传统的图像分割算法,无论是阈值分割、区域分割、边缘分割或基于聚类的方法,几乎都停留在纯手工设计的阶段,例如人为确定一个阈值或者定义一个滤波器模板。此类方法更加适应的场景偏颜色、纹理、形状或梯度等简单的底层特征提取。然而,当遇到光照变化、姿态变化或者背景变化等情况几乎无能为力,更遑论提取到更进一步的高级语义特征。此外,此类先验知识往往需要专家经验,完全不易于推而广之。因此,基于传统的图像分割算法目前较多的是作为预处理(简单去噪)或者后处理(比如条件随机场和分水岭算法平滑边界轮廓)的一种手段去使用,亦或者取其精华去其糟粕,将其核心思想凝练出来融于现代的神经网络架构。

随着 AlexNet 引爆深度学习热潮开始,以卷积神经网络为代表的新一代神经网络架构逐渐开始流行起来,几乎在每个深度学习子领域均遍地开花。特别地,自全卷机神经网络(Fully Convolutional Network, FCN)这个里程碑式的网络被提出后,基于深度学习的语义分割正式拉开帷幕。既然谈到 FCN 势必很多人会拿它跟 U-Net 作比较。其实这两个网络包括整体的结构设计和思路是大同小异的,只不过是一个应用在场景解析任务,另一个应用在医学图像分割任务;一个长跳跃连接采用相加的操作然后直接一步到位上采样到原始空间分辨率,另一个长跳跃连接方式是通过拼接操作后再用卷积进行更细致的特征融合,然后不断细化,使其整体结构更加对称。后续提出的多数语义分割方法大都是基于此架构从不同方向延伸发展而成的。

因此,要想捋清楚语义分割究竟何去何从,从分析这个编解码架构的角度出发无疑是较合适的。

性能

早期的语义分割以追求性(涨)能(点)为主,整体核心思想均是考虑如何高效建模上下文信息而设计。下面我们将围绕编解码器展开详细的讨论。

编解码的思想早期是出自自编码器,这个结构是由 Hinton 提出并发表在 Nature 上,主要用于解决图像压缩去噪任务,随后该思路被广泛应用到图像分割任务上。编解码架构(Encoder-Decoder Architecture)主要由编码器长跳跃连接解码器所组成。

编码器

首先,让我们来看下编码器。众所周知,编码器一般可视为整个网络的特征提取器(a.w.a Backbone),用于压缩原始图像并逐步地提取出富含高级语义信息的特征图。这个过程中最关键的因素便是上下文信息,它是提升语义分割性能最为重要的因素之一,而有效感受野则大致决定了网络能够利用到多少上下文信息。

对于大部分网络结构来说,通常都会在编码的过程中引入池化或步长卷积来逐步降低输入特征图的空间分辨率,一方面可以降低计算资源的消耗,另一方面也能够在一定程度扩大感受野。此外,除了卷积操作本身(参数共享)所具备的平移等变性 translation equivalence 外,引入池化操作还能够为网络带来一定的平移不变性 translation invariant,使网络对目标位置不那么敏感,间接地增强了网络对未知数据的推理能力,同时又通过共享卷积核来达到控制模型复杂度的目的。

理论上,通过堆叠足够深的卷积(池化)层,网络的感受野能够覆盖到输入图像的全局区域。然而,考虑到以下三点:

  1. 网络的实际感受野远小于其理论感受野,理论上呈高斯分布;
  2. 考虑到参数量激增和计算量消耗与性能之间的平衡;
  3. 频繁的下采样操作会导致小目标的细节信息丢失严重;

所以,单纯依赖堆叠一堆常规的卷积池化操作来实现覆盖原图的感受野其实是不太实际的。扯到这里,我想还有部分人没明白究竟上下文信息是个什么概念?考虑下面这张图片:

Figure from PSPNet

先看第一行第三列,这里模型将远处的一艘的部分误判为,这是因为它具有与汽车相似的外观,而模型由于缺乏有效的局部上下文信息容易导致分割失败。局部上下文信息是分割领域中不可或缺的一部分,常用于区分具备相似特征的不同对象。

再看下第二行第三列,此处目标是一栋美丽的大厦,可惜模型未能将其完整的表示出来,这是由于传统的卷积运算一次仅能处理一个局部领域,这大概率会导致大尺寸对象分割的不完整性。因此,为了解决这个问题,我们需要思考如何设计更大的感受野来获取充足的全局上下文信息

再来看下这张图片:

Figure from PraNet

上图展示了多个结直肠息肉数据集统计后的目标尺寸分布,可以明显看出,不同的息肉目标之间是存在明显的尺度差异的,这种现象也普遍存在于许多语义分割任务中。因此,如何有效的提取多尺度特征以适应不同尺寸、形状变化多样的目标也是一个亟需解决的问题。


以上多重因素均会在一定程度上制约模型的表示能力。因此,如上所述,早期的语义分割网络大都是围绕如何在保证效率的同时尽可能的捕获有效的上下文信息开展的,而主流的方法主要有两种:扩大感受野或引入注意力机制

扩大感受野的方法主要有以下几种方式:

  • 使用大卷积核GCN 等方法;
  • 使用空洞卷积DeepLab 等方法;
  • 使用池化操作的 PSPNet 等方法;

现在,让我们再进一步思考,以上这些方法存在什么局限性?例如:

  • 使用不同大小的卷积核组合,一方面参数量过大容易导致多拟合,另一方面理论感受野远小于实际感受野;
  • 使用空洞卷积虽然可以保留完整的空间信息,然而会引入额外的计算量,容易引起局部领域的信息丢失,同时,当扩张率选取不恰当时还会造成网格(棋盘)效应;
  • 使用池化操作虽然简单高效,但容易因为降采样导致小尺寸目标丢失;

此外,感受野是否越大越好?实际上,感受野太小,不足以建模远距离依赖捕获大尺寸对象;感受野太大,则容易引入过多噪声和无效信息,这些最终都会影响到整体的分割性能。那么,设计合理的多尺度表征来获取丰富的等效感受野就显得尤为重要了。例如,DMNet 提出了动态多尺度的过滤器来自适应不同的目标尺寸。解决了尺度参数设计的问题,那么如何更高效的融合不同尺度的信息?CPFNet通过借鉴SK-Net的思想引入了尺度感知模块来自适应的融合来自不同尺度的特征。

另一方面,引入注意力机制的作用主要是获取足够的全局上下文信息以建立远距离依赖,主要方式有:

  • 结合通道空间双注意力的 DANet 等;
  • 借鉴自注意力机制的 NonLocal 等;

同样地,对于基于注意力机制的分割方法来说,其优化点可以考虑从不同维度去考虑如何建模,例如基于区域信息建模的PSANet以及针对不同类别信息进行像素加权的OCRNet;另一方面可以考虑从效率方面去改进注意力机制本身带来的计算资源问题,例如采用十字交叉注意力进行等效替代的CCNet、引入非对称结构的ANN、亦或是从全局上下文建模角度所实际的简化版GCNet等等。

长跳跃连接

聊完编码器部分,再来分析下长跳跃连接。

既然谈到跳跃连接,想必大家第一时间想到的是 ResNet 中的残差连接 skip connection。与原始的(短)跳跃连接操作缓解梯度弥散的动机不同,考虑到语义分割任务本身是一种密集型分类预测任务,因此 U-NetFCN 中所涉及到的长跳跃连接操作本质上是为了更好的弥补编码过程中下采样导致的信息损失问题,帮助网络在解码的过程中更好的恢复对物体细节的定位。

另一方面,通过引入长跳跃连接,可以实现不同层级特征之间的信息融合,从而提取到更具有判别力的特征。因此,早期的 RefineNet 便是结合这两点,通过建模多个层级特征之间的信息交互来弥补下采样操作所带来的信息损失。那么问题来了:

  1. 如何融合更多的特征?

众所周知,不同抽象层级的特征具有不同的独特语义表征。因此,融合不同层级之间的特征是一个自然而然的想法,例如,UNet++ 中便尝试结合长、短跳跃连接来实现尽可能丰富的信息共享。

  1. 如何融合更好的特征?

首先,考虑下医学图像分割任务。不同于自然图像,医学图像在成像过程中,受采集设备或光照等因素的影响,不可避免的会引入许多背景噪声。此时,如果我们单纯的采用长跳跃连接操作,势必会引入浅层特征中一些不纯净的噪声,从而影响解码器输出特征的质量。为了解决此问题,一方面可以从数据源本身出发,进行去噪处理,例如nnUnet中设计了许多有效的预处理操作,例如CLAHEGamma增强等来更好的处理图像。另一方面可以从模型角度考虑,例如Attention-UNet中引入门控注意力来强化前景区域抑制背景区域;又或者像MultiResUNet堆叠多个1×1卷积来进行特征"提纯"。

特征融合本质上是为了获得更具有判别力的特征表示。一般而言,浅层特征注重边缘、纹理等空间细节,但缺乏高级语义;而深层特征具备精确的高级语义信息,但缺乏空间细节信息。一种自然而然的想法便是融合两者。然而,由于特征结构以及特征内容本身的限制,不同层级之间的特征融合势必会存在语义鸿沟。为了解决此问题,ExFuse提出了许多方法使网络得以在浅层特征中引入更多的语义信息,在深层特征中嵌入更多的空间信息。

解码器

解码器的作用是将编码器所提取到的高级特征上采样至固定分辨率以实现端到端的训练从而完成像素级的密集预测分类。通常来说,解码器设计的核心是如何高效的将经过压缩的高级语义特征尽可能无损的还原。这个过程中会涉及两个操作:上采样和特征输出。

如上所述,由于编码器会涉及到多次下采样操作,不可避免的会导致图像精细特征的丢失。一种解决方法是“提前止损”,正如我们上面所介绍的DeepLab,采用空洞卷积可以在无需降采样的情况下拥有更大的感受野,但这仍然会引入许多问题。另一种方法便是“直面困难”,通常将一个特征图进行上采样有两种方式,即使用线性插值和反卷积。

线性插值算法是一种与数据无关的算法,它是根据设定好的公式近似模拟出未知点的信息,这必将制约模型的表达能力。而使用反卷积由于本身自带可学习参数,一般可获得更优的分割性能,但不可避免会引入过多的参数量和计算量。因此,一种参考的解决方案便如同 DUsampleing 中基于通道重排的思路所设计的新型上采样方式,可以同时结合两者的优势。

特征输出的作为为了让网络能进行端到端的训练以更新模型参数。通常来说,大多数网络只会输出最后一层特征图,但大家思考下这一定是最优解吗?众所周知,不同层级的特征所提取到的语义是不一样的,如果能够对中间层的特征进行监督学习,是否能取得比较好的效果?这个思想早期在 GoogLeNet 中有所体现,例如该论文中所提及到的辅助损失。后续一部分语义分割网络也应用了此思路,例如 PSPNetDSNDSN 中较早提出了深监督的思想,旨在为解码器中所有层级的输出特征均建立监督机制,一来可以有效的综合多个输出层的信息来学习更加鲁邦的特征;二来可以有效的缓解训练过程中梯度消失的现象,加速网络收敛。

谈完深监督的好处,那潜在的问题会出现在哪呢?这里给大家举几个栗子:

  1. 需要监督多少层特征?
  2. 需要监督哪些层特征?
  3. 如何分配合适的权重?

对于第1点,这其实并没有一个严格的定论,关键之处还是取决于训练数据本身的特性。对于第2和第3点,一个经验法则是越靠近输出层的特征理应是最重要的,因此越靠近输出层的中间特征理应分配更多的权重,这一点其实也有不少论文验证过了。

演进思路

经过早几年的发展,这种通过设计新的网络结构或者拼接模(积)块(木)的方式所带来的性能增益,其边际效应逐渐降低,紧接着伴随而来的便是大量同质化工作的涌现,以至于在某个时间节点会出现诸如“xxx还能不能走下去”的窘境。当然,以上现象不仅限于语义分割,对于大部分视觉任务来说亦如此。

尽管在中间这段短暂的时间也涌现一些有意思的工作,但最终都未能掀起大的波澜,好比下面这个段子:

  1. 手动设计网络结构 → NAS搜索;
  2. 固定感受野 → 引入动态加权实现感受野的自动调节;
  3. 效果提升不上去 → 换个思路做实时分割来对比结果;
  4. 强监督太热门 → 换成弱监督(GAN, 知识蒸馏, …) + trick = 差不多的指标;
  5. DNN 太枯燥,融入点传统视觉的方法设计成端到端模式;
  6. CNN 太单调,配合 GCN 搞点悬念;
  7. 2D 分割过于饱和,转 3D 点云分割;

作者:湃森

链接:https://www.zhihu.com/question/390783647/answer/1221984335

来源:知乎

随着 ViT 的诞生,吹响了 Transformer 席卷 CV 界的号角,一时间横扫计算机视觉各个子领域的 SOTA 之星,成为了夜空中最亮的仔,间接盘活了这盘棋。虽然 Transformer 同普通的卷积在数学概念上基本是等价的,整体的架构也都很类似,只不过在优化和实现细节上有所出入,但是整体而言还是有许多不同之处,主要体现在几个方面。

归纳偏置

对于 CNN 来说,由于有了归纳偏置,无需大量训练数据和精心设计的 trick 便能够取得不错的效果;反观 Transformer,尽管少了这层约束,但是却造就其无限潜力的可能,而且这种性能上的差异会伴随着数据和算力规模的提升被逐渐放大。

远距离依赖

众所周知,由于感受野有限无法捕获有效的长距离依赖,CNN 在高层视觉语义信息中相对缺乏特征的连贯性来关联实例,导致在大尺寸目标对象上的分割结果堪忧。尽管可以通过其他方式(见上)辅助,但效果铁定不如 Transformer 这种开场即全局来得更加直接。

空间分辨率

Transformer 的另一个特性便是能够自始至终保持输入和输出的空间分辨率不变,这对于语义分割这种非常注重空间细节信息的密集型预测分类任务来说是非常有用的,在一定程度上可以缓解 CNN 多次下采样所导致的小目标信息损失的问题。

不过,Transformer 对于底层特征的提取其实并不擅长,容易导致对小目标的错误预测,这也是后面为什么涌现出这么多 CNN + Transformer 的混合双打架构,当然还有其他的益处,例如降低计算量。


总的来说,找到一个合适的点去开展并不难,关键是要摆脱思维的禁锢,下面给大家举几个示例,更多的研究方向可参考前面"语义分割扩展"章节。

  1. 当感觉定量结果上已经难以再去提升时,可以尝试从定性角度出发,譬如从改善图像分割边缘这个点入手,虽然从数值指标上几乎不会有什么差距,但可视化结果展示出来的分割边界就是个极大的优势,不失为一个亮点去宣传。

  2. 当感觉主流的数据集已经趋于饱和时,尝试转换个思路去突破,例如大家都做白天,你便可以做夜视场景;大家都做基于陆地的场景解析,你可以做基于水下的场景分割;大家都在做基于晴天的场景,你便可以尝试做风雷雨雪等极端场景下的分割等等;甚至自己还可以开辟一个新的方向出来开源新数据集。

  3. 正所谓它山之石可以攻玉,平常一定要多阅读积累,广泛涉猎相关领域的知识,不求精通点到为止。下面以半监督学习为例,其核心问题在于如何有效利用无标注样本,作为有标签样本的补充,以提升模型性能。一种很容易想到的方法便是借助知识蒸馏的方法,首先基于另一半有标签的数据训练处一个模型;随后基于这个训练好的模型为剩余另一半没有带标签的数据提供标签,即伪标签;最后再用这些伪标签去训练模型。常规的做法是通过样本筛选只保留高置信度预测的结果,这种做法会存在几个:

  • 如何保证最终筛选出来的伪标签就是高质量的?
  • 如何保证被剔除掉的数据就是真正的无效?

如果我们将大量的无标签数据排除在训练过程外,便会导致模型训练不充分。此外,如果模型不能较好地预测某些困难类别,那么后面就更难为该类别的无标签像素分配准确的伪标签,从而无法获得提升,形成「马太效应」。因此,有效的解决了包括不可靠样本在内的全部无标签数据,理论上一定是可以提升算法精度的,这便是 U2P 所提倡的。此前如果你有涉猎到目标跟踪的算法,你会惊奇的发现这其实跟 ByteTrack 有着异曲同工之妙,有时候思想的火花一碰撞便能产生美妙的灵感。

写在最后,让我们展望下 2023 年,这里笔者斗胆预测一波,明年开始,一堆 Diffusion Model 在语义分割的应用必将遍地开花。同 Transformer 一般,尽管这两年涌现出非常非常多的模型,但绝大多数都没有本质上的创新,几乎是把 CNN 那套 多尺度 + 局部上下文 + 全局上下文 理论套成壳搬上荧幕再重演一遍。现在原始的 DDPM 等扩散模型内部架构还是基于原始的 U-Net,可以预计不远的将来必将又是在 Diffusion Model 这层外壳上套用 TransformerCNN 再进行各种魔改重走一遍老路——“Deep learning is brute force, which is equivalent to evil.”

CVHub

如果您也对人工智能和计算机视觉全栈领域感兴趣,强烈推荐您关注有料、有趣、有爱的公众号『CVHub』,每日为大家带来精品原创、多领域、有深度的前沿科技论文解读及工业成熟解决方案!欢迎添加小编微信号: cv_huber,备注"优快云",加入 CVHub 官方学术&技术交流群,一起探讨更多有趣的话题!

<think>好的,用户之前已经问过关于飞机制造中测量两个水平放置圆柱同轴度的方案,现在他再次提问,要求更清晰地解释传感器的安装位置和原理。我需要回顾之前的回答,看看哪里可能不够清楚,并针对性地进行补充。 首先,用户之前的提问中,我提到了使用龙门架和旋转臂安装激光传感器,但可能示意图不够详细,或者文字描述不够具体。用户现在需要更清晰的安装位置说明,可能需要更详细的步骤分解和图文描述,但由于不能使用图片,必须用文字更详细地描述。 在原理部分,用户可能对三维坐标重建和轴线拟合的具体过程有疑问。需要更详细地解释激光传感器如何通过旋转和移动获取数据,以及如何将这些数据转化为圆柱的轴线参数。此外,可能需要用更直观的方式说明同轴度的计算方式,比如几何上的偏差分析。 另外,用户可能对传感器的布局和对称性不太清楚,需要进一步解释为什么选择四个传感器,上下左右各一对,以及如何通过对称布局消除误差。可能还需要解释龙门架移动的路径,如何覆盖整个圆柱的度,确保测量的全面性。 还要考虑到用户可能对实际应用中的操作步骤有疑问,比如校准过程、温度补偿的具体实现,或者如何确保测量精度在0.5mm以内。需要结合这些因素,将安装位置和原理更详细地分解,可能分步骤或分部分进行说明。 最后,要确保语言简洁明了,避免专业术语过多,但又要准确。可能需要用比喻或类比的方法,让读者更容易理解传感器布局和测量原理。同,检查是否有遗漏的关键,如辅助传感器的作用,如旋转编码器和直线光栅尺的具体功能,如何与主控系统协同工作。</think>以下是针对双圆柱同轴度测量系统的传感器安装位置和测量原理的详细解析,通过三维空间定位逻辑和机械结构分解进行说明: --- ### **一、传感器安装拓扑图(文字版三维描述)** ``` 龙门架横梁(X轴导轨) ↑ [旋转臂]━┳━[伺服电机]━┳━[旋转臂] ┃ ┃ ▼ ▼ 激光传感器组1 激光传感器组2 / \ / \ 上 下 左 右 上 下 左 右 (垂直交叉布局) (垂直交叉布局) ``` #### **1. 核心传感器布局(4组8传感器)** | 传感器组 | 安装位置 | 测量方向 | 功能描述 | |----------|-----------------------|----------------|---------------------------| | 组1-上 | 旋转臂顶端 | 垂直向下发射 | 捕捉圆柱上表面轮廓 | | 组1-下 | 旋转臂底端 | 垂直向上发射 | 捕捉圆柱下表面轮廓 | | 组2-左 | 旋转臂左侧延伸支架 | 水平向右发射 | 捕捉圆柱左侧轮廓 | | 组2-右 | 旋转臂右侧延伸支架 | 水平向左发射 | 捕捉圆柱右侧轮廓 | **对称性设计**:两组传感器呈中心对称布局,通过交叉测量消除单侧误差 --- ### **二、机械结构动态配合原理** #### **1. 三轴协同运动** | 运动轴 | 驱动方式 | 行程范围 | 定位精度 | |--------|---------------|--------------|-----------| | X轴 | 直线电机 | 0-6m(可调) | ±0.01mm | | θ轴 | 伺服减速电机 | 0-360° | ±0.005° | | Z轴 | 电动升降柱 | ±50mm | ±0.1mm | **运动逻辑**: ``` for x in 0 → L(步进10mm): 旋转臂转动θ从0°→360°(步进1°) 同触发8个传感器采样 通过Z轴微调保持测量距离恒定(20±2mm) ``` --- ### **三、测量原理深度解析** #### **1. 云数据生成模型** **坐标转换公式**: ``` X_total = X_光栅尺 + R·cosθ Y_total = Y_初始偏移 + R·sinθ Z_total = 激光测距值 + Z补偿量 ``` (其中R为旋转臂半径,θ为编码器角度) **数据密度计算**: - 轴向分辨率:10mm/(X轴步进) - 周向分辨率:1°/ → 圆周方向约1.7mm/(Φ200mm圆柱) - 单圆柱单次扫描数据量:600mm/10mm × 360° = 21,600 #### **2. 轴线拟合算法流程** ```python # 圆柱轴线拟合伪代码 def cylinder_fitting(points): # 第一阶段:粗拟合 centroid = np.mean(points, axis=0) # 计算云质心 # 第二阶段:精迭代 for _ in range(10): # 迭代优化 # 计算各到当前轴线的距离 errors = [distance_to_axis(point, current_axis) for point in points] # 用RANSAC算法剔除离群 inliers = points[errors < 3*sigma] # 最小二乘法更新轴线参数 new_axis = least_squares(inliers) return new_axis ``` **关键参数**: - 拟合残差阈值:≤0.2mm - 迭代收敛条件:Δθ<0.01°, Δd<0.05mm --- ### **四、误差抑制技术详解** #### **1. 安装误差补偿矩阵** 建立九参数补偿模型: ``` [ΔX ΔY ΔZ]^T = K·[X Y Z θ T V]^T + B ``` 其中: - K:温度/角度/位置耦合系数矩阵(3×6) - B:基础偏移量向量 - T:温度传感器读数 - V:振动传感器频谱特征值 #### **2. 实补偿案例** 当检测到Y方向振动幅度>0.05g: 1. 启动加速度计数据融合 2. 采用卡尔曼滤波修正测量值: ```matlab Q = diag([0.01 0.01 0.01]); % 过程噪声协方差 R = diag([0.1 0.1 0.1]); % 观测噪声协方差 [x_est, P] = kalman_filter(z, Q, R); ``` --- ### **五、典型安装剖面图(文字描述)** ``` 剖面视角:垂直于圆柱轴线方向 ------------------------------------------- | 龙门立柱 旋转机构外壳 | | █ ┌──────────┐ | | █ │ 编码器 │ | | █ ├──────────┤ | | █ │ 激光器组1│◄→20mm测量距| | █ ├──────────┤ | | █ │ 激光器组2│ | | █ └──────────┘ | | 被测圆柱体 | ------------------------------------------- ``` **安装间隙要求**: - 传感器端面距圆柱表面:20±2mm - 旋转臂径向跳动:<0.01mm - 结构刚性:一阶固有频率>100Hz --- ### **六、测量系统标定流程** 1. **几何标定**: - 使用标准圆柱(标称误差±0.005mm) - 全行程扫描建立空间误差地图 2. **动态标定**: - 施加0.1-10Hz振动激励 - 记录传感器响应曲线 3. **温度标定**: - 在20-35℃范围内以5℃为步进 - 记录热膨胀导致的测量漂移 经标定后系统综合精度可达: - 静态测量:±0.15mm - 动态测量:±0.35mm --- 该方案通过多传感器空间融合测量和智能误差补偿,在航空制造苛刻环境下仍可稳定实现0.5mm同轴度检测要求。实际部署建议采用碳纤维复合材料测量臂,在保证刚性的同降低热膨胀影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CVHub

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

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

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

打赏作者

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

抵扣说明:

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

余额充值