給想玩AI的新手|Stable Diffusion 保姆級入門手冊

圖片

圖片

👉騰小云導讀

最近,AI圖像生成引人注目,它能夠根據文字描述生成精美圖像,這極大地改變了人們的圖像創作方式。Stable Diffusion作爲一款高性能模型,它生成的圖像質量更高、運行速度更快、消耗的資源以及內存佔用更小,是AI圖像生成領域的里程碑。本篇文章作者將手把手教大家入門 Stable Diffusion,可以先收藏再瀏覽,避免迷路!

👉看目錄,點收藏

1 硬件要求

2 環境部署

2.1 手動部署

2.2 自動整合包

3 關於插件

4 文生圖最簡流程——重點步驟與參數

5 提示詞

5.1 提示詞內容

5.2 提示詞語法

5.3 Token

5.4 提示詞模板

6 Controlnet

6.1 基本流程

6.2 可用預處理/模型

6.3 多 ControlNet 合成

7 模型:從下載、安裝、使用到訓練

7.1 模型下載

7.2 模型安裝

7.3 模型使用

7.4 模型訓練

7.5 環境搭建

7.6 環境更新

7.7 界面啓動

7.8 訓練流程

8 風格訓練與人物訓練

01、 硬件要求

本篇我們將詳細講解SD模型的使用教程,各位讀者可以在公衆號後臺回覆 「AIGC」 直接獲取模型以及實現快速部署的GPU服務器限量優惠券。

建議使用不少於 16GB 內存,並有 60GB 以上的硬盤空間。需要用到 CUDA架構,推薦使用 N 卡。(目前已經有了對 A 卡的相關支持,但運算的速度依舊明顯慢於N卡,參見:

Install and Run on AMD GPUs · AUTOMATIC1111/stable-diffusion-webui Wiki · GitHub。)

注意:過度使用,顯卡會有損壞的風險。進行 512x 圖片生成時主流顯卡速度對比:

圖片

02、環境部署

2.1手動部署

可以參考 webui 的官方 wiki 部署:

Home · AUTOMATIC1111/stable-diffusion-webui Wiki (github.com)

stable diffusion webui 的完整環境佔用空間極大,能達到幾十 G。值得注意的是,webui 需要聯網下載安裝大量的依賴,在境內網絡環境下載較慢。接下來是手動部署的6個步驟:

1、安裝Python

安裝 Python 3.10,安裝時須選中 Add Python to PATH

2、安裝 Git

在 Git-scm.com 下載 Git 安裝包並安裝。下載 webui 的 github 倉庫,按下 win+r 輸入 cmd,調出命令行窗口。運行下方代碼,並請把代碼中的 PATH_TO_CLONE 替換爲自己想下載的目錄。

cd PATH_TO_CLONEgit 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,調出命令行窗口。運行下方,並請把代碼中的 PATH_TO_CLONE 替換爲自己下載倉庫的目錄。

cd PATH_TO_CLONEgit pull

2.2 自動整合包

覺得上述步驟麻煩的開發者可以直接使用整合包,解壓即用。 比如獨立研究員的空間下經常更新整合包。秋葉的啓動器也非常好用,將啓動器複製到下載倉庫的目錄下即可,更新管理會更方便。

圖片

打開啓動器後,可一鍵啓動:

圖片

如果有其它需求,可以在高級選項中調整配置。

圖片

顯存優化根據顯卡實際顯存選擇,不要超過當前顯卡顯存。不過並不是指定了顯存優化量就一定不會超顯存,在出圖時如果啓動了過多的優化項(如高清修復、人臉修復、過大模型)時,依然有超出顯存導致出圖失敗的機率。

xFormers 能極大地改善內存消耗和速度,建議開啓。準備工作完畢後,點擊一鍵啓動即可。等待瀏覽器自動跳出,或是控制檯彈出本地 URL 後說明啓動成功。

圖片

如果報錯提示缺少 Pytorch,則需要在啓動器中點擊配置。

圖片

圖片

Stable Diffusion webui 的更新比較頻繁,請根據需求在“版本管理”目錄下更新:

圖片

同樣地,也請注意插件的更新:

圖片

03、 關於插件

Stable Diffusion 可配置大量插件擴展,在 webui 的“擴展”選項卡下,可以安裝插件:

圖片

點擊「加載自」後,目錄會刷新。選擇需要的插件點擊右側的 install 即可安裝。

圖片

安裝完畢後,需要重新啓動用戶界面:

圖片

04、文生圖最簡流程——重點步驟與參數

4.1 重點步驟

主要是4步驟:

1、選擇需要使用的模型(底模),這是對生成結果影響最大的因素,主要體現在畫面風格上。

圖片

