☰
Stable Diffusion v1 全解析:架构原理、权重选型与 txt2img / img2img 采样实战(基于 instruct-pix2pix 仓库源码)
2026/10/15 15:44:30 网站建设 项目流程
  • 计算机视觉
  • 媒体生成
  • AI 应用

【免费下载链接】instruct-pix2pix

项目地址:https://gitcode.com/gh_mirrors/in/instruct-pix2pix
点击查看免费下载

Stable Diffusion v1 是一个潜在(latent)文本到图像扩散模型,本文以仓库内 stable_diffusion/README.md 为主线,结合 v1-inference.yaml 模型配置、txt2img.py 与 img2img.py 采样脚本以及ldm源码,完整讲解它的架构组成、checkpoint 权重差异、环境搭建、文本生图与图像编辑两大实战流程,并给出每个参数与底层实现之间的对应关系。读完本文,你将能够独立搭建ldm环境、下载并链接权重、运行 txt2img / img2img 采样并读懂采样器与 classifier-free guidance 的源码实现。需要说明的是,本仓库 instruct-pix2pix 正是以这份 CompVis Stable Diffusion 代码库为底座构建的指令式图像编辑模型,其训练也以 sd-v1.x 权重为起点(见仓库根目录 README.md)。

一、Stable Diffusion 是什么:潜在扩散模型 + 冻结文本编码器

Stable Diffusion 属于Latent Diffusion Model(LDM):它不直接在像素空间做去噪扩散,而是先通过一个自编码器把图像压缩到潜在空间,再在潜在空间训练一个 UNet 扩散模型,最后用解码器把采样结果还原成图像。其核心设计可以概括为三点(均可在仓库源码与配置中得到印证):

  1. 条件方式:与 Google Imagen 类似,使用一个冻结的 CLIP ViT-L/14 文本编码器把文本 prompt 编码为条件。源码中对应 FrozenCLIPEmbedder,它从 Hugging Face 加载openai/clip-vit-large-patch14,tokenizer 截断/补齐到max_length=77,取last_hidden_state作为非池化嵌入序列,并在构造后调用freeze()冻结全部参数。
  2. 轻量级:模型由 860M 参数的 UNet 与 123M 参数的文本编码器构成,官方文档给出的运行前提是至少 10GB 显存的 GPU。
  3. 数据来源:得益于 Stability AI 的算力捐赠与 LAION 的支持,模型在 LAION-5B 数据库子集的 512×512 图像上训练而成。

这套代码库的扩散实现建立在 OpenAI 的 ADM(guided-diffusion)与 lucidrains 的 denoising-diffusion-pytorch 基础之上,Transformer 编码器部分来自 x-transformers,详见文档末尾的 Comments 部分。

二、环境搭建:创建ldmconda 环境

文档给出了两条安装路径。第一条是全新创建环境:

conda env create -f environment.yaml conda activate ldm

对应依赖文件为 environment.yaml,其关键版本如下:

类别依赖版本
Pythonpython3.8.5
深度学习pytorch / torchvision / cudatoolkit1.11.0 / 0.12.0 / 11.3
基础库numpy1.19.2
采样与训练pytorch-lightning / omegaconf / test-tube1.4.2 / 2.1.1 / >=0.7.5
文本与图像transformers / diffusers / einops / kornia / opencv-python4.19.2 / 最新 / 0.3.0 / 0.6 / 4.1.2.30
水印与安全invisible-watermark / torch-fidelity最新 / 0.3.0
可编辑安装taming-transformers、openai/CLIP、本地包(-e .)主分支

第二条路径是更新已有的 latent diffusion 环境:

conda install pytorch torchvision -c pytorch pip install transformers==4.19.2 diffusers invisible-watermark pip install -e .

其中pip install -e .以可编辑模式安装仓库根目录的 setup.py 定义的本地包(包名ldm),transformers==4.19.2与diffusers分别用于加载 CLIP 文本编码器与安全检测器(Safety Checker),invisible-watermark用于输出图像的水印嵌入。

三、Stable Diffusion v1:一种具体的模型配置与四代权重

3.1 v1 的架构定义

