书画家点赞!基于飞桨绘制中国水墨山水画

书画家点赞!基于飞桨绘制中国水墨山水画_第1张图片

书画家点赞!基于飞桨绘制中国水墨山水画_第2张图片

2573a57987f5fa89b9a1cdd76353aecb.png项目简介

水墨画是中国画的一个分支,水墨山水就是纯用水墨不设颜色的山水画体。其相传始于唐,成于宋,盛于元,明清两代有所发展。作画讲究立意隽永,气韵生动,形成了整套以水墨为主体的表现技法。其笔法糸以勾斫、皴擦、点染为主导,长于结构和质感的表现;其墨法糸于墨的浓淡干湿,泼破积烘为主导,“水晕墨章”、“如兼五彩”的效果,长于体积和气韵的珍现。[7]  

AIGC(AI-Generated Content,AI生成内容)是一种新型的内容创作方式,其利用扩散模型、生成对抗网络、大型预训练模型等人工智能技术,对已有数据进行学习和模式识别,以适当的泛化能力生成相关内容。[8]中国水墨山水画算的上中国文化的瑰宝。最近 AIGC技术这么火,碰巧家中有位长者亦石[1]画得一手好山水,那么就来看看,当中国水墨山水遇上AIGC,模型学的如何,画得可有意境 。

本文使用shanshui_style和shanshui_gen_style两个模型,利用飞桨的PaddleNLP的PPDiffusers 中的Textual Inversion[3]技术学习画作的风格,预训练模型为runwayml/stable-diffusion-v1-5。

  • megemini/shanshui_style该模型可以生成水墨山水画。

  • megemini/shanshui_gen_style该模型可以生成水墨山水画的具像图片

megemini/shanshui_gen_style 模型的来历:

笔者看到官方例子[4]中的StableDiffusionMegaPipeline有个img2img,出于好奇,就用水墨画作为输入,结果就是类似下图中 megemini/shanshui_gen_style风格的图片。当时,确实是有点被震惊,感觉很像是水墨画的一种具像,有种中西艺术揉合的样子,然后就用这些由水墨画生成的图片,又训练了Textual Inversion的style,最后就有了megemini/shanshui_gen_style。

来看看这两个模型的表现如何:

案例一

Model: megemini/shanshui_style

Prompt: A fantasy landscape in

书画家点赞!基于飞桨绘制中国水墨山水画_第3张图片

案例二

Model: megemini/shanshui_style

Prompt: A fantasy landscape in

书画家点赞!基于飞桨绘制中国水墨山水画_第4张图片

案例三

Model: megemini/shanshui_style

Prompt: A fantasy landscape in

书画家点赞!基于飞桨绘制中国水墨山水画_第5张图片

案例四

Model: megemini/shanshui_gen_style

Prompt: A fantasy landscape in

书画家点赞!基于飞桨绘制中国水墨山水画_第6张图片

案例五

Model: megemini/shanshui_gen_style

Prompt: A fantasy landscape in

书画家点赞!基于飞桨绘制中国水墨山水画_第7张图片

案例六

Model: megemini/shanshui_gen_style

Prompt: A fantasy landscape in

书画家点赞!基于飞桨绘制中国水墨山水画_第8张图片

展示一下当时震撼到我的图(runwayml/stable-diffusion-v1-5 生成):

原图

书画家点赞!基于飞桨绘制中国水墨山水画_第9张图片

生成(并用于此模型的训练)

Prompt:A fantasy landscape

原图

书画家点赞!基于飞桨绘制中国水墨山水画_第10张图片

生成(并用于此模型的训练)

书画家点赞!基于飞桨绘制中国水墨山水画_第11张图片

Prompt:A fantasy landscape

原图

书画家点赞!基于飞桨绘制中国水墨山水画_第12张图片

生成(并用于此模型的训练)

书画家点赞!基于飞桨绘制中国水墨山水画_第13张图片

Prompt:A fantasy landscape

原图

生成(并用于此模型的训练)

Prompt:A fantasy landscape

原图

书画家点赞!基于飞桨绘制中国水墨山水画_第14张图片

生成(并用于此模型的训练)

书画家点赞!基于飞桨绘制中国水墨山水画_第15张图片

Prompt:A fantasy landscape,trending on artstation

如上图所示,第一张生成的图片上面的文字并非真的是通顺的文字,但是,其风格学习能力已经非常惊人。我将这些图片发给亦石老师,请其帮忙评价,他先是发问:“这画是谁的作品?”。当得知这些作品是基于飞桨实现绘制时,他立马发来5个大拇指表情。接下来,就看看怎么一步步训练这些模型,并生成图片。

项目已经发布在AI Studio上,欢迎一起交流学习。

链接

https://aistudio.baidu.com/aistudio/projectdetail/6103948

77d4ad1aff067e40a4e1f9b3dd898389.png水墨山水画之shanshui_style模型

dae8fac6436f1cb9ae404e22965f972f.png

模型训练

