Stable Diffusion原理详解(附代码实现)

一、前言

回顾AI绘画的历史,GAN(Generative Adversarial Nets)是比较出众的一个。GAN的出现让AI绘画成为可能,当时GAN给AI绘画提供了一种新的思路,现在回顾当时的绘画可以算是相当粗糙。

gan-results.jpg

初代GAN出现后,出现了大量GAN的变种,比如StyleGAN、CycleGAN、DCGAN等。而StyleGAN已经可以生成非常逼真的图像了,下面是StyleGAN的一些结果。

stylegan-results.jpg

GAN提出已经过去十年,AI绘画也得到了颠覆性的进步。Diffusion Model(DM)逐渐取代了GAN在AI绘画领域的地位。在此基础上,AI绘画领域还融合了其它深度学习方法,比如Controlnet、LoRA等。如今,AI绘画达到了以假乱真的地步,同时给与用户极高的可控性,对资源的要求也逐步降低,每个人都可以在自己的电脑上运行AI绘画模型。

今天我们的主角是Stable Diffusion,它是如今最流行的开源DM。基于Stable Diffusion,开源社区涌现了繁多的开源项目和模型。比如Stable Diffusion Webui、Comfyui、Fooocus等集成应用;分享模型的Civitai网站;HuggingFace提供的Diffusers模块。

今天我们将介绍Stable Diffusion的整体架构,分解每个部件,最后借助Diffusers模块实现AI绘画。

二、网络结构

Stable Diffusion由多个子网络组成,包括文本编码器、UNet和VAE三大部分。组合在一起可以看做一个接收文本输入,输出图像的模型。下面我们将从整体出发,而后拆分每个部件。

2.1 整体架构

Stable Diffusion的架构如图所示:

stable-diffusion-structure.jpg

整体上看是一个接收文本输入,并输出图像的模型。Stable Diffusion处理的过程如下:

  1. 输入文本,使用CLIP模型对文本进行编码,获得文本Embedding
  2. 从潜空间生成噪声Latent
  3. 将文本Embedding和Latent输入UNet模型,预测Latent中的噪声
  4. 将去除Latent中的噪声,去除噪声后的结果重新赋值为Latent
  5. 重复步骤3、4
  6. 将Latent传入VAE解码器,得到最终图片

模型的核心是一个UNet噪声预测网络。不同于GAN直接从噪声中生成图片,Stable Diffusion会进行多次预测噪声并降噪,最终生成图片。

2.2 文本编码器

Stable Diffusion是一种带条件的图像生成模型,可以根据输入的文本生成与文本相符的图片。我们可以直接使用训练良好的Bert模型作为文本编码器,但是这样生成的文本向量和图像的关系不太密切,为了图像生成能更遵循文本条件,Stable Diffusion使用了CLIP模型。

CLIP模型的提出是为了更好的解决视觉任务,CLIP可以在zero-shot的情况下在ImageNet上与ResNet50有同等的表现。

下面是OpenAI提供的CLIP工作图:

stable diffusion 是一种图像处理技术,通过应用不同的滤波器和参数调整,可以达到稳定图像的效果。Dreambooth 是一个用于定制自己的 stable diffusion 的工具。 Dreambooth 的原理是基于稳定扩散的原始算法,通过反复迭代将图像平滑处理,达到消除噪音和增加细节的目的。该算法的主要思想是在滤波器的各个位置上应用聚合函数,以合并邻域内的像素值。图像的每个像素点在该过程中被赋予一个新的值,以确保图像的平滑和细节。 在使用 Dreambooth 进行实战时,首先需要选择一个适合的滤波器类型和参数。常用的滤波器类型包括均值滤波器、中值滤波器等。选择不同的滤波器类型和参数可以得到不同的效果。接下来,将选择的滤波器和参数应用于输入图像,可以使用编程语言如Python来实现相关代码。 以下是一个简单的示例代码,展示了如何使用 Python 和 OpenCV 库来实现 Dreambooth 的效果: ```python import cv2 def dreambooth(image, filter_type, filter_size): blurred_image = cv2.blur(image, (filter_size, filter_size)) # 使用均值滤波器进行图像模糊 detail_image = image - blurred_image # 计算细节图像 result_image = image + detail_image # 合并细节和原始图像 return result_image # 读取输入图像 image = cv2.imread('input_image.jpg') # 设置滤波器类型和大小 filter_type = cv2.MEAN # 均值滤波器 filter_size = 5 # 滤波器大小 # 应用 Dreambooth result = dreambooth(image, filter_type, filter_size) # 显示结果图像 cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 通过调整滤波器类型和大小,可以实现不同的图像处理效果。在使用 Dreambooth 进行定制时,可以根据自己的需求和实际情况选择适合的滤波器和参数,以达到最佳的稳定扩散效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值