【图像去噪】论文精读:Spatial-Adaptive Network for Single Image Denoising(SADNet)

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中)


前言

论文题目:Spatial-Adaptive Network for Single Image Denoising —— 用于单幅图像去噪的空间自适应网络

论文地址:Spatial-Adaptive Network for Single Image Denoising

疑似官方代码:https://github.com/sami-automatic/SADNet_Replication

ECCV 2020!真实世界图像盲去噪,空间自适应去噪网络SADNet!

Abstract

以前的工作表明,卷积神经网络可以在图像去噪任务中取得良好的性能。然而,受局部刚性卷积运算的限制,这些方法会导致过度平滑伪影。更深层次的网络结构可以缓解这些问题,但代价是额外的计算开销。在本文中,我们提出了一种新的空间自适应去噪网络(SADNet),用于高效的单幅图像盲噪声去除。为了适应空间纹理和边缘的变化,我们设计了一个残差空间自适应块。引入可变形卷积对空间相关特征进行采样以进行加权。引入了带有上下文块的编码器-解码器结构来捕获多尺度信息。通过对粗到细的噪声去除,获得了高质量的无噪声图像。我们将我们的方法应用于合成和真实噪声图像数据集。实验结果表明,我们的方法在定量和视觉上都优于最先进的去噪方法。

摘要总览:为了缓解伪影,提出SADNet,主要模块为残差空间自适应块(residual spatial-adaptive block,RSAB),主要结构为Encoder-decoder结构,使用了可变卷积。

1 Introduction

图像去噪是计算机视觉中的一项重要任务。在图像采集过程中,由于成像环境和设备的限制,噪声往往是不可避免的。因此,噪声去除是一个基本的步骤,不仅用于视觉质量,还适用于其他计算机视觉任务。图像去噪有着悠久的历史,提出了许多方法。许多早期的基于模型的方法发现自然图像先验,然后应用优化算法迭代求解模型[23,2,30,41]。然而,这些方法非常耗时,不能有效地去除噪声。随着深度学习的兴起,卷积神经网络 (CNN) 已应用于图像去噪任务,并取得了高质量的结果。

另一方面,早期的工作假设噪声是独立的和同分布的。通常采用加性高斯白噪声(AWGN)来创建合成噪声图像。现在人们意识到噪声以更复杂的形式呈现,这些形式是空间变体和通道相关的。因此,最近的一些工作在真实图像去噪方面取得了进展[26,39,12,4]。

然而,尽管图像去噪取得了许多进展,但仍有一些问题有待解决。传统的 CNN 只能在本地固定位置邻域中使用特征,但这些可能与当前位置无关甚至排他性。由于其无法适应纹理和边缘,基于 CNN 的方法会导致过度平滑伪影,并且会丢失一些细节。此外,传统 CNN 的感受野相对较小。许多方法深化网络结构[27]或使用非本地模块来扩展接受域[18,37]。然而,这些方法会导致较高的计算和内存和时间消耗,因此它们在实践中无法应用。

在本文中,我们提出了一种空间自适应去噪网络(SADNet)来解决上述问题。设计了一种残差空间自适应块(RSAB),以适应空间纹理和边缘的变化。我们引入了每个RSAB中的调制可变形卷积来对空间相关特征进行采样以进行加权。此外,我们将 RSAB 和残差块 (ResBlock) 合并到编码器-解码器结构中,以从粗到细去除噪声。为了进一步扩大感受野并捕获多尺度信息,将上下文块应用于最粗的尺度。与最先进的方法相比,我们的方法可以在保持相对较小的计算开销的同时获得良好的性能。

综上所述,本文的主要贡献如下:

  • 提出了一种新的空间自适应去噪网络,用于有效的噪声去除。该网络可以从复杂的图像内容中捕获相关特征,并从重噪声中恢复细节和纹理。
  • 我们提出了残差空间自适应块,引入可变形卷积来适应空间纹理和边缘。此外,使用具有上下文块捕获多尺度信息的编码器-解码器结构,我们可以估计偏移量并从粗到细去除噪声。
  • 我们对多个合成图像数据集和真实的噪声数据集进行了实验。结果表明,我们的模型在合成和真实噪声图像上实现了最先进的性能,计算开销相对较小。

