【stable diffusion部署】文生图模型原理,以及Stable Diffusion部署体验

前言

LLM推理优化系统工程概述

截止到目前市面上比较主流的基于文字生成影像的模型都是基于了3大部分组成的。

Encoder Model , Generation Model ,Decoder Model。并且这三个部分是分开训练,然后组合在一起从而构成了文生图大模型。

图片来源于B站李宏毅教授讲问生图原理,侵删。

下面我们可以看一下Stable Diffusion, DAll -E ,以及Imagen的架构示意图。它们基本上也都是基于这三大部分构成的。

在这里插入图片描述

一、关键的前置认知:

1.1 基础概念:

FID分数:是一种衡量生成图像质量的指标,较低的FID分数表示更好的图像质量。

  • “red points: real images” 表示红色点代表真实图像的特征向量。

  • “blue points: generated images” 表示蓝色点代表生成图像的特征向量。

  • “FID = Frechet distance between the two Gaussians” 表示FID是两个高斯分布之间的弗雷歇距离。

  • “Smaller is better” 表示FID值越小,表示生成图像的质量越好。

CLIP Score:是一个用于评估文本到图像生成任务中生成图像与输入文本相关性的指标。

即文本进变向量,图像进变向量。然后比较两个向量在高斯分布上的距离。分值越高越好。

1.2 重要结论:

(a)显示了不同大小(Small, Large, XL, XXL)的T5编码器对最终图像生成质量的影响。随着T5模型大小的增加,其在低CLIP Score范围内的表现有所改善,但超过某个阈值后,较大的模型不再显著提升图像质量,甚至可能导致过拟合,从而影响性能。

(b)展示了不同大小(300M, 500M, 1B, 2B参数量)的U-Net模型对图像生成质量的影响。随着模型复杂度(即参数量)的增加,U-Net在提高图像质量方面表现出了一定的优势,但在高CLIP Score区域,较大的模型可能会导致过拟合,从而影响生成图像的质量。

综上,在生成图像模型中,编码器(如T5)的重要性超过了生成模型(如U-Net)。具体表现为,随着编码器规模的增加,生成图像的质量显著提高,而生成模型规模的增加对生成图像质量的提升相对较小。因此,编码器在生成图像模型中的作用更为关键。

即,一个好的文生图模型,Encoder是关键的核心,并且其关键程度要大于Generation Model!!!

二、文生图模型的工作原理

2.1 文生图模型的基本原理

- 其核心的逻辑是,

- 正向(加噪过程):一张图像 —> 加噪 —> 加噪 —>加噪… 直至变成纯噪声

- 反向(去噪过程):纯噪声 —> 去噪 —> 去噪 —>去噪… 直至还原成一张图片

- 这是一个AE(Auto Encoder)模型的变体,即自编码模型

- 学习的过程就是,将一段向量转换成一张图片的过程(加噪,去噪的过程)。

- 实际推理的过程,就是“噪声”变向量的过程。

2.2 正向(Forward Process)&反向(Backward Process)过程逻辑说明:

在这里插入图片描述

上图就是一个典型加噪过程。在Encoder对图像进行编码后,开始分步骤加躁。直至加至纯噪声。不过这时的“纯噪声”实际上是指图像已经无法辨认出其原始内容,但严格来说,它并不是一个完全随机的噪声向量。它的像素值仍然遵循某种概率分布,但不再保留任何关于原始图像的信息。

上图就是一个典型降噪的过程。我们会看到一系列重复的去噪模块(Denoise Block),每个模块都试图从当前的噪声图像中移除一部分噪声。每次去噪操作后,图像的某些部分变得更加清晰,显示出更多的结构信息。例如,我们可以观察到一些颜色块逐渐形成图案,暗示着图像内容的逐步恢复。

去噪过程是循环进行的,每次迭代都会使图像更加接近原始状态。图片中展示了多轮迭代的效果,可以看到图像从最初的混乱状态逐渐转变为具有更多可识别特征的状态。

2.3 解码器(Decoder)的原理

在最后一轮去噪之后,图像被传递给一个解码器(Decoder)。解码器的任务是将去噪后的特征重新组合成完整的图像。

其实核心本质,就是把所谓的中间产物(Latent Representation) 还原为一张图片。让生成图片与原始图片向量,在高斯分布上,越接近越好。

通过大量的数据进行训练,使整个模型学习文本和图像之间的对应关系。

2.4 推理过程说明

  • 首选输入文档,例如:“一只雪地里的猫”;

  • 使用预训练的文本编码器(如BERT、T5)将文本描述转换为固定长度的向量表示;

  • 将文本编码的向量作为条件输入到图像生成模型中;–Vtext

  • 生成模型从一个随机噪声向量开始; – Z

  • 通过一系列生成步骤,逐步减少噪声,恢复图像的结构信息。逐步将噪声向量转换为与文本描述匹配的图像。 – Vtext和Z生成中间特征向量f

  • 生成模型输出一张图像,该图像应与输入的文本描述相匹配。-- f转换为生成的图像Xgen

以下是,训练过程与推理过程在架构上的区别示意图:

推理过程的核心本质是,首先进行多模态抽特征,生成一个向量。由这个向量去干扰去噪的过程。由此可以实现控制生成的结果。

三、Stable Diffusion 部署体验

