AIGC神器CLIP:技术详解及应用示例

这篇具有很好参考价值的文章主要介绍了AIGC神器CLIP:技术详解及应用示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编者按:上一期,我们介绍了Diffusion模型的发展历程、核心原理及其对AIGC发展的推动作用。本期,我们将共同走进另一项AI重要突破——CLIP,著名的DALLE和Stable Diffusion均采用了CLIP哦。

Nikos Kafritsas的这篇文章,为我们详细介绍了CLIP是如何工作的,同时提供一些编码示例。

以下是译文,Enjoy!

作者 | Nikos Kafritsas

编译 | 岳扬

AIGC神器CLIP:技术详解及应用示例

图片生成自白海科技“涌现AIGC引擎”

最近有两项人工智能的突破性成果:DALLE[1]和Stable Diffusion[2],它们有什么共同点?

它们都使用CLIP[3]架构的组件。因此,如果你想要了解这些模型是如何工作的,需要首先了解什么是CLIP。

CLIP可以用来干些什么?为什么它是人工智能领域的一个重要的里程碑?

让我们来深入了解一下吧!

1

CLIP 概述

CLIP是Constastive Language-Image Pretraining的缩写。其是一个开源的、多模式的、zero-shot的模型。如果提供一张图像和一段文本描述,该模型可以预测与该图像最相关的文本描述,而不需要为某个特定任务进行优化。

让我们来分析一下上面这个段描述:

  • 开源的:该模型是由OpenAI构建并开源的。在后文可以看到如何使用它的教程。

  • 多模式的:多模式架构利用了不止一个领域来学习特定的任务。CLIP同时结合了自然语言处理和计算机视觉等多个领域的技术。

  • zero-shot:zero-shot学习是一种对未见过的标签进行归纳的方法,并且我们不需要专门训练如何对它们进行分类。例如,ImageNet模型只能被训练来识别1000个特定的类别,而CLIP不受这种限制。

  • Constastive Language:这种技术使得CLIP能理解相似的表征彼此应该靠近,而不相似的应该相距甚远。这将在后文的例子中表示出来。

关于CLIP的一些有趣的事实:

  • CLIP是用多达4亿对图文数据来进行训练的。而ImageNet数据集仅包含120万张图片。

  • 最终的CLIP模型在256个V100 GPU上训练了两个星期。如果按照AWS Sagemaker上的计费标准,这将花费至少20万美金!

  • 该模型使用32,768张图片的minibatch进行训练。

CLIP in Action:

为了演示一下CLIP的作用,稍后本文会更详细地展示一个编码的例子。

首先,我们从Unsplash选择一张免费的图片。

AIGC神器CLIP:技术详解及应用示例

Photo by Андрей Курган on Unsplash

接下来,我们为CLIP提供以下文本提示:

‘a girl wearing a beanie’.

‘a girl wearing a hat’.

‘a boy wearing a beanie’.

‘a girl riding a bike’.

‘a dog’.

很明显,第一个关于对图像的描述更准确。

CLIP能够自主找到哪个文本提示最佳地描述图像,上述过程是通过分配归一化的概率实现的。

AIGC神器CLIP:技术详解及应用示例

通过上图可以知道,CLIP成功定位了最适合的图像描述。

另外,CLIP可以准确地识别它以前从未见过的物体种类和个体。

如果你有一个庞大的图像数据集,并且你想把这些图像标记为特定的类别,CLIP能够自动为你做这件事。

接下来,我们将说明CLIP是如何工作的。

2

CLIP 架构

CLIP使用了来自其他成功深度学习模型架构的新颖想法,并引入了一些创新性的想法。

让我们从第一部分开始,对比式无监督预训练(Contrastive Pre-training)。

2.1 对比式无监督预训练

图1展示了对比式无监督预训练过程的概况。

假设我们有N个图像与它们各自的描述集合,例如:<image1, text1>, <image2, text2>, <imageN, textN>。

对比式无监督预训练的目的是同时训练图像编码器和文本编码器,产生图像嵌入[I1, I2 ... IN]和文本嵌入[T1, T2 ... TN],其方式为:

