【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

这篇具有很好参考价值的文章主要介绍了【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

论文:Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection

代码:https://github.com/IDEA-Research/GroundingDINO

出处:清华、IDEA

时间:2023.03.20

贡献:

  • 本文提出了一种 open-set 的目标检测器,Grounding DINO,将 Transformer based 检测器 DINO 和 grounded pre-training 结合起来,能够输出 prompt 中提到的目标框,或者输出 prompt 的 referring expressions 的目标框
  • 实现的方法:将 language 引入闭集目标检测中,来对开集的概念进行扩展
  • 如何引入:将闭集目标检测分为三个阶段:
    • feature enhancer
    • language-guided query selection
    • cross-modality decoder for cross-modality fusion
  • 之前的工作都是在 novel categories 上测评开集目标检测,本文提出在文本 reffering 的目标上也进行测试
  • 之前的工作对语言特征和图像特征的融合不够完全,GLIP 就只在特征层面进行了融合
  • 在 COCO 上 zero-shot 达到了 52.5 AP,fine-tuning 之后达到了 63.0 AP

作者视频讲解

bilibili

模型设计三个重点:

  • 第一:基于强劲的目标检测器 DINO
  • 第二:基于闭集检测的模型结构,但 text 和 image 要尽可能多的融合,来学习更好的信息
  • 第三:模型训练时不同类别之间不做 attention,能加速模型训练

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测
【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测
ref:只输出一个物体

grounding 任务:输出所有提到的物体
【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

GLIP 的方案很天才:

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

CLIP-based 和 Grounding 建模方式的区别:

  • CLIP:把每个类别当成一句话来做,处理的是句子级别的 feature
  • Grounding:把所有类别拼成一句话,送入 BERT ,提取每个 单词的 feature,是单词级别的特征,特征粒度不同

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

Grounding 好在哪里:可以使用更多的 grounding data

  • 把检测数据转换为 grounding 数据,而且不需要做特殊的处理(如类别名称处理什么的)
  • 还可以使用预训练的 grounding 模型来提取 image-text pairs 的伪标签框,而且 image-text pair 本来的标注就是一个图对应一句话,所以可以很容易的使用 grounding 进行推理得到伪标签框,而且文本中有很多语义信息,更能引入丰富的语义信息。

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

关联和区别:

  • 传统目标检测是提取 region feature,然后对该 region feature 进行分类和回归
  • CLIP-based open-set 目标检测:box 的处理是不变的,变得是求类别的方式,变成了 region feature 和 text embedding 的相似度,可以使用 CLIP 来将类别表示成 text embedding,这个思路比较自然,且各个类别是并行输入,不受类别限制。
  • Grounding-based open-set 目标检测:和 grounding 数据结合,将目标检测转换为 grounding,模型接收的语义信息更丰富,能利用 grounding 模型提取 image-text 伪标签,受类别数量的限制。

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

DINO :

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

模型设计:

  • 蓝框是 close-set 目标检测过程
  • 从 close-set 到 open-set 的关键在于引入 text encoder
  • 如果想要模型有更强的文本、图像理解能力,所以这两个模态尽可能多的融合是很重要的,一般的融合会在 3 个部分:Neck、Query init、output

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测
如何处理不同的句子:

  • CLIP 会把每个类别做成句子形式来提取特征,
  • Grounding 会把所有类别当做一句话来提取特征,所以 grounding 类别名称之间是没有什么联系的,所以也不需要计算各个类别之间的 attention,所以作者发现不计算类别之间的 attention 能提高训练速度且效果依然良好

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

一、背景

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

理解视觉新概念是视觉模型应该具有的基本能力,基于此,作者提测了一个强大的检测器 open-set object detection,能够检测任意的能用人类语言描述的目标

而且该任务也能和其他模型结合使用,有很大的潜力,如图 1b 所示,和生成模型结合起来就能进行图像编辑

开集目标检测的关键在哪里!!!

  • 引入自然语言处理对语言的理解能力,来扩展模型对没见过的目标的理解
  • 举一个不太严谨的例子:如输入了一个 prompt=哈士奇,但视觉模型不知道什么是哈士奇,那么语言模型会先分析哈士奇和 dog 关联很近,那么就会输出检测为 dog 的框为哈士奇