模型名称:iic/multi-modal_chinese_stable_diffusion_v1.0 即阿里云中文微调过的stable_diffusion模型

环境:魔搭的NoteBook

下载模型:git clone https://www.modelscope.cn/iic/multi-modal_chinese_stable_diffusion_v1.0.git

安装版本低于0.21.0的diffusers库。diffusers是一个用于实现扩散模型的库,通常用于图像生成等任务。这里使用特定版本是为了确保与代码中其他部分的兼容性。

pip install 'diffusers<0.21.0'

导出相关依赖

import torch  
import cv2  
from modelscope.pipelines import pipeline  
from modelscope.utils.constant import Tasks  
from IPython.display import display, Image as IPImage  
from PIL import Image

设定任务,并指定模型

task = Tasks.text_to_image_synthesis  
model_id = 'damo/multi-modal_chinese_stable_diffusion_v1.0'

魔搭社区的基础调用示例

pipe = pipeline(task=task, model=model_id)  
output = pipe({'text': '中国山水画'})  
cv2.imwrite('result.png', output['output_imgs'][0])

输出为opencv numpy格式,转为PIL.Image

from PIL import Image  
img = output['output_imgs'][0]  
img = Image.fromarray(img[:,:,::-1])  
img.save('result.png')

展示结果图片

display(IPImage(filename='result.png'))

结果如下:

当然Prompt如果不是很符合训练的数据习惯时,大概率会有翻车的可能,例如:

最后说一下,这个推理的过程还是非常吃资源的。例如使用纯CPU的NoteBook环境,在8核24G的配置下,生成一张图片大概需要将近30分钟。然后同样的配置,如果使用的是24G的GPU,则生成一张图片的速度在1.5分钟 - 3分钟之间。

可以使用:

nvidia-smi 

命令来查看GPU的使用率。这里我之前忘记截图了,但是推理过程中,基本上快把24G的内存吃满了。

好了,以上就是本篇的全部内容了。希望对各位有一点帮助。

这里直接将该软件分享出来给大家吧~

1.stable diffusion安装包

随着技术的迭代,目前 Stable Diffusion 已经能够生成非常艺术化的图片了,完全有赶超人类的架势,已经有不少工作被这类服务替代,比如制作一个 logo 图片,画一张虚拟老婆照片,画质堪比相机。

最新 Stable Diffusion 除了有win多个版本,就算说底端的显卡也能玩了哦!此外还带来了Mac版本,仅支持macOS 12.3或更高版本

在这里插入图片描述

2.stable diffusion视频合集

我们在学习的时候,往往书籍源码难以理解,阅读困难,这时候视频教程教程是就很适合了,生动形象加上案例实战,一步步带你入坑stable diffusion,科学有趣才能更方便的学习下去。

在这里插入图片描述

3.stable diffusion模型下载

stable diffusion往往一开始使用时图片等无法达到理想的生成效果,这时则需要通过使用大量训练数据,调整模型的超参数(如学习率、训练轮数、模型大小等),可以使得模型更好地适应数据集,并生成更加真实、准确、高质量的图像。

在这里插入图片描述

4.stable diffusion提示词

提示词是构建由文本到图像模型解释和理解的单词的过程。可以把它理解为你告诉 AI 模型要画什么而需要说的语言,整个SD学习过程中都离不开这本提示词手册。

在这里插入图片描述

5.SD从0到落地实战演练

在这里插入图片描述

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名SD大神的正确特征了。

这份完整版的stable diffusion资料我已经打包好,需要的点击下方插件,即可前往免费领取!

在这里插入图片描述

### 使用 Stable Diffusion API 实现文本到图像生成功能 为了实现从文本生成图像的功能,`stable-diffusion-api-server` 提供了一个本地API服务器接口来访问Stable Diffusion模型[^1]。该服务允许开发者通过HTTP请求提交文本描述,并接收由模型生成的对应图像作为响应。 下面是一个简单的Python脚本示例,展示了如何调用此API来进行文本转图像的操作: ```python import requests from PIL import Image from io import BytesIO def generate_image_from_text(prompt, api_url='http://localhost:8080'): """ 发送POST请求给稳定扩散API以创建新图象 参数: prompt (str): 文字提示语句. api_url (str): API端点URL,默认为'http://localhost:8080'. 返回: img (PIL.Image.Image): 生成的图片对象. """ response = requests.post( f'{api_url}/sdapi/v1/txt2img', json={ "prompt": prompt, "steps": 50, "width": 768, "height": 768, "n_iter": 1, "batch_size": 1 } ) if response.status_code == 200: image_data = BytesIO(response.content) img = Image.open(image_data) return img else: raise Exception(f'Error generating image: {response.text}') # 测试函数 if __name__ == '__main__': try: generated_img = generate_image_from_text('a beautiful sunset over mountains') generated_img.show() except Exception as e: print(e) ``` 这段代码定义了一个名为 `generate_image_from_text()` 的函数,它可以接受一段文字描述作为参数,并向指定的API发送一个JSON格式的数据包。如果一切顺利的话,将会返回一张根据所给定的文字描述而合成的新图片。 需要注意的是,实际部署环境中可能需要调整API URL以及配置其他必要的参数(比如认证令牌)。此外,对于更复杂的场景,还可以探索更多高级选项,例如设置不同的采样步数(`steps`)、宽度和高度等属性来自定义最终输出的质量与风格[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值