2、在第一個框中填入提示詞(Prompt),對想要生成的東西進行文字描述。

圖片

3、在第二個框中填入負面提示詞(Negative prompt),對不想要生成的東西進行文字描述。

圖片

4、選擇採樣方法、採樣次數、圖片尺寸等參數。

圖片

4.2 參數

知道完大致的步驟後,下面我們來介紹一些重要的參數,選擇不同將會帶來較大差異:

  • Sampler(採樣器/採樣方法)選擇使用哪種採樣器?

Euler 是最簡單、最快的。
Euler a(Eular ancestral)可以以較少的步數產生很大的多樣性,不同的步數可能有不同的結果。而非 ancestral 採樣器都會產生基本相同的圖像。DPM 相關的採樣器通常具有不錯的效果,但耗時也會相應增加。Euler a 更多樣,不同步數可以生產出不同的圖片。但是太高步數 (>30) 效果不會更好。
DDIM 收斂快,但效率相對較低,因爲需要很多 step 才能獲得好的結果,適合在重繪時候使用。
LMS 是 Euler 的衍生,它們使用一種相關但稍有不同的方法(平均過去的幾個步驟以提高準確性)。大概 30 step 可以得到穩定結果
PLMS 是 Euler 的衍生,可以更好地處理神經網絡結構中的奇異性。
DPM2 是一種神奇的方法,它旨在改進 DDIM,減少步驟以獲得良好的結果。它需要每一步運行兩次去噪,它的速度大約是 DDIM 的兩倍,生圖效果也非常好。但是如果你在進行調試提示詞的實驗,這個採樣器可能會有點慢了。
UniPC 效果較好且速度非常快,對平面、卡通的表現較好,推薦使用。

  • Sampling Steps(採樣步數)

Stable Diffusion 的工作方式是從以隨機高斯噪聲起步,向符合提示的圖像一步步降噪接近。隨着步數增多,可以得到對目標更小、更精確的圖像。但增加步數也會增加生成圖像所需的時間。增加步數的邊際收益遞減,取決於採樣器。一般開到 20~30。

不同採樣步數與採樣器之間的關係:

圖片

  • CFG Scale(提示詞相關性)

圖像與你的提示的匹配程度。增加這個值將導致圖像更接近你的提示,但它也在一定程度上降低了圖像質量。

可以用更多的採樣步驟來抵消。過高的 CFG Scale 體現爲粗獷的線條和過銳化的圖像。一般開到 7~11。

CFG Scale 與採樣器之間的關係:

圖片

  • 生成批次

每次生成圖像的組數。一次運行生成圖像的數量爲“批次* 批次數量”。

  • 每批數量

同時生成多少個圖像。增加這個值可以提高性能,但也需要更多的顯存。大的 Batch Size 需要消耗巨量顯存。若沒有超過 12G 的顯存,請保持爲 1。

  • 尺寸

指定圖像的長寬。出圖尺寸太寬時,圖中可能會出現多個主體。1024 之上的尺寸可能會出現不理想的結果,推薦使用小尺寸分辨率+高清修復(Hires fix)。

  • 種子

種子決定模型在生成圖片時涉及的所有隨機性,它初始化了 Diffusion 算法起點的初始值。

理論上,在應用完全相同參數(如 Step、CFG、Seed、prompts)的情況下,生產的圖片應當完全相同。

  • 高清修復

圖片

通過勾選 "Highres. fix" 來啓用。默認情況下,文生圖在高分辨率下會生成非常混沌的圖像。如果使用高清修復,會型首先按照指定的尺寸生成一張圖片,然後通過放大算法將圖片分辨率擴大,以實現高清大圖效果。最終尺寸爲(原分辨率*縮放係數 Upscale by)。

放大算法中,Latent 在許多情況下效果不錯,但重繪幅度小於 0.5 後就不甚理想。ESRGAN_4x、SwinR 4x 對 0.5 以下的重繪幅度有較好支持。

Hires step 表示在進行這一步時計算的步數。

Denoising strength 字面翻譯是降噪強度,表現爲最後生成圖片對原始輸入圖像內容的變化程度。該值越高,放大後圖像就比放大前圖像差別越大。低 denoising 意味着修正原圖,高 denoising 就和原圖就沒有大的相關性了。一般來講閾值是 0.7 左右,超過 0.7 和原圖基本上無關,0.3 以下就是稍微改一些。實際執行中,具體的執行步驟爲 Denoising strength * Sampling Steps。

  • 面部修復

修復畫面中人物的面部,但是非寫實風格的人物開啓面部修復可能導致面部崩壞。點擊“生成”即可。

圖片

05、提示詞

提示詞所做的工作是縮小模型出圖的解空間,即縮小生成內容時在模型數據裏的檢索範圍,而非直接指定作畫結果。

