使用Dreambooth訓(xùn)練畫風(fēng)的心得及講解

這篇專欄的內(nèi)容其實早就整理好了,一直拖到現(xiàn)在主要還是因為懶。。。
另外就是因為目前說到訓(xùn)練就是各種lora,dreambooth基本上已經(jīng)沒什么人在用了。再加上其實主要的幾個重點我都在視頻里面講過了,只為了幾個參數(shù)調(diào)整又搞個視頻實在沒意思,索性就寫個專欄,把之前那些講過沒講過的都寫一遍,也算是有個比較完整的觀看體驗。
具體的訓(xùn)練參數(shù)我直接放在開頭這里,方便只想看參數(shù)不想浪費時間聽我細(xì)說的不用翻來覆去的上下查找。









如果你愿意多聽我啰嗦幾句,那就容我從頭講起。
一、為什么選擇dreambooth而不是lora來訓(xùn)練
誠然,相較于lora,dreambooth訓(xùn)練(下稱DB訓(xùn)練)的缺點顯而易見,門檻高、速度慢、占空間等等,但相比于lora,DB訓(xùn)練的畫風(fēng)則能更容易的還原(個人見解),并且對于數(shù)據(jù)集的寬容度更高,所以,如果你和我一樣比較看重還原度的,可以試著體驗一下DB訓(xùn)練。

上圖左中右分別為作者(袁藤沖人)原圖、DB訓(xùn)練模型、Lora模型(模型來源c站,作者:ZFTLY)經(jīng)過文生圖生成的圖,tag由作者原圖使用WD1.4反推獲得,種子和其他參數(shù)全部一致。對比僅做參考,完全無法代表孰優(yōu)孰劣!
二、訓(xùn)練前的準(zhǔn)備工作
DB訓(xùn)練門檻要求較高,訓(xùn)練前記得檢查自己的設(shè)備滿不滿足條件
1、擁有一塊至少顯存有12g的n卡(20g以上更好)
2、安裝好stable-diffusion-webui的本體以及dreambooth插件
3、部署好相對應(yīng)的環(huán)境
4、留足相應(yīng)的硬盤空間
這里再加一句關(guān)于DB插件的版本,我比較推薦43ae9d5這個版本(2023年2月12日04:49:57版本)。根據(jù)我的幾次測試,包括調(diào)整了最新版新加的各種參數(shù)后,我發(fā)現(xiàn)相較于最新版本的插件,這個版本訓(xùn)練出來的還原程度最高,如果說老版能有9成像,那么新版就只有7-8成像,并且新版有各種其他蛋疼的地方,如果你確實想用新版,那我在文章后面會另外單獨講解。

考慮到不少人不知道怎么下載老版本插件,我會在文章最后附上43ae9d5版本DB插件的網(wǎng)盤下載地址,只要解壓出來放在webui根目錄下的extensions文件夾內(nèi),再重啟webui即可。
三、DB訓(xùn)練報錯講解
把報錯放在這么前面是因為我發(fā)現(xiàn)大部分在我視頻下方留言和私信我的朋友都是因為訓(xùn)練報錯,所以我提前講了。其實DB訓(xùn)練報錯主要就是四個原因:
1、顯存不夠
這個就是硬傷,如果你的顯存低于12g,那就建議不要使用DB來訓(xùn)練了,或者去租個在線訓(xùn)練。如果你的顯存只有12g,那么訓(xùn)練時就老老實實選擇512或768分辨率吧。
2、環(huán)境沒有正確配置
環(huán)境問題是除了顯存問題外最常見的,最簡單的檢測方法就是在啟動webui后檢查webui控制臺中的這個位置,如下圖所示,當(dāng)這幾個位置前面均為 + 號就表示你的運行環(huán)境沒有問題。反之則需要你重新安裝對應(yīng)的環(huán)境。

使用秋葉大佬整合包的朋友可以在啟動器的高級選項位置,選擇環(huán)境維護(hù)選項來進(jìn)行環(huán)境配置,具體如下圖所示。其他的小伙伴就只能麻煩自己動手配置了。

