stable diffusion v1.4官方版(CompVis)本地复现手册
主页:https://github.com/wjxpro
邮箱:804359553@qq.com
文章目录
- **stable diffusion v1.4官方版(CompVis)本地复现手册**
- 〇、说明
- 环境
- 一、准备
- 1. [stable-diffusion](https://github.com/CompVis/stable-diffusion)(标题链接可点)
- 2. [sd-v1-4.ckpt](https://huggingface.co/CompVis/stable-diffusion-v-1-4-original/tree/main)
- 3. [clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14/tree/main)
- 4. [safety_checker](https://huggingface.co/CompVis/stable-diffusion-v1-4/tree/main/safety_checker)
- 二、构建
- 1. ldm虚拟环境
- 2. 使用
- 3. 重要超参数解释
- 三、修改源码
- 超参数
- 禁用安全检查器
- 禁用不可见水印
- 四、生成结果示例
- 生成结果示例
〇、说明
对于只想体验stable-diffusion
的朋友,可以参考这篇教程1使用网页版。对于想要进行深入研究、要进行本地版部署的朋友,现有教程大多使用基于WebUI版23以及非官方版4复现的,也有一些是基于官方版本56复现的,但是其版本已经过时,因此我重新复现了官方的CompVis v1.4版(2023年4月10日),希望能帮助到大家。
环境
windows环境下部署,需要有显卡,显存大于4G,显存大小影响可以生成图片的最大尺寸。工程最终大小约为7GB,请注意存储位置。
请自行配置Python运行环境(
Anaconda
、VS Code
)、CUDA、cudnn,注意修改国内镜像源,并保证可用。
一、准备
1. stable-diffusion(标题链接可点)
下载工程源码并解压,关于国内无法访问github,除了挂代理也可以通过修改DNS加速,工具下载地址。
2. sd-v1-4.ckpt
下载权重模型,只下载sd-v1-4.ckpt
(约3.97GB)就可以。下载完成后,将其放在工程根目录下。
3. clip-vit-large-patch14
下载openai的分词器clip-vit-large-patch14
,本人猜测这个模型用于将输入的prompt
转换为stable-diffusion
的输入特征。需要下载的内容包括:
- pytorch_model.bin(约1.59GB)
- config.json
- merges.txt
- preprocessor_config.json
- special_tokens_map.json
- tokenizer.json
- tokenizer_config.json
- vocab.json
下载完成后,在工程根目录创建文件夹openai\clip-vit-large-patch14
,将下载的内容放入其中。
4. safety_checker
下载安全性检查器。这个模型用于检测生成的内容是否为NSFW内容,如果是,则将其替换为assets\rick.jpeg
(你被骗了)。需要下载的内容包括:
- pytorch_model.bin(约1.13GB)
- config.json
下载完成后,在工程根目录创建文件夹CompVis\stable-diffusion-safety-checker
,将下载的内容放入其中。
二、构建
1. ldm虚拟环境
参照源码README
,在Anaconda
环境下,可以使用如下命令创建并激活ldm
虚拟环境:
conda env create -f environment.yaml
conda activate ldm
此处可能产生两个报错:
ImportError: cannot import name 'SAFE_WEIGHTS_NAME' from 'transformers.utils'
解决方案参照此issue:修改environments.yaml
,将diffusers
改为diffusers==0.12.1
。Pip subprocess error: ERROR: Command errored out with exit status 128: git fetch -q ...
参照5的解释,因为环境中包含了两个从github
上下载的子工程,所以这个问题需要检查当前网络环境对github的访问是否通畅,然后重新下载:
也可以通过以下命令更新环境:# 查看已存在环境 conda env list # 先切换到base环境 conda activate base # 删除ldm conda env remove --name ldm
conda env update -f environment.yaml
2. 使用
在工程根目录下,激活ldm
虚拟环境,然后直接运行script中的脚本即可。如果使用命令行运行,一个示例命令如下:
python scripts/txt2img.py --ckpt "sd-v1-4.ckpt" --prompt "a photograph of an astronaut riding a horse" --plms --H 256 --W 256
3. 重要超参数解释
以文本生成图片(script\txt2img.py
)为例:
超参数 | 解释 |
---|---|
ckpt | 模型权重文件路径(相对于根目录) |
prompt | 生成图像需要的文本提示 |
H | 生成图像的高 |
W | 生成图像的宽 |
n_iter | 一次运行进行n次采样 |
n_samples | 一次采样生成n张图像 |
seed | 随机数种子,修改其值可生成不同的结果 |
skip_grid | 不生成拼接的图像,拼接的图像由n_iter 行n_samples 列构成 |
skip_save | 不生成独立的图像 |
outdir | 结果保存的文件夹路径 |
plms | 一个采样器,暂未深入研究 |
三、修改源码
超参数
可以直接修改超参数的默认值减少命令行输入内容,一个修改示例如下:
推荐修改的超参数 | 推荐修改值 |
---|---|
ckpt | sd-v1-4.ckpt |
plms | True |
H | 256 (适用于显存小的显卡) |
W | 256 (适用于显存小的显卡) |
禁用安全检查器
安全检查器有1GB多,不想下载的朋友可以按如下方法进行修改。(NSFW警告)
- 注释掉27-29行的
# load safety model
内容:
# safety_model_id = "CompVis/stable-diffusion-safety-checker"
# safety_feature_extractor = AutoFeatureExtractor.from_pretrained(safety_model_id)
# safety_checker = StableDiffusionSafetyChecker.from_pretrained(safety_model_id)
- 注释掉88-95行
check_safety
函数:
# def check_safety(x_image):
# safety_checker_input = safety_feature_extractor(numpy_to_pil(x_image), return_tensors="pt")
# x_checked_image, has_nsfw_concept = safety_checker(images=x_image, clip_input=safety_checker_input.pixel_values)
# assert x_checked_image.shape[0] == len(has_nsfw_concept)
# for i in range(len(has_nsfw_concept)):
# if has_nsfw_concept[i]:
# x_checked_image[i] = load_replacement(x_checked_image[i])
# return x_checked_image, has_nsfw_concept
- 318行内容修改:
x_checked_image, has_nsfw_concept = check_safety(x_samples_ddim)
修改为:
x_checked_image = x_samples_ddim
禁用不可见水印
- 注释掉262-265行内容:
# print("Creating invisible watermark encoder (see https://github.com/ShieldMnt/invisible-watermark)...")
# wm = "StableDiffusionV1"
# wm_encoder = WatermarkEncoder()
# wm_encoder.set_watermark('bytes', wm.encode('utf-8'))
- 注释掉327与343行内容:
# img = put_watermark(img, wm_encoder)
四、生成结果示例
默认prompt
: a painting of a virus monster playing guitar
完
https://zhuanlan.zhihu.com/p/560226367 ↩︎
https://zhuanlan.zhihu.com/p/617997179 ↩︎
https://zhuanlan.zhihu.com/p/617997179 ↩︎
https://zhuanlan.zhihu.com/p/565851314 ↩︎
https://juejin.cn/post/7143441237037711396 ↩︎ ↩︎
https://zhuanlan.zhihu.com/p/563731965 ↩︎