图片

项目简介

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

 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=a...

[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%B...

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

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


飞桨PaddlePaddle
30 声望34 粉丝

飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,集深度学习核心训练和推理框架、基础模型库、端到端开发套件、丰富的工具组件于一体,是中国首个自主研发、功能丰富、开源开放的产业级深度...