3、參數(shù)填寫錯誤
參數(shù)填錯也是常見的報錯原因,建議不熟練的朋友在填寫完成后多對照檢查幾遍,然后記得在訓(xùn)練開始前點擊“保存參數(shù)”的按鈕。
4、其他問題
剩下的基本都是些偶發(fā)的小問題,像是沒寫模型名稱、忘了選擇底模啦,數(shù)據(jù)集路徑填錯啦之類的問題,多加注意即可。另外,有朋友和我反饋說如果數(shù)據(jù)集路徑或者數(shù)據(jù)集的文件名含有中文字符也會報錯,我沒有實際驗證過,不過基于windows的尿性,建議各位在這些地方盡量不用中文字符,以防萬一。
訓(xùn)練報錯的問題很多,除了硬件問題外,都可以嘗試下列四板斧套路循序漸進(jìn)來解決。
重啟webui→重啟電腦→重裝DB插件→重新部署環(huán)境
四、準(zhǔn)備數(shù)據(jù)集
數(shù)據(jù)集是訓(xùn)練中最重要的一環(huán),這點不管是什么訓(xùn)練都是一樣的,數(shù)據(jù)集準(zhǔn)備好了,訓(xùn)練就已經(jīng)成功了一大半。DB訓(xùn)練畫風(fēng)有100張左右的數(shù)據(jù)集就能出相當(dāng)不錯的效果,超過300張的話意義就不是很大了,除非是你想在訓(xùn)練畫風(fēng)的同時訓(xùn)練大量角色或服飾等等。雖說DB訓(xùn)練對數(shù)據(jù)集比較寬容,再加上由于自帶分桶訓(xùn)練,也不需要對數(shù)據(jù)集進(jìn)行裁剪,但還是需要進(jìn)行一些篩選來確保數(shù)據(jù)集本身有較高質(zhì)量。(下圖這種多圖合一的情況,還是需要裁剪分開的)

在挑選數(shù)據(jù)集圖片時,如果可以的話,盡量選擇一手?jǐn)?shù)字圖片而非掃描圖片,掃描圖片多多少少會存在顏色失真,并且掃描時的一些缺陷,像是條紋、折痕等也會被當(dāng)成特征被學(xué)進(jìn)去,進(jìn)而反應(yīng)在產(chǎn)出的圖片上。如果實在沒得選,那么盡可能的挑選缺陷較少的掃描圖,或者裁去存在缺陷的部分。(下圖就是有明顯折痕的掃描圖,且左右有色差,需要裁剪)

另外就是注意甄別一些圖片,以角色為主體的畫風(fēng)為例,像是特殊透視構(gòu)圖(容易肢體崩壞)、過暗場景中的人物(容易造成色彩混亂)、帶文字或水印的圖片(出圖污染)等等,這些圖片不是完全不能放,只是需要注意不要在數(shù)據(jù)集中占比過高。(下圖右側(cè)有大片文字,需要裁剪)

如果你想要在訓(xùn)練畫風(fēng)的同時訓(xùn)練角色,那么相關(guān)的準(zhǔn)備工作也是在數(shù)據(jù)集這一步。一般而言,想要還原出一個原本大模型中沒有的角色,需要至少2-4張圖片,當(dāng)然數(shù)據(jù)集更多效果更好,實在不夠的話可以考慮通過鏡像翻轉(zhuǎn)、裁剪等方法來增加數(shù)據(jù)集。準(zhǔn)備好后,將對應(yīng)的角色tag寫入由wd1.4插件反推出的文本文檔最前面,注意避開一些已有的人物名(像是miku、rem這些本身已經(jīng)高度綁定的角色名)以免造成角色特征混淆。(下圖為訓(xùn)練八寶備仁風(fēng)格同時訓(xùn)練了蓮華這個角色,左為原圖,右為原圖反推tag進(jìn)行文生圖生成的圖)

