快速上手文生图sd3.5模型

前言

以diffusion为核心技术的文生图模型大放异彩,但大多闭源,而Stable Diffusion(SD)作为开源模型的代表,其在很多方面表现出了强劲的效果。

目前已经有很多框架项目支持sd,今天笔者这里就给一个hf的官方demo,可以快速infer和微调,以一个直观的例子来展示效果,为想快速上手的小伙伴提供一个极其简单的demo。

注意:所有demo核心都来自hf的官方,所以大家也可以直接看原博客。

链接:https://huggingface.co/blog/zh/sd3#使用-dreambooth-和-lora-进行微调

如果大家对diffusion扩散模型更底层的实现和原理感兴趣的话可以看笔者更早之前写过的一篇:https://zhuanlan.zhihu.com/p/599642809

废话不多说,进入正题。

快速体验

需要首先下载sd3.5模型到本地,链接如下:

https://hf.co/stabilityai/stable-diffusion-3.5-large

下载后就可以使用gradio来简单体验下了

import torch
import argparse
import os
import traceback
import gradio as gr
from PIL import Image
import os
import torch
from diffusers import StableDiffusion3Pipeline

pipe = StableDiffusion3Pipeline.from_pretrained("model/stable-diffusion-3.5-large", torch_dtype=torch.bfloat16).to("cuda")

def generate_image(prompt):
    # 使用 Stable Diffusion 模型生成图片
    image = pipe(
        prompt=prompt,
        negative_prompt="",
        num_inference_steps=40,
        height=1024,
        width=1024,
        guidance_scale=4.5,
    ).images[0]
    # save img
    image.save("temp_save_img/demo.png")
    return image


with gr.Blocks() as demo:
    gr.Markdown("## 来画画画!")
    with gr.Row():
        with gr.Column():
            prompt_input = gr.Textbox(lines=2, placeholder="Enter your prompt here...", label="Prompt")
            submit_button = gr.Button("Submit")
        with gr.Column():
            output_image = gr.Image(label="Generated Image")

    submit_button.click(fn=generate_image, inputs=prompt_input, outputs=output_image)
    
# Launch the Gradio interface
demo.launch(share=False, server_name='0.0.0.0',server_port=57653)

下面是原生sd的一些效果图

自己怎么 train 以及训练后怎么infer?

(1)train

这里为了demo,笔者随手找了一件自己身边的小物件:一个钥匙环上小葫芦(正好可以和上面演示的原生能力做个对比),废话不多说,下面是笔者对自己小葫芦随手拍的5张不同角度的照片


其中1.jpg如下

拍摄好了后,接下来就可以训练啦,启动脚本如下:

# https://github.com/huggingface/diffusers/tree/main/examples/dreambooth
accelerate launch train_dreambooth_lora_sd3.py \
  --pretrained_model_name_or_path="model/stable-diffusion-3.5-large" \
  --instance_data_dir="data/golden_gourd" \
  --output_dir="output/golden_gourd_lora" \
  --mixed_precision="bf16" \
  --instance_prompt="photo of a golden gourd" \
  --caption_column="text"\
  --resolution=768 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=1 \
  --learning_rate=4e-4 \
  --report_to="tensorboard" \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --max_train_steps=700 \
  --rank=16 \
  --seed="0"

(a) 其中launch train_dreambooth_lora_sd3.py脚本来源:https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth_lora_sd3.py,当然这里还有很多脚本可以参考,大家按需所取。

(b) 具体到这里启动脚本中有几个关键的参数是大家可能需要根据自己情况修改的,pretrained_model_name_or_path就是本地下载的原生sd模型路径、instance_data_dir就是刚笔者拍摄照片放置的本地路径、output_dir是训练后模型需要保存的路径,instance_prompt就是咱们当前要训练核心东西是啥,这里给一个描述,注意这里最好描述的务实具体一点,比如你的照片是一个名叫“小明”的小男孩的照片,不要写成“A photo of Xiao Ming”,这样效果可能不好,还不如写成“A little boy named Xiao Ming”把boy这个突出出来。这样它就起码知道我是要在这5个照片中学习的是这个boy而不是其他的,这个boy是我核心要学习的目标。

(2)infer

训练完了,就可以推理看看效果了,推理的代码也很简单只需要加一行即可

pipe.load_lora_weights("output/golden_gourd_lora")

全部代码如下

import torch
import argparse
import os
import traceback
import gradio as gr
from PIL import Image
import os
import torch
from diffusers import StableDiffusion3Pipeline

pipe = StableDiffusion3Pipeline.from_pretrained("model/stable-diffusion-3.5-large", torch_dtype=torch.bfloat16).to("cuda")
# 多加这一行即可
pipe.load_lora_weights("output/golden_gourd_lora")

def generate_image(prompt):
    # 使用 Stable Diffusion 模型生成图片
    image = pipe(
        prompt=prompt,
        negative_prompt="",
        num_inference_steps=40,
        height=1024,
        width=1024,
        guidance_scale=4.5,
    ).images[0]
    # save img
    image.save("temp_save_img/demo.png")
    return image


with gr.Blocks() as demo:
    gr.Markdown("## 来画画画!")
    with gr.Row():
        with gr.Column():
            prompt_input = gr.Textbox(lines=2, placeholder="Enter your prompt here...", label="Prompt")
            submit_button = gr.Button("Submit")
        with gr.Column():
            output_image = gr.Image(label="Generated Image")

    submit_button.click(fn=generate_image, inputs=prompt_input, outputs=output_image)
    