文档明确指出,Stable Diffusion v1特指这样一种架构配置:

  • 下采样因子为 8 的 Autoencoder(将H×W×3的图像编码为H/8×W/8×4的潜在表示,见模型卡);
  • 860M 参数的 UNet扩散主干;
  • CLIP ViT-L/14 文本编码器;
  • 先在 256×256 分辨率上预训练,再在 512×512 上微调。

这套配置完整落地在 v1-inference.yaml 中,以下是核心字段及其含义:

配置字段取值含义
targetldm.models.diffusion.ddpm.LatentDiffusion模型类,即潜在空间扩散模型
linear_start/linear_end0.00085 / 0.0120噪声 beta 调度区间
timesteps1000训练/推理的扩散时间步总数
first_stage_key/cond_stage_keyjpg/txt输入图像键与文本条件键
image_size64潜在空间分辨率(512/8)
channels4潜在通道数
conditioning_keycrossattn文本条件通过交叉注意力注入 UNet
scale_factor0.18215潜在表示的缩放系数,采样前乘以此值
use_emaFalse推理使用非 EMA 权重(见 5.4 节说明)
unet_config.model_channels320UNet 基础通道数
unet_config.context_dim768交叉注意力的上下文维度(CLIP 嵌入维度)
unet_config.attention_resolutions[4, 2, 1]各分辨率层级使用注意力
first_stage_config.targetldm.models.autoencoder.AutoencoderKLKL 自编码器,embed_dim=4、下采样因子 8(z_channels=4,分辨率 256)
cond_stage_config.targetldm.modules.encoders.modules.FrozenCLIPEmbedder冻结的 CLIP 文本编码器

值得注意的细节:scale_factor: 0.18215与源码 get_first_stage_encoding 中的return self.scale_factor * z一一对应——自编码器输出的潜在表示会先乘上该系数再交给扩散模型,避免潜在值方差过大。

3.2 四代权重 checkpoints 的差异

仓库目前提供sd-v1-1.ckpt至sd-v1-4.ckpt四个权重,训练路径与数据差异如下:

Checkpoint训练起点步数与分辨率训练数据
sd-v1-1.ckpt从零256×256 上 237k 步;512×512 上 194k 步laion2B-en;laion-high-resolution(LAION-5B 中分辨率 ≥1024×1024 的 170M 样本)
sd-v1-2.ckpt续训sd-v1-1512×512 上 515k 步laion-aesthetics v2 5+(美学评分 >5.0,且原始尺寸 ≥512×512、水印概率 <0.5)
sd-v1-3.ckpt续训sd-v1-2512×512 上 195k 步laion-aesthetics v2 5+,并 10% 丢弃文本条件以改进 classifier-free guidance
sd-v1-4.ckpt续训sd-v1-2512×512 上 225k 步laion-aesthetics v2 5+,同样 10% 丢弃文本条件

其中sd-v1-3/sd-v1-4的"10% 丢弃文本条件"直接服务于 classifier-free guidance:推理时模型同时以空文本与真实 prompt 做条件预测,二者插值控制生成强度(公式见 5.3 节)。官方使用 classifier-free guidance scale 取值 1.5、2.0、3.0、4.0、5.0、6.0、7.0、8.0 并配合 50 步 PLMS 采样评估各 checkpoint 的相对改进:

根据模型卡(Stable_Diffusion_v1_Model_Card.md)的补充说明,该评估使用 50 步 PLMS、COCO2017 验证集的 10000 个随机 prompt,在 512×512 分辨率下进行。

3.3 训练数据、许可证与已知局限

模型卡记录了训练配置:硬件为 32×8×A100 GPU,优化器 AdamW,梯度累积 2,总 batch 为 32×8×2×4=2048,学习率先 warmup 10000 步到 0.0001 后保持恒定。训练数据为 LAION-5B 及其子集。

需要特别留意两点:

  1. 许可证:权重以 CreativeML OpenRAIL M 许可证发布(见 LICENSE),它基于 BigScience 与 RAIL Initiative 联合推进的 Open RAIL M 责任式 AI 许可证改编而来。虽然许可条款允许商业使用,但官方不建议在缺少额外安全机制与考量的情况下将权重用于服务或产品,因为权重存在已知的局限与偏见,安全、合乎伦理地部署通用文生图模型的研究仍在进行中——这些权重应被视为研究工件。
  2. 局限与偏见(模型卡归纳):模型并未实现完美照片级真实感;无法渲染清晰可读的文本;在需要组合性的复杂任务(如"红色立方体在蓝色球体之上")上表现不佳;人脸等小目标可能生成异常;主要以英文 caption 训练,非英语效果较差;自编码部分是有损的;训练数据未做去重,存在一定程度的记忆现象。

