项目简介
水墨画是中国画的一个分支,水墨山水就是纯用水墨不设颜色的山水画体。其相传始于唐,成于宋,盛于元,明清两代有所发展。作画讲究立意隽永,气韵生动,形成了整套以水墨为主体的表现技法。其笔法糸以勾斫、皴擦、点染为主导,长于结构和质感的表现;其墨法糸于墨的浓淡干湿,泼破积烘为主导,“水晕墨章”、“如兼五彩”的效果,长于体积和气韵的珍现。[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该模型可以生成水墨山水画。
- m egemini/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 < shanshui-style >
案例二
Model: megemini/shanshui_style
Prompt: A fantasy landscape in < shanshui-style >
案例三
Model: megemini/shanshui_style
Prompt: A fantasy landscape in < shanshui-style >
案例四
Model: megemini/shanshui_gen_style
Prompt: A fantasy landscape in < shanshui-gen-style >
案例五
Model: megemini/shanshui_gen_style
Prompt: A fantasy landscape in < shanshui-gen-style >
案例六
Model: megemini/shanshui_gen_style
Prompt: A fantasy landscape in < shanshui-gen-style >
展示一下当时震撼到我的图(runwayml/stable-diffusion-v1-5 生成):
原图
生成(并用于此模型的训练)
Prompt:A fantasy landscape
原图
生成(并用于此模型的训练)
Prompt:A fantasy landscape
原图
生成(并用于此模型的训练)
Prompt:A fantasy landscape
原图
生成(并用于此模型的训练)
Prompt:A fantasy landscape
原图
生成(并用于此模型的训练)
Prompt:A fantasy landscape,trending on artstation
如上图所示,第一张生成的图片上面的文字并非真的是通顺的文字,但是,其风格学习能力已经非常惊人。我将这些图片发给亦石老师,请其帮忙评价,他先是发问:“这画是谁的作品?”。当得知这些作品是基于飞桨实现绘制时,他立马发来5个大拇指表情。接下来,就看看怎么一步步训练这些模型,并生成图片。项目已经发布在AI Studio上,欢迎一起交流学习。
链接
https://aistudio.baidu.com/aistudio/projectdetail/6103948
水墨山水画之shanshui_style模型
模型训练
数据
这里我将家人的一些水墨画放到了项目中的 ./train_shanshui/ 目录下面 (传播时要注明作者哦~),您也可以自己添加自己喜欢的画作。
工具
本项目使用的是Textual Inversion,PaddleNLP的PPDiffusers 封装了train_textual_inversion.py,可以很方便地调用。
方法
这里学习的是风格,也就是利用模型学习水墨山水画的风格。
预训练模型
这里用的是 runwayml/stable-diffusion-v1-5。万事具备,只需一行命令就可以训练模型了,训练之前记得要安装必要的包。
%%capture
# 安装好之后要重启此 notebook
!pip install "paddlenlp>=2.5.2" safetensors "ppdiffusers>=0.11.1" --user
# 训练模型
!python -u train_textual_inversion.py \
--pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \
--train_data_dir="train_shanshui" \
--learnable_property="style" \
--placeholder_token="<shanshui-style>" --initializer_token="style" \
--resolution=512 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--max_train_steps=1000 \
--learning_rate=5.0e-04 \
--scale_lr \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--seed 2023 \
--output_dir="shanshui_style"
几个主要的参数:
--pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \ # 预训练模型
--train_data_dir="train_shanshui" \ # 数据目录
--learnable_property="style" \ # 学习 style
--placeholder_token="<shanshui-style>" \ # prompt 中用来表示此 style 的 token
--initializer_token="style" \ # 初始化 token
--resolution=512 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--max_train_steps=1000 \ # 训练步骤,有时间可以设置多一些
--learning_rate=5.0e-04 \
--scale_lr \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--seed 2023 \
--output_dir="shanshui_style" # 模型保存的路径
模型预测
模型预测利用 PPDiffusers 的 StableDiffusion Pipeline。这里注意,要在 prompt 中加入训练阶段 placeholder_token 参数设置的token 。另外,生成图片的分辨率越高,貌似生成的图片质量越好。
import matplotlib.pyplot as plt
%matplotlib inline
from ppdiffusers import StableDiffusionPipeline
# 我们所需加载的模型地址,这里我们输入了训练时候使用的 output_dir 地址
model_path = "shanshui_style"
pipe = StableDiffusionPipeline.from_pretrained(model_path)
prompt = "A fantasy landscape in <shanshui-style>"
image = pipe(prompt, num_inference_steps=100, guidance_scale=7.5, height=432, width=768,).images[0]
1plt.imshow(image)
水墨山水画具像图之 shanshui_gen_style模型
模型训练
数据
这里需要利用 Stable diffusion 的 img2img,将之前用到的水墨画先生成具像图,作为此模型的训练数据。
工具
同 shanshui_style,这里依然用的是 Textual Inversion,PaddleNLP的PPDiffusers封装了train_textual_inversion.py。
方法
同 shanshui_style,这里学习的是风格,也就是利用模型学习水墨山水画具像之后的风格。
预训练模型
同 shanshui_style,这里用的是 runwayml/stable-diffusion-v1-5。这里单独介绍一下如何用 img2img 生成图片:
from stable_diffusion_mega import StableDiffusionMegaPipeline
import PIL
import paddle
pipe = StableDiffusionMegaPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", paddle_dtype=paddle.float16)
pipe.enable_attention_slicing()
generator = paddle.Generator().manual_seed(202305)
prompt = "A fantasy landscape"
init_image = PIL.Image.open("train_shanshui/mmexport1477788619881.jpg").convert("RGB")
with paddle.amp.auto_cast(True, level="O2"):
image = pipe.img2img(prompt=prompt,
image=init_image,
strength=0.75,
guidance_scale=7.5,
generator=generator).images[0]
plt.figure(figsize=(16, 6))
plt.subplot(211)
plt.imshow(init_image)
plt.subplot(212)
plt.imshow(image)
只需要将 ./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="<shanshui-gen-style>" --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"
模型预测
同样,模型预测利用 PPDiffusers 的 StableDiffusion Pipeline。这里注意,要在 prompt 中加入上面 placeholder_token 设置的token < shanshui-gen-style >。
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 <shanshui-gen-style>"
11image = pipe(prompt, num_inference_steps=100, guidance_scale=7.5, height=432, width=768,).images[0]
1plt.imshow(image)
HuggingFace 模型与应用
AI Studio项目详细介绍了如何在 AI Studio 中使用 HuggingFace[5],有需要的同学可以看看。该项目提供了一个可以将模型上传到 HuggingFace 的方法:**upload_lora_folder
链接
https://aistudio.baidu.com/aistudio/projectdetail/5513258
使用前请确保已经登录了HuggingFace Hub!
from utils import upload_lora_folder
upload_dir = "shanshui_gen_style # 我们需要上传的文件夹目录
repo_name = "shanshui_gen_style" # 我们需要上传的repo名称
pretrained_model_name_or_path = "shanshui_gen_style" # 训练该模型所使用的基础模型
prompt = "A fantasy landscape in <shanshui-gen-style>" # 搭配该权重需要使用的Prompt文本
upload_lora_folder(
upload_dir=upload_dir,
repo_name=repo_name,
pretrained_model_name_or_path=pretrained_model_name_or_path,
prompt=prompt,
)
虽然名字是 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://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