提示詞的效果也受模型的影響,有些模型對自然語言做特化訓練,有些模型對單詞標籤對特化訓練,那麼對不同的提示詞語言風格的反應就不同。

5.1提示詞內容

提示詞中可以填寫以下內容:

值得注意的是,Emoji 在構圖上有影響。舉個例子,💐👩💐輸出後:

圖片

對於使用 Danbooru 數據的模型來說,可以使用西式顏文字在一定程度上控制出圖的表情。如::-) 微笑 :-( 不悅 ;-) 使眼色 :-D 開心 :-P 吐舌頭 :-C 很悲傷 :-O 驚訝 張大口 :-/ 懷疑

5.2提示詞語法

根據自己想畫的內容寫出提示詞,多個提示詞之間使用英文半角符號 [ , ],如:

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

一般而言,概念性的、大範圍的、風格化的關鍵詞寫在前面,敘述畫面內容的關鍵詞其次,最後是描述細節的關鍵詞,大致順序如:

(畫面質量提示詞), (畫面主題內容)(風格), (相關藝術家), (其他細節) |

不過在模型中,每個詞語本身自帶的權重可能有所不同。如果模型訓練集中較多地出現某種關鍵詞,在提示詞中只輸入一個詞就能極大地影響畫面。

反之如果模型訓練集中較少地出現某種關鍵詞,在提示詞中可能輸入很多個相關詞彙都對畫面的影響效果有限。提示詞的順序很重要,越靠後的權重越低。關鍵詞最好具有特異性,譬如 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 在不同的步數生成不一樣的內容,譬如在某階段後,繪製的主體由男人變成女人。

圖片

語法爲:

[to:when] 在指定數量的 step 後,將to處的提示詞添加到提示  
  
[from::when] 在指定數量的 step 後從提示中刪除 from處的提示詞  
  
[from:to:when] 在指定數量的 step 後將 from處的提示詞替換爲 to處的提示詞

例1: 

a [fantasy:cyberpunk:16] landscape

在一開始,讀入的提示詞爲:the model will be drawing a fantasy landscape.

在第 16 步之後,提示詞將被替換爲:a cyberpunk landscape, 它將繼續在之前的圖像上計算

例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

提示詞還可以輪轉,譬如

[cow|horse] in a field

在第一步時,提示詞爲“cow in a field”;在第二步時,提示詞爲"horse in a field.";在第三步時,提示詞爲"cow in a field" ,以此類推。

5.3Token

實際上,程序是將輸入的關鍵詞以 Token 的形式傳入模型進行計算的:

圖片

“ (Medieval astronomer using a telescope with a cosmic starry sky in the background.sketch, hand draw style, con, uncomplicated background )”

轉換爲 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 中優秀作品的提示詞作爲模板。類似的網站還有:

  • Majinai:MajinAI | Home

  • 詞圖:詞圖 PromptTool - AI 繪畫資料管理網站

  • 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 指預處理器,它將對輸入的圖像進行預處理。如果圖像已經符合預處理後的結果,請選擇 None。譬如,圖中導入的圖像已經是 OpenPose 需要的骨架圖,那麼 preprocessor 選擇 none 即可。

  • 在 Weight 下,可以調整該項 ControlNet 的在合成中的影響權重,與在 prompt 中調整的權重類似。Guidance strength 用來控制圖像生成的前百分之多少步由 Controlnet 主導生成,這點與[:]語法類似。

  • Invert Input Color 表示啓動反色模式,如果輸入的圖片是白色背景,開啓它。

  • RGB to BGR 表示將輸入的色彩通道信息反轉,即 RGB 信息當做 BGR 信息解析,只是因爲 OpenCV 中使用的是 BGR 格式。如果輸入的圖是法線貼圖,開啓它。

  • Low VRAM 表示開啓低顯存優化,需要配合啓動參數“--lowvram”。

  • Guess Mode 表示無提示詞模式,需要在設置中啓用基於 CFG 的引導。

  • Model 中請選擇想要使用解析模型,應該與輸入的圖像或者預處理器對應。請注意,預處理器可以爲空,但模型不能爲空。

6.2可用預處理/模型

  • canny:用於識別輸入圖像的邊緣信息。

圖片

  • depth:用於識別輸入圖像的深度信息。

圖片

  • hed:用於識別輸入圖像的邊緣信息,但邊緣更柔和。

圖片

  • mlsd:用於識別輸入圖像的邊緣信息,一種輕量級的邊緣檢測。它對橫平豎直的線條非常敏感,因此更適用於於室內圖的生成。

圖片

  • normal:用於識別輸入圖像的法線信息。

圖片

  • openpose:用於識別輸入圖像的動作信息。