正确的<image-text>嵌入对<I1,T1>, <I2,T2>(其中i=j)的余弦相似度是最大的。

以对比的方式,不相似的对<I1,T2>, <I1,T3>...<Ii,Tj>(其中i≠j)的余弦相似性最小。

AIGC神器CLIP:技术详解及应用示例

图1:CLIP的对比式无监督预训练步骤

让我们看看每一步都发生了些什么...

  1. 该模型首先接收N个<image-text>对。

  1. 文本编码器是一个标准的Transformer模型,进行了GPT2风格的修改[4]。图像编码器可以是ResNet或Vision Transformer[5]

  1. 对于batch中的每个图像,图像编码器都会计算一个图像向量。比如第一幅图像对应于I1向量,第二幅对应于I2向量,以此类推。每个向量的大小为de(de是潜在维度的大小)。因此,这一步的输出是N * de矩阵。

  1. 同样地,文本描述被压缩成文本嵌入[T1, T2 ... TN],产生一个N * de矩阵。

  1. 最后,我们将这些矩阵相乘,计算每张图片和文本描述之间的成对余弦相似度。这将产生一个N * N矩阵,如图1所示。

  1. 我们的目标是使对角线上的余弦相似度最大化,这些是正确的<image-text>对。以对比的方式,非对角线元素的相似度应该最小化(例如,I1图像由T1描述,而不是由T2、T2、T3等描述)。

A few extra remarks:

  • 该模型使用对称的交叉熵损失函数作为其优化目标。这种类型的损失函数既能优化图像到文本的方向,也能有优化文本到图像的方向(对比损失函数矩阵同时保持<I1,T2>和<I2,T1>的余弦相似度)。

  • 对比式无监督预训练并不是全新的。在以前的其他模型中就有使用它,并在之后被CLIP[6]改造。

2.2 Zero-Shot 分类

现在我们已经对图像和文本编码器进行了预训练,这就说明已经准备好了进行Zero-Shot分类。

The baseline

首先,需要了解在Pre-Transformer时代是如何实现Zero-Shot分类的?这其实很简单[7]

首先下载一个高性能的预训练过的CNN,比如ResNet,用它进行特征提取,得到图像特征。

然后,将这些特征作为一个标准分类器(如Logistic Regression)的输入。分类器是以有监督的方式进行训练的,其中图像标签是目标变量(图2)。

如果你选择了K-shot learning,那么在分类阶段的训练集应该只包含每个类别的K个实例。

当K<10时,该任务被称为few-shot classification learning。相应地,对于K=1,我们称之为one-shot classification learning。如果我们使用所有可用的数据,这就是一个完全有监督的模型(老式的方法)。

AIGC神器CLIP:技术详解及应用示例

图2:带有特征提取的图像分类(图片来自本文作者)

注意上文的关键词 “有监督的”——分类器应该事先知道类别标签。使用图像提取器与分类器配对,也被称为线性探测评估(linear probing evaluation)。

CLIP的竞争优势

CLIP如何进行Zero-Shot分类的过程显示在图3中。

AIGC神器CLIP:技术详解及应用示例

图3:使用CLIP的Zero-Shot分类

同样,这个过程也很简单明了。

首先,我们提供一组文本描述,如一张狗或猫吃冰淇淋的照片(任何我们认为最能描述一张或多张图像的内容)。这些文本描述被编码为文本嵌入。

然后,我们对图像做同样的事情——图像被编码成图像嵌入。

最后,CLIP计算图像嵌入和文本嵌入之间的成对余弦相似度。具有最高相似度的文本提示被选择为预测结果。

当然,我们也可以输入一张以上的图像。CLIP巧妙地缓存了输入的文本嵌入,所以它们不必为其余的输入图像重新进行计算。

这就是CLIP端到端的工作方式。

3

寻找数据的问题

CLIP使用多达30个公共数据集进行预训练。用大量的数据拟合一个大型语言模型是很重要的。

然而,很难找到具有成对的包含图像和文本描述的强大数据集。大多数公共数据集,如CIFAR,是只有一个单词作为标签的图像——这些标签是目标类别。但是CLIP使用了完整的文本描述。

