Qbot5.接入DALL·E图像生成/Disco Diffusion本地部署

Posted zstar-_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qbot5.接入DALL·E图像生成/Disco Diffusion本地部署相关的知识,希望对你有一定的参考价值。

该项目计划长期进行维护更新,欢迎star:https://github.com/zstar1003/Qbot

前言

Ai绘图的出现引发了美术界的变革,本篇尝试将Ai绘图融入进QQ机器人中。

DALL·E图像生成

和GPT-3类似,DALL·E同样是openai的产品,并且官方提供了调用API。
官方文档中明了调用方式,下面是python的调用示例:

import openai

openai.api_key = '自己的api_key'
response = openai.Image.create(
  prompt="a white siamese cat",
  n=1,
  size="1024x1024"
)
image_url = response['data'][0]['url']
print(image_url)

相关参数说明:

  • prompt:图像描述语
  • n:生成图片张数
  • size:图像尺寸,有256x256, 512x512, 1024x1024三种尺寸可选择

运行之后,生成的图片会存储在OpenAi云端,返回图片对应的url。

Qbot发送图片

QQ机器人采用的是go-cqhttp框架,该框架定义了一种CQ码,可以用来发送图片。
官方文档中给出了具体格式:

[CQ:image,file=http://baidu.com/1.jpg,type=show,id=40004]

其中,file参数指向一个网络图片路径。

因此,可以直接将DALL·E得到的图片路径赋值给CQ码的参数,相关函数如下:

# 发送群消息图片
def send_group_message_image(gid, pic_path, uid, msg):
    try:
        message = "[CQ:image,file=" + pic_path + "]"
        if msg != "":
            message = msg + '\\n' + message
        message = str('[CQ:at,qq=%s]\\n' % uid) + message  # @发言人
        res = requests.post(url=cqhttp_url + "/send_group_msg",
                            params='group_id': int(gid), 'message': message).json()
        if res["status"] == "ok":
            print("群消息发送成功")
        else:
            print("群消息发送失败,错误信息:" + str(res['wording']))
    except Exception as error:
        print("群消息发送失败")
        print(error)

Disco Diffusion本地部署测试

安装

虽然上面这样直接调用API很方便快捷,然而,每个账号都只有18$的限额,如果生成一张1024x1024的图片,将直接耗费0.02$。如果直接在本地进行Ai绘画,就可以摆脱限额限制。

找了目前主流的开源Ai绘图,流行较广的是novelai和Disco Diffusion。
novelai官方提供了封装较好的webui,并不利于二次开发。于是找了基于Disco Diffusion的discoart。
项目地址:https://github.com/jina-ai/discoart

项目文档中写明可用下列方式安装:

pip install discoart

不过实测发现该方式安装会出错,因此采用的理想方式是拷贝整个项目,然后使用setup.py进行安装:

python setup.py install

注:安装尽量创建一个新的虚拟环境,pytorch版本需手动安装为1.13.1,默认安装的pytorch版本不支持GPU。

不支持GPU的运行之后会出现不支持半精度推理的问题,检测是否支持GPU可用下面的方式进行检测:

import torch

print(torch.cuda.is_available())

使用

安装好之后,调用起来比较便捷,下面是一个调用示例:

from discoart import create

da = create(
    text_prompts='spring morning, a painting of Chinese water town , There are green trees on the bank, created by Makoto Shinkai and Hayao Miyazaki,Evgeny Lushpin, popular on cgsociety,ultrawide angle, soft light, 8K, fairy tales, dreams, tranquility, HD pictures',
    skip_steps=200,
    width_height=[400, 200]
)

运行完成后,会生成以下一系列参数,任何参数都可以通过上面类似的方式进行设定,不设定则使用默认值。

┌────────────────────────────┬────────────────────────────────────────────────┐
│                   Argument │ Value                                          │
├────────────────────────────┼────────────────────────────────────────────────┤
│                 batch_name │ None                                           │
│                 batch_size │ 1                                              │
│                 clamp_grad │ True                                           │
│                  clamp_max │ 0.05                                           │
│              clip_denoised │ False                                          │
│        clip_guidance_scale │ 5000                                           │
│                clip_models │ ['ViT-B-32::openai', 'ViT-B-16::openai',       │
│                            │ 'RN50::openai']                                │
│      clip_models_schedules │ None                                           │
│                 cut_ic_pow │ 1.0                                            │
│               cut_icgray_p │ [0.2]*400+[0]*600                              │
│               cut_innercut │ [4]*400+[12]*600                               │
│               cut_overview │ [12]*400+[4]*600                               │
│        cut_schedules_group │ None                                           │
│               cutn_batches │ 4                                              │
│            diffusion_model │ 512x512_diffusion_uncond_finetune_008100       │
│     diffusion_model_config │ None                                           │
│    diffusion_sampling_mode │ ddim                                           │
│               display_rate │ 1                                              │
│                        eta │ 0.8                                            │
│                    gif_fps │ 20                                             │
│             gif_size_ratio │ 0.5                                            │
│               image_output │ True                                           │
│                 init_image │ None                                           │
│                 init_scale │ 1000                                           │
│                  n_batches │ 4                                              │
│             name_docarray* │ discoart-a52a19258c3b11ed83433868935d4197      │
│        on_misspelled_token │ ignore                                         │
│                perlin_init │ False                                          │
│                perlin_mode │ mixed                                          │
│                   rand_mag │ 0.05                                           │
│            randomize_class │ True                                           │
│                range_scale │ 150                                            │
│                  sat_scale │ 0                                              │
│                  save_rate │ 20                                             │
│                      seed*4017468948                                     │
│                 skip_event │ None                                           │
│                skip_steps*200                                            │
│                      steps │ 250                                            │
│                 stop_event │ None                                           │
│           text_clip_on_cpu │ False                                          │
│              text_prompts* │ spring morning, a painting of Chinese water    │
│                            │ town , There are green trees on the bank,      │
│                            │ created by Makoto Shinkai and Hayao            │
│                            │ Miyazaki,Evgeny Lushpin, popular on            │
│                            │ cgsociety,ultrawide angle, soft light, 8K,     │
│                            │ fairy tales, dreams, tranquility, HD pictures  │
│     transformation_percent │ [0.09]                                         │
│ truncate_overlength_prompt │ False                                          │
│                   tv_scale │ 0                                              │
│    use_horizontal_symmetry │ False                                          │
│        use_secondary_model │ True                                           │
│      use_vertical_symmetry │ False                                          │
│             visualize_cuts │ False                                          │
│              width_height*[400, 200]                                     │
└────────────────────────────┴────────────────────────────────────────────────┘

运行之后,会生成一个独立的文件夹存储结果,其中包含绘图过程图,最终生成图标记为done

运用这一点,可以将过程图转换成Gif动图,而形成官方说明中所展示的效果:

缺陷

本地部署最大的问题还是速度慢,并且对设备要求较高。

我的设备使用默认参数,会报错:

【error】RuntimeError: Unable to find a valid cuDNN algorithm to run convolution

这个问题是GPU显存不足,调小生成图片尺寸,才能够成功运行。
因此,对于群机器人这种需要及时响应的场景,在没有优秀设备加持的情况下,使用本地绘图并不合适。

以上是关于Qbot5.接入DALL·E图像生成/Disco Diffusion本地部署的主要内容,如果未能解决你的问题,请参考以下文章

Qbot5.接入DALL·E图像生成/Disco Diffusion本地部署

OpenAI发布DALL·E 2

OpenAI:DALL·E图像处理功能展示

DALL·E 2 文本到图像生成都给我卷起来

文本生成图像这么火,你需要了解这些技术的演变

OpenAI 发布 DALL·E 进化版,这只蒸汽朋克时代的小熊有点酷~