圖片

OpenPose Editor插件可以自行修改姿勢,導出到文生圖或圖生圖。

圖片

  • scribble:將輸入圖像作爲線稿識別。如果線稿是白色背景,務必勾選“Invert Input Color”

圖片

  • fake_scribble:識別輸入圖像的線稿,然後再將它作爲線稿生成圖像。

圖片

  • segmentation:識別輸入圖像各區域分別是什麼類型的物品,再用此構圖信息生成圖像。

圖片

如果想繪製一張符合 segementation 規範的圖像,可以使用以下色表繪製。

color_coding_semantic_segmentation_classes - Google 表格

圖片

6.3 多ControlNet合成

在 ControlNet 的設置下,可以調整可用 ControlNet 的數量。

圖片

在多個 ControlNet 模式下,結果會將輸入的信息合併生成圖像:

圖片

圖片

07、模型:從下載、安裝、使用到訓練

7.1模型下載

模型能夠有效地控制生成的畫風和內容。常用的模型網站有:

  • 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 界面的左上角選擇使用。

圖片

一些模型會有觸發詞,即在提示詞內輸入相應的單詞纔會生效。

  • Lora 模型 / LoHA 模型 / LoCon 模型

對人物、姿勢、物體表現較好的模型,在 ckpt 模型上附加使用。在 webui 界面的 Additional Networks 下勾線 Enable 啓用,然後在 Model 下選擇模型,並可用 Weight 調整權重。權重越大,該 Lora 的影響也越大。不建議權重過大(超過1.2),否則很容易出現扭曲的結果。

圖片

多個 lora 模型混合使用可以起到疊加效果,譬如一個控制面部的 lora 配合一個控制畫風的 lora 就可以生成具有特定畫風的特定人物。因此可以使用多個專注於不同方面優化的 Lora,分別調整權重,結合出自己想要實現的效果。

LoHA 模型是一種 LORA 模型的改進。LoCon 模型也一種 LORA 模型的改進,泛化能力更強。

  • Embedding

對人物、畫風都有調整效果的模型。在提示詞中加入對應的關鍵詞即可。大部分Embedding模型的關鍵詞與文件名相同,譬如一個名爲爲“SomeCharacter.pt”的模型,觸發它的關鍵詞檢索“SomeCharacter”。

7.4 模型訓練

7.4.1 環境搭建

以 GitHub - bmaltais/kohya_ss 爲例,它提供了在 Windows 操作系統下的 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 環境。

首先,以管理員模式啓動Powershell,執行“Set-ExecutionPolicy Unrestricted”命令,並回答“A"。然後可以關閉該窗口。

圖片

其次,啓動一個普通的 Powershell 窗口,在需要克隆該倉庫的路徑下,執行以下命令:

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

在執行“accelerate config”後,它將詢問一些設置選項。請按照以下選項依次選擇:

This machine

No distributed training

NO

NO

NO

all

fp16

30 系、40 系顯卡可選擇安裝 CUDNN:

.\venv\Scripts\activatepython .\tools\cudann_1.8_install.py

7.4.2 環境更新

如果需要更新倉庫,請執行以下命令:

git pull .\venv\Scripts\activate pip install --use-pep517 --upgrade -r requirements.txt

7.4.3 界面啓動

在 Powershell 中執行:

.\gui.ps1

雙擊 gui.bat 也可以。彈出以下界面後,直接訪問 URL 即可。

圖片

圖片

7.4.4 訓練流程

模型訓練主要有三種結果:欠擬合、效果好、過擬合。

  • 欠擬合:模型完全沒有從數據集中學習到經驗,對各種輸入都得出差距很大的結果。

  • 效果好:模型不僅對訓練集中的輸入有接近的結果,對不來自訓練集中的輸入也有接近的效果。

  • 過擬合:模型只訓練集中的輸入有非常非常接近的結果,對不來自訓練集中的輸入給出差距很大的結果。

接下來開始講訓練流程,主要會有6步:準備訓練集、圖片裁剪、圖片打標、正則化、文件路徑組織、訓練參數。 其中,訓練參數(也即第6步)我們會展開講述。

7.4.4.1 準備訓練集

圖片儘可能高清,風格統一但內容形式多樣(譬如動作多樣、服裝多樣)。

圖片

樣本數量可能影響到擬合結果。樣本量太少,模型可能欠擬合;樣本量過大,模型可能過擬合。(譬如讓一個人學習英語,只給他幾條例句去看,他可能什麼都沒學會【欠擬合】;給了它幾十億條例句去看,他可能只會根據別人說的話查字典一樣回話,如果字典裏沒有就完全不會說了【過擬合】)。

7.4.4.2 圖片裁剪

