如何用ESD生成擦除前后对比图?Erasing Concepts from Diffusion Models推理实战教程
【免费下载链接】erasingErasing Concepts from Diffusion Models项目地址: https://gitcode.com/gh_mirrors/er/erasing
Erasing Concepts from Diffusion Models(简称 ESD)是一个基于 diffusers 的开源项目,用于从 Stable Diffusion、SDXL、FLUX 等扩散模型中精确"擦除"指定概念——比如去掉画面的艺术风格、移除特定物体、清除不当内容,而保留模型其余生成能力。本教程手把手带你完成 ESD 推理实战:从环境配置、加载权重,到固定随机种子生成擦除前后对比图,全程无需复杂改动,新手也能 10 分钟跑通。🚀
ESD 是什么?三分钟看懂概念擦除
传统做法是重新训练或微调整个模型来"遗忘"某个概念,成本高且容易破坏原有能力。ESD 的思路完全不同:它只需一个简短文字描述(如 "Van Gogh"),对模型权重做轻量微调,让生成结果自动"绕开"该概念,同时保持其他生成能力几乎不变。
上图展示了 ESD 的三类典型应用:擦除裸露内容(Erasing Nudity)、擦除艺术风格(Erasing Artistic Style)、擦除物体(Erasing Objects),每列上方是原始模型输出,下方是编辑后模型的输出。可以看出,被擦除的元素消失后,画面构图和整体质量依然在线。
从原理上看,训练时 ESD 让"待微调模型"的输出与"冻结的原始模型"输出产生差异,并通过 L2 损失把生成轨迹推向与目标概念相反的方向,具体流程可参考项目自带的原理图:
环境准备:一条命令安装依赖
ESD 代码库已经重构得相当精简,训练与推理统一基于 diffusers,官方文档在 docs/official.md。安装只需三步:
git clone https://link.gitcode.com/i/a1f7ef760f0990e8f1d405b223150538 cd erasing pip install -r requirements.txt依赖清单见 requirements.txt,其中核心是diffusers、torch、safetensors。如果使用 FLUX 系列模型,记得先把 diffusers 与 transformers 升级到最新版。硬件上,一张 8GB 以上显存的 NVIDIA 显卡即可流畅运行 SD 1.x 的推理。
快速生成对比图:一条命令出图
项目提供了开箱即用的批量出图脚本 evalscripts/generate-images.py,它自动检测 checkpoint 目标组件(unet 或 transformer),SD、SDXL、FLUX 通用。
生成对比图的核心思路是"同一提示词、跑两次":
- 第一次不带 ESD 权重,得到原始模型的输出;
- 第二次带上 ESD 权重,得到擦除后的输出。
命令示例如下(以 SDXL + Kelly 概念为例,提示词来自 data/kelly_prompts.csv):
# 生成原始模型输出 python evalscripts/generate-images.py --base_model 'stabilityai/stable-diffusion-xl-base-1.0' --prompts_path 'data/kelly_prompts.csv' --num_samples 1 --num_inference_steps 20 --guidance_scale 7 # 加载 ESD 权重,生成擦除后输出 python evalscripts/generate-images.py --base_model 'stabilityai/stable-diffusion-xl-base-1.0' --esd_path 'esd-models/sdxl/esd-kelly-from-kelly.safetensors' --prompts_path 'data/kelly_prompts.csv' --num_samples 1 --num_inference_steps 20 --guidance_scale 7两次运行使用相同的--base_model与提示词文件,图片会自动保存到esd-images/目录下对应模型名的文件夹中,把相同case_number的两张图并排放置,就是一张标准的擦除前后对比图。
进阶实战:固定随机种子,精确复现对比效果
批处理脚本适合快速出图;如果想要"同一提示词 + 完全相同的种子"做逐像素级对比,推荐直接在 Notebook 中手动推理。项目内置了针对不同底座的推理模板:
- notebooks/esd_inference_sd.ipynb(SD 1.x)
- notebooks/esd_inference_sdxl.ipynb(SDXL)
- notebooks/esd_inference_flux.ipynb(FLUX)
- notebooks/esd_inference_flux2_klein.ipynb(FLUX.2 Klein)
第 1 步:加载模型并保存原始权重
pipe = StableDiffusionPipeline.from_pretrained(basemodel_id, torch_dtype=torch.bfloat16, safety_checker=None).to('cuda:0') original_weights = deepcopy(pipe.unet.state_dict()) # 备份原始权重 esd_weights = load_file("../esd-models/sd/esd-cowboy_hat-from-cowboy-esdx.safetensors")第 2 步:先出原图,再换 ESD 权重出擦除图
关键技巧是固定随机种子:用torch.Generator().manual_seed(seed)锁定种子后,原始模型与 ESD 模型在相同提示词下生成的画面结构几乎一致,差异只会出现在被擦除的概念上,对比效果一目了然。
seed = random.randint(0, 2**15) # 用原始权重生成 pipe.unet.load_state_dict(original_weights, strict=False) image_original = pipe(prompt, num_inference_steps=20, guidance_scale=7.5, generator=torch.Generator().manual_seed(seed)).images[0] # 换 ESD 权重再次生成 pipe.unet.load_state_dict(esd_weights, strict=False) image_erased = pipe(prompt, num_inference_steps=20, guidance_scale=7.5, generator=torch.Generator().manual_seed(seed)).images[0]两份 checkpoint 的加载、保存、组件自动识别逻辑封装在 utils/esd_checkpoint.py 中;SD/SDXL/FLUX 各自的数据管线则在 utils/sd_utils.py、utils/sdxl_utils.py、utils/flux_utils.py 中。出图后用 PIL 水平拼接两张图,就是效果极佳的对比图素材。
实战案例:艺术风格与不当内容擦除
案例一:擦除艺术风格
用 ESD 擦除特定画家风格(如 Thomas Kinkade、Kilian Eng、Kelly McKernan),效果对比如下:原始模型生成浓烈风格化画面,ESD 模型则输出更写实的普通场景,且其他构图元素基本保留。
训练这类风格擦除模型只需一条命令,例如:
python esd_sd.py --erase_concept 'Van Gogh' --train_method 'esd-x'训练入口见 esd_sd.py(SD)、esd_sdxl.py(SDXL)、esd_flux.py(FLUX)。更妙的是,ESD 还支持"从某个概念里只擦掉一个属性"——比如只擦掉牛仔的帽子而保留牛仔本身:--erase_concept 'cowboy hat' --erase_from 'cowboy'。
案例二:擦除不当内容
对于 NSFW 场景,ESD 同样有效。下图为不同方法在"暴露身体部位减少比例"上的量化对比,可以看到 ESD 方法(Our Method)在绝大多数部位上实现了接近 -100% 的显著抑制,明显优于 SLD 与原生 SD 2.x 方案。
如果你要复现论文中的 NSFW 指标,可结合 evalscripts/nudenet-classes.py 与 evalscripts/imageclassify.py 进行自动评估。
如何评估擦除效果:从"肉眼对比"到"量化打分"
除了主观对比,项目还提供了量化评估手段:
- LPIPS 感知距离:用 evalscripts/lpips_eval.py 计算擦除前后图像的感知差异,距离越大说明改动越明显;
- 批量评估:先用 evalscripts/generate-images.py 对大量提示词批量出图,再统一比对,结果更客观;
- 风格损失:evalscripts/styleloss.py 可用于度量风格特征的残留程度。
评估时注意:对比图必须使用相同的种子、步数、guidance_scale,否则差异可能来自采样随机性而非擦除效果。🎯
常见问题 FAQ
Q1:加载 ESD 权重时提示 base_model 不匹配?checkpoint 中保存了元数据(base_model_id),如果与你加载的底模不一致会给出 Warning。只要训练与推理使用同一底模即可放心忽略,元数据读写逻辑见 utils/esd_checkpoint.py。
Q2:脚本提示 "Loaded ESD weights into pipe.transformer"?这是正常的。新版本会自动检测权重对应unet还是transformer(FLUX 系列使用 transformer 结构),无需手动指定--component。
Q3:显存不够怎么办?推荐使用torch.bfloat16精度推理,并适当降低--num_inference_steps(20 步即可获得不错效果)。新版训练核心已共享,训练显存占用约为旧版一半,训练入口统一在 utils/esd_trainer.py。
Q4:提示词数据从哪来?项目在 data/ 目录下提供了大量现成 CSV 提示词集,如 data/kelly_prompts.csv、data/art_prompts.csv、data/unsafe-prompts4703.csv,可直接用于测试与评估。
总结
用 ESD 生成擦除前后对比图,本质只有三步:备份原始权重 → 加载 ESD 权重 → 固定种子生成。无论你是想验证风格擦除效果、清理不当内容,还是为论文/评测准备对比素材,这套"同一提示词 + 固定种子"的流程都足够可靠。快去克隆 erasing 项目 动手试试吧!💡
【免费下载链接】erasingErasing Concepts from Diffusion Models项目地址: https://gitcode.com/gh_mirrors/er/erasing
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考