GLIP 方法将目标检测构建为了 phrase grounding 任务,并且引入 object region 和 language phrase 之间的对比学习来进行关联。展现出了很强的灵活性,可以同时适用于开集和闭集目标检测。

但 GLIP 的效果会被 Dynamic Head 检测器的效果限制,因为开集目标检测和闭集目标检测是强联系的,所以,本文作者认为一个在闭集目标检测上表现好的模型一定能在开集目标检测上表现好。

所以,本文作者基于 DINO 构建了一个开集目标检测器,且在目标检测上获得了很好的效果

Grounding DINO 相比 GLIP 的优势:

  • 基于 Transformer 结构,能同时适用于图像和语言数据
  • Transformer 结构能从大型数据集上获得更多的信息
  • DINO 可以端到端的优化模型,不需要使用后处理等(如 NMS),能够简化这个 grounding model 的设计

closed-set 检测器的三个重要模块:

  • backbone:抽取图像特征
  • neck:特征增强
  • head:回归和分类等

如何使用语言模型将 closed-set 检测器扩展到 open-set 检测器:

  • 学习 language-aware regiong embedding
  • 这样就可以将每个目标区域划分到语言语义信息对应的空间去
  • 其关键在于 neck 或 head 输出的地方,在 region output 和 language features 之间使用对比学习,来帮助模型学习如何对齐这两种多模态信息
  • 如图 2 展示了三个不同的阶段进行特征融合的示例,neck(A)、query initialization(B)、head(C)

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

到底什么时候来进行特征融合比较好呢:

  • 一般认为,在整个 pipeline 中进行特征的融合的效果会更好
  • 类似于 CLIP 形式的检索结构为了高效,只需要对最后的特征来进行对比即可
  • 但是对于 open-set detection,模型的输入是 image 和 text,所以 tight(and early)fusion 的效果更好,也就是更多的融合效果更好
  • 但是以前的检测器(如 Faster RCNN)很难在这三个阶段都将语言特征引入来进行融合,但 图像 Transformer 结构和 language 的结构很类似,所以本文作者设计了三个特征融合器,分别在 neck、query initialization、head 阶段进行融合

Neck 结构:

  • stacking self-attention
  • text-to-image cross-attention
  • image-to-text cross attention

Head:

  • query 的初始化:使用 language-guided query 选择方式来初始化
  • 如何提高 query 特征表达:对 image 和 text 进行 cross-attention ,来作为 cross-modality decoder

很多现有的 open-set 目标检测器都会在新类别上来测试其效果,如图 1b 所示

但作者认为,只要是能描述的对象,都应该被考虑其中

本文将这个任务命名为 Referring Expression Comprehension(REC),即参照表示理解

作者在图 1b 的右侧展示了一些 REC 的例子

作者在下面三种数据集上进行了实验:

  • closed-set
  • open-set
  • referring
    【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

二、方法

Grounding DINO 会在给定一个输入 (image, text) 的基础上输出多个 [object boxes, noun phrases] pairs

如图 3 所示,模型会根据输入的图像和文字描述 ‘cat’ 和 ’table’ 来框出输入图像中的 cat 和 table

目标检测和 REC 任务都可以使用这个 pipeline 来对齐,类似于 GLIP:

  • 如何实现目标检测:将所有类别的名字作为输入 text 来
  • 如何实现 REC:对每个输入 text,REC 只需要返回一个 bbox 即可, 所以作者使用输出目标的最大得分作为 REC 的输出

Grounding DINO 的结构:dual-encoder-single-decoder 的结构,整体结构如图 3 所示

  • 一个 image backbone 来抽取图像信息
  • 一个 text backbone 来抽取文本信息
  • 一个 feature enhancer 来对图像和文本信息进行融合
  • 一个 language-guided query 选择模块来进行 query 初始化
  • 一个 cross-modality decoder 来进行 box 的修正

