stable diffusion实践操作-采样sample

系列文章目录

stable diffusion实践操作


`


前言

采样方式和迭代步数是相辅相成的,不能分开来谈,每个采样方式都有自己的收敛迭代最佳步数。

不同的采样方法相当于我们绘画的方式不同。具体选择哪种采样方法呢?首先,我们可以参考他人使用的好看照片中所用的采样方法。如果不确定该选择哪种,我经过测试,下面圈出来的几种采样方法生成的照片质量较高且速度较快。

本文主要是B站A Eye的视频整理而来。

观看链接:Stable diffusion喂饭级基础知识教程 第四期:什么是采样方法和采样迭代步数?


一、采样是什么?

1.1 SD原理图

1.2 SD中采样工作流程

SD在生成图片之前,大模型会先在一个潜在的空间LatentSPaced生成一个充满噪点的图像,然后噪声预测器开始工作,从图像中减去预测到的噪声,然后不断重复这个过程。重复次数受到采样步数限制,最终得到清晰的图像。

1.3 SD重复预测采样结果

最后得到清晰的图像,简而言之SD在制作图像的过程中,都会生成一张新的去噪后的图像,整个去噪的过程即为采样,使用的采样方式就是采样器或者采样方法。

1.4 SD中采样方法列表

在webUI中,展示的采样方法

采样方法有很多,下面是采样器对比:

1.4 SD中采样方法功能总结

1.5 SD中常用采样方法

我们常用的采样方式就下面的三个,你也可以 通过XYZ图标去做对比

二、 SD中常用采样方法对比

主要从速度和收敛性来分析。
速度就看从第几步开始出图,收敛性就是看随着迭代步数增加,图片是否有不可控方向发展,如果画质细节越来越好,说明收敛性很好,否则,画质突变就说明收敛性不好。
分别对比两种风格:二次元和真人

2.1 二次元-第一组

2.1.1Euler a

从上图可以看到Euler a 从第10步就可以正常出图,后面迭代画面略有扩展,文本和模型的收敛性一般。

2.1.2Euler

从上图可以看到Euler 和Euler a差不多,但是Euler 收敛性更加强,细节更加好。

2.1.3 LMS

从上图可以看到LMS在30步以后的人收敛性才开始变得很强

2.2 二次元-第二组

2.2.1Heum

从上图可以看到Heum,从20步以上开始正常出图,和LMS采样效果很像,速度略有提升。

2.2.2 DMP2

从上图可以看到DMP2,从10步以上开始正常出图,速度不错,整体收敛性很稳定,适合做逐帧动画

2.2.3 DMP2a

从上图可以看到DMP2a,从20步开始正常出图,但是后续迭代,细节略有扩展,类似Euler a,速度略慢Euler a.

2.3 二次元-第三组

2.3.1DPM++ 2S a

从上图可以看到DPM++ 2S a,从10步以上开始正常出图,但是在不同步数下,收敛性略差,细节变化略差。

2.3.2 DMP++ 2M

从上图可以看到DMP++ 2M,从20步以上开始正常出图,速度不错,整体收敛性很稳定,适合做逐帧动画,连续作图

2.3.3 DMP++ SDE

从上图可以看到DMP++ SDE,从10步开始正常出图,但收敛性很差,画面完全变了,不管整体还是细节,整体太随意了。

2.4 二次元-第四组

2.4.1DPM fast

从上图可以看到DPM fast,从40步以上开始正常出图,真正的收敛性在很高步数才有。

2.4.2 DMP adaptive

从上图可以看到DMP adaptive,从10步以上开始正常出图,速度不错,整体收敛性很稳定。

2.4.3 LMS Karras

从上图可以看到LMS Karras,从10步开始正常出图,收敛性也不错。

2.5 二次元-第五组

2.5.1DPM2 Karras

从上图可以看到DPM2 Karras,从10步以上开始正常出图,表现出极好的稳定性,表现和 LMS Karras很像,但是低步数光影略胜于 LMS Karras。

2.5.2 DMP2 a Karras

从上图可以看到DMP2 a Karras,从40步以上开始正常出图,不难看出,使用了原始采样方法的人采样器,收敛性比较差。

2.5.3 DPM++ 2S Karras

从上图可以看到DPM++ 2S Karras,从10步开始正常出图,收敛性很差,后面的人图和前面的区别很大。

2.6 二次元-第六组

2.6.1DPM++ 2M Karras

从上图可以看到DPM++ 2M Karras,从10步以上开始正常出图,表现出极好的稳定性,非常完美,这也是我们推荐使用的采样器。

2.6.2 DMP++ SDE Karras

从上图可以看到DMP++ SDE Karras,从10步以上开始正常出图,收敛性比较差。

2.6.3 DDIM(元老级采样器)

从上图可以看到DDIM,从10步开始正常出图,但是整体感觉怪怪的。

2.7 二次元-第七组

2.7.1 PLMS(元老级采样器)

从上图可以看到PLMS,从40步以上开始正常出图,出图效果比较差。

2.7.2 UniPC(理论最快采样器)

从上图可以看到UniPC,从10步以上开始正常出图,低步数收敛性一般,高步数收敛性比较好。

三、迭代步数是什么

3.1 webUI上的设置位置

3.1 迭代步数定义

通过上面的分析之后,迭代步数就很好理解了,它就是从噪点到最终生成图片的步数。
步数是要通过测试才能根据模型去确定下来。


四、总结

采样器和迭代步数是相辅相成的。

采样器的效果会根据模型的不同表现略有差异,当选定某个模型的适合,可以使用xyz图表插件测试出图风格,最终再确定 适合自己的。

迭代步数,也要根据采样器来设置,根据不同步数,选择一个速度最高,效果最好的的步数。

所以最佳采样器和迭代步数是根据实际情况试出来的。

具体方式为xyz周,x轴为迭代步数,y轴为不同采样器。效果如下:

链接入口:xyz使用教程

以上就是今天要讲的内容。

1. 准备环境及数据集 确保已经安装了PaddlePaddle和Stable Diffusion(请参考官方文档进行安装)。准备好要使用的数据集,例如MNIST。 2. 编写模型代码 使用PaddlePaddle和Stable Diffusion提供的API,编写模型代码。例如,在MNIST数据集上训练一个简单的分类模型: ```python import paddle import paddle.nn as nn from paddlenlp.ops import StableDistribution # 定义模型 class MNIST(nn.Layer): def __init__(self): super(MNIST, self).__init__() self.fc = nn.Linear(784, 10) def forward(self, x, t=1): # 定义稳定扩散噪声 dist = StableDistribution(alpha=1.5, beta=0.5, loc=0.0, scale=1.0, seed=0) for i in range(t): # 进行稳定扩散噪声采样 noise = dist.sample(x.shape).astype('float32') # 将输入和噪声相加 x = x + noise # 对输入进行线性变换 x = self.fc(x) return x # 加载数据,定义优化器与损失函数 train_dataset = paddle.vision.datasets.MNIST(mode='train') test_dataset = paddle.vision.datasets.MNIST(mode='test') train_loader = paddle.io.DataLoader(train_dataset, batch_size=128, shuffle=True) test_loader = paddle.io.DataLoader(test_dataset, batch_size=128, shuffle=False) model = MNIST() optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()) criterion = nn.CrossEntropyLoss() # 开始训练 for epoch in range(10): for batch_id, data in enumerate(train_loader()): x_data = data[0] y_data = data[1] out = model(x_data, t=10) loss = criterion(out, y_data) loss.backward() optimizer.step() optimizer.clear_grad() # 进行测试 accs = [] for batch_id, data in enumerate(test_loader()): x_data = data[0] y_data = data[1] out = model(x_data, t=10) acc = paddle.metric.accuracy(out, y_data) accs.append(acc.numpy()) print("Epoch {} Test Acc: {}".format(epoch, np.mean(accs))) ``` 3. 保存模型 使用PaddlePaddle的保存模型方法将模型保存到本地: ```python # 保存模型 model_path = './mnist.pdparams' paddle.save(model.state_dict(), model_path) ``` 4. 部署模型 使用Stable Diffusion提供的`paddle_serving_app`命令行工具进行模型部署: ```bash export CUDA_VISIBLE_DEVICES=0 paddle_serving_app --model ./mnist.pdparams --config conf/deploy.yaml --port 9393 ``` 其中,`--model`为训练好的模型路径,`--config`为配置文件路径,`--port`为服务端口号。 5. 测试模型 使用`curl`等工具对刚刚启动的服务进行测试: ```bash curl -H "Content-Type:application/json" -X POST -d '{"feeds":[{"name": "image", "shape": [1, 1, 28, 28], "data": [<这里填写28x28的一维像素数据>] }],"fetches": ["fc_0.b_0"]}' http://127.0.0.1:9393/uci_dns/inference ``` 其中,`data`为28x28的一维像素数据,`fetches`为需要获得的模型输出。 6. 可视化模型 使用Stable Diffusion提供的`paddle_serving_client`库进行模型可视化: ```python from paddleserving.client import Client import numpy as np # 定义客户端 client = Client() client.load_client_config('./conf/client_conf.prototxt') client.connect(['127.0.0.1:9393']) # 定义输入数据 batch_size = 1 input_data = { "image": np.random.random(size=(batch_size, 1, 28, 28)).astype('float32') } # 获得可视化结果 fetch_map = client.predict(input_data, fetch=["fc_0.b_0#mode=prediction"]) print("Prediction result:", fetch_map["fc_0.b_0#mode=prediction"]) visual_map = client.get_visual_data( input_data, "StackGradNorm_L1", "image", layers=["fc_0_weights"], threshold=0.5, return_format="paddle", format="NHWC", batch_size=batch_size) ``` 其中,`client_conf.prototxt`为客户端配置文件路径,`visual_map`为获得的可视化结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值