??騰小云導讀
?
最近,AI圖像生成引人注目,它能夠根據(jù)文字描述生成精美圖像,這極大地改變了人們的圖像創(chuàng)作方式。Stable Diffusion作為一款高性能模型,它生成的圖像質(zhì)量更高、運行速度更快、消耗的資源以及內(nèi)存占用更小,是AI圖像生成領域的里程碑。本篇文章作者將手把手教大家入門 Stable Diffusion,可以先收藏再瀏覽,避免迷路!
??看目錄,點收藏
??騰小云導讀
01硬件要求
02?環(huán)境部署
2.1 手動部署
2.2 自動整合包
03 關于插件
04 文生圖最簡流程——重點步驟與參數(shù)
4.1 重點步驟
4.2 參數(shù)
05 提示詞
5.1 提示詞內(nèi)容
5.2 提示詞語法
5.3 Token
5.4 提示詞模板
06 Controlnet
6.1 基本流程
6.2 可用預處理/模型
6.3 多ControlNet合成
07 模型:從下載、安裝、使用到訓練
7.1 模型下載
7.2 模型安裝
7.3 模型使用
7.4 模型訓練
08 風格訓練與人物訓練
8.1?風格訓練
8.2?人物訓練
01硬件要求
本篇我們將詳細講解SD模型的使用教程,各位讀者可以在公眾號后臺回復「AIGC」直接獲取模型以及實現(xiàn)快速部署的GPU服務器限量優(yōu)惠券。
建議使用不少于 16GB 內(nèi)存,并有 60GB 以上的硬盤空間。需要用到 CUDA架構(gòu),推薦使用 N 卡。(目前已經(jīng)有了對 A 卡的相關支持,但運算的速度依舊明顯慢于N卡,參見:
Install and Run on AMD GPUs · AUTOMATIC1111/stable-diffusion-webui Wiki · GitHub。)
注意:過度使用,顯卡會有損壞的風險。進行 512x 圖片生成時主流顯卡速度對比:
02?環(huán)境部署
2.1 手動部署
可以參考 webui 的官方 wiki 部署:
Home · AUTOMATIC1111/stable-diffusion-webui Wiki (github.com)
stable diffusion webui 的完整環(huán)境占用空間極大,能達到幾十 G。值得注意的是,webui 需要聯(lián)網(wǎng)下載安裝大量的依賴,在境內(nèi)網(wǎng)絡環(huán)境下載較慢。接下來是手動部署的6個步驟:
1、安裝?Python
安裝 Python 3.10,安裝時須選中 Add Python to PATH
2、安裝 Git
在 Git-scm.com 下載 Git 安裝包并安裝。下載 webui 的 github 倉庫,按下 win+r 輸入 cmd,調(diào)出命令行窗口。運行下方代碼,并請把代碼中的 PATH_TO_CLONE 替換為自己想下載的目錄。
cd?PATH_TO_CLONE
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
3、裝配模型
可在如 Civitai 上下載標注有 CKPT 的模型,有模型才能作畫。下載的模型放入下載后文件路徑下的 models/Stable-diffusion 目錄。
4、使用
雙擊運行 webui-user.bat 。腳本會自動下載依賴,等待一段時間(可能很長),程序會輸出一個類似 http://127.0.0.1:7860/ 的地址,在瀏覽器中輸入這個鏈接開即可。詳細可參見模型使用。
5、更新
按下 win+r 輸入 cmd,調(diào)出命令行窗口。運行下方,并請把代碼中的 PATH_TO_CLONE 替換為自己下載倉庫的目錄。
cd?PATH_TO_CLONE
git pull
?
2.2 自動整合包
覺得上述步驟麻煩的開發(fā)者可以直接使用整合包,解壓即用。比如獨立研究員的空間下經(jīng)常更新整合包。秋葉的啟動器也非常好用,將啟動器復制到下載倉庫的目錄下即可,更新管理會更方便。
?
打開啟動器后,可一鍵啟動:
如果有其它需求,可以在高級選項中調(diào)整配置。
顯存優(yōu)化根據(jù)顯卡實際顯存選擇,不要超過當前顯卡顯存。不過并不是指定了顯存優(yōu)化量就一定不會超顯存,在出圖時如果啟動了過多的優(yōu)化項(如高清修復、人臉修復、過大模型)時,依然有超出顯存導致出圖失敗的幾率。
xFormers 能極大地改善內(nèi)存消耗和速度,建議開啟。準備工作完畢后,點擊一鍵啟動即可。等待瀏覽器自動跳出,或是控制臺彈出本地 URL 后說明啟動成功。
如果報錯提示缺少 Pytorch,則需要在啟動器中點擊配置。
?
Stable Diffusion webui 的更新比較頻繁,請根據(jù)需求在“版本管理”目錄下更新:
同樣地,也請注意插件的更新:
03 關于插件
Stable Diffusion 可配置大量插件擴展,在 webui 的“擴展”選項卡下,可以安裝插件:
點擊「加載自」后,目錄會刷新。選擇需要的插件點擊右側(cè)的 install 即可安裝。
安裝完畢后,需要重新啟動用戶界面:
04 文生圖最簡流程——重點步驟與參數(shù)
4.1 重點步驟
主要是4步驟:
1、選擇需要使用的模型(底模),這是對生成結(jié)果影響最大的因素,主要體現(xiàn)在畫面風格上。
2、在第一個框中填入提示詞(Prompt),對想要生成的東西進行文字描述。
3、在第二個框中填入負面提示詞(Negative prompt),對不想要生成的東西進行文字描述。
4、選擇采樣方法、采樣次數(shù)、圖片尺寸等參數(shù)。
4.2 參數(shù)
知道完大致的步驟后,下面我們來介紹一些重要的參數(shù),選擇不同將會帶來較大差異:
-
Sampler(采樣器/采樣方法)選擇使用哪種采樣器?
Euler?是最簡單、最快的。 Euler a(Eular ancestral)可以以較少的步數(shù)產(chǎn)生很大的多樣性,不同的步數(shù)可能有不同的結(jié)果。而非 ancestral 采樣器都會產(chǎn)生基本相同的圖像。DPM 相關的采樣器通常具有不錯的效果,但耗時也會相應增加。Euler a 更多樣,不同步數(shù)可以生產(chǎn)出不同的圖片。但是太高步數(shù)?(>30)?效果不會更好。 DDIM?收斂快,但效率相對較低,因為需要很多 step 才能獲得好的結(jié)果,適合在重繪時候使用。 LMS?是 Euler 的衍生,它們使用一種相關但稍有不同的方法(平均過去的幾個步驟以提高準確性)。大概 30 step 可以得到穩(wěn)定結(jié)果 PLMS?是 Euler 的衍生,可以更好地處理神經(jīng)網(wǎng)絡結(jié)構(gòu)中的奇異性。 DPM2?是一種神奇的方法,它旨在改進 DDIM,減少步驟以獲得良好的結(jié)果。它需要每一步運行兩次去噪,它的速度大約是 DDIM 的兩倍,生圖效果也非常好。但是如果你在進行調(diào)試提示詞的實驗,這個采樣器可能會有點慢了。 UniPC?效果較好且速度非???,對平面、卡通的表現(xiàn)較好,推薦使用。 |
-
Sampling Steps(采樣步數(shù))
Stable Diffusion 的工作方式是從以隨機高斯噪聲起步,向符合提示的圖像一步步降噪接近。隨著步數(shù)增多,可以得到對目標更小、更精確的圖像。但增加步數(shù)也會增加生成圖像所需的時間。增加步數(shù)的邊際收益遞減,取決于采樣器。一般開到 20~30。
不同采樣步數(shù)與采樣器之間的關系:
-
CFG Scale(提示詞相關性)
圖像與你的提示的匹配程度。增加這個值將導致圖像更接近你的提示,但它也在一定程度上降低了圖像質(zhì)量。
可以用更多的采樣步驟來抵消。過高的 CFG Scale 體現(xiàn)為粗獷的線條和過銳化的圖像。一般開到 7~11。
CFG Scale 與采樣器之間的關系:
-
生成批次
每次生成圖像的組數(shù)。一次運行生成圖像的數(shù)量為“批次* 批次數(shù)量”。
-
每批數(shù)量
同時生成多少個圖像。增加這個值可以提高性能,但也需要更多的顯存。大的 Batch Size 需要消耗巨量顯存。若沒有超過 12G 的顯存,請保持為 1。
-
尺寸
指定圖像的長寬。出圖尺寸太寬時,圖中可能會出現(xiàn)多個主體。1024 之上的尺寸可能會出現(xiàn)不理想的結(jié)果,推薦使用小尺寸分辨率+高清修復(Hires fix)。
-
種子
種子決定模型在生成圖片時涉及的所有隨機性,它初始化了 Diffusion 算法起點的初始值。
理論上,在應用完全相同參數(shù)(如 Step、CFG、Seed、prompts)的情況下,生產(chǎn)的圖片應當完全相同。
-
高清修復
通過勾選 "Highres. fix" 來啟用。默認情況下,文生圖在高分辨率下會生成非?;煦绲膱D像。如果使用高清修復,會型首先按照指定的尺寸生成一張圖片,然后通過放大算法將圖片分辨率擴大,以實現(xiàn)高清大圖效果。最終尺寸為(原分辨率*縮放系數(shù) Upscale by)。
放大算法中,Latent 在許多情況下效果不錯,但重繪幅度小于 0.5 后就不甚理想。ESRGAN_4x、SwinR 4x 對 0.5 以下的重繪幅度有較好支持。
Hires step 表示在進行這一步時計算的步數(shù)。
Denoising strength 字面翻譯是降噪強度,表現(xiàn)為最后生成圖片對原始輸入圖像內(nèi)容的變化程度。該值越高,放大后圖像就比放大前圖像差別越大。低 denoising 意味著修正原圖,高 denoising 就和原圖就沒有大的相關性了。一般來講閾值是 0.7 左右,超過 0.7 和原圖基本上無關,0.3 以下就是稍微改一些。實際執(zhí)行中,具體的執(zhí)行步驟為 Denoising strength * Sampling Steps。
-
面部修復
修復畫面中人物的面部,但是非寫實風格的人物開啟面部修復可能導致面部崩壞。點擊“生成”即可。
?
05 提示詞
提示詞所做的工作是縮小模型出圖的解空間,即縮小生成內(nèi)容時在模型數(shù)據(jù)里的檢索范圍,而非直接指定作畫結(jié)果。
提示詞的效果也受模型的影響,有些模型對自然語言做特化訓練,有些模型對單詞標簽對特化訓練,那么對不同的提示詞語言風格的反應就不同。
5.1 提示詞內(nèi)容
提示詞中可以填寫以下內(nèi)容:
類型 | 要求 |
自然 語言 |
可以使用描述物體的句子作為提示詞。大多數(shù)情況下英文有效,也可以使用中文。避免復雜的語法。 |
單詞 標簽 |
可以使用逗號隔開的單詞作為提示詞。一般使用普通常見的單詞。單詞的風格要和圖像的整體風格搭配,否則會出現(xiàn)混雜的風格或噪點。避免出現(xiàn)拼寫錯誤。 可參考 Tags | Danbooru?(donmai.us) |
Emoji 顏文字 |
Emoji (??????????????) 表情符號也是可以使用并且非常準確的。因為Emoji只有一個字符,所以在語義準確度上表現(xiàn)良好。關于 emoji 的確切含義,可以參考 Emoji List, v15.0?(unicode.org) |
值得注意的是,Emoji 在構(gòu)圖上有影響。舉個例子,??????輸出后:
對于使用 Danbooru 數(shù)據(jù)的模型來說,可以使用西式顏文字在一定程度上控制出圖的表情。如::-) 微笑 :-( 不悅 ;-) 使眼色 :-D 開心 :-P 吐舌頭 :-C 很悲傷 :-O 驚訝 張大口 :-/ 懷疑
5.2 提示詞語法
根據(jù)自己想畫的內(nèi)容寫出提示詞,多個提示詞之間使用英文半角符號 [ , ],如:
masterpiece, best quality, ultra-detailed, illustration, close-up, straight on, face focus, 1girl, white hair, golden eyes, long hair, halo, angel wings, serene expression, looking at viewer |
一般而言,概念性的、大范圍的、風格化的關鍵詞寫在前面,敘述畫面內(nèi)容的關鍵詞其次,最后是描述細節(jié)的關鍵詞,大致順序如:
(畫面質(zhì)量提示詞), (畫面主題內(nèi)容)(風格), (相關藝術家), (其他細節(jié)) |
不過在模型中,每個詞語本身自帶的權重可能有所不同。如果模型訓練集中較多地出現(xiàn)某種關鍵詞,在提示詞中只輸入一個詞就能極大地影響畫面。
反之如果模型訓練集中較少地出現(xiàn)某種關鍵詞,在提示詞中可能輸入很多個相關詞匯都對畫面的影響效果有限。提示詞的順序很重要,越靠后的權重越低。關鍵詞最好具有特異性,譬如 Anime?(動漫)一詞就相對泛化,而 Jojo 一詞就能清晰地指向 Jojo 動漫的畫風。措辭越不抽象越好,盡可能避免留下解釋空間的措辭。
可以使用括號人工修改提示詞的權重,方法如:
-
(word)?- 將權重提高 1.1 倍
-
((word))?- 將權重提高 1.21 倍(= 1.1 * 1.1)
-
[word] - 將權重降低至原先的 90.91%
-
(word:1.5)?- 將權重提高 1.5 倍
-
(word:0.25)?- 將權重減少為原先的 25%
-
\(word\) - 在提示詞中使用字面意義上的 () 字符
( n ) = ( n : 1.1 ) (( n )) = ( n : 1.21 ) ((( n ))) = ( n : 1.331 ) (((( n )))) = ( n : 1.4641 ) ((((( n )))) = ( n : 1.61051 ) (((((( n )))))) = ( n : 1.771561 ) |
請注意,權重值最好不要超過 1.5。
還可以通過 Prompt Editing 使得 AI 在不同的步數(shù)生成不一樣的內(nèi)容,譬如在某階段后,繪制的主體由男人變成女人。?
語法為:
[to:when] 在指定數(shù)量的 step 后,將to處的提示詞添加到提示
[from::when] 在指定數(shù)量的 step 后從提示中刪除?from處的提示詞
[from:to:when] 在指定數(shù)量的 step 后將?from處的提示詞替換為 to處的提示詞
例1:? a [fantasy:cyberpunk:16] landscape 在一開始,讀入的提示詞為:the model will be drawing a fantasy landscape. 在第 16 步之后,提示詞將被替換為:a cyberpunk landscape, 它將繼續(xù)在之前的圖像上計算 例2: 對于提示詞為: fantasy landscape with a [mountain:lake:0.25] and [an oak:a christmas tree:0.75][ in foreground::0.6][ in background:0.25] [shoddy:masterful:0.5],100 步采樣, 一開始。提示詞為:fantasy landscape with a mountain and an oak in foreground shoddy 在第 25 步后,提示詞為:fantasy landscape with a lake and an oak in foreground in background shoddy 在第 50 步后,提示詞為:fantasy landscape with a lake and an oak in foreground in background masterful 在第 60 步后,提示詞為:fantasy landscape with a lake and an oak in background masterful 在第 75 步后,提示詞為:fantasy landscape with a lake and a christmas tree in background masterful |
提示詞還可以輪轉(zhuǎn),譬如
[cow|horse]?in?a field
在第一步時,提示詞為“cow in a field”;在第二步時,提示詞為"horse in a field.";在第三步時,提示詞為"cow in a field" ,以此類推。
5.3 Token
實際上,程序是將輸入的關鍵詞以 Token 的形式傳入模型進行計算的:?
“ (Medieval astronomer using a telescope with a cosmic starry sky in the background.sketch, hand draw style, con, uncomplicated background )”
轉(zhuǎn)換為 Token ID 即:263, 10789, 40036, 1996, 320, 19037, 593, 320, 18304, 30963, 2390, 530, 518, 5994, 8, 11, 263, 5269, 267, 2463, 4001, 1844, 267, 5646, 267, 569, 16621, 5994, 264 。
一個單詞可能對應一個或多個 Token,多個單詞也可能對應同一個 Token。
5.4 提示詞模板
可參考 Civitai | Stable Diffusion models, embeddings, hypernetworks and more 中優(yōu)秀作品的提示詞作為模板。類似的網(wǎng)站還有:
-
Majinai:MajinAI | Home
-
詞圖:詞圖 PromptTool - AI 繪畫資料管理網(wǎng)站
-
Black Lily:black_lily
-
Danbooru 標簽超市:Danbooru 標簽超市
-
魔咒百科詞典:魔咒百科詞典
-
AI 詞匯加速器:AI 詞匯加速器 AcceleratorI Prompt
-
NovelAI 魔導書:NovelAI 魔導書
-
鱉哲法典:鱉哲法典
-
Danbooru tag:Tag Groups Wiki | Danbooru?(donmai.us)
-
AIBooru:AIBooru: Anime Image Board
06 Controlnet
Controlnet 允許通過線稿、動作識別、深度信息等對生成的圖像進行控制。請注意,在使用前請確保 ControlNet 設置下的路徑與本地 Stable Diffusion 的路徑同步。
6.1 基本流程
-
點擊 Enable 啟用該項 ControlNet
-
Preprocessor 指預處理器,它將對輸入的圖像進行預處理。如果圖像已經(jīng)符合預處理后的結(jié)果,請選擇 None。譬如,圖中導入的圖像已經(jīng)是 OpenPose 需要的骨架圖,那么 preprocessor 選擇 none 即可。
-
在 Weight 下,可以調(diào)整該項 ControlNet 的在合成中的影響權重,與在 prompt 中調(diào)整的權重類似。Guidance strength 用來控制圖像生成的前百分之多少步由 Controlnet 主導生成,這點與[:]語法類似。
-
Invert Input Color 表示啟動反色模式,如果輸入的圖片是白色背景,開啟它。
-
RGB to BGR 表示將輸入的色彩通道信息反轉(zhuǎn),即 RGB 信息當做 BGR 信息解析,只是因為 OpenCV 中使用的是 BGR 格式。如果輸入的圖是法線貼圖,開啟它。
-
Low VRAM 表示開啟低顯存優(yōu)化,需要配合啟動參數(shù)“--lowvram”。
-
Guess Mode 表示無提示詞模式,需要在設置中啟用基于 CFG 的引導。
-
Model 中請選擇想要使用解析模型,應該與輸入的圖像或者預處理器對應。請注意,預處理器可以為空,但模型不能為空。
??6.2 可用預處理/模型
-
canny:用于識別輸入圖像的邊緣信息。
-
depth:用于識別輸入圖像的深度信息。
-
hed:用于識別輸入圖像的邊緣信息,但邊緣更柔和。
-
mlsd:用于識別輸入圖像的邊緣信息,一種輕量級的邊緣檢測。它對橫平豎直的線條非常敏感,因此更適用于于室內(nèi)圖的生成。
-
normal:用于識別輸入圖像的法線信息。
-
openpose:用于識別輸入圖像的動作信息。
OpenPose Editor插件可以自行修改姿勢,導出到文生圖或圖生圖。
-
scribble:將輸入圖像作為線稿識別。如果線稿是白色背景,務必勾選“Invert Input Color”
-
fake_scribble:識別輸入圖像的線稿,然后再將它作為線稿生成圖像。
-
segmentation:識別輸入圖像各區(qū)域分別是什么類型的物品,再用此構(gòu)圖信息生成圖像。
如果想繪制一張符合 segementation 規(guī)范的圖像,可以使用以下色表繪制。
color_coding_semantic_segmentation_classes - Google 表格
6.3 多ControlNet合成
在 ControlNet 的設置下,可以調(diào)整可用 ControlNet 的數(shù)量。
在多個 ControlNet 模式下,結(jié)果會將輸入的信息合并生成圖像:
07 模型:從下載、安裝、使用到訓練
7.1 模型下載
模型能夠有效地控制生成的畫風和內(nèi)容。常用的模型網(wǎng)站有:
-
Civitai | Stable Diffusion models, embeddings, hypernetworks and more
-
Models - Hugging Face
-
SD - WebUI 資源站
-
元素法典 AI 模型收集站 - AI 繪圖指南 wiki?(aiguidebook.top)
-
AI 繪畫模型博物館?(subrecovery.top)
7.2 模型安裝
下載模型后需要將之放置在指定的目錄下,請注意,不同類型的模型應該拖放到不同的目錄下。模型的類型可以通過 Stable Diffusion 法術解析檢測。?
-
大模型(Ckpt):放入 models\Stable-diffusion
-
VAE?模型:
一些大模型需要配合 vae 使用,對應的 vae 同樣放置在 models\Stable-diffusion 或 models\VAE 目錄,然后在 webui 的設置欄目選擇。
-
Lora/LoHA/LoCon 模型:放入
extensions\sd-webui-additional-networks\models\lora,
也可以在 models/Lora 目錄
-
Embedding 模型:放入 embeddings 目錄
7.3 模型使用
-
Checkpoint(ckpt)?模型
對效果影響最大的模型。在 webui 界面的左上角選擇使用。
一些模型會有觸發(fā)詞,即在提示詞內(nèi)輸入相應的單詞才會生效。
-
Lora 模型 / LoHA 模型 / LoCon 模型
對人物、姿勢、物體表現(xiàn)較好的模型,在 ckpt 模型上附加使用。在 webui 界面的 Additional Networks 下勾線 Enable 啟用,然后在 Model 下選擇模型,并可用 Weight 調(diào)整權重。權重越大,該 Lora 的影響也越大。不建議權重過大(超過1.2),否則很容易出現(xiàn)扭曲的結(jié)果。
多個 lora 模型混合使用可以起到疊加效果,譬如一個控制面部的 lora 配合一個控制畫風的 lora 就可以生成具有特定畫風的特定人物。因此可以使用多個專注于不同方面優(yōu)化的 Lora,分別調(diào)整權重,結(jié)合出自己想要實現(xiàn)的效果。
LoHA 模型是一種 LORA 模型的改進。LoCon 模型也一種 LORA 模型的改進,泛化能力更強。
-
Embedding
對人物、畫風都有調(diào)整效果的模型。在提示詞中加入對應的關鍵詞即可。大部分Embedding模型的關鍵詞與文件名相同,譬如一個名為為“SomeCharacter.pt”的模型,觸發(fā)它的關鍵詞檢索“SomeCharacter”。
7.4 模型訓練
?? 7.4.1 環(huán)境搭建
以 GitHub - bmaltais/kohya_ss 為例,它提供了在 Windows 操作系統(tǒng)下的 GUI 訓練面板。如果需要在 Linux 上部署且需要 GUI,請參考
GitHub - P2Enjoy/kohya_ss-docker: This is the tandem repository to exploit on linux the kohya_ss training webui converted to Linux. It uses the fork in the following link
需要保證設備擁有 Python 3.10.6 及 git 環(huán)境。
首先,以管理員模式啟動Powershell,執(zhí)行“Set-ExecutionPolicy Unrestricted”命令,并回答“A"。然后可以關閉該窗口。
其次,啟動一個普通的 Powershell 窗口,在需要克隆該倉庫的路徑下,執(zhí)行以下命令:
git clone https://github.com/bmaltais/kohya_ss.git
cd?kohya_ss
python?-m?venv venv
.\venv\Scripts\activate
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116
pip install --use-pep517 --upgrade -r requirements.txt
pip install -U -I --no-deps https://github.com/C43H66N12O12S2/stable-diffusion-webui/releases/download/f/xformers-0.0.14.dev0-cp310-cp310-win_amd64.whl
cp?.\bitsandbytes_windows\*.dll .\venv\Lib\site-packages\bitsandbytes\
cp?.\bitsandbytes_windows\cextension.py?.\venv\Lib\site-packages\bitsandbytes\cextension.py?
cp?.\bitsandbytes_windows\main.py?.\venv\Lib\site-packages\bitsandbytes\cuda_setup\main.py??
accelerate config
在執(zhí)行“accelerate config”后,它將詢問一些設置選項。請按照以下選項依次選擇:
This machine No distributed training NO NO NO all fp16 |
30 系、40 系顯卡可選擇安裝 CUDNN:
.\venv\Scripts\activate
python .\tools\cudann_1.8_install.py
??7.4.2?環(huán)境更新
如果需要更新倉庫,請執(zhí)行以下命令:
git pull
.\venv\Scripts\activate
pip?install?--use-pep517 --upgrade -r requirements.txt
??7.4.3?界面啟動
在 Powershell 中執(zhí)行:
.\gui.ps1
雙擊 gui.bat 也可以。彈出以下界面后,直接訪問 URL 即可。
??7.4.4?訓練流程
模型訓練主要有三種結(jié)果:欠擬合、效果好、過擬合。
-
欠擬合:模型完全沒有從數(shù)據(jù)集中學習到經(jīng)驗,對各種輸入都得出差距很大的結(jié)果。
-
效果好:模型不僅對訓練集中的輸入有接近的結(jié)果,對不來自訓練集中的輸入也有接近的效果。
-
過擬合:模型只訓練集中的輸入有非常非常接近的結(jié)果,對不來自訓練集中的輸入給出差距很大的結(jié)果。
接下來開始講訓練流程,主要會有6步:準備訓練集、圖片裁剪、圖片打標、正則化、文件路徑組織、訓練參數(shù)。其中,訓練參數(shù)(也即第6步)我們會展開講述。
??7.4.4.1?準備訓練集
圖片盡可能高清,風格統(tǒng)一但內(nèi)容形式多樣(譬如動作多樣、服裝多樣)。
樣本數(shù)量可能影響到擬合結(jié)果。樣本量太少,模型可能欠擬合;樣本量過大,模型可能過擬合。(譬如讓一個人學習英語,只給他幾條例句去看,他可能什么都沒學會【欠擬合】;給了它幾十億條例句去看,他可能只會根據(jù)別人說的話查字典一樣回話,如果字典里沒有就完全不會說了【過擬合】)。
??7.4.4.2?圖片裁剪
將訓練集裁剪為多個尺寸相同的圖片??梢栽?SD webui 界面中自動裁剪,也可以手動裁切。
一般使用的圖片尺寸是 512*512,也可更換為其他尺寸,尺寸越大占用顯存越高,但對細節(jié)的捕捉也會越好。
??7.4.4.3?圖片打標
我們先說關鍵詞生成,再講關鍵詞合并、編組。
-
關鍵詞生成
可以在訓練環(huán)境的頁面下打標:
也可以在 sd webui 的頁面下打標:
比較這幾種不同的打標器的效果,在同一輸入下:? 【本義:一個在鐵匠鋪里打鐵的男鐵匠】
打標器 | 效果 | 效果(中文翻譯) |
Stable Diffusion webui-訓練-圖像預處理-BLIP |
a man in a kitchen with a fire in the fireplace and a hammer in his hand and a hammer in his other hand |
一個男人在廚房里,壁爐里生著火,手里拿著錘子,另一只手拿著錘子 |
Stable Diffusion webui-訓練-圖像預處理-deepbooru |
1boy, black_gloves, gloves, indoors, male_focus, shirt, short_sleeves, solo |
一個男孩,黑色手套,手套,室內(nèi),男人特寫,襯衫,短袖,單人 |
Stable Diffusion webui-Tagger(WD14) |
1boy, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, facial hair, bandana, blue shirt, shirt |
?一個男孩,烹飪,煎鍋,男人特寫,單人,手套,圍裙,火,棕色鞋,黑色手套,靴子,爐子,廚房,握著,胡子,頭巾,藍色襯衫,襯衫 |
kohya webui-Utilities-Captioning-BLIP?Captioning |
a man is working on a piece of metal |
一個男人正在加工一塊金屬 |
kohya webui-Utilities-Captioning-GIT?Captioning |
a drawing of a blacksmith with a hammer and a glove on his hand. |
?一幅畫,畫的是一個手上戴著手套、拿著錘子的鐵匠。 |
打標對圖片的描述越準越好,如果條件允許,嘗試人工打標。
-
關鍵詞合并
在生成出的關鍵詞中,我們需要把與訓練目標強相關的關鍵詞劃為一個統(tǒng)一的特征表述。
以"1boy, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, facial hair, bandana, blue shirt, shirt"為例,假如我們的訓練對象就是一個男性大胡子,那么他必然始終攜帶著”男人、胡子“這兩個要素,那么我們可以用一個詞總結(jié)這個角色,例如用”Smith“替代”1boy,facial hair",整條句子將變?yōu)椋?/p>
|
以此類推,我們需要為目標綁定什么要素,就將它從關鍵詞中刪去。而類似于動作、背景這種與對象綁定關系不緊密,在日后生成圖期間需要改變的,就保留在關鍵詞中。
-
編組
一些具有同組關系的圖片可以利用關鍵詞引導 AI 去歸納它們。譬如,我們訓練的對象 Smith 有三張圖,分別是全圖、背景、前景,那么我可以如此處理:
|
|
|
Smith, Smith_group1, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, bandana, blue shirt, shirt |
Smith_group1,no humans, table, fire, indoors, kitchen |
Smith, Smith_group1, solo, male focus, gloves, frying pan, apron, weapon, gun, holding, white background, bandana, boots,?black gloves, simple background, cooking, blue shirt, brown footwear, shirt |
??7.4.4.4?正則化
訓練集中的每張圖片通常能被分解為兩大部分:“訓練目標+其他要素”,依然以 Smith 為例:
圖片 | 完整內(nèi)容 | 訓練目標 | 其他要素 |
|
在鐵匠鋪里打鐵的鐵匠 Smith | Smith? | 鐵匠鋪、打鐵、鐵匠 |
其中,”鐵匠鋪、打鐵、鐵匠“都是模型中已有的內(nèi)容,稱為“先驗知識”。我們需要將這部分知識為 AI 指明,省去重新學習這部分內(nèi)容的時間;也能引導 AI 明確學習的目標,讓模型具有更好的泛化性。
正則化通過降低模型的復雜性提高泛化能力。模型越復雜,模型的泛化能力越差,要達到相同的泛化能力,越復雜的模型需要的樣本數(shù)量就越多,為了提高模型的泛化能力,需要正則化來限制模型復雜度。
正則化的標簽需要與訓練集中的 Class 相對應,圖片數(shù)量也要一致。
正則化不是必須的,可以根據(jù)訓練集的情況和訓練目的的不同來調(diào)整。
同一張圖片不允許在訓練集和正則化中同時出現(xiàn)。
?7.4.4.5?文件路徑組織
在訓練前,我們需要用特定的方式組織文件路徑:譬如,訓練目標是一群女孩,其中有一位名為 sls 的女孩好一位名為 cpc 的女孩,那么文件路徑應該為:
●train_girls ----○10_sls 1girl ----○10_cpc 1girl ●reg_girls ----○1_1girl |
其中,train_girls 目錄下放置的是訓練集,命名規(guī)則是“訓練次數(shù)_<標識符> <類別>”,如“10_sls 1girl”表示“名為 sls 的對象,她是一個女孩(類別),這個文件夾下的訓練集每個訓練 10 次”。
reg_girls 目錄下放置的是正則化內(nèi)容。命名規(guī)則是“訓練次數(shù)_<類別>”,如“1_1girl“表示”文件夾下的圖片都是一個女孩,不重復使用數(shù)據(jù)“。*需要日后補充
??7.4.4.6?訓練參數(shù)
在 kohya webui 界面訓練時,ckpt 與 lora 訓練方法類似。
a. 底模
它表明我們此次訓練將以哪個模型為基礎進行訓練。這個模型需要根據(jù)自己的需求選擇。如果很明確自己的目標是屬于某一大類下的分支,那么可以用接近這一大類的模型進行訓練。譬如想訓練一個二次元角色,那么可以使用二次元的底模(如 NovelAI)進行訓練。如果自己的像訓練的目標需要比較好的泛化性,可以使用 sd 模型,因為它包含的人物、物品、風格最多。如果模型為sd2.0,則需要勾選 v2 和 v_parameterization
b. 最大分辨率 Max resolution
Training parameters 下的 Max Resolution 用于指定當前輸入訓練集圖片的分辨率,請與文件夾內(nèi)的保持一致。如果尺寸不一會被裁切。
c. Epoch
Epoch 是指一次將訓練集中的所有樣本訓練一次(即對每個樣本完成一次正向傳播與一次反向傳播)的過程。有時,由于一個訓練樣本過于龐大,它會被分成多個小塊分批學習,每個小塊就叫 batch。
在深度學習中,程序通過不斷地將數(shù)據(jù)集在神經(jīng)網(wǎng)絡中往復傳遞來更新網(wǎng)絡中的權重,以此建立對目標的擬合關系,因此只有反復地迭代才能增強數(shù)據(jù)集的擬合度。隨著 epoch 的增加,模型將從欠擬合(右一,表示即便是來自于數(shù)據(jù)集中的輸入,模型也很難達到它應該有的結(jié)果,類似于“只做題庫里的題都做不對的差生”)變?yōu)檫^擬合(左一,表示模型對于來自于數(shù)據(jù)集中的輸入,總能精確地達到對應的對結(jié)果,但是如果輸入一旦有些許偏差,比如輸入一些不是訓練集中的輸入,那結(jié)果就會很差,類似于“只會做題庫里的題的書呆子”)。 我們希望能達到中間的效果,即對訓練集輸出相對準確的結(jié)果,又對不在訓練集里的輸入也有較好的表現(xiàn)。這種特征就叫泛化。 因此,我們需要不少于一個 epoch 才能建立起較好的擬合關系,當然也不能太多。對于不同的數(shù)據(jù)集,使用的 epoch 都可能有所不同。 |
d. Batch size
batch size 表示訓練時的批量大小,也就是一次訓練中選取的樣本數(shù)量。這個參數(shù)對性能有一定要求,如果性能足夠,增加 batch size 在理論上會提高模型的準確性。如果數(shù)據(jù)集樣本量較小,Batch Size 可以等于樣本數(shù)量,即把所有數(shù)據(jù)集一起輸入網(wǎng)絡進行訓練,這樣做的效果也很好;但是如果樣本量較大,這肯定讓設備吃不消,因此需要減小 Batch Size。但是,如果 Batch Size 太小,那么意味著在一個 Epoch 中迭代的次數(shù)也會減小,訓練時權重的調(diào)整速度變慢,為了抵消這種影響,還得提高 epoch 才能有更好的效果。所以 Batch Size 與 Epoch 參數(shù)二者是相輔相成的,他們二者的關系就好比一次刷多少題和總共刷多少次題。合適的 batch size 應該讓 GPU 正好滿載運行。
e. Save every N epochs
每 N 個 Epoch 保存一次
f. 學習率 Learning Rate
學習率指的是一次迭代(即輸入一個樣本對它學習,并用此次學習的經(jīng)驗調(diào)整神經(jīng)網(wǎng)絡)的步長。這個值越大,表明一次學習對模型的影響越大。為了讓學習循序漸進,學習率不應該太高,我們需要 AI 在訓練中反復總結(jié)一點點經(jīng)驗,最后累積為完整的學習成果。合理的學習率會讓學習過程收斂,Loss 達到足夠低。
學習率太低,容易出現(xiàn)局部最優(yōu)解,類似于“一個開車的 AI 稀里糊涂地開完全程,車技很菜”;學習率太高,容易使得模型不收斂,找不到解,類似于“一個開車的 AI 完全不會開車,只會原地打圈瞎操作”。
g. 學習率調(diào)度器 Learning Rate Scheduler
學習率調(diào)度器是一種用于動態(tài)調(diào)整學習率的技術,它可以在訓練過程中根據(jù)模型的表現(xiàn)自動調(diào)整學習率,以提高模型的訓練效果和泛化能力。通常,學習率在訓練開始時設置為比較高的值,允許 AI“在一次訓練中學得更多更快”。隨著訓練的進行,學習率會降低,逐步收斂到最優(yōu)。在訓練過程中降低學習率也稱為退火或衰減。
-
adafactor:自適應學習率。
-
constant?:恒定,學習率不變。
-
constant_with_warmup:恒定預熱。學習率在開始會增大一點,然后退回原學習率不變。
-
Cosine:使用余弦函數(shù)來調(diào)整學習率,使其在訓練過程中逐漸降低。常被稱為余弦退火。
-
cosine_with_restarts:余弦退火重啟。在 consine 的基礎上每過幾個周期將進行一次重啟,該值在選擇后可以設定。
-
linear:線性。學習率線性下降。
-
Polynomial:使用多項式函數(shù)來調(diào)整學習率。
h.學習率預熱比例 LR warmup
剛開始訓練時模型的權重是隨機初始化的,如果此時選擇一個較大的學習率,可能會帶來模型的不穩(wěn)定。學習率預熱就是在剛開始訓練的時候先使用一個較小的學習率,先訓練一段時間,等模型穩(wěn)定時再修改為預先設置的學習率進行訓練。(例如,假設我們在訓練神經(jīng)網(wǎng)絡時設置了一個學習率為 0.1,預熱比例為 0.1。則在訓練的前 10% 的迭代次數(shù)中,我們會逐漸將學習率從 0.01 增加到 0.1,然后在剩余的訓練迭代次數(shù)中使用設定的學習率 0.1。)
i. 優(yōu)化器 Optimizer
在訓練神經(jīng)網(wǎng)絡時,需要在反向傳播中逐步更新模型的權重參數(shù)。優(yōu)化器的作用就是根據(jù)當前模型計算結(jié)果與目標的偏差,不斷引導模型調(diào)整權重,使得偏差不斷逼近最小。Adafactor 和 Lion 是推薦使用的優(yōu)化器。
-
Adam:一種常用的梯度下降算法,被廣泛應用于神經(jīng)網(wǎng)絡模型的優(yōu)化中。它結(jié)合了動量梯度下降和自適應學習率方法的優(yōu)點,既可以加快收斂速度,又可以避免學習率調(diào)整不當導致的振蕩和陷入局部最優(yōu)解。并且對于不同的參數(shù)有不同的學習率,更加適用于高維度的參數(shù)空間。
-
AdamW:對 Adam 算法的改進方案,對懲罰項參數(shù)進行控制,能更好地控制模型的復雜度,防止模型過擬合,提高泛化性能。
-
AdamW8bit:8bit 模式的 AdamW,能降低顯存占用,略微加快訓練速度。
-
Adafactor:自適應優(yōu)化器,對 Adam 算法的改進方案,降低了顯存占用。參考學習率為 0.005。
-
DAdaptation:自適應優(yōu)化器,比梯度下降(SGD)方法更加穩(wěn)定有效、使用時請將學習率設置為 1。
-
Lion:自適應優(yōu)化器,節(jié)省更多顯存、速度更快,與 AdamW 和 Adafactor 相比有 15% 左右的加速。參考學習率為 0.001。
-
SGDNesterov:一種常用的優(yōu)化算法,基于梯度下降(SGD)方法進行優(yōu)化,通過引入動量的概念加速收斂速度。
-
SGDNesterov8bit:8bit 模式的 SGDNesterov,能降低顯存占用,略微加快訓練速度。
j. Text Encoder 與 Unet
機器不能直接識別人類的語言,Text Encoder 是一種用于將文本數(shù)據(jù)轉(zhuǎn)換為機器可讀形式的模型或算法。對于輸入的一串提示詞,程序會將它們分解為一個個標記(Token)輸入給 Text Encoder(一個Token通常代表著一個特征),這樣一句話就能被轉(zhuǎn)為一個向量為機器所識別 。
Unet 是一種用于圖像分割的深度學習模型,它的作用是將圖像分割為多個不同的構(gòu)成部分。經(jīng)過訓練后,它可以來填充圖像中缺失或損壞的部分,或者對灰度草圖進行著色。
可以為它們設置不同的學習率,分別對應了“識別文字描述”和“識別圖片”的能力。
在原版 Dreambooth 訓練中,我們只能讓 AI 學習 UNET 模型,XavierXiao改進添加了額外訓練 Text Encoder ?,在本文使用的倉庫中就沿用了這種改進。
k. Network Rank(Dimension)
表示神經(jīng)網(wǎng)絡的維度,維度越大,模型的表達能力就越強。如果訓練 lora,該值不要超過 64;如果訓練 loha,該值不要超過 32;如果訓練 locon,該值不要超過 12 ,但還是要根據(jù)具體的訓練目標來定,如果目標比較簡單,就完全不需要太高的 Rank。
在神經(jīng)網(wǎng)絡中,每一層都由許多個神經(jīng)元節(jié)點構(gòu)成,它們縱橫交錯構(gòu)成了一個 N 維空間。維度越大,代表模型中就越多的神經(jīng)元節(jié)點可以處理各種要素。——當然,這也意味著模型的訓練難度就越大,也可能變得更容易過擬合,它可能需要更多的、更準確的數(shù)據(jù)集,更大的迭代次數(shù)。
l. Network Alpha
對模型過擬合的懲罰權重。它表示對模型在訓練時出現(xiàn)完全擬合(即輸出結(jié)果與樣本一致)時的懲罰的權重,適當提高它可以增加模型的泛化能力(當然也不能太高)。目前經(jīng)驗認為設置為 alpha 設置在1以下效果更好。
舉一個通俗的例子,一個學生在抄學霸的作業(yè),為了不與學霸的結(jié)果完全相同,他需要對每個答案做一些小小的改動。對老師而言,一個完全照抄答案的學生約等于一個只會抄不會想的學生,而能稍作修改的學生說明還有對題目思考理解的能力。所以要稍微地“懲罰”那些只會照抄的學生,引導學生自己思考。因此這個值不能太低(完全不懲罰照抄),也不能太高(太大的懲罰讓學渣完全不能從學霸的答案里獲得參考)。
m. Caption Dropout
Dropout 是在深度學習中一種防止過擬合的技術,在訓練中,可能模型會反復計算某些節(jié)點,隨著訓練的進行,這可能導致錯誤的路徑依賴,即模型會變得總是依賴這些節(jié)點解決問題,就像某個學生碰巧刷到了幾道解題方法相似的題目,就誤認為所有的題目都要用這種解題方法。Dropout 的解決方法是隨機關閉某些神經(jīng)元,迫使模型在訓練時減少神經(jīng)元之間的依賴關系,從而讓神經(jīng)網(wǎng)絡的泛化能力更強。當然,在實際使用模型的時候,Dropout 是關閉的。
在訓練中,也可以隨機將一些訓練集的標記(Caption)剔除。在 Drop out caption every n epochs 中,可以指定每隔多少 epoch 就剔除一些標記;在 Rate of caption dropout 中,可以指定剔除幾成的標記。
n. Noise Offset
在原版的 Stable Diffusion 中,模型得出的圖片在亮度上總是很平均,亮的場景不夠亮,暗的場景不夠暗,而且用傳統(tǒng)的訓練方法也無法讓它學會避免這個問題?。一般輸入 0.1。
通過 Noise Offset,可以讓圖像在亮和暗上的表現(xiàn)更加明顯(右圖)。
o.xformers
Xformers 是一個用于加快圖像生成速度并減少顯存占用的庫。
p. Gradient checkpointing
梯度檢查點(Gradient checkpointing)是一種在訓練模型時減少顯存占用的方法,但是會增加訓練時長。它避免在訓練期間一次計算所有權重,而是逐步計算權重,從而減少訓練所需的顯存量。關閉它不會影響模型的準確性,但打開它后可以使用更大的 Batch Size。
雖然單次訓練的時長可能增加了單次訓練的時長,但如果增大了Batch Size,總的學習時間實際上可能會更快。
q. shuffle caption
打開它,可以讓訓練時訓練集的標簽被打亂(Shuffle,洗牌)。如輸入"鐵匠鋪,工人,打鐵",可能被轉(zhuǎn)換為”鐵匠鋪,打鐵,工人“或”工人,鐵匠鋪,打鐵“。
這種操作通常用于增強模型對于不同文本順序的魯棒性,從而提高模型的泛化能力。打亂操作可以多次進行,從而更大程度地增加數(shù)據(jù)的隨機性。
Shuffle caption 可以在多種相似的圖像中使用。如果差異較大,就不要使用了。
在每一個 epoch 中,輸入的前 4 個 token 會被當做觸發(fā)詞,此外的 token 會被當做排除集。ai 會將排除集中的元素在素材中刪除后,把素材的剩余部分學進前 4 個 token 中。因此,如果不開啟 keep tokens,在進行打亂后,打標中的每一個 tag 在足夠多的 epoch 后,都將成為觸發(fā)詞。 ? ? ? ? ? ? ? ? ? ? |
r. Token
如果你的 Caption 比較長,那么可以擴充一次輸入允許的 Token 量。如果不是必要,保持默認值 75。
s. Clip Skip
Clip 是一個轉(zhuǎn)換提示詞為 Token 形式的神經(jīng)網(wǎng)絡,是模型理解文字的源頭。
它開啟與否與底模有關。譬如,一些模型在第一層的神經(jīng)網(wǎng)絡將輸入的詞轉(zhuǎn)換為 Token 讀取,傳輸給下一層網(wǎng)絡,但是通過 Clip Skip,可以手動控制跳過 Stable Diffusion 的 Clip 階段,直接使用模型的 Tokenizer 對某些層級直接傳輸 Token 進去。有些時候調(diào)整這個參數(shù)可以讓結(jié)果更好。
默認情況下 SD2.0 使用倒數(shù)第二層接收 Token,因此不要在 SD2.0 學習中指定。
08 風格訓練與人物訓練
8.1?風格訓練
訓練集盡可能包含該畫風對不同事物的描繪。有幾個要點:
-
盡可能對訓練集進行正則化。如果數(shù)據(jù)足夠大,可以將數(shù)據(jù)二分,一部分作為訓練集,一部分作為正則化圖集。如果數(shù)據(jù)不夠大,可以先用高學習率快速訓練出一個臨時模型,用它產(chǎn)出接近于該畫風的圖片,然后將它投入訓練集。
-
如果是小模型,可以在生成時變更大模以調(diào)整生成效果;如果是大模型,可以通過模型融合以調(diào)整效果。
-
模型效果不好不一定是模型不好,提示詞與最終的效果有非常大的關系。
8.2?人物訓練
訓練集盡可能包含人物在不同角度的畫面。如果人物圖像很少,可以通過以下的方式擴充訓練集:
-
鏡像
-
用高學習率快速訓練出一個臨時模型,用它產(chǎn)出人物的新圖,將新圖投入訓練集
以上是本次分享全部內(nèi)容,歡迎大家在評論區(qū)分享交流。如果覺得內(nèi)容有用,歡迎轉(zhuǎn)發(fā)~文章信息比較長,小云建議先一鍵三連,后續(xù)慢慢細品。在公眾號后臺回復「AIGC」直接獲取模型、實現(xiàn)快速部署的GPU服務器限量優(yōu)惠券。
參考材料
https://wandb.ai/yepster/tpu-t5-base/reports/Adafactor-learning-rate-0-005-seems-best-for-t5-base-training--VmlldzoxNTgyODIw
https://arxiv.org/pdf/2301.07733.pdf
https://github.com/google/automl/tree/master/lion
https://medium.com/analytics-vidhya/nlp-text-encoding-a-beginners-guide-fa332d715854
https://medium.com/analytics-vidhya/painting-sketches-with-ml-33a3ece74d31
https://github.com/XavierXiao/Dreambooth-Stable-Diffusion/
https://github.com/KohakuBlueleaf/LyCORIS
https://www.crosslabs.org//blog/diffusion-with-offset-noise
-End-
原創(chuàng)作者|黃志翔文章來源:http://www.zghlxwxcb.cn/news/detail-548005.html
技術責編|黃志翔文章來源地址http://www.zghlxwxcb.cn/news/detail-548005.html
到了這里,關于【AI繪圖 丨 Stable_diffusion 系列教程四】— Window 環(huán)境 | Stable Diffusion入門教程 及安裝(全篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!