¡Difusión estable implementada por NCNN Framework basado en C ++, admitido TXT2Img e IMG2Img!
Zhihu: https://zhuanlan.zhihu.com/p/5825552276
Video: https://www.bilibili.com/video/bv15g411x7hc
Txt2Img Performance (Time Pre-IT y RAM)
| PER-IT | I7-12700 (512x512) | I7-12700 (256x256) | Snapdragon865 (256x256) |
|---|---|---|---|
| lento | 4.85s/5.24g (7.07g) | 1.05s/3.58g (4.02g) | 1.6S/2.2G (2.6G) |
| rápido | 2.85s/9.47g (11.29g) | 0.65s/5.76g (6.20 g) |
2023-03-11: Feliz de agregar IMG2Img Android y lanzar un nuevo APK
2023-03-10: feliz de agregar img2img x86
2023-01-19: Acelerar y menos RAM en x86, forma dinámica en x86
2023-01-12: Actualice el último código NCNN y use el modelo Optimize, actualice Android, agregue Memory Monitor
2023-01-05: agregue el modelo 256x256 al proyecto X86
2023-01-04: fusionar y terminar la OP MHA en x86, habilitar Gelu rápido


Todos los modelos y archivo exe que puede descargar desde 百度网盘 o google drive o lanzamiento
Si solo necesita modelo NCNN, puede buscarlo desde 硬件模型库-设备专用模型, sería más rápido y gratuito.
AutoencoderKL-fp16.bin, FrozenCLIPEmbedder-fp16.bin, UNetModel-MHA-fp16.bin, AutoencoderKL-encoder-512-512-fp16.bin y ponerlos a la carpeta de assetsmagic.txt , cada línea es:stable-diffusion.exeNota: Cumplir con los requisitos del modelo SD y no lo use para fines ilegales
AutoencoderKL-fp16.bin, FrozenCLIPEmbedder-fp16.bin, UNetModel-MHA-fp16.bin, AutoencoderKL-encoder-512-512-fp16.bin y ponerlos a la carpeta de assets cd x86/linux
mkdir -p build && cd build
cmake ..
make -j $( nproc )AutoencoderKL-fp16.bin, FrozenCLIPEmbedder-fp16.bin, UNetModel-MHA-fp16.bin y ponerlos en la carpeta build/assets./stable-diffusion-ncnnAutoencoderKL-fp16.bin, FrozenCLIPEmbedder-fp16.bin, UNetModel-MHA-fp16.bin y póngalos en la carpeta de assetsHe subido los tres modelos ONNX utilizados por difusión estable, para que pueda hacer un trabajo interesante.
Puede encontrarlos desde el enlace de arriba.
ncnn (input & output): token, multiplier, cond, conds
onnx (input & output): 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 ) ncnn (input & output): in0, in1, in2, c_in, c_out, outout
onnx (input & output): x, t, cc, out
outout = in0 + onnx(x=in0 * c_in, t=in1, cc=in2) * c_out