stable diffusion 文生图流程

server/2025/2/19 8:23:50/

Stable diffusion流程

上述是单纯的图片得到原图,现在需要加入文本描述得到文本引导下的一致性原图,怎么加尼?

Classifier Free Guidance(无分类器引导,简称 CFG)并非特定的网络模型,而是一种用于文生图(Text-to-Image)模型的引导技术,它能显著提升生成图像与文本提示的一致性,CFG 技术通过同时计算有文本提示和无文本提示(即空提示)两种情况下的模型输出,然后利用两者之间的差异来引导图像生成过程

从公式中可以得知,cfg 参数越大说明生成的图片和文本关联性越大,

在实际工具中的体现

在诸如 Stable Diffusion Web UI、ComfyUI 等文生图工具中,用户可以分别输入正向提示词和负向提示词,并通过调整 CFG Scale 和 Neg Scale 等参数来控制图像生成的效果,实现对生成图像特征的精细控制。

vae

VAE(Variational Autoencoder,变分自编码器),VAE 可以将高维的图像数据压缩到低维的潜在空间中,提取出图像的本质特征。在文生图模型(如 Stable Diffusion)中,VAE 用于将图像从像素空间转换到潜在空间,这样可以减少计算量,提高模型的训练和推理效率。解码器通过一系列的神经网络层(如反卷积层)将编码向量 解码成与原始输入图像大小相同的图像。在一些简单的实验或者资源受限的场景中,latent_dim 可能设置为 32、64 或 128 ;而在复杂的大规模图像生成任务里,为了能够捕获更多的图像特征信息,latent_dim 可能会设置为 256、512 甚至更高。

许多文生图模型(如 Stable Diffusion)会使用预训练好的 VAE。这些 VAE 已经在大规模的图像数据集上进行了充分的训练,具有较好的图像编码和解码能力。在使用这些模型时,可以直接使用预训练的 VAE,而不需要重新训练。这样可以节省训练时间和计算资源,同时也能保证一定的图像生成质量。

 

图像4*3*512*512 =》 经过vae编码器处理潜空间VAE编码器会将图像压缩为原尺寸的1/8,512/8=64 ,[4, 4, 64, 64] =》 文本条件通过交叉注意力机制注入UNet,而非直接拼接通道。 CLIP文本编码输出为[4,77,768](batch=4,77个token), 需通过投影层与UNet的注意力层交互,不是拼接 =》 unet处理输出 [4, 4, 64, 64],添加噪声是通常,在扩散过程中,噪声是逐渐添加到潜空间, 扩散模型需多步迭代去噪(如50~100步),逐步预测并去除噪声,而非单次处理 for t in timesteps: 带噪潜空间 = 添加噪声(潜空间, t) 预测噪声 = UNet(带噪潜空间, t, 文本特征) 潜空间 = 去噪步骤(带噪潜空间, 预测噪声, t) =》 解码器输出 [4,3,512,512]

修正后的完整流程

  1. 输入图像[4,3,512,512](batch=4, RGB 512x512)

  2. VAE编码:压缩为潜空间[4,4,64,64]

  3. 扩散过程迭代

    1. 添加噪声:根据时间步t逐步添加噪声至潜空间。

    2. UNet去噪:输入带噪潜空间[4,4,64,64]、时间步t和文本特征[4,77,768],输出噪声预测[4,4,64,64]

    3. 更新潜空间:根据噪声预测更新潜空间。

  4. VAE解码:最终潜空间[4,4,64,64]解码为图像[4,3,512,512]

CLIP(Contrastive Language - Image Pretraining)

模型是 OpenAI 开发的一种多模态模型,它能够学习图像和文本之间的关联,通过在大规模的图像 - 文本对数据集上进行对比学习,CLIP 能够将图像和文本映射到同一个特征空间中,输出文本特征向量,图像向量,相似度越高两者越来越匹配,相似度低不匹配

  • 文生图任务:为图像生成模型提供文本的语义信息,引导模型生成符合文本描述的图像。

  • 图像检索:根据文本查询从图像数据库中检索出相关的图像。相似度搜索

  • 零样本分类:在没有对特定类别进行训练的情况下,根据文本描述对图像进行分类。相似度得分进行搜索

最后训练和使用文生图流程

其他微调模型

Dreambooth unet 整个微调,所以保存模型的时候都保存比较大

Lora 是加入一些层,改变unet 的一些层的输出,所以元模型保留后,只是保存很小的lora添加层,使用是lora 层加原模型

Controlnet, 也是新增加一个额外的网络结构 调整unet

扩散过程的核心逻辑