工作介绍:motivation是为了解决真实噪声图像丢失细节信息的问题,从而使用RSAB更好的捕获特征,引入可变卷积处理纹理和边缘。感受野很大,计算开销比较小。

2 Related works

一般来说,图像去噪方法包括基于模型的方法和基于学习的方法。基于模型的方法试图对自然图像或噪声的分布进行建模。然后,使用建模的分布作为先验,他们尝试使用优化算法获得清晰的图像。常见的先验包括局部平滑[23,30]、稀疏性[2,20,33]、非局部自相似性[5,9,8,34,11]和外部统计先验[41,32]。非局部自相似性是图像去噪任务中的显著先验。这个先验假设图像信息是多余的,并且单个图像中存在相似的结构。然后,在图像中找到自相似补丁来去除噪声。已经提出了许多基于非局部自相似性先验的方法,包括 NLM [5]、BM3D [9,8] 和 WNNM [11,34],所有这些方法都目前被广泛使用。

随着深度神经网络的普及,基于学习的去噪方法发展迅速。一些作品将自然先验与深度神经网络相结合。TRND [7] 在深度神经网络中引入了专家领域。NLNet [17] 将非局部自相似性先验与 CNN 相结合。受设计先验的限制,与端到端 CNN 方法相比,它们的性能通常较差。DnCNN[35]引入了残差学习和批处理归一化来实现端到端去噪。FFDNet[36]将噪声水平图作为输入,增强了网络对非均匀噪声的灵活性。MemNet[27]提出了一种非常深的端到端持久记忆网络用于图像恢复,该网络融合了短期和长期记忆来捕获不同级别的信息。受非局部自相似性先验的启发,为神经网络设计了一个非局部模块[28]。NLRN [18] 尝试将非本地模块合并到循环神经网络 (RNN) 中以进行图像恢复。N3Net[26]提出了神经最近邻块来实现非局部操作。RNAN[37]设计了非局部注意块来捕获全局信息,更加关注具有挑战性的部分。然而,非本地操作会导致较高的内存使用和时间消耗。

最近,研究人员的重点已经从AWGN转移到更现实的噪声。最近的一些工作在真实噪声图像方面取得了进展。通过捕获真实的噪声场景[25,3,1],建立了几个真实的噪声数据集,促进了对真实图像去噪的研究。N3Net [26] 展示了对真实嘈杂数据集的重要性。CBDNet [12] 训练了两个子网来顺序估计噪声并执行非盲去噪。PD[39]采用像素洗牌下采样策略将真实噪声近似为AWGN,使训练后的模型适应真实噪声。RIDNet[4]提出了一种具有特征注意的单级去噪网络,用于真实图像去噪。然而,这些方法缺乏对图像内容的适应性,导致过度平滑的伪影。

3 Framework

我们提出的空间自适应去噪网络(SADNet)的体系结构如图1所示。设 x x x表示噪声输入图像, y ^ \hat{y} y^表示相应的输出去噪图像。那么我们的模型可以描述如下:

y ^ = SADNet ⁡ ( x ) (1) \hat{y}=\operatorname{SADNet}(x)\tag{1} y^=SADNet(x)(1)

我们使用一个卷积层从噪声输入中提取初始特征;然后将这些特征输入到多尺度编码器-解码器架构中。在编码器组件中,我们使用ResBlocks[14]来提取不同尺度的特征。但是,与原始 ResBlock 不同,我们删除了批量归一化并使用泄漏 ReLU [19] 作为激活函数。为了避免破坏图像结构,我们限制了下采样操作的数量,实现了一个上下文块来进一步扩大感受野并捕获多尺度信息。然后,在解码器组件中,我们设计了残差空间自适应块 (RSAB) 对相关特征进行采样和加权以去除噪声并重建纹理。此外,我们估计偏移量并将它们从粗转移到细,这有利于获得更准确的特征位置。最后,将重构的特征馈送到最后一个卷积层以恢复去噪后的图像。通过使用长残差连接,我们的网络只学习噪声分量。

除了网络架构之外,损失函数对性能至关重要。去噪任务中使用了L2[35,36,37]、L1[4]、感知损失[15]和非对称损失[12]等几个损失函数。一般来说,L1 和 L2 是以前工作中最常用的两种损失。L2 损失对高斯噪声有很好的信心,而 L1 损失对异常值具有更好的容忍度。在我们的实验中,我们使用 L2 损失来训练合成图像数据集和 L1 损失来训练真实图像噪声数据集。

