基于c++版ncnn实现的“屎山+盲盒”版stable-diffusion
知乎介绍文章: https://zhuanlan.zhihu.com/p/582552276
- 对于模型的使用,请参照官方stable-diffusion的模型license的说明,这里不在赘述,请自觉遵守
- 该代码只使用cpu,经过调整,只需要8G内存!!!
- 感谢nihui的pr,目前出图质量稳定(咒语要写得好),欢迎尝试
- stable-diffusion就三个步骤:
- CLIP做文本的嵌入
- 使用采样算法进行迭代采样
- decode解码采样结果到最终图像
- 模型细节:
- 模型:Naifu(懂得都懂)
- 采样:k-diffusion的euler ancestral
- 分辨率:512*512
- 降噪器:CFGDenoiser和CompVisDenoiser
- prompt:支持positive和negative
- 由于目前速度不咋快,因此不分发exe了,大家自己编译吧
- 从百度网盘或Google Drive下载三个bin放到对应的assets目录下进行编译
- 代码里面给了一个简单的测试prompt
- 对prompt很敏感,要想出图好,prompt就得写得好
- 速度较慢,一个step在5~10s不等
这里把stable diffusion用到的三个onnx模型放出来,方便大家做一些有意思的工作,模型也在上面的百度网盘链接里面
- 请自觉遵守的stable diffusion模型的协议,不要用于非法用途!
- 如果你用这些onnx做了开源项目,还请来踢一踢我,我去给大佬捧个人场
一共有三个模型,按照使用顺序依次为:FrozenCLIPEmbedder、UNetModel、AutoencoderKL。使用方法可以参考ncnn的代码。但ncnn中使用的模型,相比于onnx模型,还额外合并了一些辅助计算用以加速整体代码,下面是ncnn模型和onnx模型的输入输出对齐说明:
- FrozenCLIPEmbedder
ncnn输入输出: token, multiplier, cond, conds
onnx输入输出: onnx::Reshape_0, 2271
z = onnx(onnx::Reshape_0=token)
origin_mean = z.mean()
z *= multiplier
new_mean = z.mean()
z *= origin_mean / new_mean
conds = torch.concat([cond,z], dim=-2)
- UNetModel
ncnn输入输出: in0, in1, in2, c_in, c_out, outout
onnx输入输出: x, t, cc, out
outout = in0 + onnx(x=in0 * c_in, t=in1, cc=in2) * c_out
- AutoencoderKL模型ncnn与onnc一致,直接使用即可