← 学习导读
CODING WITH AI · LECTURE 04 · LAB 06
LAB 06 · 真实文生图与编辑
同一个模型,为什么每次会画出不一样的图?这册从一只窗边杯子开始,把随机起点、提示词、CFG、更新步数和编辑范围分开观察。
这里保存了本次实际运行的 23 张 512×512 原始输出:18 张文生图、3 张 img2img、2 张 inpainting。采用普通 Stable Diffusion 1.5 预训练权重,没有训练新模型,也没有用加速蒸馏模型代替 CFG 实验。三个种子全部保留;基线图在各组中复用,没有为了图好看而更换种子。原定22张完成后,仅增加一次遮罩位置的定向跟进;原来的编辑失败也保留在图阵中。
先看图,再选一项参数重算。下载 Notebook 内嵌保存图阵,不需要 GPU 或联网即可阅读保存输出;重新生成需要依赖、模型权重和计算资源。
回到 N34 的 CFG · 回到 N41 的编辑 · 网页实验
固定什么,改变什么
基线提示词:A red ceramic mug on a wooden table beside a window, soft daylight, still life photograph。
| 对照 |
唯一改变项 |
其余固定 |
| 随机起点 |
seed = 11 / 23 / 37 |
红杯提示、CFG 4、20 步 |
| 文本条件 |
red → blue |
同一种子的原始 latent、CFG 4、20 步 |
| CFG |
1 / 4 / 8 |
同一种子的原始 latent、红杯提示、20 步 |
| 步数 |
10 / 20 / 40 |
同一种子的原始 latent、红杯提示、CFG 4 |
| img2img |
strength = 0.25 / 0.55 / 0.85 |
同一原图、蓝杯提示、seed 11、CFG 4、名义20步 |
文生图不只重设随机种子,还保存并复用每个种子的同一初始 latent。DDIM 的 eta=0 固定,改变步数会改变使用的时间网格。img2img 的 strength 同时改变加入的噪声量与实际去噪区间,这正是该参数的实现含义;不能把它解释成只给图像加了一个后处理滤镜。
1 · 条件相同,答案仍不唯一
三张图只改变 seed。先指出共有的条件:杯子、木桌、窗边、日光;再找没有被条件唯一决定的构图、杯形、把手和光影。三张样本只能提供具体观察,不能估计整个模型的多样性。
2 · 同一起点,只把 red 改为 blue
每一行复用同一份初始 latent,左侧是 red,右侧是 blue。颜色是我们改变的文本条件,但生成过程仍可能改变光线、边缘或局部形状。检查哪几项保持近似、哪几项跟着改变,不要把提示词差异理解为逐像素编辑指令。
本组中,三张blue条件图都出现了蓝色杯子,但seed11同时改变了杯子的位置,seed37的杯子占画面比例也明显变大。相同噪声提供一个可比起点,并不锁死构图。
3 · CFG 调整条件方向的力度
每一行保持同一份起始噪声,从左到右只改 guidance_scale=1,4,8。先比较杯子是否出现、颜色与材质是否贴近提示,再比较纹理、明暗与局部瑕疵;不要预设“越大越好”。
本组的红色在较大CFG下通常更明显,但seed37在CFG4时是一只红杯,CFG8时旁边又出现大型红色容器。颜色条件更突出,并不等于物体数量、结构和构图同时更符合预期。
本册固定 Diffusers 0.35.1 的普通 StableDiffusionPipeline。其实现为:
prediction = empty_text_prediction + s * (text_prediction - empty_text_prediction)
在同一噪声状态和时间点,用相同网络分别预测“空文本”和“给定文本”,再放大两者之差。s=1 是文本条件预测本身,并非无条件生成;这个实现只有 s>1 才执行双分支 CFG。negative_prompt="" 固定为空文本,本册没有将 s=0 当作无条件基线。机制见 v0.35.1 源码 L764 与 L1054。
4 · 多做更新,会改变什么
每一行保持种子、初始 latent、提示词和 CFG 不变,只改 10、20、40 步。比较结构与纹理是否稳定、哪里出现新的变化。更多步意味着更多网络调用,并不保证每一个局部都更好;这些图也不能证明一个调度器优于另一个,因为调度器没有被比较。
看seed37:40步在杯子之外又出现了红色容器和书。它不是20步图的单纯“精细版”。一次完整采样会沿自己的时间网格推进,改变步数可以改变最后落到的答案。
5 · 从同一原图开始,增加改动空间
左侧固定使用 seed 11 的红杯基线。后三张使用同一个蓝杯提示、同一个重置种子,只改变 img2img 的 strength。名义步数20,对应本实现实际更新区间为5、11、17步。
低 strength 从接近原图的状态开始,通常更容易留下布局,但也可能不充分服从“蓝色”这一新条件;高 strength 允许更大变化。用本组图检查这两个倾向,避免把它说成必然规律。img2img 不显式保护某一区域;这与下一组的遮罩约束不同。
本组实际结果没有可靠完成“红杯变蓝”:0.25与0.55大体保留了红杯,0.85改变了窗格,并增加了一个小杯与杯碟。变化更大并不等于指定编辑成功。三张均照实保留;下一次可以固定strength,只改CFG或提示措辞中的一项来追问原因。
6 · 遮罩告诉模型期望修改哪里
白色矩形是期望编辑的区域,黑色部分作为上下文参考;这并不保证黑色区域的每个像素完全不变。这个固定几何遮罩并不是自动分割出的杯子:它覆盖画面中央,因此没有完整包住左侧原杯。将这张遮罩与输出一起看,区分“指定区域生成”和“自动理解并替换整个对象”。
本例使用 Stable Diffusion 1.5 的专用 inpainting 权重、蓝杯提示、seed 11、CFG 4、20 步。展示的是模型原始输出,没有将遮罩外像素再贴回原图。遮罩外变化也保留并单独计算;这不是 RePaint 的算法复现。
上排是原定中央遮罩:实际输出主要重建了窗格,左侧杯子仍为红色。看到这个失败后,下排增加一次定向跟进:仅将矩形改为完整包住杯子的范围,其余参数保持相同。两张输出都展示,以便判断遮罩是否真正覆盖了想改的对象;这不是把第二张伪装成预先成功的案例。
跟进结果确实重画了杯子:红杯变成了形状不同的白杯,仍然没有满足提示中的蓝色。这里分别看到了区域修改生效与颜色条件未满足;“模型运行成功”“目标区域发生变化”和“编辑目标达成”是三个不同判断。