为了克服这种差异,作者并没有排除这些数据集。相反,他们进行了一些特征工程的工作。单词标签(如bird或car)被转换为句子:一张狗的照片或一张鸟的照片。在Oxford-IIIT Pets数据集上,作者使用了这样的提示:一张{label}的照片,一种宠物的类型。

关于预训练技术的其他信息,请查看原始论文[3]

4

CLIP在人工智能领域的影响

文初,我们称CLIP是人工智能界的一个里程碑,现在来看看为什么。

4.1 Zero-Shot 分类器的卓越性能

CLIP是一个zero-shot分类器,所以首先针对小样本学习(few-shot learning)模型测试CLIP是非常有意义的。

因此,作者测试了CLIP与由高质量预训练模型(如ResNet)上的线性分类器组成的模型。

结果显示在图4中。

AIGC神器CLIP:技术详解及应用示例

图4:CLIP的性能与其他模型在小样本分类方面的对比

CLIP明显优于其他分类器!

另外,CLIP还能够与16-shot线性分类器BiT-M的性能相媲美。换句话说,BiT-M的分类器必须在每类至少16个例子的数据集上进行训练才能与CLIP的得分相匹配——而CLIP都不需要进行微调就能达到同样的得分。

有趣的是,作者将CLIP作为一个linear probe(指训练的时候把预训练好的模型权重冻住,直接用其提取特征,然后只是去训练最后的 fc 分类头)进行评估。他们只用CLIP的图像编码器来获取图像特征,并将其送入一个线性分类器,就像其他模型一样。不过即使有这样的设置,CLIP的小样本学习能力也很突出。

4.2 对分布迁移的非并行鲁棒性

分布迁移是个大问题,特别是对于生产环境中的机器学习系统。

注:你可能认为分布迁移是概念漂移,尽管技术上它们不一样。

分布迁移是一种现象,当一个模型所训练的数据随着时间的推移而变化时,就会出现这种现象。因此,随着时间的推移,模型的效率会下降,预测的准确性会降低。

事实上,出现分布迁移并不是什么令人意外的事情,它一定会发生。问题是,如何尽早发现这种现象,以及需要采取什么措施来 “重新校准” 你的模型?这并不容易解决,会受到许多因素的影响。

幸运的是,关于人工智能的研究方向开始朝向研究创建对分布漂移有弹性的模型。

这就是为什么作者要对CLIP的稳健性进行测试。测试结果显示在图5中。

AIGC神器CLIP:技术详解及应用示例

图5:CLIP与ResNet在分布漂移方面的性能表现

下面介绍关于CLIP的两个重要点:

  • CLIP在ImageNet上实现了与SOTA ResNet模型相同的准确度,尽管CLIP是一个zero-shot模型。

  • 除了原始的ImageNet之外,还有类似的数据集作为分布迁移的基准,不过似乎ResNet在这些数据集上很吃力。然而,CLIP可以很好地处理未知的图像。事实上,该模型在ImageNet的所有变化中都保持着同样的准确度。

4.3 计算效率

在GPT-2之前,计算效率高在某种程度上被认为是理所当然的。

如今,在一个模型需要用数百个价值高达八千美元的GPU来训练的时代,计算效率问题需要严肃对待。

CLIP是一个更有利于计算的架构。取得成功的部分原因是CLIP使用了一个视觉变换器作为默认的图像编码器组件。比较结果显示在图6中。

AIGC神器CLIP:技术详解及应用示例

图6:针对不同模型,每张图像的浮点运算数量比较

显然,与其他模式相比,CLIP能够更好地利用硬件资源。这也代表在云服务(如AWS Sagemaker)上训练时能够节省更多费用。此外,图6显示,与其他模型相比,CLIP在硬件操作与准确性得分方面具备更好的可扩展性。

还有一个数据效率的问题。作者表明,在zero-shot的情况下,CLIP比类似的模型数据效率更高。但是,他们没有解决CLIP在预训练阶段的数据效率问题。然而,对于这种情况我们可能做不了什么,因为CLIP使用两种类型的Transformers——而Transformers从本质上来说是对数据要求很高的模型。