以下小节侧重于 RSAB 和上下文块以提供更详细的解释。


在这里插入图片描述

网络结构拆解:

  • 输入 → 一个卷积层提取特征 → Encoder-decoder结构
  • Encoder结构:使用ResBlocks(Conv+LeakyReLU,无BN)
  • 中间:上下文块,增大感受野
  • Decoder:RSAB,上采样;偏移量由粗到细变化
  • 最后一个卷积层重建,并通过残差连接,学习的是噪声
  • 损失函数:L2损失训练合成噪声图像;L1损失训练真实噪声图像

3.1 Residual spatial-adaptive block

在本节中,我们首先介绍可变形卷积[10,40],然后详细介绍我们的RSAB。

令 x§ 表示输入特征图 x 中位置 p 处的特征。然后,对于传统的卷积运算,对应的输出特征y§可以通过
y ( p ) = ∑ p i ∈ N ( p ) w i ⋅ x ( p i ) (2) y(p)=\sum_{p_{i} \in N(p)} w_{i} \cdot x\left(p_{i}\right)\tag{2} y(p)=piN(p)wix(pi)(2)
其中 N ( p ) N (p) N(p)表示位置 p 的邻域,其大小等于卷积核的大小。wi 表示卷积核中位置 p 的权重,pi 表示 N ( p ) N (p) N(p) 中的位置。传统的卷积操作在计算输出特征时严格取p周围固定位置的特征。因此,一些不需要或不相关的特征会干扰输出计算。例如,当当前位置靠近边缘时,引入位于对象外的不同特征进行加权,这可能会平滑边缘并破坏纹理。对于去噪任务,我们更喜欢仅使用相关或相似的特征进行噪声去除,类似于自相似加权去噪方法[5,8,9]。

因此,我们引入可变形卷积[10,40]来适应空间纹理的变化。与传统的卷积层相比,可变形卷积可以改变卷积核的形状。它首先为每个位置学习一个偏移图,并将得到的偏移图应用于特征图,该特征图重新采样相应的特征进行加权。在这里,我们使用调制可变形卷积[40],它提供了另一个自由度来调整其空间支持区域,
y ( p ) = ∑ p i ∈ N ( p ) w i ⋅ x ( p i + Δ p i ) ⋅ Δ m i (3) y(p)=\sum_{p_{i} \in N(p)} w_{i} \cdot x\left(p_{i}+\Delta p_{i}\right) \cdot \Delta m_{i}\tag{3} y(p)=piN(p)wix(pi+Δpi)Δmi(3)
其中 Δpi 是位置 pi 的可学习偏移量,Δmi 是可学习的调制标量,位于 [0, 1] 范围内。它反映了采样特征 x(pi) 与当前位置的特征之间的相关性程度。因此,调制的可变形卷积可以调制输入特征幅度以进一步调整空间支持区域。Δp 和 Δm 都是从先前的特征中获得的。

在每个RSAB中,我们首先将提取的特征和前一个尺度的重构特征作为输入进行融合。RSAB 由一个构造调制可变形卷积,然后是具有短跳跃连接的传统卷积。与ResBlock类似,我们实现了局部残差学习来增强信息流并提高网络的表示能力。然而,与ResBlock不同的是,我们用调制的可变形卷积替换第一个卷积,并使用泄漏的ReLU作为我们的激活函数。因此,RSAB 可以表述为
F R S A B ( x ) = F c n ( F a c t ( F d c n ( x ) ) ) + x (4) F_{R S A B}(x)=F_{c n}\left(F_{a c t}\left(F_{d c n}(x)\right)\right)+x\tag{4} FRSAB(x)=Fcn(Fact(Fdcn(x)))+x(4)
其中Fdcn和Fcn分别表示调制可变形卷积和传统卷积。事实是激活函数(此处泄漏 ReLU)。RSAB的体系结构如图2所示。

