1. 项目背景
目前游戏项目中出现美术产能不足的瓶颈,如果使用 midjourney 之类的第三方生成式人工智能产品生成美术素材的话,一方面需要将我们的美术资产投喂给第三方企业进行风格训练,有安全性上的风险,另一方面,第三方平台生成的素材结合了其他数据集,生成的资产在版权问题上有很多不可控因素。本篇文档介绍一种可以保证版权归属于我们的风格迁移方案。它是基于 Stable Diffusion 技术进行实现的。
2. Stable Diffusion介绍
Stable Diffusion是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如内补绘制、外补绘制,以及在提示词指导下产生图生图的翻译。 它是一种潜在扩散模型,由慕尼黑大学的CompVis研究团体开发的各种生成性人工神经网络。它是一种开源的算法,且有现成的代码仓库可以调用。
3. 利用 Stable Diffusion 进行风格迁移
目前,训练Stable Diffusion模型的方法主要有四种,它们分别是:Dreambooth、Textual Inversion、LoRA和Hypernetworks。
DreamBooth是谷歌推出的一个主题驱动的AI生成模型,它可以微调文本到图像扩散模型或新图像的结果。Dreambooth具备个性化结果的能力。
只要有少量图片作为输入(通常3-5张),Dreambooth就可以在调整后的Imagen和其他一些扩散模型的帮助下,生成具有不同背景的基于主题的个性化图像。一旦有图片输入,调整后的Imagen和其他扩散模型就找到唯一标识符,并将其与主题联系起来。在推理时,唯一标识符被用于合成不同上下文中的主题。
3.1 训练集
我们可以用特定风格的美术图片作为训练集,训练生成特定艺术风格的模型,例如我们使用《明星志愿1》的人物立绘素材做训练集,训练了一个名为 star1 的模型,专门用来生成上世纪90年代dos游戏风格的图片。我们仅使用了27张图片作为训练集,如下所示:
3.2 用图片生成器 + prompt 生成图片 (txt2img)
用 stable diffusion 训练好的图片生成器 + 我们生成的 star1 模型 + prompt,就可以通过文本生成特定风格的人物立绘。例如下面三张图片,我们采用的 positive prompt 和 negative prompt 分别是:
((star1)), a handsome 20 year old man, solo, look at viewer, portait, simple background, transparent background
(watermark),sketch, duplicate, ugly, ((text)), ((logo)), monochrome, worst face, (bad and mutated hands:1.3), (worst quality:2.0), (low quality:2.0), (blurry:2.0), horror, geometry, (bad hands), (missing fingers), multiple limbs, bad anatomy, (interlocked fingers:1.2), Ugly Fingers, (extra digit and hands and fingers and legs and arms:1.4), crown braid, ((2girl)), (deformed fingers:1.2), (long fingers:1.2),(bad-artist-anime),extra fingers,fewer fingers,hands up,bad hands, bad feet,shoes, stone, ((bad toe))
生成的图片结果是:
![]() |
![]() |
![]() |
---|---|---|
图1 | 图2 | 图3 |
3.3 利用参考图做风格迁移生成素材(img2img)
此外,我们也可以通过输入一张参考图像,做风格迁移,如下所示,左图是参考图,右图是用我们的 star1 模型进行风格迁移后的图片:
输入图 | 风格迁徙结果 |
---|---|
![]() |
![]() |
— | — |
![]() |
![]() |
— | — |
![]() |
![]() |
可以看出,我们训练的 star1 模型完美抓住了上世纪90年代dos游戏的画风,注意头发的高光、整齐的发际线,以及人物衣服褶皱处的处理。
虽然我们的训练集中使用的全部是人物素材,但这种风格迁移不仅对人物有效,我们发现对于动物照片,同样能够实现画风风格的迁移,如下图所示,是一只大熊猫吃竹子的照片,及我们用 star1 进行风格迁移后的结果:
输入图 | 风格迁徙结果 |
---|---|
![]() |
![]() |
我们使用的底层大模型是stable-diffusion-v1-5,它已经提供丰富的txt2img语义支持。而Dreambooth微调文本到图像扩散模型或新图,只负责微调画风。你可以理解为,底模告诉机器这是一只熊猫,熊猫的特征是毛茸茸的哺乳动物,它的颜色如何,耳朵什么样,眼睛什么样,四肢什么样;然后 dreamBooth 告诉机器,毛茸茸的地方应该怎么画,然后机器可以将画风扩散到底模能够解释的语义的所有地方。
4. 训练使用的参数:
4.1 安装环境
首先配置需要的 DreamBooth 环境:
!wget -q https://github.com/ShivamShrirao/diffusers/raw/main/examples/dreambooth/train_dreambooth.py !wget -q https://github.com/ShivamShrirao/diffusers/raw/main/scripts/convert_diffusers_to_original_stable_diffusion.py %pip install -qq git+https://github.com/ShivamShrirao/diffusers %pip install -q -U --pre triton %pip install -q accelerate transformers ftfy bitsandbytes==0.35.0 gradio natsort safetensors xformers
4.2 引入初始模型
引入初始模型并设置保存路径:
`save_to_gdrive = False #@param {type:”boolean”}
if save_to_gdrive:
from google.colab import drive
drive.mount(‘/content/drive’)
#@markdown Name/Path of the initial model.
MODEL_NAME = “runwayml/stable-diffusion-v1-5″ #@param {type:”string”}
#@markdown Enter the directory name to save model at.
OUTPUT_DIR = “stable_diffusion_weights/star01″ #@param {type:”string”}
if save_to_gdrive:
OUTPUT_DIR = “/content/drive/MyDrive/” + OUTPUT_DIR
else:
OUTPUT_DIR = “/content/” + OUTPUT_DIR
print(f”[*] Weights will be saved at {OUTPUT_DIR}”)
!mkdir -p $OUTPUT_DIR`
4.3 训练使用的参数
!python3 train_dreambooth.py --pretrained_model_name_or_path=$MODEL_NAME --pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" --output_dir=$OUTPUT_DIR --revision="fp16" --with_prior_preservation --prior_loss_weight=1.0 --seed=1337 --resolution=512 --train_batch_size=1 --train_text_encoder --mixed_precision="fp16" --use_8bit_adam --gradient_accumulation_steps=1 --learning_rate=1e-6 --lr_scheduler="constant" --lr_warmup_steps=0 --num_class_images=50 --sample_batch_size=4 --max_train_steps=800 --save_interval=10000 --save_sample_prompt="star1" --concepts_list="concepts_list.json"
用最后一次训练存储的权值进行一次生成,可以预览到训练的模型的风格化能力:
感兴趣的同学可以以 Stable Diffusion DreamBooth 为关键字到网上检索更多资料进行学习。我上手开发使用的示例项目是colab.research.google.com/github/Shiv…
相信大家能够训练出自己风格的模型。