Stable Diffusion 是一种基于概率扩散过程的生成模型,通过模拟数据分布的扩散过程来生成数据。这个模型的应用场景非常广泛,包括图像的生成、文本的生成和音频的生成,其中在图像生成领域,可以生成人脸、风景、物体等图像,并通过定制的条件信息,实现风格迁移、图像修复等任务。本文档将就图像生成方面的应用给出详细的实现,虽然 Stable Diffusion 模型也提供 UI 交互和很多复杂高阶的应用,这些留在以后慢慢分享。
首先初始化一个“管道”,这是机器学习领域中非常常用的一个概念,表示搭建一个从输入到输出的完整工作流程,包括预处理、模型推理和后处理等步骤,其中 task 参数指定这个管道要执行的任务类型为“文本到图像合成”,即根据用户输入的文本描述来自动生成图像; model 参数指定了模型的路径,指向预先训练好的模型文件存放的位置;torch_dtype 参数设置模型运行时使用的数据类型,如果当前系统支持 CUDA,那么模型会使用半精度浮点数(torch.float16)进行运算,这样做可以加速计算过程并减少内存占用,如果不支持 CUDA,则会回退到全精度浮点数(torch.float32)进行运算。
pipe = pipeline(
task=Tasks.text_to_image_synthesis,
model='multi-modal_chinese_stable_diffusion_v1.0',
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32
)
接下来调用之前定义的 pipe 管道来生成图像,参数为字典类型,包含了多个键值对来定制图像生成的过程。text 参数为生成图像的最主要的依据,即用户提供的文本描述或提示; negative_prompt 参数指导模型避免生成某些特定内容,例如用户希望生成的图像中不包含某些元素; width 和 height 参数指定了生成图像的宽度和高度,单位为像素;num_outputs 参数表示希望模型生成的图像数量;num_inference_steps 参数为控制图像生成过程中的推理步数,更多的推理步数意味着更长的生成时间,不过可能能够换来质量更高的图像;guidance_scale 参数是一个影响图像生成质量和多样性的参数,越高的比例值越会使生成的图像接近于文本提示,但同时也会牺牲一些多样性,越低的比例值越可能产生更多变异性,与文本描述或提示信息的契合度越低。
output = pipe(
{
'text': '一只趴在地上的小花猫',
'negative_prompt': '奔跑和跳跃',
'width': 512,
'height': 512,
'num_outputs': 1,
'num_inference_steps': 7.5,
'guidance_scale': 50
}
)
最后一步将生成的图像数据转换为 bytearray,cv2 是 OpenCV 库中的一个广泛用于图像处理的库,imencode 函数是将图像编码为内存缓冲区中的指定格式,output['output_imgs'][0] 表示从之前生成的图像输出中取出第一张图像,numpy.array 方法将编码后的图像数据转换为 NumPy 数组,获取图像的数据部分,bytearray 方法则是将 NumPy 数组形式的图像数据转换为用于存储的二进制数据,以便于在网络上传输或保存到磁盘。
file_data = bytearray(numpy.array(cv2.imencode('.jpg', output['output_imgs'][0])[1]))
至此整个文生图片的实现就结束了,需要说明的是,图片生成的效果好坏和提示信息等参数有着非常非常密切的联系,在实际应用中,如果使用标准通用模型的话,其实效果并不能十分令人满意,这个心里预期还是要有的,至于个性化训练以后的模型,倒是可以值得期待一下。