4.4 人们对文转图模型的研究兴趣得到增加

CLIP的成功引发了人们对文转图模型的兴趣,并推广了对比式无监督预训练方法。

除了DALLE和Stable Diffusion,我们可以把CLIP作为GANs中的一个判别器。

此外,伴随着CLIP的发布也出现很多基于CLIP的论文,扩展了该模型的功能,如DenseCLIP[8]和CoCoOp[9]

微软也发布了X-CLIP[10],一个用于视频理解的CLIP扩展新框架。

Bonus Info:推荐一个类似于Pictionary的应用程序,叫做paint.wtf,使用CLIP对你的绘画进行排名。

5

如何使用CLIP - 编码示例

接下来,我们将展示如何通过HugginFaces库来使用CLIP。

首先,我们从Unsplash选择3张图片,我们在前文使用了第1张。

AIGC神器CLIP:技术详解及应用示例

Photo by Андрей Курган on Unsplash

AIGC神器CLIP:技术详解及应用示例

Photo by Richard Brutyo on Unsplash

AIGC神器CLIP:技术详解及应用示例

Photo by Oscar Sutton on Unsplash

我们将使用以下库:

import transformers
import datasets
import numpy as np
import pandas as pd
import torch
from PIL import Image
import requests

from transformers import CLIPTokenizerFast, CLIPProcessor, CLIPModel

接下来,我们加载CLIP模型的权重、tokenizer图像处理模块:

device = "cuda" if torch.cuda.is_available() else "cpu"
model_id = "openai/clip-vit-base-patch32"

# we initialize a tokenizer, image processor, and the model itself
tokenizer = CLIPTokenizerFast.from_pretrained(model_id)
processor = CLIPProcessor.from_pretrained(model_id)
model = CLIPModel.from_pretrained(model_id).to(device)

另外,我们在Python中加载上面那些来自Unsplash的图片:

urls=['https://images.unsplash.com/photo-1662955676669-c5d141718bfd?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80',
'https://images.unsplash.com/photo-1552053831-71594a27632d?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=662&q=80',
'https://images.unsplash.com/photo-1530281700549-e82e7bf110d6?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=688&q=80']

images=[Image.open(requests.get(i, stream=True).raw)  for i in urls]

最后,我们给CLIP为这些图片提供一些文本提示。这样做的目的是让CLIP把3张来自Unsplash的图片分类为特定的文字描述。请注意,其中一个文字描述是具有误导性的,让我们看看这样是否可以混淆模型。

text_prompts=["a girl wearing a beanie", "a boy wearing a beanie", "a dog", "a dog at the beach"]
inputs = inputs = processor(text=text_prompts, images=images, return_tensors="pt", padding=True)

outputs = model(**inputs)
logits_per_image = outputs.logits_per_image 
probs = logits_per_image.softmax(dim=1)
pd.DataFrame(probs.detach().numpy()*100, columns=text_prompts, index=list(['image1','image2', 'image3'])).style.background_gradient(axis=None,low=0, high=0.91).format(precision=2)

该模型成功地对这3幅图像进行了分类!

需要注意两点:

  • CLIP可以理解多个实体以及它们在每张图像中的行为。

  • CLIP给每张图片分配了最具体的描述。例如,我们可以把第二张图片描述为 “一只狗”和 “一只在海滩上的狗”。然而,模型正确地决定 “一只狗” 能够更好地描述第二幅图像,因为那里没有海滩。

完整样例:https://jovian.ai/nkafr/clip

6

局限性和未来的工作