把观察变成一个可检验的判断
选一组图,写下三句话:这次只改了什么;你在图中实际看到什么;哪一个更强的结论还不能据此得出。比如“这个种子下 CFG 8 的红色更明显”并不能推出“提高 CFG 总能提高质量”。
若要继续,先固定一张基线,只改一个参数并保存结果。给出原图、参数和输出,比单独发一张“好看”图片更容易让同学或 AI 帮你判断。
可选重算:先选一张
阅读保存图不需要安装推理依赖。若要重算,在已具备计算资源的Python环境中安装下面的固定依赖,选择 TASK,再把 RUN_RECOMPUTE 改为 True。代码只生成所选任务的一张图,不会默认再跑完整23张。
安装示例:pip install torch==2.8.0 diffusers==0.35.1 transformers==4.55.4 accelerate==1.10.1 huggingface-hub==0.34.4 safetensors==0.6.2。PyTorch安装包应与自己的设备匹配;CPU结果是本册的基线。初次运行会下载模型权重并写入缓存,输出保存在 student-results/。这不需要付费图像API,但会占用所在环境的存储和计算资源。
TASK 可选 txt2img、img2img 或 inpainting。文生图中固定其他参数,只改 SEED、PROMPT、CFG、STEPS 中的一项;img2img 先只改 STRENGTH。编辑任务使用保存的 seed 11 原图,自动核对其 SHA256;遮罩仍为同一几何矩形。不要同时改多项再将变化归因于其中一个。
完整实验源码 · 逐图参数与时间 · 遮罩内外像素变化
运行来源与重算边界
这23张图实际运行于 本地执行环境的 CPU(8核配额、8GiB内存、AMD EPYC 9V74,bfloat16),不是Deepnote GPU运行。保存结果时间为 2026-09-29T00:01:01.907763+00:00 至 2026-09-29T00:25:23.473353+00:00;逐图用时、参数、初始latent哈希、图片SHA256和安全检查结果见 results/manifest.json。总推理时间约 21.5 分钟,不含首次模型下载;其他设备的耗时可能不同。
| 项目 |
固定值 |
| 文生图 / img2img |
stable-diffusion-v1-5/stable-diffusion-v1-5 |
| 权重 revision |
451f4fe16113bff5a5d2269ed5ad43b0592e9a14 |
| Inpainting |
stable-diffusion-v1-5/stable-diffusion-inpainting |
| Inpainting revision |
8a4288a76071f7280aedbdb3253bdb9e9d5d84bb |
| 主要依赖 |
PyTorch 2.8.0+cpu / Diffusers 0.35.1 / Transformers 4.55.4 |
| 数值与采样 |
CPU bfloat16 / DDIM / eta=0 / 512×512 |
Deepnote 原有环境探测run 3f9e0c0d-2c7b-4ca8-b6d0-8a03f35aa48e 显示2核CPU配额、5GiB内存、CUDA不可用。该run只证明探测成功,不能当作生成成功。这里将本地生成结果同步为可阅读教材,默认不在云端重复消耗推理时间。
精确种子不保证跨设备、数值精度或软件版本逐像素一致。重新计算时记录实际环境;不要将不同精度生成的图与本组混成一个“单变量”对照。
来源:SD1.5 模型卡 · inpainting 模型卡 · Diffusers img2img 说明。
下载原图与逐图参数(23张全部保留)