2024不可不会的StableDiffusion(二)

1. 引言

这是我关于StableDiffusion学习系列的第二篇文章,如果第一篇你还没有阅读,强烈推荐大家翻看前篇内容。在本文中,我们将学习构成StableDiffusion的各个基础组件,并针对每个组件的功能进行阐述。

闲话少说,我们直接开始吧!

2. 概览

正如前文所述,扩散模型主要用来生成高质量的图像。稳定扩散模型(StableDiffusion)可以视为一种特殊的扩散模型,学术上叫做潜在扩散模型(Latent Diffusion model),相关概念来自于论文《 High-Resolution Image Synthesis with Latent Diffusion Models》。简单来说,原始的扩散模型通常会消耗更多的内存,因此创建了潜在扩散模型,可以在被称为潜在低维度特征空间进行扩散过程。更进一步,扩散模型是机器学习模型,它被训练来在带有高斯噪声的图像上逐步进行去噪,以获得高质量图像。而潜在扩散模型被训练成在低纬度的特征空间上进行同样的过程。

一般来说,潜在扩散模型含有三个组件:

  • a text encoder 文本编码器,这里主要指基于CLIP的文本编码器
  • an autoencoder 自编码器,这里主要指Variational Auto Encoder,也被简称为VAE
  • A Unet 扩散模型

本文先从最基础的text encoder讲起,主要介绍其在扩散过程中的用途。

3. CLIP Text Encoder作用

CLIP text Encoder 以文本作为输入,并在潜在特征空间中生成文本嵌入(text embeddings);我们也可以通过CLIP模型对图像进行特征编码一样。
在这里插入图片描述

任何机器学习模型都无法直接理解原始文本输入数据。在机器学习领域,我们通常都需要将文本转换为包含文本含义的数字表示,称为嵌入(embedding)。将文本转换为数字表示的过程可以分为两部分:

  • Tokenizer - 将文本输入拆分为各个子单词,然后使用查找表将每个子单词转换为数字
  • Token_To_Embedding Encoder - 将每个子单词的数字表示转换为包含该文本语义信息的特征表示

4. 代码实践之Tokenizer

只看文字讲解还是不够直观,让我们不妨通过代码来进一步了解它。我们将从导入相关库开始:

import torch,logging
from transformers import CLIPTextModel,CLIPTokenizer
clip_path = "/media/stable_diffusion/clip-vit-large-patch14"
tokenizer = CLIPTokenizer.from_pretrained(clip_path,
                                              local_files_only=True,
                                              torch_dtype=torch.float16)

让我们初始化一个文本提示,并将其token化,代码如下:

prompt = [ 'a dog wearing hat' ]
tok = tokenizer(prompt,padding="max_length",
                max_length=tokenizer.model_max_length,
                truncation=True,
                return_tensors="pt")
print(tok.input_ids.shape)
print(tok)

输出结果如下:
在这里插入图片描述

观察上述输出,tokenizer返回包含以下两个对象的字典:
input_ids- 表示一个文本提示被转化为一个1X77的tensor,其中49406表示start token, 而320表示对应单词“a”的token,1929对应单词“dog”,3309对应单词“wearing”,3801对应单词“hat”,49407表示end token,后面重复的多个49407为了padding至固定长度77
attention_mask - 这里的1表示对应有效的embeded值,0表示对应的为padding

进一步,我们可以使用一下代码来将input_ids表示的单词依次打印出来:

for token in list(tok.input_ids[0,:7]):
        print(f"{token}:{tokenizer.convert_ids_to_tokens(int(token))}")

得到结果如下:
在这里插入图片描述

5. 代码实践之Text Encoder

这一节我们来介绍基于CLIPText Encoder,首先我们利用以下代码来进行初始化操作:

text_encoder = CLIPTextModel.from_pretrained(clip_path,
                                         local_files_only=True,                
                                         torch_dtype=torch.float16).to('cuda')

接着我们利用text_encoder来将由tokenizer 生成的input_ids 转化为对应的文本嵌入表示,代码如下:

emb = text_encoder(tok.input_ids.to("cuda"))[0].half()
print(f"shape of embedding: {emb.shape}")
print(emb)

得到结果如下:
在这里插入图片描述

如上所述,大小为1x77的每个token化后的输入现在已被转换为1x77x768嵌入(embedding)。因此,每个单词都被表示在768维的潜在特征空间中。