数据

这里我将家人的一些水墨画放到了项目中的 ./train_shanshui/ 目录下面 (传播时要注明作者哦~),您也可以自己添加自己喜欢的画作。

书画家点赞!基于飞桨绘制中国水墨山水画_第16张图片

工具

本项目使用的是Textual Inversion,PaddleNLP的PPDiffusers 封装了train_textual_inversion.py,可以很方便地调用。

方法

这里学习的是风格,也就是利用模型学习水墨山水画的风格。

预训练模型

这里用的是 runwayml/stable-diffusion-v1-5。万事具备,只需一行命令就可以训练模型了,训练之前记得要安装必要的包。

1%%capture
2# 安装好之后要重启此 notebook
3!pip install "paddlenlp>=2.5.2" safetensors "ppdiffusers>=0.11.1" --user
1# 训练模型
 2!python -u train_textual_inversion.py \
 3--pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \
 4--train_data_dir="train_shanshui" \
 5--learnable_property="style" \
 6--placeholder_token="" --initializer_token="style" \
 7--resolution=512 \
 8--train_batch_size=1 \
 9--gradient_accumulation_steps=4 \
10--max_train_steps=1000 \
11--learning_rate=5.0e-04 \
12--scale_lr \
13--lr_scheduler="constant" \
14--lr_warmup_steps=0 \
15--seed 2023 \
16--output_dir="shanshui_style"

几个主要的参数:

1--pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \ # 预训练模型
 2--train_data_dir="train_shanshui" \ # 数据目录
 3--learnable_property="style" \ # 学习 style
 4--placeholder_token="" \ # prompt 中用来表示此 style 的 token
 5--initializer_token="style" \ # 初始化 token
 6--resolution=512 \
 7--train_batch_size=1 \
 8--gradient_accumulation_steps=4 \
 9--max_train_steps=1000 \ # 训练步骤,有时间可以设置多一些
10--learning_rate=5.0e-04 \
11--scale_lr \
12--lr_scheduler="constant" \
13--lr_warmup_steps=0 \
14--seed 2023 \
15--output_dir="shanshui_style" # 模型保存的路径

d901bdd48a7baec32943b55a60ceec1a.png模型预测

模型预测利用 PPDiffusers 的 StableDiffusion Pipeline。这里注意,要在 prompt 中加入训练阶段 placeholder_token 参数设置的token

另外,生成图片的分辨率越高,貌似生成的图片质量越好。

1import matplotlib.pyplot as plt
 2%matplotlib inline
 3
 4from ppdiffusers import StableDiffusionPipeline
 5# 我们所需加载的模型地址,这里我们输入了训练时候使用的 output_dir 地址
 6model_path = "shanshui_style"
 7pipe = StableDiffusionPipeline.from_pretrained(model_path)
 8
 9prompt = "A fantasy landscape in "
10image = pipe(prompt, num_inference_steps=100, guidance_scale=7.5, height=432, width=768,).images[0]
1plt.imshow(image)

书画家点赞!基于飞桨绘制中国水墨山水画_第17张图片

9131f67bbf90fcab6e7a559a40331cfd.png

水墨山水画具像图之

shanshui_gen_style模型

a531ebb2189def5292bca9818cec979c.png

模型训练

数据

这里需要利用 Stable diffusion 的 img2img,将之前用到的水墨画先生成具像图,作为此模型的训练数据。

书画家点赞!基于飞桨绘制中国水墨山水画_第18张图片

工具

同 shanshui_style,这里依然用的是 Textual Inversion,PaddleNLP的PPDiffusers封装了train_textual_inversion.py。

方法

同 shanshui_style,这里学习的是风格,也就是利用模型学习水墨山水画具像之后的风格。

预训练模型

同 shanshui_style,这里用的是 runwayml/stable-diffusion-v1-5。这里单独介绍一下如何用 img2img 生成图片:

1from stable_diffusion_mega import StableDiffusionMegaPipeline
 2import PIL
 3import paddle
 4
 5pipe = StableDiffusionMegaPipeline.from_pretrained(
 6"runwayml/stable-diffusion-v1-5", paddle_dtype=paddle.float16)
 7pipe.enable_attention_slicing()
 8generator = paddle.Generator().manual_seed(202305)
 9
10prompt = "A fantasy landscape"
11init_image = PIL.Image.open("train_shanshui/mmexport1477788619881.jpg").convert("RGB")
12with paddle.amp.auto_cast(True, level="O2"):
13image = pipe.img2img(prompt=prompt,
14image=init_image,
15strength=0.75,
16guidance_scale=7.5,
17generator=generator).images[0]
1plt.figure(figsize=(16, 6))
2plt.subplot(211)
3plt.imshow(init_image)
4
5plt.subplot(212)
6plt.imshow(image)

书画家点赞!基于飞桨绘制中国水墨山水画_第19张图片