將訓練集裁剪爲多個尺寸相同的圖片。可以在 SD webui 界面中自動裁剪,也可以手動裁切。

圖片

一般使用的圖片尺寸是 512*512,也可更換爲其他尺寸,尺寸越大佔用顯存越高,但對細節的捕捉也會越好。

7.4.4.3 圖片打標

我們先說關鍵詞生成,再講關鍵詞合併、編組。

  • 關鍵詞生成

可以在訓練環境的頁面下打標:

圖片

也可以在 sd webui 的頁面下打標:

圖片

圖片

比較這幾種不同的打標器的效果,在同一輸入下:  【本義:一個在鐵匠鋪裏打鐵的男鐵匠】

圖片

打標對圖片的描述越準越好,如果條件允許,嘗試人工打標。

  • 關鍵詞合併

在生成出的關鍵詞中,我們需要把與訓練目標強相關的關鍵詞劃爲一個統一的特徵表述。

以_"1boy, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, facial hair, bandana, blue shirt, shirt"_爲例,假如我們的訓練對象就是一個男性大鬍子,那麼他必然始終攜帶着”男人、鬍子“這兩個要素,那麼我們可以用一個詞總結這個角色,例如用”Smith“替代”1boy,facial hair",整條句子將變爲:

  • 原關鍵詞:1boy, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, facial hair, bandana, blue shirt, shirt
  • 合併後:Smith, cooking, frying pan, male focus, solo, gloves, apron, fire, brown footwear, black gloves, boots, stove, kitchen, holding, bandana, blue shirt, shirt

以此類推,我們需要爲目標綁定什麼要素,就將它從關鍵詞中刪去。而類似於動作、背景這種與對象綁定關係不緊密,在日後生成圖期間需要改變的,就保留在關鍵詞中。

  • 編組

一些具有同組關係的圖片可以利用關鍵詞引導 AI 去歸納它們。譬如,我們訓練的對象 Smith 有三張圖,分別是全圖、背景、前景,那麼我可以如此處理:

image.png

7.4.4.4 正則化

訓練集中的每張圖片通常能被分解爲兩大部分:“訓練目標+其他要素”,依然以 Smith 爲例:

image.png

其中,”鐵匠鋪、打鐵、鐵匠“都是模型中已有的內容,稱爲“先驗知識”。我們需要將這部分知識爲 AI 指明,省去重新學習這部分內容的時間;也能引導 AI 明確學習的目標,讓模型具有更好的泛化性。

正則化通過降低模型的複雜性提高泛化能力。模型越複雜,模型的泛化能力越差,要達到相同的泛化能力,越複雜的模型需要的樣本數量就越多,爲了提高模型的泛化能力,需要正則化來限制模型複雜度。

正則化的標籤需要與訓練集中的 Class 相對應,圖片數量也要一致。

正則化不是必須的,可以根據訓練集的情況和訓練目的的不同來調整。

同一張圖片不允許在訓練集和正則化中同時出現。

7.4.4.5 文件路徑組織

在訓練前,我們需要用特定的方式組織文件路徑:譬如,訓練目標是一羣女孩,其中有一位名爲 sls 的女孩好一位名爲 cpc 的女孩,那麼文件路徑應該爲:

●train_girls

----○10_sls 1girl

----○10_cpc 1girl

●reg_girls

----○1_1girl

其中,train_girls 目錄下放置的是訓練集,命名規則是“訓練次數_<標識符> <類別>”,如“10_sls 1girl”表示“名爲 sls 的對象,她是一個女孩(類別),這個文件夾下的訓練集每個訓練 10 次”。

reg_girls 目錄下放置的是正則化內容。命名規則是“訓練次數_<類別>”,如“1_1girl“表示”文件夾下的圖片都是一個女孩,不重複使用數據“。*需要日後補充

7.4.4.6 訓練參數

在 kohya webui 界面訓練時,ckpt 與 lora 訓練方法類似。

a. 底模

圖片

它表明我們此次訓練將以哪個模型爲基礎進行訓練。這個模型需要根據自己的需求選擇。如果很明確自己的目標是屬於某一大類下的分支,那麼可以用接近這一大類的模型進行訓練。譬如想訓練一個二次元角色,那麼可以使用二次元的底模(如 NovelAI)進行訓練。如果自己的像訓練的目標需要比較好的泛化性,可以使用 sd 模型,因爲它包含的人物、物品、風格最多。如果模型爲sd2.0,則需要勾選 v2 和 v_parameterization

圖片

b. 最大分辨率 Max resolution

Training parameters 下的 Max Resolution 用於指定當前輸入訓練集圖片的分辨率,請與文件夾內的保持一致。如果尺寸不一會被裁切。

圖片