6. Text encoder在SD中的用途

事实上,Stable Diffusion仅仅使用训练好的CLIP模型来实现将文本转化为嵌入表示,这种嵌入表示作为扩散模型UNet的输入之一。

在这里插入图片描述

一般来说,CLIP使用文本编码器和图像编码器来在潜在空间进行特征嵌入,通过对比学习来将文本和图像语义接近的在特征空间进行距离拉近。关于CLIP更多的信息,大家可以访问OpenAI的关于CLIP介绍的文章,链接见附录;也可以翻看我之前的博客。

7. 总结

本文重点介绍了SD模型中的文本编码器text encoder的相关功能和具体实现原理,并详细介绍了其两个具体操作步骤,并给出了相应的代码示例。

您学废了嘛!

8. 参考链接

本文涉及的相关参考链接如下:

LDM论文: 戳我

CLIP介绍: 戳我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/351771.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE 网络编程

JavaEE 网络编程 文章目录 JavaEE 网络编程引子1. 网络编程-相关概念1.1 基本概念1.2 发送端和接收端1.3 请求和响应1.4 客户端和服务端 2. Socket 套接字2.1 数据包套接字通信模型2.2 流套接字通信模型2.3 Socket编程注意事项 3. UDP数据报套接字编程3.1 DatagramSocket3.2 Da…

matplotlib多个子图共用一个colorbar

文章目录 colorbar共用colorbar布局colorbar colorbar matplotlib默认提供的功能是,在多个子图中分别生成colorbar,例如 import numpy as np import matplotlib.pyplot as pltfig plt.figure() for i in range(2):ax fig.add_subplot(2,1,i1)ax plt…

掌握HTTP协议:GET和POST请求之间的关键差异

掌握HTTP协议:GET和POST请求之间的关键差异 HTTP(Hypertext Transfer Protocol)是用于在Web浏览器和服务器之间传递信息的协议。在HTTP中,GET请求和POST请求是两种最基本的请求方法。HTTP的底层是TCP/IP,所以GET和POST…

数据库设计的一些原则

文章目录 数据库设计原则表之间的关系一对一关系(了解)一对多(多对一)多对多联合主键和复合主键 数据库设计准则-范式1、函数依赖2、完全函数依赖3、部分函数依赖4、传递函数依赖5、码 第一范式第二范式第三范式第三范式 数据库设…

Go 从标准输入读取数据

fmt.Scan系列 fmt.Scan函数定义如下: // Scan scans text read from standard input, storing successive space-separated values into successive arguments. // Newlines count as space. // It returns the number of items successfully scanned. // If tha…

JZ15 二进制中1的个数(牛客)(C语言)

个人博客主页:https://blog.csdn.net/2301_79293429?typeblog 专栏:https://blog.csdn.net/2301_79293429/category_12545690.html 该题我为笨办法,与题解不同,如有疑问和见解,欢迎大家在评论区提出 题目链接: 二进制中1的个数_牛客题霸_牛客网 (now…

XSS靶场练习(pikachu和dvwa)

Pikachu靶场xss练习 反射型xss(get) 输入123发现被直接插入到了html中&#xff0c;而且输入框有字符长度限制 在url中构造payload:<script>alert(123)</script> 反射型xss(post) 查看源码发现登录界面没有任何机会&#xff1b;登录后输入123发现和xss(get)写入位…

Linux 驱动开发基础知识—— LED 驱动程序框架(四)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

联合 Maxlinear 迈凌 与 Elitestek 易灵思 - WPI 世平推出基于 FPGA 芯片的好用高效电源解决方案