对每个(image, text)pair 的操作过程如下:

  • 首先,使用 image backbone 和 text backbone 来抽取原始的图像特征和文本特征
  • 然后,将这两组特征输入 feature enhancer 模块来进行跨模态特征融合,得到跨模态融合特征
  • 接着,使用 language-guided query selection 模型来从 image feature 中选择跨模态特征的 query,并输入跨模态 decoder 来从这两个模态的特征中提前需要的特征并且更新 query
  • 最后,最后一层 decoder 的输出 query 被用于预测 object box 并且提取对应的 phrases

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

右边一列就是 DINO 的结构,左边就是对文本的处理

2.1 特征抽取和加强

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

给定(Image,Text)pair,从 Swin Transformer 的结构中抽取多级图像特征,从 BERT 的结构中抽取文本特征

抽取特征之后,将两组特征输入 enhancer 中来进行跨模态的特征融合,enhancer 结构包括多个 enhancer layers,其中一个如图 3 block2 所示。

如上图所示:

  • Text features:使用 self-attention 先进行自注意力特征提取
  • Image features:使用 Deformable self-attention 来增强图像特征
  • 然后再顺序的进行 image-to-text 和 text-to-image 的 cross-attention
  • 最后经过 FFN 来分别得到增强后的两种特征

2.2 Language-Guided Query Selection

GLIP 在进行了特征融合后,就分别使用融合后的特征去进行特征预测了

但 Grounding DINO 在这里设计了 language-guided query selection 再次进行融合,为了更好的利用 input text 来指导目标检测,来选择和 input text 相关性更大的 features 来作为 decoder queries

pytorch 伪代码如 Algorithm 1 所示:

  • num_query:decoder 中的 queries 数量,实际使用时和 DINO 一样设定为 900
  • bs:batch size
  • ndim:feature dimension
  • num_img_tokens:image token 的数量
  • num_text_tokens:text token 的数量

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

language-guided query selection module 的输出:

  • num_query 索引,可以根据这个输出的索引来初始化 queries
  • 每个 decoder query 包含两部分:content(是参与训练的)、positional(动态 anchor box,使用 encoder 的输出来初始化)

2.3 Cross-Modality Decoder

在 Language-Guided Query Selection 之后,还接了一个 cross-modality decoder,如图 3 block3 所示,进一步将 image 和 text 的特征进行结合

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

2.4 Sub-sentence level text feature

前面的 work 可以获得两种 text prompt,如图 4 所示

  • sentence level representation:如图 4a,将整个句子的特征编码为一个特征,如果一个句子有多个短语,则会抽取这些短语,忽略其他 word
  • word level representation:如图 4b,会对一个句子中的所有 word 进行关联性编码,会引入不必要的依赖关系,一些并不相关的单词也会被关联起来

基于上面两种编码方式的问题,作者提出了 sub-sentence level 表达的方式,就是只对 sub-sentence 内的 word 进行关联学习,不会引入不必要的联系
【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

2.5 Loss Function

  • 回归 loss:L1 loss 和 GIoU loss
  • 分类 loss:对比学习 loss(预测的和 language token 之间的对比)

三、效果

作者在三种不同设置上进行了实验:

  • 闭集: COCO 检测数据集
  • 开集:zero-shot COCO、LVIS、ODinW
  • Referring detection:RefCOCO/+/g

设置细节:

  • 作者训练了两个模型变体:
    • Grounding-DINO-T(swin-T)
    • Grounding-DINO-L(swin-L)
  • text backbone 为 BERT-base(from Hugging Face)

3.1 zero-shot transfer of grounding DINO

1、COCO Benchmark:

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

2、LVIS Benchmark

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

3、ODinW Benchmark

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

3.2 Referring Object detection

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

3.3 Ablations

因为作者提出了 tight fusion 模式,为了验证该方式是否有用,作者移除了一些 fusion block,结果见图 6

所有模型都是使用 Swin-L 基于 O365 训练的,结果证明更紧密的 fusion 能够提升最终的效果

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

3.4 从 DINO 到 Grounding DINO