此外,为了更好地估计从粗到细的偏移量,我们将最后尺度偏移量∆ps−1和调制标量∆ms−1转移到当前尺度,然后使用{∆ps−1,∆ms−1}和输入特征xs来估计{∆ps,∆ms}。给定小尺度偏移量作为初始参考,相关特征可以大规模更准确地定位。偏移转移可以表示如下:
{ Δ p s , Δ m s } = F offset  ( x , F u p ( { Δ p s − 1 , Δ m s − 1 } ) ) (5) \left\{\Delta p^{s}, \Delta m^{s}\right\}=F_{\text {offset }}\left(x, F_{u p}\left(\left\{\Delta p^{s-1}, \Delta m^{s-1}\right\}\right)\right)\tag{5} {Δps,Δms}=Foffset (x,Fup({Δps1,Δms1}))(5)
其中 F o f f s e t F_{of f set} Foffset F u p F_{up} Fup 分别表示偏移传输和上采样函数,如图 2 所示。偏移传递函数涉及多个卷积,它从输入中提取特征并将它们与先前的偏移量融合以估计当前尺度的偏移量。上采样函数放大了前一个偏移图的大小和值。在我们的实验中,采用双线性插值对偏移量和调制标量进行上采样。
在这里插入图片描述
RSAB:offset transfer和deformable convolution两个主要结构。先融合之前提取的特征和重建特征作为RSAB的输入,然后通过可变卷积+LeakyReLU,最后局部残差连接得到RSAB的输出。双线性插值对偏移量和标量进行上采样。

3.2 Context block

多尺度信息对图像去噪任务很重要;因此,网络中通常采用下采样操作。然而,当空间分辨率太小时,图像结构被破坏,信息丢失,不利于重构特征。

为了提高感受野并捕获多尺度信息而不进一步降低空间分辨率,我们在编码器和解码器之间的最小尺度上引入了一个上下文块。上下文块已成功应用于图像分割[6]和去模糊任务[38]。与空间金字塔池[13]相比,上下文块使用多个具有不同膨胀率的扩张卷积,而不是下采样。它可以在不增加参数数量或破坏结构的情况下扩展感受野。然后,融合从不同感受野中提取的特征来估计输出(如图 3 所示)。估计来自更大感受野的偏移量是有益的。

在我们的实验中,我们去掉了批处理归一化层,只使用了四个学习率设置为1、2、3和4的膨胀率。为了进一步简化操作和减少运行时间,我们首先使用1 × 1卷积压缩特征通道。在我们的实验中,压缩比设置为 4。在融合设置中,我们使用 1 × 1 卷积输出通道等于原始输入特征的融合特征。类似地,输入和输出特征之间的局部跳过连接用于防止信息阻塞。

在这里插入图片描述
context block:膨胀卷积替代下采样,增大感受野而不增加参数。不使用BN,膨胀因子为1234,初始卷积为1×1压缩特征通道,压缩比为4,使用shortcut保持信息的传递。

启发:context block在图像分割中用的比较多,而图像分割和图像去噪在许多结构上都是相通的(比如已经证明的类U-Net结构在分割和去噪上的表现都好)。所以,如果想找创新,可以多看看分割领域的内容,看能不能迁移到去噪领域。

3.3 Implementation

在所提出的模型中,我们对编码器-解码器架构使用四个尺度,每个尺度的通道数设置为 32、64、128 和 256。第一个和最后一个卷积层的内核大小设置为 1 × 1,最终输出设置为 1 或 3 个通道,具体取决于输入。此外,我们对上/下卷积层使用 2 × 2 滤波器,所有其他卷积层的内核大小为 3 × 3。

4 Experiments

在本节中,我们展示了我们的模型在合成数据集和真实噪声数据集上的有效性。我们采用DIV2K[21]包含800张分辨率为2K的图像,并将不同级别的噪声添加到合成噪声数据集中。对于真实的噪声图像,我们使用SIDD[1]、RENOIR[3]和Poly[31]数据集。我们水平和垂直随机旋转和翻转图像以进行数据增强。在每个训练批次中,我们使用 16 个大小为 128 × 128 的补丁作为输入。我们使用ADAM[16]优化器训练我们的模型,β1 = 0.9, β2 = 0.999, ε = 10−8。初始学习率设置为10−4,然后在3 × 105次迭代后减半。我们的模型是在 PyTorch 框架 [24] 中使用 Nvidia GeForce RTX 1080Ti 实现的。此外,我们使用 PSNR 和 SSIM [29] 来评估结果。