c. Epoch

圖片

Epoch 是指一次將訓練集中的所有樣本訓練一次(即對每個樣本完成一次正向傳播與一次反向傳播)的過程。有時,由於一個訓練樣本過於龐大,它會被分成多個小塊分批學習,每個小塊就叫 batch。

在深度學習中,程序通過不斷地將數據集在神經網絡中往復傳遞來更新網絡中的權重,以此建立對目標的擬合關係,因此只有反覆地迭代才能增強數據集的擬合度。隨着 epoch 的增加,模型將從欠擬合(右一,表示即便是來自於數據集中的輸入,模型也很難達到它應該有的結果,類似於“只做題庫裏的題都做不對的差生”)變爲過擬合(左一,表示模型對於來自於數據集中的輸入,總能精確地達到對應的對結果,但是如果輸入一旦有些許偏差,比如輸入一些不是訓練集中的輸入,那結果就會很差,類似於“只會做題庫裏的題的書呆子”)。
我們希望能達到中間的效果,即對訓練集輸出相對準確的結果,又對不在訓練集裏的輸入也有較好的表現。這種特徵就叫泛化。
圖片

因此,我們需要不少於一個 epoch 才能建立起較好的擬合關係,當然也不能太多。對於不同的數據集,使用的 epoch 都可能有所不同。

d. Batch size

圖片

batch size 表示訓練時的批量大小,也就是一次訓練中選取的樣本數量。這個參數對性能有一定要求,如果性能足夠,增加 batch size 在理論上會提高模型的準確性。如果數據集樣本量較小,Batch Size 可以等於樣本數量,即把所有數據集一起輸入網絡進行訓練,這樣做的效果也很好;但是如果樣本量較大,這肯定讓設備喫不消,因此需要減小 Batch Size。但是,如果 Batch Size 太小,那麼意味着在一個 Epoch 中迭代的次數也會減小,訓練時權重的調整速度變慢,爲了抵消這種影響,還得提高 epoch 纔能有更好的效果。所以 Batch Size 與 Epoch 參數二者是相輔相成的,他們二者的關係就好比一次刷多少題和總共刷多少次題。合適的 batch size 應該讓 GPU 正好滿載運行。

e. Save every N epochs

圖片

每 N 個 Epoch 保存一次

f. 學習率 Learning Rate

圖片

學習率指的是一次迭代(即輸入一個樣本對它學習,並用此次學習的經驗調整神經網絡)的步長。這個值越大,表明一次學習對模型的影響越大。爲了讓學習循序漸進,學習率不應該太高,我們需要 AI 在訓練中反覆總結一點點經驗,最後累積爲完整的學習成果。合理的學習率會讓學習過程收斂,Loss 達到足夠低。

學習率太低,容易出現局部最優解,類似於“一個開車的 AI 稀裏糊塗地開完全程,車技很菜”;學習率太高,容易使得模型不收斂,找不到解,類似於“一個開車的 AI 完全不會開車,只會原地打圈瞎操作”。

g. 學習率調度器 Learning Rate Scheduler

圖片

學習率調度器是一種用於動態調整學習率的技術,它可以在訓練過程中根據模型的表現自動調整學習率,以提高模型的訓練效果和泛化能力。通常,學習率在訓練開始時設置爲比較高的值,允許 AI“在一次訓練中學得更多更快”。隨着訓練的進行,學習率會降低,逐步收斂到最優。在訓練過程中降低學習率也稱爲退火或衰減。

  • adafactor:自適應學習率。

  • constant :恆定,學習率不變。

  • constant_with_warmup:恆定預熱。學習率在開始會增大一點,然後退回原學習率不變。

  • Cosine:使用餘弦函數來調整學習率,使其在訓練過程中逐漸降低。常被稱爲餘弦退火。

  • cosine_with_restarts:餘弦退火重啓。在 consine 的基礎上每過幾個週期將進行一次重啓,該值在選擇後可以設定。

  • linear:線性。學習率線性下降。

  • Polynomial:使用多項式函數來調整學習率。

h.學習率預熱比例 LR warmup

圖片

剛開始訓練時模型的權重是隨機初始化的,如果此時選擇一個較大的學習率,可能會帶來模型的不穩定。學習率預熱就是在剛開始訓練的時候先使用一個較小的學習率,先訓練一段時間,等模型穩定時再修改爲預先設置的學習率進行訓練。(例如,假設我們在訓練神經網絡時設置了一個學習率爲 0.1,預熱比例爲 0.1。則在訓練的前 10% 的迭代次數中,我們會逐漸將學習率從 0.01 增加到 0.1,然後在剩餘的訓練迭代次數中使用設定的學習率 0.1。)

i. 優化器 Optimizer

圖片