如果直接从头开始训练 Grounding DINO 的话,费时费力,所有作者尝试使用了训练好的 DINO 权重,冻结了两个模型共用的部分权重,微调其他部分的参数,结果见表 7。

结果表明,使用 DINO 预训练好的权重,只训练 text 和 fusion block, 就可以达到和重新训练一样的效果

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

四、代码

4.1 环境安装

git clone https://github.com/IDEA-Research/GroundingDINO.git
cd GroundingDINO/
pip install -e .

4.2 权重下载

# 浏览器输入下面路径即可下载
https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
# wget 下载
mkdir weights
cd weights
wget -q https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
cd ..

4.3 单张图 demo

# 输出需要检测的类别:
CUDA_VISIBLE_DEVICES=7 python demo/inference_on_a_image.py \
-c groundingdino/config/GroundingDINO_SwinT_OGC.py \
-p weights/groundingdino_swint_ogc.pth \
-i images/1.jpg \
-t cat \ # 如果要检测多个类别的目标,使用.分开,如 -t cat.dog.bird
-o output
  • text_threshold=0.25
  • box_threshold=0.3

【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测

过程如下:

  • 输入:图像、text_prompt ('cat. dog')
  • 文本处理:变成小写字母、去除空格,如果最后没有 . 的话,给文本最后加上 . ,变成 'cat. dog.',然后对输入文本进行分词,变成 {'input_ids': tensor([[ 101, 4937, 1012, 3899, 1012, 102]], device='cuda:0'), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0]], device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1]], device='cuda:0')},输入的 special_token 为 [101, 102, 1012, 1029],可以过滤不需要的 token,包括开始 101 和结束标记 102 和句号 1012 等。输入 bert 进行特征提取,这里的 mask 和 gilp 有一些区别,具体还没细看
  • 图像处理:提取 swin 特征,输出 3 层多尺度特征和加了位置信息的3层多尺度特征,然后在进行一次卷积,共得到 4 层输出特征
  • 得到类别特征 [2,256],回归特征 [2,4]

4.4 COCO zero-shot 测评

首先下载 coco 数据集,将数据集放到 dataset 路径下,然后执行如下命令,得到 mAP0.50:0.95 = 48.5文章来源地址https://www.toymoban.com/news/detail-493952.html

CUDA_VISIBLE_DEVICES=7 python demo/test_ap_on_coco.py \
-c groundingdino/config/GroundingDINO_SwinT_OGC.py \
-p weights/groundingdino_swint_ogc.pth \
--anno_path dataset/coco/annotations/instances_val2017.json \
--image_dir dataset/coco/val2017
IoU metric: bbox
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.48503
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.64419
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.52925
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.33947
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.51771
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.63410
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.38590
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.66831
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.73744
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.59104
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.77465
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.88776
Final results: [0.48502937223654774, 0.6441887991833478, 0.5292488429259078, 0.3394684576029584, 0.5177052819196549, 0.634102477342082, 0.38590050340039866, 0.668313126216868, 0.7374381132430312, 0.5910350651020582, 0.7746541080843435, 0.8877636350581676]