4.1 Ablation study

我们对Kodak24数据集进行了消融研究,噪声sigma为50。结果如表1所示。
在这里插入图片描述
RSAB上的消融 RSAB是我们网络中的关键块。如果没有它,网络将失去适应图像内容的能力。当我们用原始ResBlock替换RSAB时,性能会大幅下降,这证明了它的效果。

上下文块上的消融 上下文块补充了下采样操作以捕获更大的字段信息。我们可以观察到,当引入上下文块时,性能会提高。

偏移转移消融 我们去除从粗到细的偏移量转移,只使用当前尺度上的特征来估计RSAB的偏移量。该比较验证了偏移传输的有效性。

4.2 Analyses of the spatial adaptability

如上所述,我们的网络引入了对空间纹理和边缘的适应性。RSAB 可以通过根据图像内容改变采样位置来提取相关特征。我们在图 4 中可视化了 RSAB 的学习内核位置。可视化结果表明,在平滑区域或均匀纹理区域中,卷积核近似均匀分布,而在靠近边缘的区域,卷积核的形状沿边缘扩展。大多数采样点落在对象内部相似的纹理区域,这表明我们的网络确实学习了空间适应性。此外,如图 4 所示,RSAB 可以在粗略尺度上从更大的感受野中提取特征,而在精细尺度上,采样的特征位于当前点的邻域。多尺度结构使网络能够获取不同接受域的信息进行图像重建。在这里插入图片描述

4.3 Comparisons

在本小节中,我们将我们的算法与最先进的去噪方法进行比较。为了公平比较,所有比较方法都使用默认值相应作者提供的设置。我们首先对合成噪声数据集进行比较,因为许多方法只提供高斯噪声去除结果。然后,我们使用最先进的真实噪声去除方法报告真实噪声数据集上的去噪结果。

合成噪声图像 在合成噪声图像的比较中,我们使用BSD68和Kodak24作为我们的测试数据集。这些数据集包括用于测试的颜色和灰度图像。我们将不同噪声水平下的AWGN添加到干净的图像中。我们选择 BM3D [9] 和 CBM3D [8] 作为经典方法的代表以及一些基于 CNN 的方法,包括 DnCNN [35]、MemNet [27]、FFDNet [36]、RNAN [37] 和 RIDNet [4] 进行比较。

表 2 显示了三种不同噪声水平的灰度图像 PSNR 的平均结果。我们的SADNet在大多数数据集上实现了最高的值,并测试了噪声水平。请注意,尽管 RNAN 可以在部分低噪声水平上实现与我们的方法相当的性能,但它需要更多的参数和更大的计算开销。接下来,表 3 报告了彩色图像的定量结果。我们将输入和输出通道从 1 替换为 3 作为其他方法。我们的 SADNet 在所有具有所有测试噪声水平的数据集上都优于最先进的方法。此外,我们可以观察到我们的方法在更高的噪声水平下显示出更多的改进,这证明了它对重噪声去除的有效性。在这里插入图片描述
在这里插入图片描述

视觉比较如图5和图6所示。我们从BSD68和Kodak24提出了一些具有挑战性的例子。特别是鸟类的羽毛和服装纹理很难与重噪声分离。比较的方法倾向于去除细节和噪声,从而产生过度平滑的伪影。许多纹理区域在去噪结果中严重涂抹。由于其对图像内容的适应性,我们的方法可以在不引入其他伪影的情况下从噪声图像中恢复生动的纹理。
在这里插入图片描述
在这里插入图片描述
真实的噪声图像 为了对真实的噪声图像进行比较,我们选择DND[25]、SIDD[1]和Nam[22]作为测试数据集。DND包含50张真实的噪声图像及其对应的清晰图像。提供商从数据集中提取大小为 512 × 512 的一千个补丁进行测试和比较目的。由于地面真实图像不公开,我们只能获得PSNR/SSIM结果,尽管[25]介绍的在线提交系统。为我们的评估引入了SIDD的验证数据集,其中包含1280 256 × 256的噪声干净图像对。Nam 包含 15 个大型图像对,JPEG 压缩 11 个场景。我们将图像裁剪为512×512补丁,并选择CBDNet[12]选择的25个补丁进行测试。