另外,一個有用的小技巧是,針對同一角色但體態(tài)有較大變化的,如龍珠中的少年孫悟空、成年孫悟空,超級賽亞人孫悟空,可以分別標(biāo)記不同的tag來進(jìn)行區(qū)分。
和角色同理,如果想要同時訓(xùn)練服裝、動作等也可以通過調(diào)整tag來一并訓(xùn)練,這里就不展開講了。
另外還有一個點需要在收集數(shù)據(jù)集時特別注意,目前網(wǎng)絡(luò)上的圖片格式多為jpg、png兩種,這兩種格式本身沒有任何問題,都能被DB插件正確識別(其他非主流格式能否識別尚待驗證),但問題在于,這兩種格式可以用相同的命名在同一文件夾下共存,如1.png和1.jpg可以同時存在于一個文件夾下,在這種情況下如果用wd1.4插件批量處理該文件夾時,只會導(dǎo)出一個1.txt文件。要檢查這種問題也很簡單,看導(dǎo)出后文件夾下的txt文件數(shù)量是否和圖片數(shù)量一致,如果一致則說明沒有問題,反正就要檢查一下是否存在同名文件的情況了。
五、創(chuàng)建模型
DB訓(xùn)練的第一步就是選擇底模來創(chuàng)建模型,底模決定了模型的以下兩個方面。
1、數(shù)據(jù)集中未包含的元素(人、物、風(fēng)景、動作、概念等等)。
2、底模的VAE,如經(jīng)典的anythingV3模型,模型內(nèi)置的VAE由于損壞導(dǎo)致出圖發(fā)灰,一般搭配animevae使用,那么你用anythingV3當(dāng)?shù)啄S?xùn)練出來的模型也需要搭配animevae,否則出圖同樣會發(fā)灰。
由于底模的部分缺陷會繼承到訓(xùn)練完成后的模型上,所以底模的選擇非常重要,這里建議大家參考秋葉大佬這則動態(tài)里的模型基礎(chǔ)理論,通過里面的插件檢測一下底模有沒有存在問題。

圖中地址如下:https://docs.qq.com/doc/p/a36aa471709d1cf5758151d68ef5b59397421b2e,文章寫的很專業(yè),大家也可以參考學(xué)習(xí)。
按照本文開頭的參數(shù)設(shè)置好后就可以點擊創(chuàng)建模型按鈕,等待插件創(chuàng)建完成后再進(jìn)行下一步。
六、參數(shù)填寫
這一塊其實沒有啥特別可說的,具體的參考我開頭放出的參數(shù)圖即可,大部分參數(shù)都是目前我個人在實踐中嘗試出來的最優(yōu)解,這里就挑那些需要看情況更改的參數(shù)說明。

上圖中第一項為保存模型的頻率,我習(xí)慣設(shè)置為4,由于總共要跑200個epochs,所以最后會保存50個模型。在不開半精度的情況下,將會占用約200g的硬盤空間。如果硬盤空間吃緊,可以適當(dāng)調(diào)高這項值。
第二項為保存預(yù)覽圖的頻率,這個數(shù)值其實留空不寫也無所謂,反正生成的預(yù)覽圖完全代表不了模型質(zhì)量,基本都是古神。

學(xué)習(xí)率調(diào)度器這里簡單提一嘴,按我上圖這樣設(shè)置的話,最終整個學(xué)習(xí)函數(shù)如下圖所示??梢钥吹接?xùn)練越往后的學(xué)習(xí)率越小,生成的模型在差異上也越小。另外Loss值在訓(xùn)練里面基本上沒有參考價值,大家在訓(xùn)練的時候不用在意具體數(shù)值變動。

分辨率我具體說下,這里的分辨率值指的是你數(shù)據(jù)集中圖片長邊的最大值,由于DB插件自帶分桶訓(xùn)練,舉個例子來說,假定我們有3張圖片,分辨率分別為512*768、1280*720、2048*2048,我們按上圖中將分辨率設(shè)定為1280,那么訓(xùn)練時插件會自動分成512*768、1280*704、1280*1280,三個桶進(jìn)行訓(xùn)練。更多的圖片也是按照這個規(guī)律自動分為不同的桶,我選擇1280主要是因為我訓(xùn)練的圖集有很大一部分來自游戲cg,其分辨率為1280*720。分辨率設(shè)置的越高,訓(xùn)練消耗的時間也會越長,顯存占用也越高,如下圖所示,訓(xùn)練時最高占用峰值再加上顯卡默認(rèn)消耗等等,實際最高大概能到17-18g(分辨率再往上顯存占用不會明顯增加,但訓(xùn)練時間仍會增加,具體測試次數(shù)不多,僅供參考)。在有250張訓(xùn)練集圖片,按1280分辨率訓(xùn)練時,以我的3090顯卡為例,訓(xùn)練時長將達(dá)到14-15個小時,顯卡算力不同時間會相應(yīng)提高或降低,但總體上都是需要耗費十來個小時的大工程,訓(xùn)練時要合理安排時間。