只需要将 ./train_shanshui/ 目录下面的图片通过上面的 img2img 方法生成具像图片,然后保存下来即可。这里已经提前生成好了,保存在 ./train_shanshui_gen 目录下。您可以直接使用,也可以换个 prompt 重新生成一下 ~

有了这些图片,就可以训练 shanshui_gen_style 模型了,方法跟 shanshui_style 一样。

1!python -u train_textual_inversion.py \
 2--pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \
 3--train_data_dir="train_shanshui_gen" \
 4--learnable_property="style" \
 5--placeholder_token="" --initializer_token="style" \
 6--resolution=512 \
 7--train_batch_size=1 \
 8--gradient_accumulation_steps=4 \
 9--max_train_steps=1000 \
10--learning_rate=5.0e-04 \
11--scale_lr \
12--lr_scheduler="constant" \
13--lr_warmup_steps=0 \
14--seed 2023 \
15--output_dir="shanshui_gen_style"

96cc525a9050b0ae731b536c0519b5bd.png

模型预测

同样,模型预测利用 PPDiffusers 的 StableDiffusion Pipeline。这里注意,要在 prompt 中加入上面 placeholder_token 设置的token

1import matplotlib.pyplot as plt
 2%matplotlib inline
 3
 4from ppdiffusers import StableDiffusionPipeline
 5
 6# 我们所需加载的模型地址,这里我们输入了训练时候使用的 output_dir 地址
 7model_path = "shanshui_gen_style"
 8pipe = StableDiffusionPipeline.from_pretrained(model_path)
 9
10prompt = "A fantasy landscape in "
11image = pipe(prompt, num_inference_steps=100, guidance_scale=7.5, height=432, width=768,).images[0]
1plt.imshow(image)

书画家点赞!基于飞桨绘制中国水墨山水画_第20张图片

4ad8c5719ed9d0deeb43cb30182d8e6b.png

HuggingFace 模型与应用

AI Studio项目详细介绍了如何在 AI Studio 中使用 HuggingFace[5],有需要的同学可以看看。该项目提供了一个可以将模型上传到 HuggingFace 的方法:upload_lora_folder

链接

https://aistudio.baidu.com/aistudio/projectdetail/5513258

使用前请确保已经登录了HuggingFace Hub!

1from utils import upload_lora_folder
 2upload_dir = "shanshui_gen_style # 我们需要上传的文件夹目录
 3repo_name = "shanshui_gen_style" # 我们需要上传的repo名称
 4pretrained_model_name_or_path = "shanshui_gen_style" # 训练该模型所使用的基础模型
 5prompt = "A fantasy landscape in "   # 搭配该权重需要使用的Prompt文本
 6upload_lora_folder(
 7    upload_dir=upload_dir,
 8    repo_name=repo_name,
 9    pretrained_model_name_or_path=pretrained_model_name_or_path,
10    prompt=prompt, 
11)
12

虽然名字是 lora 相关的,但是没关系,模型上传之后手动修改一下 Model card 即可。

这里已经将两个模型上传上去了:

  • 模型 megemini/shanshui_style 可以生成水墨山水画。

  • 模型 megemini/shanshui_gen_style 可以生成水墨山水画的具像图片。

另外,我在 AI Studio 上建了相关的应用,即如何使用Gradio[6]自建应用[9]:https://aistudio.baidu.com/aistudio/projectdetail/6103948

又可以水一期的话题了,并且操作起来很简单。总之,多看多学多试。欣赏别人的AIGC成果,远没有自己摸索来的有成就感,不多说了,快来试试吧!

参考资料

[1] 亦石https://baike.baidu.com/item/%E4%BA%A6%E7%9F%B3/18606991?fr=aladdin‍

[2]【飞桨黑客松】AIGC - DreamBooth LoRA 文生图模型微调, https://aistudio.baidu.com/aistudio/projectdetail/5513258

[3] Textual Inversion 微调代码, https://github.com/PaddlePaddle/PaddleNLP/tree/develop/ppdiffusers/examples/textual_inversion#textual-inversion-%E5%BE%AE%E8%B0%83%E4%BB%A3%E7%A0%81

[4] Community Examples,https://github.com/PaddlePaddle/PaddleNLP/tree/develop/ppdiffusers/examples/community#community-examples

[5] HuggingFace, https://huggingface.co/

[6] gradio, https://gradio.app/docs/

[7] 水墨山水画,https:// https://baike.baidu.com/item/%E6%B0%B4%E5%A2%A8%E5%B1%B1%E6%B0%B4%E7%94%BB/4728942?fr=aladdin

[8] AIGC:从入门到精通, https://zhuanlan.zhihu.com/p/610229253

[9] 【Hackathon 4th AIGC】当中国水墨山水遇上AIGC,https://aistudio.baidu.com/aistudio/projectdetail/6103948

书画家点赞!基于飞桨绘制中国水墨山水画_第21张图片

关注【飞桨PaddlePaddle】公众号

获取更多技术内容~

你可能感兴趣的:(paddlepaddle,人工智能)