虽然CLIP是一种颠覆性的模式,但仍然有改进的空间。作者指出了可以取得进一步进展的方面:

  • 准确率得分:CLIP是最先进的zero-shot分类器,它能够直接挑战那些因为特定任务而训练出来的模型。事实上,CLIP与ImageNet上有监督的ResNet101的准确率相匹配,这是十分惊人的。不过,还有有监督的模型能够取得更高的分数。作者说因为CLIP具备优秀的可扩展性,它以后可能会取得更高的分数,但这需要天文数字的计算机资源。

  • 多义词:作者指出,CLIP受到多义词的影响。有时,由于缺乏上下文,该模型无法区分一些词的含义。记住,我们在前面提到,有些图片只用一个类别标签而不是文本提示来进行标记。作者提供了一个例子。在Oxford-IIIT Pet数据集中,“boxer”这个词指的是一种狗的品种,但其他图像“boxer”是运动员。在这个例子,罪魁祸首是数据的质量,而不是模型本身。

  • 特定任务的学习:虽然CLIP可以区分复杂的图像,但该模型在一些琐碎的任务中却面临失败。例如,CLIP在手写数字识别任务上很吃力(图7)。作者将这种类型的任务识别吃力的现象归因于训练数据集中缺乏手写数字。

AIGC神器CLIP:技术详解及应用示例

图7:使用CLIP进行手写数字识别

7

Closing Remarks 结语

毫无疑问,CLIP是人工智能领域的一个重要模型。

从本质上讲,CLIP为新一代的文转图模型铺平了道路,彻底改变了人工智能研究方向。别忘了,这个模型是开源的。

但是CLIP仍然有很多改进的空间。在整篇论文中,作者暗示CLIP的许多问题是由于较低质量的训练数据造成的。

END

参考资料

  1. Aditya Ramesh et al. Hierarchical Text-Conditional Image Generation with CLIP Latentshttps://arxiv.org/pdf/2204.06125.pdf (April 2022)

  1. Robin Rombach et al. High-Resolution Image Synthesis with Latent Diffusion Modelshttps://arxiv.org/pdf/2112.10752.pdf (April 2022)

  1. Alec Radford et al. Learning Transferable Visual Models From Natural Language Supervisionhttps://arxiv.org/pdf/2103.00020.pdf (Feb 2021)

  1. Alec Radford et al. Language Models are Unsupervised Multitask Learnershttps://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf (2019)

  1. Dosovitskiy et al. An Image is Worth 16x16 Words: Transformers for Image Recognition at Scalehttps://arxiv.org/abs/2010.11929 (2020)

  1. Yuhao Zhang et al. CONTRASTIVE LEARNING OF MEDICAL VISUAL REPRESENTATIONS FROM PAIRED IMAGES AND TEXThttps://arxiv.org/pdf/2010.00747.pdf (2020)

  1. Tian, Y et al. Rethinking few-shot image classification: a good embedding is all you need?https://arxiv.org/pdf/2003.11539.pdf (2020)

  1. Yongming Rao et al. DenseCLIP: Language-Guided Dense Prediction with Context-Aware Promptinghttps://arxiv.org/abs/2112.01518

  1. Kaiyang Zhou et al. Conditional Prompt Learning for Vision-Language Modelshttps://openaccess.thecvf.com/content/CVPR2022/papers/Zhou_Conditional_Prompt_Learning_for_Vision-Language_Models_CVPR_2022_paper.pdf (Mar 2022)

  1. Bolin Ni et al. Expanding Language-Image Pretrained Models for General Video Recognitionhttps://arxiv.org/abs/2208.02816 (August 2022)

原文链接:https://towardsdatascience.com/clip-the-most-influential-ai-model-from-openai-and-how-to-use-it-f8ee408958b1文章来源地址https://www.toymoban.com/news/detail-501876.html

