近来,基于Diffusion的文图生成模型比较火,用户输入一句话,模型就可以生成一副对应的图像,还是很有意思的。本文记录了通过PaddleHub快速实现上述任务的过程,以供参考。
1、安装PaddlePaddle
PaddleHub底层依赖于百度自研的开源框架PaddlePaddle,可以根据官方提供的方式来快速安装,目前文档还是挺全面的。
官方链接如下:https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/linux-pip.html
安装前需要确定系统相关的环境,以下是我选择的安装命令:
python -m pip install paddlepaddle-gpu==2.3.2.post111 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
2、安装PaddleHub
PaddleHub开源了较为丰富的预训练模型,涵盖大模型、CV、NLP、Audio、Video、工业应用主流六大品类的 360+ 预训练模型。这里我们主要是会用到其中的文图生成模型,包括Stable Diffusion和Disco Diffusion两种。
https://github.com/PaddlePaddle/PaddleHub/blob/develop/README_ch.md
!pip install --upgrade paddlehub -i https://mirror.baidu.com/pypi/simple
3、模型推理
PaddleHub对于模型封装的已经很完善了,通过几行代码即可快速调用文图生成模型的接口。以下是PaddleHub上的介绍,先来看看示例Stable Diffusion模型的效果。
官方示例链接如下:
https://aistudio.baidu.com/aistudio/projectdetail/4512600
Stable Diffusion是一种潜在扩散模型(Latent Diffusion), 属于生成类模型,这类模型通过对随机噪声进行一步步地迭代降噪并采样来获得感兴趣的图像,当前取得了令人惊艳的效果。相比于Disco Diffusion, Stable Diffusion通过在低纬度的潜在空间(lower dimensional latent space)而不是原像素空间来做迭代,极大地降低了内存和计算量的需求,并且在V100上一分钟之内即可以渲染出想要的图像。
from PIL import Image
import paddlehub as hub
# 导入模型
module = hub.Module(name='stable_diffusion')
# 生成图像
result = module.generate_image(text_prompts="A beautiful painting of a singular lighthouse, shining its light across a tumultuous sea of blood by greg rutkowski and thomas kinkade, Trending on artstation.", output_dir='stable_diffusion_out')
# 将生成过程存成gif
result[0].chunks[-1].chunks.save_gif('beautiful_painting.gif')
输入:A beautiful painting of a singular lighthouse, shining its light across a tumultuous sea of blood by greg rutkowski and thomas kinkade, Trending on artstation.
输出默认是512*512的图像,如下:
4、更多的测试
到这里,我们就可以开始测试更多的输入了,大胆的尝试吧。如果设置seed的话,每次运行会生成不一样的图。
输入:A tree on the hilltop in autumn.
生成过程如下:
输入:A man face.
输入:A woman face.
5、尝试中文输入
上面提到的Stable Diffusion模型,暂时还不支持以中文作为输入。目前支持中文输入的模型给出了两个,都是Disco Diffusion的模型,生成图像的速度相对Stable Diffusion慢了很多,需要耐心等待。
官方示例链接如下:
https://aistudio.baidu.com/aistudio/projectdetail/4444998
示例代码如下:
from PIL import Image
import paddlehub as hub
# 导入模型
module = hub.Module(name='disco_diffusion_ernievil_base')
# 生成图像
result = module.generate_image(text_prompts="孤舟蓑笠翁,独钓寒江雪。", style='油画', width_height= [1280, 768], output_dir='孤舟蓑笠翁_油画', seed=1853109922)
# 将生成过程存成gif
result[0].chunks.save_gif('孤舟蓑笠翁.gif')
输入:孤舟蓑笠翁,独钓寒江雪。
6、问题解决方案
在使用的过程中,可能会出现一些问题,这里也记录下来。
问题1:无法使用GPU
解决方案:有可能是安装的PaddlePaddle不是gpu版本,需要卸载安装gpu版。
先使用如下命令查看当前安装的paddle和相关套件的版本:
pip list| grep paddle
查询信息如下:
paddle-bfloat 0.1.7
paddle2onnx 1.0.0
paddlefsl 1.1.0
paddlehub 2.3.0
paddlenlp 2.4.0
paddlepaddle-gpu 2.3.2.post111
如果确实有CPU版本,可通过如下命令卸载:
pip uninstall paddlepaddle
之后再选择合适的gpu版本来安装。
参考资料:https://github.com/PaddlePaddle/PaddleHub/issues/1301
问题2:Segmentation fault (core dumped)
解决方案:可能是cudnn版本不匹配导致的,建议检查cuda、cudnn以及paddlepaddle-gpu的版本是否匹配。
参考资料:https://github.com/PaddlePaddle/PaddleHub/issues/1301
体验下来,会发现参数中的text_prompts很重要,并不是任意的输入都能生成很好的图。在某些情况下,可以明显感觉到效果不太好,也是后续研究中需要重点解决的问题。