在訓練神經網絡時,需要在反向傳播中逐步更新模型的權重參數。優化器的作用就是根據當前模型計算結果與目標的偏差,不斷引導模型調整權重,使得偏差不斷逼近最小。Adafactor 和 Lion 是推薦使用的優化器。

  • Adam:一種常用的梯度下降算法,被廣泛應用於神經網絡模型的優化中。它結合了動量梯度下降和自適應學習率方法的優點,既可以加快收斂速度,又可以避免學習率調整不當導致的振盪和陷入局部最優解。並且對於不同的參數有不同的學習率,更加適用於高維度的參數空間。

  • AdamW:對 Adam 算法的改進方案,對懲罰項參數進行控制,能更好地控制模型的複雜度,防止模型過擬合,提高泛化性能。

  • AdamW8bit:8bit 模式的 AdamW,能降低顯存佔用,略微加快訓練速度。

  • Adafactor:自適應優化器,對 Adam 算法的改進方案,降低了顯存佔用。參考學習率爲 0.005。

  • DAdaptation:自適應優化器,比梯度下降(SGD)方法更加穩定有效、使用時請將學習率設置爲 1。

  • Lion:自適應優化器,節省更多顯存、速度更快,與 AdamW 和 Adafactor 相比有 15% 左右的加速。參考學習率爲 0.001。

  • SGDNesterov:一種常用的優化算法,基於梯度下降(SGD)方法進行優化,通過引入動量的概念加速收斂速度。

  • SGDNesterov8bit:8bit 模式的 SGDNesterov,能降低顯存佔用,略微加快訓練速度。

j. Text Encoder 與 Unet

圖片

機器不能直接識別人類的語言,Text Encoder 是一種用於將文本數據轉換爲機器可讀形式的模型或算法。對於輸入的一串提示詞,程序會將它們分解爲一個個標記(Token)輸入給 Text Encoder(一個Token通常代表着一個特徵),這樣一句話就能被轉爲一個向量爲機器所識別 。

Unet 是一種用於圖像分割的深度學習模型,它的作用是將圖像分割爲多個不同的構成部分。經過訓練後,它可以來填充圖像中缺失或損壞的部分,或者對灰度草圖進行着色。

圖片

可以爲它們設置不同的學習率,分別對應了“識別文字描述”和“識別圖片”的能力。

在原版 Dreambooth 訓練中,我們只能讓 AI 學習 UNET 模型,XavierXiao改進添加了額外訓練 Text Encoder  ,在本文使用的倉庫中就沿用了這種改進。

k. Network Rank(Dimension)

圖片

表示神經網絡的維度,維度越大,模型的表達能力就越強。如果訓練 lora,該值不要超過 64;如果訓練 loha,該值不要超過 32;如果訓練 locon,該值不要超過 12 ,但還是要根據具體的訓練目標來定,如果目標比較簡單,就完全不需要太高的 Rank。

在神經網絡中,每一層都由許多個神經元節點構成,它們縱橫交錯構成了一個 N 維空間。維度越大,代表模型中就越多的神經元節點可以處理各種要素。——當然,這也意味着模型的訓練難度就越大,也可能變得更容易過擬合,它可能需要更多的、更準確的數據集,更大的迭代次數。

l. Network Alpha

圖片

對模型過擬合的懲罰權重。它表示對模型在訓練時出現完全擬合(即輸出結果與樣本一致)時的懲罰的權重,適當提高它可以增加模型的泛化能力(當然也不能太高)。目前經驗認爲設置爲 alpha 設置在1以下效果更好。

舉一個通俗的例子,一個學生在抄學霸的作業,爲了不與學霸的結果完全相同,他需要對每個答案做一些小小的改動。對老師而言,一個完全照抄答案的學生約等於一個只會抄不會想的學生,而能稍作修改的學生說明還有對題目思考理解的能力。所以要稍微地“懲罰”那些只會照抄的學生,引導學生自己思考。因此這個值不能太低(完全不懲罰照抄),也不能太高(太大的懲罰讓學渣完全不能從學霸的答案裏獲得參考)。

m. Caption Dropout

圖片

Dropout 是在深度學習中一種防止過擬合的技術,在訓練中,可能模型會反覆計算某些節點,隨着訓練的進行,這可能導致錯誤的路徑依賴,即模型會變得總是依賴這些節點解決問題,就像某個學生碰巧刷到了幾道解題方法相似的題目,就誤認爲所有的題目都要用這種解題方法。Dropout 的解決方法是隨機關閉某些神經元,迫使模型在訓練時減少神經元之間的依賴關係,從而讓神經網絡的泛化能力更強。當然,在實際使用模型的時候,Dropout 是關閉的。

