连续看了几期和菜头的公众号上关于 AI 作画的文章后,我也产生了一些兴趣。作为一名理科生,立马就行动起来,这篇文章就聊一聊我的尝试过程。
说起 AI 作画,其实已经出现好几年了。最早的新闻有:
2018年,10月25日,一幅由人工智能创作出的肖像画在纽约佳士得拍卖会上拍出43.2万美元的高价(约合人民币300万元)。
但之前的 AI 作画,都只存在于谷歌、NVidia这样的顶级实验室中,对硬件配置有着极高的要求,普通人想要尝试,并不太容易。
近一段时间,画家圈刷屏了一个 AI 工具:Disco Diffusion。这个 AI 工具已经进化到 V5.2 版本,具有两个特点:
现在 AI 作画工具也是百花齐放,远不止 Disco Diffusion 这一款,不过这篇文章仅限于探讨 Disco Diffusion。
Disco Diffusion 是一个部署在 Colab 的开源项目,所以在线就可以作图。Disco Diffusion V 5.2 Colab 地址:
https://colab.research.google.com/github/alembics/disco-diffusion/blob/main/Disco_Diffusion.ipynb
Colab 是 Google 家的用来在线编写并运行 Python 程序的 notebook,如果使用过用 Jupyter notebook,会觉得非常熟悉。
依次运行 notebook 中的代码,就可以出图。当然 Colab 每天给免费用户使用的计算资源有限制(有资料说是 2 个小时时长,显卡资源随机),经常碰到的情况就是生成到一半,服务器就断开了。下面就是我在线尝试生成的画作:
这是一幅未完成的作品。如果你觉得对你非常有用,可以购买谷歌的云计算资源,完成一幅完整的作品。
不过对一名程序员来说,怎么会这么容易就为云计算买单呢?
接着尝试其它的 AI 工具:CogView。这是中国之光清华大学的项目,据团队发布的论文里称“人工评估的测试中,CogView被选为最好的概率为37.02%,远远超过其他基于GAN的模型。”
来源:CogView: Mastering Text-to-Image Generation via Transformers (https://arxiv.org/abs/2105.13290)
中国团队出品的产品,当然提示词原生支持中文,对中国用户比较友好。试用地址:
https://wudao.aminer.cn/CogView/index.html
使用提示语:“一棵湖面上的樱花树,花瓣飘在天空中,湖水倒影” 生成的结果如下:
一次生成 8 张,速度倒是挺快,至于说质量,要看运气。运气好的话,还是能生成不错的图像的。
再次尝试一款国外出品的在线生成工具:Dalle-Mini。试用地址:
https://huggingface.co/spaces/dalle-mini/dalle-mini
使用 prompt:"A lonely glowing door in a beautiful wilderness, by Asher Brown Durand." 生成的图像如下:
这个生成的速度也很快,一次生成 9 张,但效果比起和菜头本地运行生成出来的图还是差远了。
没有办法了,还是得本地部署,虽然显卡比较渣(RTX 2080 TI),但我可以用时间换取质量。
关于 Disco Diffusion 的本地部署,网上有许多资料,谷歌也给出了本地部署的官方文档:
https://research.google.com/colaboratory/local-runtimes.html
但作为一名程序员,我更喜欢批量化的运行,喜欢直接通过脚本搞定一切,所以我选择了通过 Docker 部署。
我的操作系统环境是 Ubuntu 20.04 LTS,NVIDIA 的驱动和 CUDA 已经安装,版本如下:
照着网上的资料一步步操作,你总会遇到这样或那样的问题,这并不是作者的问题,而是这个世界变化太快。本次部署我也碰到了一些问题,所以记录一下。
git clone https://github.com/alembics/disco-diffusion
构建 Docker 镜像需要分两步,首先是构建 Prep 镜像,然后 main 镜像,次序不能反,因为 main 镜像依赖于 Prep 镜像。
cd docker/prep
docker build -t disco-diffusion-prep:5.1 .
cd ../main
docker build -t disco-diffusion:5.1 .
在构建 Prep 镜像时可能会碰到如下错误:
Step 5/16 : RUN wget --no-directories --progress=bar:force:noscroll -P /scratch/models https://v-diffusion.s3.us-west-2.amazonaws.com/512x512_diffusion_uncond_finetune_008100.pt
---> Running in e777eaa1659f
--2022-05-26 01:36:57-- https://v-diffusion.s3.us-west-2.amazonaws.com/512x512_diffusion_uncond_finetune_008100.pt
Resolving v-diffusion.s3.us-west-2.amazonaws.com (v-diffusion.s3.us-west-2.amazonaws.com)... 52.92.146.186
Connecting to v-diffusion.s3.us-west-2.amazonaws.com (v-diffusion.s3.us-west-2.amazonaws.com)|52.92.146.186|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2022-05-26 01:36:58 ERROR 404: Not Found.
原因就在于模型文件在服务器上已经不存在,研究了一下 colab 中的代码,发现还有一套 fallback 地址(备用地址),所以将 docker/prep/Dockerfile 中的地址修改为:
https://huggingface.co/lowlevelware/512x512_diffusion_unconditional_ImageNet/resolve/main/512x512_diffusion_uncond_finetune_008100.pt
如果其它的模型还存在问题,可以依葫芦画瓢,修改为备用地址即可。
不过有一个模型死活下载不下来:
--2022-05-26 04:47:12-- (try:20) https://cloudflare-ipfs.com/ipfs/Qmd2mMnDLWePKmgfS8m6ntAg4nhV5VkUyAydYBp8cWWeB7/AdaBins_nyu.pt
Connecting to cloudflare-ipfs.com (cloudflare-ipfs.com)|31.13.81.4|:443... failed: Connection timed out.
Connecting to cloudflare-ipfs.com (cloudflare-ipfs.com)|2001::6ca0:a936|:443... failed: Cannot assign requested address.
Giving up.
没有办法,只能上网找一个,先下载下来,地址:
https://drive.google.com/drive/folders/1nYyaQXOBjNdUJDsmJpcRpu6oE55aQoLA
然后通过 COPY 指令从 host 复制到 Docker 容器:
COPY AdaBins_nyu.pt /scratch/pretrained/
事先准备好 images_out 和 init_images 两个目录, 前一个目录存放生成的图像,后一个是初始图像存放的位置。然后映射到容器,这样,在 Docker 容器中生成的图像才好被 host 主机访问到:
docker run --rm -it \
-v $(echo ~)/disco-diffusion/images_out:/workspace/code/images_out \
-v $(echo ~)/disco-diffusion/init_images:/workspace/code/init_images \
--runtime=nvidia \
--name="disco-diffusion" --ipc=host \
--user $(id -u):$(id -g) \
disco-diffusion:5.1 python disco-diffusion/disco.py
如果遇到权限问题:
PermissionError: [Errno 13] Permission denied: '/workspace/code/images_out/TimeToDisco'
可以修改一下 host 下文件的 owner 或者 mode:
sudo chown alex:alex ~/disco-diffusion/images_out/
然后就是漫长的等待。在没有修改任何参数的情况下,生成了 49 张图片,大小为 1280x768,大家可以欣赏一下其中的几张:
值得一提的是,AI 程序对同一个输入,每次输出并不相同,这和传统的计算机程序不一样,所以要获得好的结果,需要多多尝试,挑选出最好的结果。
和菜头自从迷上了 AI 作画后,其公众号的题图都是自己生成,现在网上也有一些大神,通过 AI 画出了不少令人惊艳的作品。下面这篇文章尝试了古风插画,我非常喜欢:
AI 能理解和表达古诗意境吗?来看看西乔用人工智能辅助创作的古风插画(第一辑)
你对 AI 作画怎么看,先动手尝试一下再来说说你的看法吧!