引言
本文的目的为记录stable diffusion的风格迁移,采用diffusers example中的text_to_image和textual_inversion目录
2023.7.11
收集了6张水墨画风格的图片,采用textual_inversion进行训练,以"The street of Paris, in the style of "作为模板,第369轮的图片如下
第500轮的模型用于生成飞机,猫,狗
然而生成草莓,香蕉却无法生成,顶多是更改了背景
这让我怀疑模型并不能很好的学习到其中的风格
2023.7.12
在昨天注意到textual inversion只能迁移风格到一些模型已有的内容中,对于一些位置的物体无法进行风格迁移后,我将目光再次转向了LoRA,在参考了这篇文章之后,我开始着手训练,LoRA需要使用较多的图片,因此我将图片的数量增加到了20张,并且使用stable-diffusion-webui进行数据预处理,具体为将图片裁剪为512*512大小之后,使用danbooru提供图片的描述词,然后使用train_text_to_image_lora.py
进行训练,我的设置如下,在之前的理解中,我认为random_flip
和center_crop
数据增强应该对图像生成是没有用的,这篇文章中也是这么说的,但是我又想到数据量这么小,虽然可能没有提升,但是也不会更差,于是就加上吧,同时我将train_batch_size从计算机最大可以使用的6改为4,玄学认为4的倍数训练模型更加好
export MODEL_NAME="/home/zxa/ps/pretrain_models/stable-diffusion-v1-5/"
export DATASET_NAME="/home/zxa/ps/open_data/material_tags_copy/"
accelerate launch --mixed_precision="fp16" train_text_to_image_lora_my_version.py \
--pretrained_model_name_or_path=$MODEL_NAME \
--train_data_dir $DATASET_NAME --caption_column="text" \
--random_flip --center_crop\
--dataloader_num_workers=0 \
--resolution=512 \
--gradient_accumulation_steps=1 \
--train_batch_size=4 \
--max_grad_norm=1 \
--checkpointing_steps=500 \
--learning_rate=1e-04 --lr_scheduler="constant" --lr_warmup_steps=0 \
--seed=42 \
--output_dir="sd-model-lora-v1.5-ink" \
--report_to="wandb" \
--enable_xformers_memory_efficient_attention \
--validation_prompt="strawberry" \
--num_validation_image=4 \
--validation_epochs=100 \
--max_train_steps=15000 \
然而,我训练了1500轮的图片,却出现了我不想要的文字信息,甚至还出现了过拟合情况,即我想要生成草莓,却生成的不是草莓,如下
这让我意识到是我训练的数据存在错误了,于是我开始采用手动裁剪的方式,使用windows自带的照片软件中的裁剪功能,选择正方形,选择没有文字的地方裁剪出来,效果如下
出现过拟合的情况,很有可能是因为danbooru给出的图片描述词与图片根本不符,因此我删掉了danbooru的描述词,全部自己手写生成,例如A yellow tiger with its mouth open, standing on a mountain,A man wearing a cap and coir raincoat with his mouth closed and holding a bowl,将图片和文字全部处理好之后,重新开始训练,训练效果如下
这是模型运行2000轮的效果
这是模型运行3000轮的效果,可见我们的猜想是正确的,模型在训练到过拟合后,也没有丢失文字信息,生成的都是和文字描述匹配的草莓的效果,但是3000轮已经过拟合了,图片开始失真了,因此2000轮已经是不错的选择了
2023.7.13
之前使用SAM进行了扣图,生成了一些盒子图片
采用自行设计标签的方式,设计了标签——A packaging design, box, standing, box cover painted with red pomegranate, pomegranate pulp, leaves, dew, Chinese text和A packaging design, box, placed horizontally, box cover with pomegranate pictured, placed on a CD stand, music notes, Chinese text and English text,然而我发现,模型在3000轮以后就几乎严重的失真,过拟合了
这两张是1000轮的模型用同样的prompt进行生成的,算是较好的,但是图案扭曲,很不是美观,至于2000轮,3000轮的更差了就不展示了,我还发现了一个问题,那就是我对每一张图片的最后增加了chinese text and english text的tags,目的是让模型学习到文字信息,使得模型在之后在不写上文字tag的时候,可以不生成文字,然而事与愿违,可能是模型不知道如何填充文字空白区域,图案变得更加扭曲了
这让我开始思考是否要去除文字信息,为了验证是否是模型基底的问题,我采用CIVITAI中的revanimated模型进行训练,我发现模型的效果比SD1.5要明显的好,和SD1.5一样,revanimated也是在1000轮之后就开始失真了
这是800轮的结果,可以发现只有第一张还可以,后面的均有模糊和失真的感觉,这让我想到,又是我的数据集除了问题,由于包装盒子具有完整性的特征,如果将图片进行裁剪,则会出现缺边缺角的情况,因此我必须尽可能的去处理一些正方形或者长方形的图片,使得完整的盒子图片能够被保存下来。
按照正方形裁剪的方式,由于SAM扣的图已经不存在空白区域了,很难裁剪,因此我又从网上搜集了一波图,我发现有一些图很小,只有几kb,这种图一般质量也不好,因此我筛选了一下图片的大小,至少需要有60kb,裁剪后的图如下
在标注方面,我自认为一些重复的细节也是不必要的,例如石榴和石榴籽,我在一开始的时候标注了两个,现在我只保留了石榴,然后将中文文字这种tag也去掉了,标签为A packaging design, box, standing, box cover painted with red pomegranate, leaves, dew和A packaging design, the box is placed horizontally, painted with red tomatoes, flying birds, leaves, yellow clouds,在训练了500轮之后,我得到了如下效果
可以看到500轮后,出的图效果还是比较清晰的,然而1000轮就开始失真了,之前的模型忘记测500轮的结果了,因此这个结果并不能说明采用正方形切割的方式就一定能够让模型生成的图更加清晰,但是至少不会收到因为图片resize变形的影响,同时训练的图片的大小应该也与生图图片的质量有关系,虽然1000轮的模型会失真,但是我们可以设置lora的weight为0.5,我们可以使用内置的函数调成scale,image = pipe(prompt, num_inference_steps=30, guidance_scale=7.5, cross_attention_kwargs={"scale": 0.5}).images[0]
,也可以使用这个代码,使用这个代码的原因是我们之后会想要同时使用两个lora的权重,同时作用于图片,生成的效果如下
有几个也还可以,但是没有500轮给的效果直观
2023.7.14
在训练lora水墨风的时候,我突然想到,是否将Ink style这个tag加上会更加的有明确性,于是我在所有的标注文本前加上了ink style,标注变成这样ink style, A man, looking up at the sky, sits, has a beard, carries a white bag, hangs a yellow gourd, wears a brown gown and white shorts, with his left hand on his thigh,加了指定风格词后,会覆盖模型原本的水墨风,不过生成效果更加直接
将盒子lora权重设置为0.5,水墨风lora设置权重为0.5,将guidence_scale设置为10,步数从25提升到50后,用prompt=an ink style painting, high quality,highly detailed, package box, box cover painted with a banana, packaging design可以生成这样的图像
这种图片生成出来的感觉很奇怪,似乎是水墨风,又似乎不是水墨风,因此我猜测是不是风格训练的图片太少了,于是我将20张图片提升到80张图片进行尝试,水墨风格的图片在这个网站获取,在训练过程中,我发现其实lora训练100-200个epochs就可以拟合了,再增加epochs只会使得模型过拟合,因此在后续的训练中,我会将训练步数换成训练epochs,改用100个epochs进行训练,每20个epochs生成一次验证图片。