写点什么

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

  • 2023-07-17
    北京
  • 本文字数:4837 字

    阅读完需:约 16 分钟

项目简介

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

用户头像

还未添加个人签名 2022-12-26 加入

还未添加个人简介

评论

发布
暂无评论
书画家点赞!基于飞桨绘制中国水墨山水画_人工智能_飞桨PaddlePaddle_InfoQ写作社区