另外,高于768的分辨率請務(wù)必配合xformers使用,不然必定爆顯存。我曾經(jīng)在云端租了臺40g顯存的A100嘗試不開xformers訓(xùn)練1024分辨率,結(jié)果也爆顯存,一般消費級顯卡可想而知。

Concepts頁面下的參數(shù)沒什么好說明的,大家只要注意數(shù)據(jù)集的路徑別填寫錯誤就行了,然后在Instance Prompt的欄位下填寫[filewords],類(Class)提示詞是正則化用的,我們在訓(xùn)練中用不到正則化,所以填不填都一樣,包括下面的樣本圖像的提示詞等等,這些沒什么實際意義,隨便填一填就行。

Concepts頁面上面這兩個按鈕的作用只是套用DB插件的兩個預(yù)設(shè),不用管沒關(guān)系,不過如果你前一個頁面的參數(shù)填好后不小心點到了其中一個按鈕,那你就要重新回去檢查一下參數(shù)并填寫了。
Saving頁面下的參數(shù)沒什么好說的,按照文章開頭的圖勾選即可。另外就是如果勾選了半精度模型,那么最后生成的模型大小將減少一般,約1.9g,如果硬盤吃緊可以勾選。
全部設(shè)置完畢并檢查無誤后需要點擊上方的保存設(shè)置按鈕,第一次保存會出現(xiàn)如下圖一樣的提示框,點擊確定后就可以點擊訓(xùn)練按鈕開始訓(xùn)練了。

七、檢驗?zāi)P?br>
訓(xùn)練完畢以后,生成的模型會在webui根目錄下models/stable-diffusion文件夾中一個以你當(dāng)時給模型命名的文件夾下。每個對應(yīng)的檢查點會有一個模型文件和yaml文件,yaml文件沒什么用處可以直接刪除。如果你完全照搬我的參數(shù),那么這里會有50個模型來供你測試。切記,最后生成的模型不代表效果最好,所以接下來這一步就沒什么可說的了,就是跑xy圖讓50個模型玩吃雞,最終選出一個優(yōu)勝者。不過由于最后的幾個模型之間基本沒什么區(qū)別,所以挑選這一步其實是最耗費精力的,我個人一般就是在里面挑畫手出錯最少的那個??傊?,到了這一步就是完全按自己的喜好來了,各位自行挑選即可。訓(xùn)練完成后,如果想節(jié)約硬盤空間,可以到webui根目錄下models/dreambooth文件夾下將以模型名字命名的文件夾刪除,這個文件夾會占用大約5g左右的硬盤空間。
八、模型的調(diào)用
這一段的內(nèi)容其實應(yīng)該和上面是想通的,不過為了防止混淆我就分開來講。這一段主要就是講怎么才能發(fā)揮出模型本身的潛力。而這個方法就是調(diào)整下圖中的tag、采樣方法、cfg等等一系列參數(shù)。

訓(xùn)練出來的模型決定了出圖上限,而這些參數(shù)決定了出圖的下限。每一個模型都有自己的脾氣,所以不要盲目迷信xx采樣對應(yīng)xx步數(shù),xxcfg效果最好,xxtag有奇效等等,這些都要自己嘗試。這其中,tag的問題尤為明顯,特別是在lora大肆流行的現(xiàn)在,很多人寫tag是越來越隨便了,tag是你和模型溝通的渠道,溝通好了自然能出好圖。我這里就簡單說幾個tag上的心得。
1、不要盲目堆疊質(zhì)量tag
這其實是遠(yuǎn)古模型時期一直傳下來的習(xí)慣,當(dāng)時的模型學(xué)習(xí)了海量的內(nèi)容,所以加上各式的質(zhì)量tag可以顯著提升出圖效果。但我們自己訓(xùn)練生成的模型,主要參考的是我們自己喂給ai的數(shù)據(jù)集,我想沒有人會在數(shù)據(jù)集的文件里塞上一堆的質(zhì)量tag。所以當(dāng)我們使用這些訓(xùn)練后的模型時,完全可以把這些質(zhì)量tag全刪了,多余的質(zhì)量tag不僅不會提升出圖效果,反而可能影響畫風(fēng)。(下圖左為添加了常用質(zhì)量tag:masterpiece,best quality,右為沒有任何質(zhì)量tag,可以看出質(zhì)量tag對出圖幾乎沒有任何正面影響)