到了这里,关于AIGC神器CLIP:技术详解及应用示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AIGC技术发展和应用方向

    AIGC(Artificial Intelligence Generated Content)是指通过人工智能技术生成的各种文本、图像、音频和视频等多媒体内容。AIGC技术是机器学习和自然语言处理等技术的结合,通过对海量数据的学习和分析,可以让计算机模拟人类的创造力和判断力,自动生成符合人类需求的内容。

    2024年02月12日
    浏览(56)
  • 抓包技术的应用示例

    最近瑞幸在搞活动,每天免费送10000份咖啡,我是个不喝咖啡的人儿,所以没咋关注,今早我们的团宠小妹,拉着我 10点整拼手速,想着帮她抢一杯,于是点开瑞幸咖啡小程序主页,banner 栏轮播图中有一张海报入口,操作一通下来,果然,没抢到。 手速不够快不是主要原因,

    2024年02月11日
    浏览(35)
  • AIGC零基础30天学习——CLIP模型

            Contrastive Language-Image Pre-training(以下简称“CLIP”)是OpenAI 在 2021 年初发布的用于匹配图像和文本的预训练神经网络模型,可以说是近年来在多模态研究领域的经典之作。该模型直接使用大量的互联网数据进行预训练,在很多任务表现上达到了目前最佳表现(SOT

    2024年02月09日
    浏览(45)
  • 【AIGC】10、Chinese CLIP | 专为中文图文匹配设计

    论文:Chinese CLIP: Contrastive Vision-Language Pretraining in Chinese 代码:https://github.com/OFA-Sys/Chinese-CLIP 出处:阿里达摩院 时间:2022.11 贡献: 提出了 Chinese CLIP,是经过在大尺度中文图像-文本对儿的两阶段预训练 CLIP 的成功极大地促进了对比学习在视觉-语言模型预训练上的研究和应用

    2024年02月13日
    浏览(35)
  • 【AIGC】百度:跨模态内容生成技术与应用

    内容来源:机器之心,百度文心一格总架构师肖欣延博士,《跨模态内容生成与技术与应用》的演讲。 从图像生成角度来看,下图左边是 2020 年图像生的水平,是很有代表性的一个拍卖画作。到了 2022 年,技术已经相比之前强了很多。我们任意说一句话就能生成一张非常精致

    2024年02月09日
    浏览(53)
  • 深入探索AIGC技术:原理、应用与未来发展

    深入探索AIGC技术:原理、应用与未来发展 摘要 :随着人工智能技术的飞速发展,AIGC(人工智能生成内容)已成为当今科技领域的前沿话题。本文将深入探讨AIGC的原理、技术应用以及未来发展趋势,并分析其对计算机科学和整个社会的影响。 一、AIGC的基本原理 AIGC,即人工

    2024年02月03日
    浏览(41)
  • 让你的代码动起来:Python进度条神器tqdm详解及应用实例

    各位Python高手,今天我要给大家介绍一个好用的库,它就是: tqdm tqdm在阿拉伯语中的意思是 \\\"进展\\\",所以这个库也被称为 \\\"快速进展条\\\"。不得不说,这个名字真的很有创意! 让我们想象一下,你正在运行一个耗时的数据处理任务或者训练一个复杂的深度学习模型。你坐在那

    2024年02月07日
    浏览(63)
  • 行业前沿 | 畅想AIGC技术研究与应用实践(一)

    AIGC的火热之势已经蔓延到各行各业,技术浪潮冲击下,关于AIGC创业、AIGC未来发展方向以及AIGC的应用实践等,企业、投资者以及技术产品专家们有着不一样的思考。 近日,数美科技联合AMD举办的AIGC沙龙活动,邀请了 经纬创投投资董事王冰醒、启元世界战略总监王思捷、AM

    2024年02月09日
    浏览(52)
  • AIGC内容分享(二):全球大模型技术与应用分析

    目录 前言 人工智能技术回顾 AIGC近期动态梳理 1. 国内动态 2. 国外动态 3. OpenAI的关键动作 4. AIGC的技术变革  AIGC的关键应用 1. AIGC应用背后的驱动力 2. AIGC的三大原能力 3.  AIGC的四大产品形态 大模型如何融入行业? 1. 通用行业融合 2. 垂直行业融合 这篇文章主要阅读者是产品

    2024年01月16日
    浏览(54)
  • AIGC零基础30天学习——CLIP与zero-shot

           在前面对CLIP的学习中,对 zero-shot prediction 环节一直有一些疑惑,zero-shot是什么,它该如何进行操作?     zero-shot是指零样本学习,和zero-shot相关联的概念包括many-shot、few-shot和one-shot,这些其实都是从训练集样本类型、测试集样本类型和对应的样本数量角度进行划分

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包