近期 WPI 世平公司联合 Maxlinear 迈凌电源产品搭配 Elitestek 易灵思 FPGA 共同合作推出基于 FPGA 芯片的好用高效电源解决方案。 Elitestek 易灵思 FPGA 核心产品有 2 大系列 : Trion 系列与钛金系列。Trion 系列主要特点是 : 1. 40nm 工艺 2. 超低功耗 ( 可低至竞争对手的 …

极限【高数笔记】

【分类】分为了两大类&#xff0c;一个是数列的极限&#xff0c;一个是函数的极限 【数列的极限】 1.定义&#xff1a; 简单来讲&#xff0c;就是&#xff0c;当n无限趋近于无穷时&#xff0c;数列{an}无限趋近一个常数A&#xff0c;此时&#xff0c;常数A就是它们此时情况下的…

SQL注入:报错注入

SQL注入系列文章&#xff1a;初识SQL注入-CSDN博客 SQL注入&#xff1a;联合查询的三个绕过技巧-CSDN博客 目录 什么是报错注入&#xff1f; 报错注入常用的3个函数 UpdateXML ExtractValue Floor rand&#xff08;随机数&#xff09; floor&#xff08;向上取整&…

jenkins发布失败

今天用jenkins发布项目时失败了&#xff0c;而前几天还好好的。 云控制台看了下&#xff0c;发现根本就没打包。 报错如下&#xff1a; 从控制台可以看出&#xff0c;项目依赖没有下载下来&#xff0c;所以打包失败了。 根本原因是&#xff1a;在配置中给yarn指定的淘宝仓库…

WSL2+ubuntu 18+VsCode 配置C/C++开发环境 踩坑

1. 管理员模式打开cmd&#xff0c;或PowerShell &#xff0c;输入 wsl --install 可能出现的错误&#xff1a;无法解析服务器名称或地址 解决方式&#xff1a;科学上网 安装WSL时遇到“无法解析服务器名称或地址”的错误及解决方法 - 知乎 错误2&#xff1a;Error 0x8037…

【JS基础】事件对象event、环境对象this、事件的高级操作

文章目录 一、事件对象1.1 事件对象是什么&#xff1f;1.2 使用方法 二、环境对象this以及回调函数2.1 它是什么&#xff1f;2.2 演示示例 三、事件的高级操作3.1 事件流3.2 事件捕获3.3 事件冒泡以及阻止冒泡3.4 事件解绑3.5 mouseover和mouseenter事件的区别3.6 事件委托它是…

免费电视TV盒子软件,好用的免费电视盒子软件大全,免费电视盒子APP大全,2024最新整理

1、TVbox下载地址、影视接口、配置教程 下载地址 TVbox TVbox可用接口地址合集 注&#xff1a;接口均来源于互联网收集分享&#xff01;所有接口都是经过测试的&#xff0c;如果出现加载失败等情况&#xff0c;可能是因为接口针对的盒子有兼容问题&#xff0c;可以多试试几…

x-cmd pkg | httpx - 为 Python 设计的下一代 HTTP 客户端库

目录 简介首次用户功能特点进一步探索 简介 HTTPX 是一个为 Python 设计的下一代 HTTP 客户端库&#xff0c;由 Tom Christie 创建。它提供了同步和异步的 API&#xff0c;并支持 HTTP/1.1 和 HTTP/2 协议。与 Requests 库类似&#xff0c;但增加了对异步请求的支持和 HTTP/2 …

redis过期事件监听、可以做延时任务 第二篇(简单)

在使用redis时&#xff0c;所有的key都要设置过期时间&#xff0c;过期之后&#xff0c;redis就会把对应的key清除掉。 此方法可以监听redis的key失效&#xff0c;在失效时做一些逻辑处理 redis过期监听 不像mq有保证 不推荐用来弄需要有保证的业务 现象&#xff1a; redis …

Java入门高频考查基础知识7-深入挖掘Java集合框架的奇幻世界2(39题2.8万字参考答案)

Java 集合是 Java 编程中至关重要的组成部分&#xff0c;它为开发者提供了丰富、灵活、高效的数据结构和算法。无论是初学者还是有经验的开发者&#xff0c;在使用 Java 进行编程时都会频繁地接触到集合框架。这篇文章将深入探讨 Java 集合的重要性&#xff0c;以及为什么它对于…

阿里云负载均衡对接

1 、开通负载均衡产品 2 、ALB / NLB / CLB ALB&#xff1a; 应用型负载均衡 &#xff0c; 给定对应服务域名与当前实例DNS绑定之后即可使用 支持&#xff1a; HTTP/HTTPS/QUIC等应用层流量协议 NLB&#xff1a; 网络型负载均衡 支持&#xff1a; TCP / UDP / TCPSSL C…

手机视频压缩怎么压缩?一键瘦身~

现在手机已经成为我们日常生活中必不可少的工具&#xff0c;而在手机的应用领域中&#xff0c;文件的传输和存储是一个非常重要的问题。很多用户都会遇到这样一个问题&#xff0c;那就是在手机上存储的文件太多太大&#xff0c;导致手机存储空间不足&#xff0c;那么怎么在手机…