四、文本到图像生成(Text-to-Image with Stable Diffusion)

4.1 原理简述

Stable Diffusion 是一个以CLIP ViT-L/14 文本编码器的非池化(non-pooled)文本嵌入为条件的潜在扩散模型。文本先被 FrozenCLIPEmbedder 编码成长度 77 的 token 嵌入序列,通过交叉注意力注入 UNet 各层;图像侧则由 AutoencoderKL 编码到潜在空间,扩散模型在潜在空间完成去噪,最终解码回像素空间。

官方提供两条使用路径:参考采样脚本(reference sampling script)与diffusers 集成,后者社区开发更活跃。

4.2 获取权重并建立软链接

获取stable-diffusion-v1-*-original权重后,按文档要求将其链接到模型目录:

mkdir -p models/ldm/stable-diffusion-v1/ ln -s <path/to/model.ckpt> models/ldm/stable-diffusion-v1/model.ckpt

4.3 最小采样命令与默认行为

python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms

从 txt2img.py 的参数解析可以确认默认行为:

  • 使用guidance scale--scale 7.5;
  • 使用PLMS 采样器(Katherine Crowson 实现的伪线性多步采样器,对应 plms.py);
  • 输出512×512图像、50 步去噪(--ddim_steps 50);
  • 默认输出目录outputs/txt2img-samples,随机种子 42,默认精度autocast。

参考脚本内置了两道安全机制(这也是与 diffusers 集成的主要区别):

  1. Safety Checker 模块:脚本启动时加载CompVis/stable-diffusion-safety-checker与AutoFeatureExtractor(txt2img.py),对每张输出做 NSFW 概念检测,一旦命中便用assets/rick.jpeg替换该样本(check_safety)。
  2. 不可见水印(invisible watermarking):使用invisible-watermark库以dwtDct方式把"StableDiffusionV1"字节串嵌入输出图像(txt2img.py),帮助观看者识别图像为机器生成。仓库提供了对应的解码验证测试 test_watermark.py,可对任意图片解码并打印其中携带的水印字符串。

4.4 完整命令行参数

以下是python scripts/txt2img.py --help支持的完整参数(取自文档并对照源码逐项核对):

usage: txt2img.py [-h] [--prompt [PROMPT]] [--outdir [OUTDIR]] [--skip_grid] [--skip_save] [--ddim_steps DDIM_STEPS] [--plms] [--laion400m] [--fixed_code] [--ddim_eta DDIM_ETA] [--n_iter N_ITER] [--H H] [--W W] [--C C] [--f F] [--n_samples N_SAMPLES] [--n_rows N_ROWS] [--scale SCALE] [--from-file FROM_FILE] [--config CONFIG] [--ckpt CKPT] [--seed SEED] [--precision {full,autocast}] optional arguments: -h, --help show this help message and exit --prompt [PROMPT] the prompt to render --outdir [OUTDIR] dir to write results to --skip_grid do not save a grid, only individual samples. Helpful when evaluating lots of samples --skip_save do not save individual samples. For speed measurements. --ddim_steps DDIM_STEPS number of ddim sampling steps --plms use plms sampling --laion400m uses the LAION400M model --fixed_code if enabled, uses the same starting code across samples --ddim_eta DDIM_ETA ddim eta (eta=0.0 corresponds to deterministic sampling --n_iter N_ITER sample this often --H H image height, in pixel space --W W image width, in pixel space --C C latent channels --f F downsampling factor --n_samples N_SAMPLES how many samples to produce for each given prompt. A.k.a. batch size --n_rows N_ROWS rows in the grid (default: n_samples) --scale SCALE unconditional guidance scale: eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty)) --from-file FROM_FILE if specified, load prompts from this file --config CONFIG path to config which constructs model --ckpt CKPT path to checkpoint of model --seed SEED the seed (for reproducible sampling) --precision {full,autocast} evaluate at this precision