在訓練中,也可以隨機將一些訓練集的標記(Caption)剔除。在 Drop out caption every n epochs 中,可以指定每隔多少 epoch 就剔除一些標記;在 Rate of caption dropout 中,可以指定剔除幾成的標記。

n. Noise Offset

圖片

在原版的 Stable Diffusion 中,模型得出的圖片在亮度上總是很平均,亮的場景不夠亮,暗的場景不夠暗,而且用傳統的訓練方法也無法讓它學會避免這個問題 。一般輸入 0.1。

通過 Noise Offset,可以讓圖像在亮和暗上的表現更加明顯(右圖)。

圖片

o.xformers

圖片

Xformers 是一個用於加快圖像生成速度並減少顯存佔用的庫。

p. Gradient checkpointing

圖片

梯度檢查點(Gradient checkpointing)是一種在訓練模型時減少顯存佔用的方法,但是會增加訓練時長。它避免在訓練期間一次計算所有權重,而是逐步計算權重,從而減少訓練所需的顯存量。關閉它不會影響模型的準確性,但打開它後可以使用更大的 Batch Size。

雖然單次訓練的時長可能增加了單次訓練的時長,但如果增大了Batch Size,總的學習時間實際上可能會更快。

q. shuffle caption

圖片

打開它,可以讓訓練時訓練集的標籤被打亂(Shuffle,洗牌)。如輸入"鐵匠鋪,工人,打鐵",可能被轉換爲”鐵匠鋪,打鐵,工人“或”工人,鐵匠鋪,打鐵“。

這種操作通常用於增強模型對於不同文本順序的魯棒性,從而提高模型的泛化能力。打亂操作可以多次進行,從而更大程度地增加數據的隨機性。

Shuffle caption 可以在多種相似的圖像中使用。如果差異較大,就不要使用了。

在每一個 epoch 中,輸入的前 4 個 token 會被當做觸發詞,此外的 token 會被當做排除集。ai 會將排除集中的元素在素材中刪除後,把素材的剩餘部分學進前 4 個 token 中。因此,如果不開啓 keep tokens,在進行打亂後,打標中的每一個 tag 在足夠多的 epoch 後,都將成爲觸發詞。

                   圖片

r. Token

圖片

如果你的 Caption 比較長,那麼可以擴充一次輸入允許的 Token 量。如果不是必要,保持默認值 75。

s. Clip Skip

圖片

Clip 是一個轉換提示詞爲 Token 形式的神經網絡,是模型理解文字的源頭。

它開啓與否與底模有關。譬如,一些模型在第一層的神經網絡將輸入的詞轉換爲 Token 讀取,傳輸給下一層網絡,但是通過 Clip Skip,可以手動控制跳過 Stable Diffusion 的 Clip 階段,直接使用模型的 Tokenizer 對某些層級直接傳輸 Token 進去。有些時候調整這個參數可以讓結果更好。

默認情況下 SD2.0 使用倒數第二層接收 Token,因此不要在 SD2.0 學習中指定。

08、 風格訓練與人物訓練

8.1 風格訓練

訓練集儘可能包含該畫風對不同事物的描繪。有幾個要點:

  • 儘可能對訓練集進行正則化。如果數據足夠大,可以將數據二分,一部分作爲訓練集,一部分作爲正則化圖集。如果數據不夠大,可以先用高學習率快速訓練出一個臨時模型,用它產出接近於該畫風的圖片,然後將它投入訓練集。

  • 如果是小模型,可以在生成時變更大模以調整生成效果;如果是大模型,可以通過模型融合以調整效果。

  • 模型效果不好不一定是模型不好,提示詞與最終的效果有非常大的關係。

8.2 人物訓練

訓練集儘可能包含人物在不同角度的畫面。如果人物圖像很少,可以通過以下的方式擴充訓練集:

  • 鏡像

  • 用高學習率快速訓練出一個臨時模型,用它產出人物的新圖,將新圖投入訓練集

以上是本次分享全部內容,歡迎大家在評論區分享交流。如果覺得內容有用,歡迎轉發~文章信息比較長,小云建議先一鍵三連,後續慢慢細品。在公衆號後臺回覆**「AIGC」**直接獲取模型、實現快速部署的GPU服務器限量優惠券。

參考材料

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-

原創作者|黃志翔

技術責編|黃志翔

圖片

你覺得 Stable Difussion 模型還有哪些新應用場景?歡迎公衆號評論區留言分享你的創想。 我們將選取1則最有創意的分享,送出騰訊雲開發者-限定隨行杯1個(見下圖)。4月27日中午12點開獎。

圖片

關注我並點亮星標

公衆號回覆「AIGC」直接獲取模型

實現快速部署的GPU服務器限量優惠券

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章