# Launch the Gradio interface
demo.launch(share=False, server_name='0.0.0.0',server_port=57653)

好了,接下来我们看看效果

哈哈哈,第一张图稍微有些学奔,大家感兴趣的话可以试试学别的实体比如人物、宠物等等,甚至可以试试全参训练。另外就是同一个prompt多次infer的结果也差异很大,大家可以多试几次。

总结

本篇只是带大家快速尝试sd,入个门,sd还有很多东西可以折腾比如图生图等等,训练推理量化等等,大家感兴趣的话可以积极探索。

后面有时间笔者会再出一篇关于FLUX模型的实践,其是另外一个开源的文生图模型,效果同样强劲。

关注笔者

知乎csdngithub微信公众号

<think>嗯,用户想了解Stable Diffusion文生算法的工作原理。首先,我需要回顾一下自己掌握的关于Stable Diffusion的知识。记得Stable Diffusion属于扩散模型的一种,结合了潜在空间表示和变分自编码器(VAE)。对了,用户提供的引用里提到了VAE的作用,是将片编码到隐空间特征,这可能是在预处理阶段减少计算量的关键。 我应该从基本流程开始解释。首先,用户输入文本提示,比如“一只猫”,然后模型通过CLIP这样的文本编码器将其转化为向量。接下来,VAE将高分辨率像压缩到潜在空间,这样在潜在空间中进行扩散过程,计算量更小。然后是扩散过程的核心,包括正向加噪和反向去噪。正向过程逐步添加噪声,直到像变成纯噪声;反向过程则利用UNet模型预测噪声,逐步去除噪声,恢复像。最后,VAE解码器将潜在表示转换回像素空间,生成最终像。 需要提到关键组件,比如VAE、CLIP文本编码器和UNet。VAE负责压缩和重建像,CLIP处理文本理解,UNet则是去噪的主力。还要注意时间步和条件注入,这些是控制生成过程的重要部分。用户可能对CFG Scale参数感兴趣,引用里提到这个参数调节AI对提示的依从度,应该在原理部分关联到条件机制,比如通过调节条件与无条件的权重来实现。 用户可能还关心为什么Stable Diffusion高效,这涉及到潜在空间的降维,相比在像素空间操作,计算效率更高。另外,扩散模型的优势在于逐步细化生成内容,质量较高。可能需要对比以前的GAN模型,说明扩散模型的进步之处。 需要检查是否有遗漏的步骤或组件。比如,调度器在控制噪声步长中的作用,或者训练时的目标函数。此外,解释潜在空间如何平衡信息保留和计算效率,可能帮助用户理解设计选择。 确保使用正确的中文术语,避免直译英文词汇。例如,变分自编码器、隐空间特征、扩散过程等。同时,按照用户的要求,行内公式用$...$,独立公式用$$...$$,并正确使用LaTeX语法。 最后,生成相关问题时要围绕用户可能感兴趣的扩展点,比如具体组件的作用、参数影响、与其他模型的比较,以及应用场景。这样可以帮助用户进一步探索相关知识。</think>### Stable Diffusion文生算法原理详解 Stable Diffusion是基于$扩散模型$(Diffusion Model)的生成算法,核心流程可分为以下步骤: 1. **文本编码** 输入文本通过CLIP等$文本编码器$转换为768维向量$T \in \mathbb{R}^{768}$。例如输入"一只猫"会被编码为语义向量[^2]。 2. **潜在空间压缩** VAE(变分自编码器)将原始像$x \in \mathbb{R}^{H \times W \times 3}$压缩到潜在空间: $$z = \text{VAE}_e(x) \in \mathbb{R}^{h \times w \times 4}$$ 其中$h=H/8$, $w=W/8$,实现维度压缩以降低计算量。 3. **正向扩散过程** 在潜在空间逐步添加高斯噪声,经过$T$步后得到纯噪声: $$q(z_t|z_{t-1}) = \mathcal{N}(z_t; \sqrt{1-\beta_t}z_{t-1}, \beta_t\mathbf{I})$$ 其中$\beta_t$是预设的噪声系数。 4. **反向去噪过程** 使用UNet预测噪声并逐步重建: $$\epsilon_\theta(z_t,t,T) = \text{UNet}(z_t,t,T)$$ 通过迭代更新: $$z_{t-1} = \frac{1}{\sqrt{\alpha_t}}(z_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_\theta(z_t,t,T)) + \sigma_t\epsilon$$ 其中$\alpha_t=1-\beta_t$, $\bar{\alpha}_t=\prod_{s=1}^t\alpha_s$。 5. **像重建** 最终潜在表示通过VAE解码器恢复为像素空间: $$x_{output} = \text{VAE}_d(z_0)$$ ### 关键组件解析 | 组件 | 功能 | 数学表达 | |------|------|---------| | CLIP | 文本语义编码 | $T = \text{CLIP}(prompt)$ | | VAE | 空间维度压缩 | $z = \text{VAE}_e(x), \hat{x} = \text{VAE}_d(z)$ | | UNet | 噪声预测器 | $\epsilon_\theta(z_t,t,T)$ | | 调度器 | 噪声步长控制 | $\beta_t$调度策略 | ### 参数影响示例 - **CFG Scale**:调节条件权重 $$ \epsilon_{cfg} = \epsilon_{uncond} + s(\epsilon_{cond} - \epsilon_{uncond}) $$ 当$s=7$时平衡创造性与依从性[^1] - **采样步数**:步数$T$越大细节越精细,但耗时增加
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值