引言
本文的目的為記錄stable diffusion的風(fēng)格遷移,采用diffusers example中的text_to_image和textual_inversion目錄
2023.7.11
收集了6張水墨畫風(fēng)格的圖片,采用textual_inversion進行訓(xùn)練,以"The street of Paris, in the style of "作為模板,第369輪的圖片如下
第500輪的模型用于生成飛機,貓,狗
然而生成草莓,香蕉卻無法生成,頂多是更改了背景
這讓我懷疑模型并不能很好的學(xué)習(xí)到其中的風(fēng)格
2023.7.12
在昨天注意到textual inversion只能遷移風(fēng)格到一些模型已有的內(nèi)容中,對于一些位置的物體無法進行風(fēng)格遷移后,我將目光再次轉(zhuǎn)向了LoRA,在參考了這篇文章之后,我開始著手訓(xùn)練,LoRA需要使用較多的圖片,因此我將圖片的數(shù)量增加到了20張,并且使用stable-diffusion-webui進行數(shù)據(jù)預(yù)處理,具體為將圖片裁剪為512*512大小之后,使用danbooru提供圖片的描述詞,然后使用train_text_to_image_lora.py
進行訓(xùn)練,我的設(shè)置如下,在之前的理解中,我認(rèn)為random_flip
和center_crop
數(shù)據(jù)增強應(yīng)該對圖像生成是沒有用的,這篇文章中也是這么說的,但是我又想到數(shù)據(jù)量這么小,雖然可能沒有提升,但是也不會更差,于是就加上吧,同時我將train_batch_size從計算機最大可以使用的6改為4,玄學(xué)認(rèn)為4的倍數(shù)訓(xùn)練模型更加好
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 \
然而,我訓(xùn)練了1500輪的圖片,卻出現(xiàn)了我不想要的文字信息,甚至還出現(xiàn)了過擬合情況,即我想要生成草莓,卻生成的不是草莓,如下
這讓我意識到是我訓(xùn)練的數(shù)據(jù)存在錯誤了,于是我開始采用手動裁剪的方式,使用windows自帶的照片軟件中的裁剪功能,選擇正方形,選擇沒有文字的地方裁剪出來,效果如下
出現(xiàn)過擬合的情況,很有可能是因為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,將圖片和文字全部處理好之后,重新開始訓(xùn)練,訓(xùn)練效果如下
這是模型運行2000輪的效果
這是模型運行3000輪的效果,可見我們的猜想是正確的,模型在訓(xùn)練到過擬合后,也沒有丟失文字信息,生成的都是和文字描述匹配的草莓的效果,但是3000輪已經(jīng)過擬合了,圖片開始失真了,因此2000輪已經(jīng)是不錯的選擇了
2023.7.13
之前使用SAM進行了扣圖,生成了一些盒子圖片
采用自行設(shè)計標(biāo)簽的方式,設(shè)計了標(biāo)簽——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,然而我發(fā)現(xiàn),模型在3000輪以后就幾乎嚴(yán)重的失真,過擬合了
這兩張是1000輪的模型用同樣的prompt進行生成的,算是較好的,但是圖案扭曲,很不是美觀,至于2000輪,3000輪的更差了就不展示了,我還發(fā)現(xiàn)了一個問題,那就是我對每一張圖片的最后增加了chinese text and english text的tags,目的是讓模型學(xué)習(xí)到文字信息,使得模型在之后在不寫上文字tag的時候,可以不生成文字,然而事與愿違,可能是模型不知道如何填充文字空白區(qū)域,圖案變得更加扭曲了
這讓我開始思考是否要去除文字信息,為了驗證是否是模型基底的問題,我采用CIVITAI中的revanimated模型進行訓(xùn)練,我發(fā)現(xiàn)模型的效果比SD1.5要明顯的好,和SD1.5一樣,revanimated也是在1000輪之后就開始失真了
這是800輪的結(jié)果,可以發(fā)現(xiàn)只有第一張還可以,后面的均有模糊和失真的感覺,這讓我想到,又是我的數(shù)據(jù)集除了問題,由于包裝盒子具有完整性的特征,如果將圖片進行裁剪,則會出現(xiàn)缺邊缺角的情況,因此我必須盡可能的去處理一些正方形或者長方形的圖片,使得完整的盒子圖片能夠被保存下來。
按照正方形裁剪的方式,由于SAM扣的圖已經(jīng)不存在空白區(qū)域了,很難裁剪,因此我又從網(wǎng)上搜集了一波圖,我發(fā)現(xiàn)有一些圖很小,只有幾kb,這種圖一般質(zhì)量也不好,因此我篩選了一下圖片的大小,至少需要有60kb,裁剪后的圖如下
在標(biāo)注方面,我自認(rèn)為一些重復(fù)的細節(jié)也是不必要的,例如石榴和石榴籽,我在一開始的時候標(biāo)注了兩個,現(xiàn)在我只保留了石榴,然后將中文文字這種tag也去掉了,標(biāo)簽為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,在訓(xùn)練了500輪之后,我得到了如下效果
可以看到500輪后,出的圖效果還是比較清晰的,然而1000輪就開始失真了,之前的模型忘記測500輪的結(jié)果了,因此這個結(jié)果并不能說明采用正方形切割的方式就一定能夠讓模型生成的圖更加清晰,但是至少不會收到因為圖片resize變形的影響,同時訓(xùn)練的圖片的大小應(yīng)該也與生圖圖片的質(zhì)量有關(guān)系,雖然1000輪的模型會失真,但是我們可以設(shè)置lora的weight為0.5,我們可以使用內(nèi)置的函數(shù)調(diào)成scale,image = pipe(prompt, num_inference_steps=30, guidance_scale=7.5, cross_attention_kwargs={"scale": 0.5}).images[0]
,也可以使用這個代碼,使用這個代碼的原因是我們之后會想要同時使用兩個lora的權(quán)重,同時作用于圖片,生成的效果如下
有幾個也還可以,但是沒有500輪給的效果直觀
2023.7.14
在訓(xùn)練lora水墨風(fēng)的時候,我突然想到,是否將Ink style這個tag加上會更加的有明確性,于是我在所有的標(biāo)注文本前加上了ink style,標(biāo)注變成這樣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,加了指定風(fēng)格詞后,會覆蓋模型原本的水墨風(fēng),不過生成效果更加直接
將盒子lora權(quán)重設(shè)置為0.5,水墨風(fēng)lora設(shè)置權(quán)重為0.5,將guidence_scale設(shè)置為10,步數(shù)從25提升到50后,用prompt=an ink style painting, high quality,highly detailed, package box, box cover painted with a banana, packaging design可以生成這樣的圖像文章來源:http://www.zghlxwxcb.cn/news/detail-554201.html
這種圖片生成出來的感覺很奇怪,似乎是水墨風(fēng),又似乎不是水墨風(fēng),因此我猜測是不是風(fēng)格訓(xùn)練的圖片太少了,于是我將20張圖片提升到80張圖片進行嘗試,水墨風(fēng)格的圖片在這個網(wǎng)站獲取,在訓(xùn)練過程中,我發(fā)現(xiàn)其實lora訓(xùn)練100-200個epochs就可以擬合了,再增加epochs只會使得模型過擬合,因此在后續(xù)的訓(xùn)練中,我會將訓(xùn)練步數(shù)換成訓(xùn)練epochs,改用100個epochs進行訓(xùn)練,每20個epochs生成一次驗證圖片。文章來源地址http://www.zghlxwxcb.cn/news/detail-554201.html
到了這里,關(guān)于Stable Diffusion (持續(xù)更新)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!