2、慎重添加低效tag
這類情況主要分為兩種,一種是添加無意義tag當(dāng)占位符,比如用大量=當(dāng)分隔符,或者使用ai is sb之類的無意義tag占位。由于tag書寫時的權(quán)重會由前到后依次降低,越靠后的tag越容易被ai忽視,所以與其使用這種tag占位還不如去調(diào)整權(quán)重,至少之后排查tag時沒有無用信息。
第二種是自認(rèn)為有效,實際作用不大或無效的tag。這類tag多以形容詞為主,像是cute face之類的,作用不能說沒有,但可能實際效果不大,尤其是DB訓(xùn)練后的模型,可能這類形容詞tag的效果更不明顯,所以實際使用時可以多測試測試。
3、合并同質(zhì)tag
這個問題一般是直接從wd插件復(fù)制反推出的tag而來的,插件反推出的tag會按照置信度從高到低排列,所有有時候會出現(xiàn)大量同質(zhì)tag,多個同質(zhì)tag在出圖時一般不會提供幫助,我們自己填寫的時候就需要盡量合并這些tag,只留一個就行。(下圖左使用tag:twintails,short?twintails,右圖使用tag:short?twintails,可以看出合并了同質(zhì)tag后對發(fā)型不會造成影響)

4、保持書寫整潔
這點只能算作是我的個人習(xí)慣,我習(xí)慣將tag保持在相同的格式,以畫角色為例,我會從上到下依次寫角色名、狀態(tài)、發(fā)色、發(fā)型、瞳色、其他特征、衣物、表情、姿勢、環(huán)境等等,這樣檢查起來十分方便,遇到某部分沒畫好也能快速調(diào)節(jié)。另外也分享一個心得,因為我練畫風(fēng)主要的目的就是想用各類畫風(fēng)畫同人角色,所以我就把這些角色整理好弄了個表格記錄,用的時候直接從表格復(fù)制粘貼出來就行,包括lora也不用再去選項卡里一個個選了,笨方法,但很實用。

再講多就偏題太遠(yuǎn)了,剩下的負(fù)面提示詞、采樣方法、cfg等等其實總結(jié)出來就是一句話,自己多摸索,沒有最好的標(biāo)準(zhǔn)答案,只有最適合的。
九、新版DB插件
這里就挑一些有改動的地方說下,畢竟前面也提到了,新版的DB插件訓(xùn)練效果并不好,所以我研究的沒有舊版這么深。
首先是模型創(chuàng)建移動到了畫面左側(cè),需要點擊創(chuàng)建選項卡切換,并且移除了調(diào)度器的選擇。

設(shè)置頁面上除了可以用滑條調(diào)整參數(shù)外,還將很多原有參數(shù)進(jìn)行細(xì)分,像是將原來的學(xué)習(xí)率細(xì)分為學(xué)習(xí)率和文本編碼器學(xué)習(xí)率,新增了幾種學(xué)習(xí)率調(diào)度器和優(yōu)化器,以及Offset Noise、Weight Decay、TENC Weight Decay等等參數(shù),雖然可以微調(diào)的范圍變廣了,但是實際效果也就那樣。。。
重點說一下新版的分辨率,相較于舊版,新版的分桶訓(xùn)練進(jìn)行了相當(dāng)?shù)疤鄣母膭印?br>

舊版的分辨率前文已經(jīng)介紹過,是設(shè)置最長邊的像素,一目了然。而新版的設(shè)置的是總像素,并且小于該值的圖片會被強制放大到該值。還是用上文的例子,假定有3張圖片,分辨率分別為512*768、1280*720、2048*2048,我們同樣將分辨率設(shè)定為1280,那么此時相當(dāng)于將總像素設(shè)置為了1280*1280=1638400,那么此時的系統(tǒng)將會把圖片分桶為1044*1566(約數(shù))、1706*960(約數(shù))、1280*1280。所以,假如你的數(shù)據(jù)集都是1280*720分辨率,那么正確的分辨率填寫應(yīng)該是根號下(1280*720)=960。總之就是非常蛋疼的分桶,而且直接會把低于目標(biāo)分辨率的圖片強制放大,這就使得我們在選擇數(shù)據(jù)集的時候要更加謹(jǐn)慎。
Concepts頁面下沒什么太大的變動,稍微講下Saving頁面的幾個選項,首先是系統(tǒng)會默認(rèn)勾選一個Save EMA Weights to Generated Models選項,這個選項會額外保存一份EMA權(quán)重,導(dǎo)致模型體積變大,但在實際出圖中并沒有什么幫助,所以記得取消勾選。