扩散模型通过逐步去噪生成图像,整个过程类似"从随机噪声中雕刻出图像"。具体分为3个阶段:

  1. 初始化:从纯噪声开始([4,4,64,64]

  2. 迭代去噪:UNet逐步预测并去除噪声(循环50~100次)

  3. 最终解码:去噪后的潜空间通过VAE解码为图像


具体迭代步骤分解(以batch=4为例)

阶段1:初始化潜空间

python

复制

latents = torch.randn([4,4,64,64]) # 纯噪声初始潜空间

阶段2:扩散循环(关键步骤)
 

for t in timesteps: # 如从t=999到t=0逐步降噪 # 步骤1:将当前时间步编码为向量 t_batch = torch.tensor([t], device=device).repeat(4) # [4] # 步骤2:将潜空间输入UNet,同时传入时间步和文本条件 noise_pred = unet( latents, # 当前带噪潜空间 [4,4,64,64] timestep=t_batch, # 时间步向量 [4] encoder_hidden_states=text_embeddings # 文本特征 [4,77,768] ).sample # 输出噪声预测 [4,4,64,64] # 步骤3:根据噪声预测更新潜空间 latents = scheduler.step( noise_pred, # 预测的噪声 t, # 当前时间步 latents # 当前潜空间 ).prev_sample # 更新后的潜空间 [4,4,64,64]


关键技术细节

1. 时间步(Timestep)的作用
  • 数值范围:通常为1000步(t=999到t=0)

  • 物理意义:控制噪声添加的强度,t越大噪声越多

  • 编码方式:通过正弦位置编码转换为向量输入UNet

2. 文本条件的注入机制
  • 文本特征形状[4,77,768](batch=4,77个token)

  • 注入方式:通过UNet的交叉注意力层

  • python

  • 复制

 

# UNet内部伪代码 class CrossAttention(nn.Module): def forward(self, x, text_emb): # x: 潜空间特征 [4,320,64,64] # text_emb: 文本特征 [4,77,768] # 将x转换为query q = self.to_q(x) # [4,320,4096] # 将文本转换为key/value k = self.to_k(text_emb) # [4,77,320] v = self.to_v(text_emb) # [4,77,320] # 注意力计算:query与文本key的点积 attn = torch.matmul(q, k.transpose(1,2)) * self.scale attn = attn.softmax(dim=-1) # 输出与文本value的加权和 out = torch.matmul(attn, v) # [4,320,4096] return self.to_out(out) # 融合回潜空间特征

3. 噪声调度器(Scheduler)
  • 常见类型:DDPM、DDIM、PLMS等

  • 核心功能:根据预测噪声计算潜空间更新量

  • 典型更新公式(DDPM):就是预测噪声的一个公式计算方法

 

# 简化的更新规则 latents = (latents - (noise_pred * (1 - alpha_t)) / sqrt(alpha_t) + sqrt(1 - alpha_t) * noise_pred)


可视化流程

 

初始噪声 [4,4,64,64] ↓ ┌───────────────┐ │ UNet预测噪声 │ ← 文本条件[4,77,768] └───────────────┘ ↓ 调度器更新潜空间 ↓ 重复50~100次 → 最终潜空间 ↓ VAE解码 → 输出图像[4,3,512,512]


常见参数配置

参数典型值作用
num_inference_steps50扩散迭代总次数
guidance_scale7.5文本条件强度(CFG参数)
eta0控制随机性的参数(DDIM专用)

参考视频

[零基础] Stable Diffusion 原理详解

https://www.bilibili.com/video/BV1Yu411x7mg/?spm_id_from=333.337.search-card.all.click&vd_source=40cdba46cd0fe1ed5b7f9c50d95ee879


http://www.ppmy.cn/server/167538.html

相关文章

零信任网络安全

什么是零信任 零信任是一种安全思维方式,表示组织不应自动信任其边界内外的任何内容。在授予访问权限之前,必须验证任何尝试连接的实体。零信任安全策略围绕最低特权访问控制和严格的用户身份验证,因为假设不信任任何人。 若要实现这些原则…

用java实现word(docx)转换为pdf格式文档(简单版)

导入依赖 <dependency> <groupId>com.documents4j</groupId> <artifactId>documents4j-local</artifactId> <version>1.0.3</version> </dependency> <dependency>…

AVL树:高效平衡的二叉搜索树

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 引言&#x1f914; 在数据结构的奇妙世界里&#xff0c;二叉搜索树&#xff08;BST&#xff09;原本是查找数据的好帮手。想象一下…

人工智能丨Deepseek vs 传统测试工具:谁将主导软件质量保障?

如今软件质量保障已成为企业竞争力的核心命脉。传统的测试工具&#xff08;如Selenium、JMeter、JIRA等&#xff09;曾长期占据主导地位&#xff0c;但随着AI技术的突破&#xff0c;以Deepseek为代表的智能化测试平台正以颠覆性姿态冲击行业格局。这场新旧工具的较量&#xff0…

反向代理块sjbe

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

ollama实践笔记

目录 一、linux安装文件命令&#xff1a; 二、启动ollama 三、linux 如何把ollama serve做为服务方式启动 四、安装deepseek-r1 五、如何在网页中使用ollama&#xff1f; ‌5.1 安装Open WebUI【不推荐】 5.2 安装ollama-webui-lite 六、Ubuntu安装docker、只需要一句话…

Qt QComboBox 下拉列表偏移问题探究:多屏幕与高 DPI 环境下的 bug

一、问题背景与重现步骤 现象描述&#xff1a; 在 Qt 应用程序中&#xff0c;主界面包含 QComboBox 控件&#xff0c;并且启用了高 DPI 支持&#xff08;例如在 main() 中调用 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling)&#xff09;。 当用户将窗口拖动到…

用大模型学大模型03-数学基础 概率论 随机变量 概率分布

deepseek.com:什么是概率&#xff0c;什么是随机变量&#xff1f;深度学习中常用概率的分布有哪些&#xff1f; 1. 什么是概率&#xff1f; 概率是描述事件发生的可能性的数值&#xff0c;范围在 0 到 1 之间&#xff1a; 0&#xff1a;事件不可能发生。1&#xff1a;事件必…