到了这里,关于【AIGC】15、Grounding DINO | 将 DINO 扩展到开集目标检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【计算机视觉 | 目标检测】Grounding DINO 深度学习环境的配置(含案例)

    “ Grounding DINO:Marrying DINO with Grounded Pre-Training for Open-Set Object Detection ”的官方 PyTorch 实现: SoTA 开放集对象检测器。 论文地址: 在 YouTube 上观看介绍视频: Try the Colab Demo: Try Official Huggingface Demo: Grounded-SAM: Marrying Grounding DINO with Segment Anything Grounding DINO with Stable Diffusion

    2024年02月07日
    浏览(72)
  • 【计算机视觉 | 目标检测 | 图像分割】Grounded Segment Anything:Grounding DINO + Segment Anything Model (SAM)介绍

    集成SAM,可以通过文本提示做检测/分割等任务。 我们计划通过结合 Grounding DINO 和 Segment Anything 来创建一个非常有趣的演示,旨在通过文本输入检测和分割任何内容! 并且我们会在此基础上不断完善它,创造出更多有趣的demo。 我们非常愿意帮助大家分享和推广基于Segment-A

    2024年02月04日
    浏览(47)
  • 【计算机视觉 | 目标检测 | 图像分割】Grounding DINO + Segment Anything Model (SAM)源代码分享(含源代码)

    在本教程中,我们将学习如何使用两个突破性的模型自动注释图像 - Grounding DINO 和 Segment Anything Model (SAM)。 然后,我们可以使用此数据集来训练实时对象检测或实例分割模型。 以传统方式使用多边形对图像进行注释极其耗时且昂贵。 借助 Grounding DINO 和 SAM,初始注释仅需几分

    2024年04月15日
    浏览(157)
  • 开集目标检测-标签提示目标检测大模型(吊打YOLO系列-自动化检测标注)

    大多数现有的对象检测模型都经过训练来识别一组有限的预先确定的类别。将新类添加到可识别对象列表中需要收集和标记新数据,并从头开始重新训练模型,这是一个耗时且昂贵的过程。该大模型的目标是开发一个强大的系统来检测由人类语言输入指定的任意对象,而无需

    2024年01月23日
    浏览(58)
  • GroundingDINO(一种开集目标检测算法)服务化,根据文本生成检测框

    最近发现一个叫GroundingDINO的开集目标检测算法,所谓开集目标检测就是能检测的目标类别不局限于训练的类别,这个算法可以通过输入文本的prompt然后输出对应的目标框。可以用来做预标注或者其他应用,比如我们要训练某个细分场景的算法时,我们找不到足够的已经标注的

    2024年02月06日
    浏览(48)
  • 【多模态】18、ViLD | 通过对视觉和语言知识蒸馏来实现开集目标检测(ICLR2022)

    论文:Open-vocabulary Object Detection via Vision and Language Knowledge Distillation 代码:https://github.com/tensorflow/tpu/tree/master/models/official/detection/projects/vild 效果: 在 zero-shot 测试下,coco 达到了 36.6 AP,PASCAL VOC 达到了 72.2AP,Object365 达到了 11.8AP 本文提出了 Vision and Language knowledge Distillation(

    2024年02月14日
    浏览(43)
  • 【计算机视觉 | 目标检测】术语理解2:Grounding 任务、MLM、ITM代理任务

    Grounding 任务是指将自然语言文本与视觉场景之间进行对齐或连接的任务。在这个任务中,文本描述和视觉信息需要建立联系,以实现跨模态的理解和交互。 Grounding 任务可以包括以下几种类型: 图像描述生成:这个任务要求从给定的图像中生成相应的文本描述。模型需要将图

    2024年02月05日
    浏览(42)
  • 【AIGC】12、DINO | 针对 DETR-like 检测器的提升

    论文:DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 代码:https://github.com/IDEACVR/DINO 出处:香港大学 | 清华大学 时间:2022.07 DINO:Detr with Improved deNoising anchOr boxes DINO 是一个基于 DETR 结构的端到端目标检测器,通过对去噪训练使用对比学习的方式来提高了 DETR

    2024年02月13日
    浏览(67)
  • Grounding dino + segment anything + stable diffusion 实现图片编辑

    本方案用到了三个步骤,按顺序依次为: 基于语义的目标检测(使用grounding dino) 在检测到的范围内进行目标分割生成mask(使用segment anything) 图片绘制(使用stable diffusion) 总体架构图 从图中可以看出,本算法本质上是对图像和文本进行多模态融合,将二者映射到同一个向

    2024年02月13日
    浏览(35)
  • 【计算机视觉】最强 Zero-Shot 视觉应用:Grounding DINO + Segment Anything + Stable Diffusion

    用 Midjourney 花一个小时做的项目 logo 图: 解释一下 logo 的含义:一只坐在地上的马赛克风格的熊。 坐在地面上是因为 ground 有地面的含义,然后分割后的图片可以认为是一种马赛克风格,而且马赛克谐音 mask ,之所以用熊作为 logo 主体,是因为项目主要示例的图片是熊。 G

    2024年02月04日
    浏览(79)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包