另一個需要注意的地方是Diffusion Weights (training snapshots)下面幾個選項,勾選后會在對應(yīng)節(jié)點生成訓(xùn)練快照,方便快速從對應(yīng)節(jié)點重新開始訓(xùn)練。開啟這個功能將占用額外硬盤空間,另外,如果你勾選了這些選項,那么對應(yīng)節(jié)點的訓(xùn)練成果不會直接保存到模型中,還需要你手動在左邊的模型選項卡選擇節(jié)點,再點擊上方的創(chuàng)建模型才行。之前有朋友向我反饋說用新版的DB訓(xùn)練不出效果,生成的模型和底模一模一樣,就是因為啟用了這些選項導(dǎo)致的。

十、彩蛋?
這一段的內(nèi)容是我在寫這篇專欄過程中偶然想到的。眾所周知,lora訓(xùn)練的二次元角色如果放在真人模型當(dāng)中,會跑出類似cosplay的效果,又或者是模型過擬合,導(dǎo)致整個畫面都偏向lora自身的畫風(fēng)。而上文中提到,DB訓(xùn)練過程中,如果是數(shù)據(jù)集中沒有涉及到的內(nèi)容,那么這部分內(nèi)容就會延續(xù)底模的樣式。以下圖為例,我在訓(xùn)練這個畫風(fēng)模型時并沒有用太多涉及室外場景的圖片,從實際出圖對比來看,兩者雖然有些差異,但大體上的風(fēng)格確實是類似的,沒有受到人物畫風(fēng)的影響。

然后我就拍腦袋想了一下,假如我在這個基礎(chǔ)上,用現(xiàn)實的風(fēng)景照來訓(xùn)練背景,能不能做到類似二次元穿越的效果。于是我就找了100張無人風(fēng)景照來對已經(jīng)訓(xùn)練好的畫風(fēng)模型再訓(xùn)練,結(jié)果令人驚喜,如下圖所示,在保持人物畫風(fēng)不變的基礎(chǔ)上,右側(cè)圖片背景畫面明顯比左側(cè)更加的貼近現(xiàn)實。


雖然圖片放大細(xì)看多多少少仍存在一些瑕疵,但至少是有部分“二次元穿越”的感覺在了,思維發(fā)散一些,練出一個真人人物、二次元背景的“穿越二次元”模型也并非不可能。更進(jìn)一步,可以試著多畫風(fēng)同時出現(xiàn)在一張畫里,像是A畫風(fēng)的角色甲和B畫風(fēng)的角色乙在現(xiàn)實背景的場景丙中等等,這些都是可以通過訓(xùn)練來實現(xiàn)的。

結(jié)語
感謝你能看到這里,不知不覺已經(jīng)碼了7000多字,在最后容許我小小的吐槽一下,之前嘗試認(rèn)真做的講解視頻,結(jié)果播放量完全不如起個夸張標(biāo)題的營銷號視頻,所以說總歸還是噱頭和美工更能吸引人嗎。。。不過想想我也不靠視頻吃飯,也就無所謂了。
言歸正傳,上面專欄的內(nèi)容就是我對DB訓(xùn)練的所有心得,由于我不是科班出身,所以沒有很強的專業(yè)知識,所以在內(nèi)容上大多是以結(jié)果導(dǎo)向的經(jīng)驗總結(jié),如果能因此對各位的訓(xùn)練有所幫助和吸引到更多的人嘗試DB訓(xùn)練,那就再好不過了,有問題可以隨時在評論區(qū)提出,我會盡我所能的回答大家,也歡迎各路大佬來批評指正,謝謝。
43ae9d5版本DB插件下載地址:
鏈接:https://pan.baidu.com/s/15D7N8nKiaWNw3bWhitw3LA?pwd=xsgs?
提取碼:xsgs?
解壓后放在webui根目錄下的extensions文件夾內(nèi)