网站建设手机银行限额wordpress 原子特效
web/
2025/10/2 5:44:42/
文章来源:
网站建设手机银行限额,wordpress 原子特效,电商设计网站素材,dede模板网站教程手把手教你入门绘图超强的AI绘画#xff0c;用户只需要输入一段图片的文字描述#xff0c;即可生成精美的绘画。给大家带来了全新保姆级教程资料包 #xff08;文末可获取#xff09;
2022年可谓是AIGC#xff08;AI Generated Content#xff09;元年#xff0c;上半年…手把手教你入门绘图超强的AI绘画用户只需要输入一段图片的文字描述即可生成精美的绘画。给大家带来了全新保姆级教程资料包 文末可获取
2022年可谓是AIGCAI Generated Content元年上半年有文生图大模型DALL-E2和Stable Diffusion下半年有OpenAI的文本对话大模型ChatGPT问世这让冷却的AI又沸腾起来了因为AIGC能让更多的人真真切切感受到AI的力量。这篇文章将介绍比较火的文生图模型Stable Diffusion简称SDStable Diffusion不仅是一个完全开源的模型代码数据模型全部开源而且是它的参数量只有1B左右大部分人可以在普通的显卡上进行推理甚至精调模型。毫不夸张的说Stable Diffusion的出现和开源对AIGC的火热和发展是有巨大推动作用的因为它让更多的人能快地上手AI作画。这里将基于Hugging Face的diffusers库深入讲解SD的技术原理以及部分的实现细节然后也会介绍SD的常用功能注意本文主要以SD V1.5版本为例在最后也会简单介绍 SD 2.0版本以及基于SD的扩展应用。
SD模型原理
SD是CompVis、Stability AI和LAION等公司研发的一个文生图模型它的模型和代码是开源的而且训练数据LAION-5B也是开源的。SD在开源90天github仓库就收获了33K的stars可见这个模型是多受欢迎。 SD是一个基于latent的扩散模型它在UNet中引入text condition来实现基于文本生成图像。SD的核心来源于Latent Diffusion这个工作常规的扩散模型是基于pixel的生成模型而Latent Diffusion是基于latent的生成模型它先采用一个autoencoder将图像压缩到latent空间然后用扩散模型来生成图像的latents最后送入autoencoder的decoder模块就可以得到生成的图像。基于latent的扩散模型的优势在于计算效率更高效因为图像的latent空间要比图像pixel空间要小这也是SD的核心优势。文生图模型往往参数量比较大基于pixel的方法往往限于算力只生成64x64大小的图像比如OpenAI的DALL-E2和谷歌的Imagen然后再通过超分辨模型将图像分辨率提升至256x256和1024x1024而基于latent的SD是在latent空间操作的它可以直接生成256x256和512x512甚至更高分辨率的图像。
SD模型的主体结构如下图所示主要包括三个模型 autoencoderencoder将图像压缩到latent空间而decoder将latent解码为图像 CLIP text encoder提取输入text的text embeddings通过cross attention方式送入扩散模型的UNet中作为condition UNet扩散模型的主体用来实现文本引导下的latent生成。 对于SD模型其autoencoder模型参数大小为84MCLIP text encoder模型大小为123M而UNet参数大小为860M所以SD模型的总参数量约为1B。
autoencoder
autoencoder是一个基于encoder-decoder架构的图像压缩模型对于一个大小为的输入图像encoder模块将其编码为一个大小为的latent其中为下采样率downsampling factor。在训练autoencoder过程中除了采用L1重建损失外还增加了感知损失perceptual loss即LPIPS具体见论文The Unreasonable Effectiveness of Deep Features as a Perceptual Metric以及基于patch的对抗训练。辅助loss主要是为了确保重建的图像局部真实性以及避免模糊具体损失函数见latent diffusion的loss部分。同时为了防止得到的latent的标准差过大采用了两种正则化方法第一种是KL-reg类似VAE增加一个latent和标准正态分布的KL loss不过这里为了保证重建效果采用比较小的权重10e-6第二种是VQ-reg引入一个VQ vector quantizationlayer此时的模型可以看成是一个VQ-GAN不过VQ层是在decoder模块中这里VQ的codebook采样较高的维度8192来降低正则化对重建效果的影响。latent diffusion论文中实验了不同参数下的autoencoder模型如下表所示可以看到当较小和较大时重建效果越好PSNR越大这也比较符合预期毕竟此时压缩率小。 论文进一步将不同的autoencoder在扩散模型上进行实验在ImageNet数据集上训练同样的步数2M steps其训练过程的生成质量如下所示可以看到过小的比如1和2下收敛速度慢此时图像的感知压缩率较小扩散模型需要较长的学习而过大的其生成质量较差此时压缩损失过大。 当在416时可以取得相对好的效果。SD采用基于KL-reg的autoencoder其中下采样率特征维度为当输入图像为512x512大小时将得到64x64x4大小的latent。autoencoder模型时在OpenImages数据集上基于256x256大小训练的但是由于autoencoder的模型是全卷积结构的基于ResnetBlock所以它可以扩展应用在尺寸256的图像上。下面我们给出使用diffusers库来加载autoencoder模型并使用autoencoder来实现图像的压缩和重建代码如下所示
import torch
from diffusers import AutoencoderKL
import numpy as np
from PIL import Image#加载模型: autoencoder可以通过SD权重指定subfolder来单独加载
autoencoder AutoencoderKL.from_pretrained(runwayml/stable-diffusion-v1-5, subfoldervae)
autoencoder.to(cuda, dtypetorch.float16)# 读取图像并预处理
raw_image Image.open(boy.png).convert(RGB).resize((256, 256))
image np.array(raw_image).astype(np.float32) / 127.5 - 1.0
image image[None].transpose(0, 3, 1, 2)
image torch.from_numpy(image)# 压缩图像为latent并重建
with torch.inference_mode():latent autoencoder.encode(image.to(cuda, dtypetorch.float16)).latent_dist.sample()rec_image autoencoder.decode(latent).samplerec_image (rec_image / 2 0.5).clamp(0, 1)rec_image rec_image.cpu().permute(0, 2, 3, 1).numpy()rec_image (rec_image * 255).round().astype(uint8)rec_image Image.fromarray(rec_image[0])
rec_image
这里我们给出了两张图片在256x256和512x512下的重建效果对比如下所示第一列为原始图片第二列为512x512尺寸下的重建图第三列为256x256尺寸下的重建图。对比可以看出autoencoder将图片压缩到latent后再重建其实是有损的比如会出现文字和人脸的畸变在256x256分辨率下是比较明显的512x512下效果会好很多。 这种有损压缩肯定是对SD的生成图像质量是有一定影响的不过好在SD模型基本上是在512x512以上分辨率下使用的。为了改善这种畸变stabilityai在发布SD 2.0时同时发布了两个在LAION子数据集上精调的autoencoder注意这里只精调autoencoder的decoder部分SD的UNet在训练过程只需要encoder部分所以这样精调后的autoencoder可以直接用在先前训练好的UNet上这种技巧还是比较通用的比如谷歌的Parti也是在训练好后自回归生成模型后扩大并精调ViT-VQGAN的decoder模块来提升生成质量。我们也可以直接在diffusers中使用这些autoencoder比如mse版本采用mse损失来finetune的模型
autoencoder AutoencoderKL.from_pretrained(stabilityai/sd-vae-ft-mse/)
对于同样的两张图这个mse版本的重建效果如下所示可以看到相比原始版本的autoencoder畸变是有一定改善的。 由于SD采用的autoencoder是基于KL-reg的所以这个autoencoder在编码图像时其实得到的是一个高斯分布DiagonalGaussianDistribution分布的均值和标准差然后通过调用sample方法来采样一个具体的latent调用mode方法可以得到均值。由于KL-reg的权重系数非常小实际得到latent的标准差还是比较大的latent diffusion论文中提出了一种rescaling方法首先计算出第一个batch数据中的latent的标准差然后采用的系数来rescale latent这样就尽量保证latent的标准差接近1防止扩散过程的SNR较高影响生成效果具体见latent diffusion论文的D1部分讨论然后扩散模型也是应用在rescaling的latent上在解码时只需要将生成的latent除以然后再送入autoencoder的decoder即可。对于SD所使用的autoencoder这个rescaling系数为0.18215。
CLIP text encoder
SD采用CLIP text encoder来对输入text提取text embeddings具体的是采用目前OpenAI所开源的最大CLIP模型clip-vit-large-patch14这个CLIP的text encoder是一个transformer模型只有encoder模块层数为12特征维度为768模型参数大小是123M。对于输入text送入CLIP text encoder后得到最后的hidden states即最后一个transformer block得到的特征其特征维度大小为77x76877是token的数量这个细粒度的text embeddings将以cross attention的方式送入UNet中。在transofmers库中可以如下使用CLIP text encoder
from transformers import CLIPTextModel, CLIPTokenizertext_encoder CLIPTextModel.from_pretrained(runwayml/stable-diffusion-v1-5, subfoldertext_encoder).to(cuda)
# text_encoder CLIPTextModel.from_pretrained(openai/clip-vit-large-patch14).to(cuda)
tokenizer CLIPTokenizer.from_pretrained(runwayml/stable-diffusion-v1-5, subfoldertokenizer)
# tokenizer CLIPTokenizer.from_pretrained(openai/clip-vit-large-patch14)# 对输入的text进行tokenize得到对应的token ids
prompt a photograph of an astronaut riding a horse
text_input_ids text_tokenizer(prompt,paddingmax_length,max_lengthtokenizer.model_max_length,truncationTrue,return_tensorspt
).input_ids# 将token ids送入text model得到77x768的特征
text_embeddings text_encoder(text_input_ids.to(cuda))[0]
值得注意的是这里的tokenizer最大长度为77CLIP训练时所采用的设置当输入text的tokens数量超过77后将进行截断如果不足则进行paddings这样将保证无论输入任何长度的文本甚至是空文本都得到77x768大小的特征。在训练SD的过程中CLIP text encoder模型是冻结的。在早期的工作中比如OpenAI的GLIDE和latent diffusion中的LDM均采用一个随机初始化的tranformer模型来提取text的特征但是最新的工作都是采用预训练好的text model。比如谷歌的Imagen采用纯文本模型T5 encoder来提出文本特征而SD则采用CLIP text encoder预训练好的模型往往已经在大规模数据集上进行了训练它们要比直接采用一个从零训练好的模型要好。
UNet
SD的扩散模型是一个860M的UNet其主要结构如下图所示这里以输入的latent为64x64x4维度为例其中encoder部分包括3个CrossAttnDownBlock2D模块和1个DownBlock2D模块而decoder部分包括1个UpBlock2D模块和3个CrossAttnUpBlock2D模块中间还有一个UNetMidBlock2DCrossAttn模块。encoder和decoder两个部分是完全对应的中间存在skip connection。注意3个CrossAttnDownBlock2D模块最后均有一个2x的downsample操作而DownBlock2D模块是不包含下采样的。 其中CrossAttnDownBlock2D模块的主要结构如下图所示text condition将通过CrossAttention模块嵌入进来此时Attention的query是UNet的中间特征而key和value则是text embeddings。SD和DDPM一样采用预测noise的方法来训练UNet其训练损失也和DDPM一样这里的为text embeddings此时的模型是一个条件扩散模型。基于diffusers库我们可以很快实现SD的训练其核心代码如下所示这里参考diffusers库下examples中的finetune代码
import torch
from diffusers import AutoencoderKL, UNet2DConditionModel, DDPMScheduler
from transformers import CLIPTextModel, CLIPTokenizer
import torch.nn.functional as F# 加载autoencoder
vae AutoencoderKL.from_pretrained(runwayml/stable-diffusion-v1-5, subfoldervae)
# 加载text encoder
text_encoder CLIPTextModel.from_pretrained(runwayml/stable-diffusion-v1-5, subfoldertext_encoder)
tokenizer CLIPTokenizer.from_pretrained(runwayml/stable-diffusion-v1-5, subfoldertokenizer)
# 初始化UNet
unet UNet2DConditionModel(**model_config) # model_config为模型参数配置
# 定义scheduler
noise_scheduler DDPMScheduler(beta_start0.00085, beta_end0.012, beta_schedulescaled_linear, num_train_timesteps1000
)# 冻结vae和text_encoder
vae.requires_grad_(False)
text_encoder.requires_grad_(False)opt torch.optim.AdamW(unet.parameters(), lr1e-4)for step, batch in enumerate(train_dataloader):with torch.no_grad():# 将image转到latent空间latents vae.encode(batch[image]).latent_dist.sample()latents latents * vae.config.scaling_factor # rescaling latents# 提取text embeddingstext_input_ids text_tokenizer(batch[text],paddingmax_length,max_lengthtokenizer.model_max_length,truncationTrue,return_tensorspt).input_idstext_embeddings text_encoder(text_input_ids)[0]# 随机采样噪音noise torch.raAI绘画所有方向的学习路线思维导图
这里为大家提供了总的路线图。它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。如果下面这个学习路线能帮助大家将AI利用到自身工作上去那么我的使命也就完成了
stable diffusion新手0基础入门PDF AI绘画必备工具 温馨提示篇幅有限已打包文件夹获取方式在文末
AI绘画基础速成进阶使用教程
观看零基础学习视频看视频学习是最快捷也是最有效果的方式跟着视频中老师的思路从基础到深入还是很容易入门的。 12000AI关键词大合集 这份完整版的AI绘画资料我已经打包好戳下方蓝色字体即可免费领取CSDN大礼包《全套AI绘画基础学习资源包》免费分享
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85453.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!