对照源码补充几个容易忽视的细节:

  • 采样器选择逻辑(txt2img.py):--dpm_solver优先选择 DPMSolver,其次--plms选择 PLMS,否则回退到 DDIM。
  • --laion400m回退:该开关会把配置切到 txt2img-1p4B-eval.yaml(文本编码器换成 BERTEmbedder,context_dim=1280,cond_stage_trainable=true),checkpoint 指向models/ldm/text2img-large/model.ckpt,输出目录切到outputs/txt2img-samples-laion400m。
  • --from-file:逐行读取 prompt 文件,每n_samples行组成一个 batch。
  • --fixed_code:为所有样本复用同一份随机起始编码torch.randn([n_samples, C, H//f, W//f]),便于对照。
  • --scale的数学含义即参数帮助文本所写:eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty)),这与采样器源码中的实现完全一致(见 4.5 节)。

4.5 源码级原理:从配置到采样的一整条调用链

txt2img.py 的推理流程可归纳为:

  1. seed_everything(opt.seed)固定随机种子;
  2. OmegaConf.load(config)读取 YAML 配置,load_model_from_config通过ldm.util.instantiate_from_config按target字段构造 LatentDiffusion 模型并加载state_dict;
  3. 计算无条件与条件嵌入:uc = get_learned_conditioning([""])、c = get_learned_conditioning(prompts);
  4. 构造潜在形状[C, H//f, W//f],调用sampler.sample(...)得到潜在样本;
  5. decode_first_stage解码、clamp到 [0,1]、过 Safety Checker、嵌入水印后保存。

其中classifier-free guidance 的插值发生在采样器内部。查看 ddim.py 的 p_sample_ddim:当给定无条件条件且 scale≠1 时,把输入x、时间步t、条件c各自拼接为两份,一次前向推理同时得到e_t_uncond与e_t,然后执行e_t = e_t_uncond + scale * (e_t - e_t_uncond)。PLMS 采样器同样实现该公式;而 PLMS 要求ddim_eta必须为 0(见 plms.py),否则直接抛错。

4.6 关于 EMA 权重的注意事项

文档特别强调:所有 v1 版本的推理配置都是为 EMA-only checkpoint 设计的,因此 v1-inference.yaml 中设置了use_ema=False——否则代码会尝试从非 EMA 权重切换到 EMA 权重而失败。如果你拿到同时包含两类权重的"full" checkpoint,use_ema=False会加载并使用其中的非 EMA 权重。若确实想对比 EMA 效果,可以查看 ddpm.py 的 ema_scope,它在进入采样上下文时把 EMA 权重复制到模型、结束后再恢复训练权重。

4.7 Diffusers 集成方式

diffusers 库提供了更简洁的下载与采样路径(需要先执行huggingface-cli login完成登录):

from torch import autocast from diffusers import StableDiffusionPipeline pipe = StableDiffusionPipeline.from_pretrained( "CompVis/stable-diffusion-v1-4", use_auth_token=True ).to("cuda") prompt = "a photo of an astronaut riding a horse on mars" with autocast("cuda"): image = pipe(prompt)["sample"][0] image.save("astronaut_rides_horse.png")

五、图像编辑与修改(Image Modification with Stable Diffusion)

5.1 原理:SDEdit 式的去噪-去噪机制

利用SDEdit(diffusion-denoising 机制)思想,同一模型可胜任文本引导的图像到图像翻译与超分辨率放大等任务。核心思路是:把输入图像编码到潜在空间,加入与强度(strength)成正比的噪声后再按文本条件逐步去噪,从而实现"在保留输入结构的前提下按 prompt 改写图像"。

5.2 命令与 strength 参数

python scripts/img2img.py --prompt "A fantasy landscape, trending on artstation" --init-img <path-to-img.jpg> --strength 0.8

strength是 0.0~1.0 之间的浮点数,控制加入输入图像的噪声量:越接近 1.0,允许的改动越大、生成变体越丰富,但输出与输入在语义上的一致性也越差。对照 img2img.py 源码可以看清其精确语义:

  • 默认--strength 0.75、--scale 5.0、--ddim_steps 50、--n_samples 2;
  • load_img会把输入缩放到32 的整数倍(w - w % 32)并用 LANCZOS 重采样,归一化到 [-1,1](img2img.py);
  • 图像经encode_first_stage与get_first_stage_encoding进入潜在空间;
  • 关键计算:t_enc = int(strength * ddim_steps),即只执行前t_enc步去噪(img2img.py);
  • 先用 stochastic_encode 把输入潜在表示扰动到时间步t_enc(sqrt(alpha) * x0 + sqrt(1-alpha) * noise),再调用sampler.decode(...)从该状态按文本条件去噪回到干净潜在表示,最后decode_first_stage还原为图像(img2img.py)。

文档给出的示例是:把一张用 Pinta 绘制的粗略草图转换为精细画作。输入与输出如下:

值得注意的是,img2img 脚本中 PLMS 采样器尚未支持(源码--plms分支直接raise NotImplementedError),默认使用 DDIM 采样器。

5.3 应用延伸:超分辨率放大

由于该流程可在任意输入图像上进行文本引导的"重新绘制",因此也可以直接用于放大基础模型的低分辨率输出:把低分辨率样本作为--init-img,用较低的strength与描述性 prompt 即可得到放大且细节增强的结果。

5.4 本仓库中的直接应用

instruct-pix2pix 正是基于这份 Stable Diffusion 代码库进行改造:根目录 README.md 说明训练以sd-v1-5checkpoint 为起点(通过bash scripts/download_pretrained_sd.sh下载),并新增了ddpm_edit.py等编辑专用模块。如果你把本仓库整体克隆下来,stable_diffusion/目录就是这篇文档所描述的完整代码库,scripts/download_pretrained_sd.sh会把 Stable Diffusion v1.5 权重放入stable_diffusion/models/ldm/stable-diffusion-v1/,供生成数据集与训练使用。

六、其他脚本与模型权重下载

stable_diffusion/目录还包含两个批量下载脚本,用于获取潜在扩散相关的各类模型:

  • download_first_stages.sh:下载一阶段自编码器(kl-f4、kl-f8、kl-f16、kl-f32、vq-f4、vq-f8、vq-f16等)权重到models/first_stage_models/;
  • download_models.sh:下载各类下游任务的 LDM 权重(celeba256、ffhq256、lsun_churches256、lsun_beds256、text2img256、cin256、semantic_synthesis512/256、bsr_sr、layout2img-openimages256、inpainting_big)到models/ldm/,并自动解压。

对应模型配置均可在此前环境清单中列出的models/ldm/<task>/config.yaml中找到。

七、常见问题与调参建议

  • 显存不足:官方要求至少 10GB VRAM。可尝试降低--n_samples、改用--precision full(关闭 autocast 并不省显存,实际应保持 autocast 并减小 batch)或换用更小的分辨率;亦可直接使用 4.7 节的 diffusers 集成(通常更省显存、更快)。
  • 结果与 prompt 不符:增大--scale(guidance)让模型更听文本指令,但过大会导致饱和伪影;配合增大--ddim_steps通常能改善质量。
  • img2img 保留度控制:--strength越低越贴近原图、越高改动越大;若想"只改风格不改结构",请把 strength 控制在 0.5 以下并配合合适的--scale。
  • 可复现性:固定--seed,或使用--fixed_code让一批样本共享同一初始噪声。

八、参考与致谢(Comments)

  • 扩散模型代码库大量借鉴了 OpenAI 的 ADM(guided-diffusion)代码库与 lucidrains 的 denoising-diffusion-pytorch,特此致谢;
  • Transformer 编码器实现来自 lucidrains 的 x-transformers。

九、引用(BibTeX)

@misc{rombach2021highresolution, title={High-Resolution Image Synthesis with Latent Diffusion Models}, author={Robin Rombach and Andreas Blattmann and Dominik Lorenz and Patrick Esser and Björn Ommer}, year={2021}, eprint={2112.10752}, archivePrefix={arXiv}, primaryClass={cs.CV} }

如需深入了解本模型的行为边界、训练数据与偏见问题,可继续阅读仓库内的 Stable_Diffusion_v1_Model_Card.md;若想了解指令式图像编辑的完整训练与推理流程,可回到仓库根目录的 README.md 与 train.yaml 继续探索。

  • 计算机视觉
  • 媒体生成
  • AI 应用

【免费下载链接】instruct-pix2pix

项目地址:https://gitcode.com/gh_mirrors/in/instruct-pix2pix
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询