我们在SIDD媒体数据集和RENOIR上训练模型,以评估DND和SIDD验证数据集。然后,我们在 Nam 的 Poly [31] 上微调我们的模型,这提高了带有 JPEG 压缩的噪声图像的性能。此外,作为比较,我们选择了最先进的方法,其有效性以前已经在真实的噪声图像中得到证明,包括CBM3D[8]、DnCNN[35]、CBDNet[12]、PD[39]和RIDNet[4]。

DND 定量结果列于表 4 中,它们是从公共 DnD 基准网站获得的。FFDNet+是改进的FFDNet版本,具有由提供者手动选择的统一噪声水平图。CDnCNN-B 是用于盲色去噪的原始 DnCNN 模型。DnCNN+ 在 CDnCNN-B 上进行了微调,结果为 FFDNet+。SADNet (1248) 是我们的 SADNet 的修改版本,在上下文块中具有 1, 2, 4, 8 个膨胀率。包括非盲去噪方法和盲去噪方法进行比较。CDnCNN-B不能有效地推广到真实的噪声图像。由于AWGN和真实世界噪声之间的分布不同,非盲去噪方法的性能受到限制。相比之下,我们的SADNet在PSNR和SSIM值方面都优于最先进的方法。我们进一步对来自DnD数据集的去噪图像进行视觉比较,如图7所示。其他方法用残余噪声腐蚀边缘,而我们的方法可以有效地从平滑区域去除噪声并保持清晰的边缘。在这里插入图片描述
在这里插入图片描述
SIDD SIDD 数据集中的图像由智能手机捕获,一些噪声图像具有较高的噪声水平。我们使用 1,280 个验证图像进行定量比较,如表 5 所示。结果表明,与其他测试方法相比,我们的方法取得了显着的改进。对于视觉比较,我们从去噪结果中选择了两个具有挑战性的示例。第一个场景具有丰富的纹理,而第二个场景具有突出的结构。如图8和图9所示,CDnCNN-B和CBDNet在噪声去除时失败。CBM3D导致伪伪影,PD和RIDNet破坏纹理。相比之下,我们的网络恢复了更接近基本事实的纹理和结构。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Nam JPEG 压缩使噪声更顽固于 Nam 数据集上。为了公平比较,我们使用CBDNet[12]选择的补丁进行评估。此外,还引入了 CBDNet* [12] 进行比较,该比较由其提供商在 JPEG 压缩数据集上重新训练。我们在表6中报告了Nam的平均PSNR和SSIM值。在PSNR方面,我们的SADNet比RIDNet、PD和CBDNet*获得了1.88、1.83和1.61 dB的增益。同样,我们在比较中,我们的 SSIM 值优于所有其他方法。在图10所示的可视比较中,我们的方法再次获得了纹理恢复和噪声去除的最佳结果。在这里插入图片描述
在这里插入图片描述
参数和运行时间 为了比较运行时间,我们在去噪 480 × 320 彩色图像时测试了不同的方法。请注意,运行时间可能取决于测试平台和代码;因此,我们还提供了浮点运算 (FLOP) 的数量。所有方法都在 PyTorch 中实现。如表7所示,虽然SADNet具有较高的参数数,但由于多次下采样操作,其FLOPs最小,运行时间较短。由于大多数操作都是在小规模特征图上运行的,因此我们的模型在参数较少的情况下比其他许多操作更快。在这里插入图片描述

5 Conclusion

在本文中,我们提出了一种用于有效噪声去除的空间自适应去噪网络。该网络由多尺度残差空间自适应块构建,该块根据图像的内容和纹理对相关特征进行采样以进行加权。我们进一步引入了一个上下文块来捕获多尺度信息并实现偏移传输,以更准确地估计采样位置。我们发现空间自适应能力的引入可以在大噪声下恢复复杂场景中更丰富的细节。所提出的SADNet在合成和真实噪声图像上都达到了最先进的性能,运行时间适中。


回顾一下网络结构:

在这里插入图片描述

然后马不停蹄地来到复现文章吧!看看SADNet的复杂结构具体是如何实现的吧!

本文对应的复现文章:


至此本文结束。

如果本文对你有所帮助,请点赞收藏,创作不易,感谢您的支持!

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十小大

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

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

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

打赏作者

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

抵扣说明:

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

余额充值