Stable Diffusion v1 全解析:架构原理、权重选型与 txt2img / img2img 采样实战(基于 instruct-pix2pix 仓库源码) 计算机视觉媒体生成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 ModelLDM它不直接在像素空间做去噪扩散而是先通过一个自编码器把图像压缩到潜在空间再在潜在空间训练一个 UNet 扩散模型最后用解码器把采样结果还原成图像。其核心设计可以概括为三点均可在仓库源码与配置中得到印证条件方式与 Google Imagen 类似使用一个冻结的 CLIP ViT-L/14 文本编码器把文本 prompt 编码为条件。源码中对应 FrozenCLIPEmbedder它从 Hugging Face 加载openai/clip-vit-large-patch14tokenizer 截断/补齐到max_length77取last_hidden_state作为非池化嵌入序列并在构造后调用freeze()冻结全部参数。轻量级模型由 860M 参数的 UNet 与 123M 参数的文本编码器构成官方文档给出的运行前提是至少 10GB 显存的 GPU。数据来源得益于 Stability AI 的算力捐赠与 LAION 的支持模型在 LAION-5B 数据库子集的 512×512 图像上训练而成。这套代码库的扩散实现建立在 OpenAI 的 ADMguided-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 transformers4.19.2 diffusers invisible-watermark pip install -e .其中pip install -e .以可编辑模式安装仓库根目录的 setup.py 定义的本地包包名ldmtransformers4.19.2与diffusers分别用于加载 CLIP 文本编码器与安全检测器Safety Checkerinvisible-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/8channels4潜在通道数conditioning_keycrossattn文本条件通过交叉注意力注入 UNetscale_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_dim4、下采样因子 8z_channels4分辨率 256cond_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-enlaion-high-resolutionLAION-5B 中分辨率 ≥1024×1024 的 170M 样本sd-v1-2.ckpt续训sd-v1-1512×512 上 515k 步laion-aesthetics v2 5美学评分 5.0且原始尺寸 ≥512×512、水印概率 0.5sd-v1-3.ckpt续训sd-v1-2512×512 上 195k 步laion-aesthetics v2 5并 10% 丢弃文本条件以改进 classifier-free guidancesd-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×42048学习率先 warmup 10000 步到 0.0001 后保持恒定。训练数据为 LAION-5B 及其子集。需要特别留意两点许可证权重以 CreativeML OpenRAIL M 许可证发布见 LICENSE它基于 BigScience 与 RAIL Initiative 联合推进的 Open RAIL M 责任式 AI 许可证改编而来。虽然许可条款允许商业使用但官方不建议在缺少额外安全机制与考量的情况下将权重用于服务或产品因为权重存在已知的局限与偏见安全、合乎伦理地部署通用文生图模型的研究仍在进行中——这些权重应被视为研究工件。局限与偏见模型卡归纳模型并未实现完美照片级真实感无法渲染清晰可读的文本在需要组合性的复杂任务如红色立方体在蓝色球体之上上表现不佳人脸等小目标可能生成异常主要以英文 caption 训练非英语效果较差自编码部分是有损的训练数据未做去重存在一定程度的记忆现象。四、文本到图像生成Text-to-Image with Stable Diffusion4.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.ckpt4.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 集成的主要区别Safety Checker 模块脚本启动时加载CompVis/stable-diffusion-safety-checker与AutoFeatureExtractortxt2img.py对每张输出做 NSFW 概念检测一旦命中便用assets/rick.jpeg替换该样本check_safety。不可见水印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 (eta0.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文本编码器换成 BERTEmbeddercontext_dim1280cond_stage_trainabletruecheckpoint 指向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 的推理流程可归纳为seed_everything(opt.seed)固定随机种子OmegaConf.load(config)读取 YAML 配置load_model_from_config通过ldm.util.instantiate_from_config按target字段构造 LatentDiffusion 模型并加载state_dict计算无条件与条件嵌入uc get_learned_conditioning([])、c get_learned_conditioning(prompts)构造潜在形状[C, H//f, W//f]调用sampler.sample(...)得到潜在样本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_emaFalse——否则代码会尝试从非 EMA 权重切换到 EMA 权重而失败。如果你拿到同时包含两类权重的full checkpointuse_emaFalse会加载并使用其中的非 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_tokenTrue ).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 Diffusion5.1 原理SDEdit 式的去噪-去噪机制利用SDEditdiffusion-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.8strength是 0.0~1.0 之间的浮点数控制加入输入图像的噪声量越接近 1.0允许的改动越大、生成变体越丰富但输出与输入在语义上的一致性也越差。对照 img2img.py 源码可以看清其精确语义默认--strength 0.75、--scale 5.0、--ddim_steps 50、--n_samples 2load_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_encsqrt(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 不符增大--scaleguidance让模型更听文本指令但过大会导致饱和伪影配合增大--ddim_steps通常能改善质量。img2img 保留度控制--strength越低越贴近原图、越高改动越大若想只改风格不改结构请把 strength 控制在 0.5 以下并配合合适的--scale。可复现性固定--seed或使用--fixed_code让一批样本共享同一初始噪声。八、参考与致谢Comments扩散模型代码库大量借鉴了 OpenAI 的 ADMguided-diffusion代码库与 lucidrains 的 denoising-diffusion-pytorch特此致谢Transformer 编码器实现来自 lucidrains 的 x-transformers。九、引用BibTeXmisc{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点击查看免费下载相关推荐stable-diffusion-webui核心功能揭秘txt2img与img2img完整指南stable diffusion webui核心功能揭秘txt2img与img2img完整指南 引言AI图像生成的双引擎 你是否曾因复杂的命令行操作而对St人工智能本地部署媒体生成如何利用gpt-repository-loader提升团队代码审查效率完整指南如何利用gpt repository loader提升团队代码审查效率完整指南 在现代软件开发流程中代码审查是保障代码质量的关键环节但随着项目规模扩大和团DiffusionBee架构深度解析基于TensorFlow的Stable Diffusion实现原理DiffusionBee架构深度解析基于TensorFlow的Stable Diffusion实现原理 DiffusionBee 是一款专为 M1 Mac 用人工智能大模型媒体生成本地部署AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考