擴散模型課程文件

第三單元:Stable Diffusion

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

第三單元:Stable Diffusion

歡迎來到 Hugging Face Diffusion 模型課程的第三單元!在本單元中,你將認識一個名為 Stable Diffusion(SD)的強大 Diffusion 模型,並探索它的功能。

開始本單元 :rocket:

以下是本單元的步驟:

  • 請確保你已註冊本課程,以便在新材料釋出時收到通知。
  • 請閱讀以下材料,瞭解本單元的核心概念。
  • 檢視 Stable Diffusion 簡介 筆記本,瞭解 SD 在一些常見用例中的實際應用。
  • 使用 hackathon 資料夾 中的 Dreambooth 筆記本,微調你自己的定製 Stable Diffusion 模型,並與社群分享,就有機會贏得獎品和周邊。
  • (可選)檢視 Stable Diffusion 深度解析影片 和配套的 筆記本,深入探索其不同元件以及如何調整它們以實現不同效果。這些材料是為新的 FastAI 課程 ‘從基礎開始學習 Stable Diffusion’ 創作的 —— 整個課程已經發布,對於任何想完全從零開始構建這類模型的人來說,這是一個很好的補充材料。

:loudspeaker: 別忘了加入 Discord,你可以在 #diffusion-models-class 頻道中討論材料並分享你的作品。

簡介

SD example images
使用 Stable Diffusion 生成的示例圖片

Stable Diffusion 是一個強大的文字條件潛在擴散模型。別擔心,我們很快會解釋這些術語!它能根據文字描述創造出令人驚歎的影像,這讓它在網際網路上引起了轟動。在本單元中,我們將探討 SD 的工作原理,並看看它還能做些什麼。

潛在擴散

隨著影像尺寸的增大,處理這些影像所需的計算能力也隨之增加。這在一種稱為自注意力(self-attention)的操作中尤為明顯,其操作量隨輸入數量呈二次方增長。一張 128px 的方形影像的畫素數量是一張 64px 方形影像的 4 倍,因此在自注意力層中需要 16 倍(即 42)的記憶體和計算量。這對於任何想生成高解析度影像的人來說都是一個問題!

latent diffusion diagram
圖表來自 Latent Diffusion 論文

潛在擴散透過使用一個名為變分自編碼器(VAE)的獨立模型將影像 壓縮 到一個更小的空間維度來緩解這個問題。其背後的原理是,影像通常包含大量冗餘資訊——給定足夠的訓練資料,VAE 有望學會生成一個輸入影像的更小表示,然後基於這個小的 潛在 表示以高保真度重建影像。SD 中使用的 VAE 接收 3 通道影像,並生成一個 4 通道的潛在表示,每個空間維度的縮減因子為 8。也就是說,一張 512px 的方形輸入影像將被壓縮成一個 4x64x64 的潛在表示。

透過在這些 潛在表示 而非全解析度影像上應用擴散過程,我們可以獲得許多使用較小影像帶來的好處(更低的記憶體使用、UNet 中需要的層數更少、更快的生成時間……),並且在我們準備檢視最終結果時,仍然可以將結果解碼回高解析度影像。這項創新顯著降低了訓練和執行這些模型的成本。

文字條件

在第二單元中,我們展示瞭如何透過向 UNet 提供額外資訊來對生成的影像型別進行額外控制。我們稱之為條件化。給定一個影像的噪聲版本,模型的任務是 根據額外的線索(如類別標籤,或者在 Stable Diffusion 的情況下是影像的文字描述)來預測去噪後的版本。在推理時,我們可以輸入我們想看到的影像的描述和一些純噪聲作為起點,模型會盡力將隨機輸入“去噪”成與描述相匹配的東西。

text encoder diagram
圖表展示了文字編碼過程,該過程將輸入提示轉換為一組文字嵌入(encoder_hidden_states),然後可以作為條件輸入到 UNet 中。

為了實現這一點,我們需要建立一個文字的數字表示,以捕獲有關其描述的相關資訊。為此,SD 利用了一個基於 CLIP 的預訓練 Transformer 模型。CLIP 的文字編碼器旨在將影像標題處理成一種可用於比較影像和文字的形式,因此它非常適合從影像描述中建立有用的表示。輸入提示首先被分詞(基於一個大的詞彙表,其中每個詞或子詞都被分配一個特定的詞元),然後透過 CLIP 文字編碼器,為每個詞元生成一個 768 維(在 SD 1.X 中)或 1024 維(在 SD 2.X 中)的向量。為了保持一致,提示總是被填充/截斷到 77 個詞元長,因此我們用作條件的最終表示是每個提示形狀為 77x1024 的張量。

conditioning diagram

好的,那麼我們實際上是如何將這些條件資訊輸入到 UNet 中,讓它在進行預測時使用的呢?答案是一種叫做交叉注意力(cross-attention)的東西。在整個 UNet 中散佈著交叉注意力層。UNet 中的每個空間位置都可以“關注”文字條件中的不同詞元,從而從提示中引入相關資訊。上圖展示了這種文字條件(以及基於時間步的條件)是如何在不同點輸入的。如你所見,UNet 在每個層級都有充分的機會利用這種條件!

無分類器引導

事實證明,即使我們付出了所有努力使文字條件儘可能有用,模型在進行預測時仍然傾向於主要依賴噪聲影像輸入而不是提示。在某種程度上,這是有道理的——許多標題與其相關影像的關聯性很鬆散,因此模型學會了不過分依賴描述!然而,這在生成新影像時是不可取的——如果模型不遵循提示,我們可能會得到與我們的描述完全無關的影像。

CFG scale demo grid
使用提示“一幅戴著高帽的柯利犬的油畫”在 CFG 比例為 0、1、2 和 10(從左到右)時生成的影像

為了解決這個問題,我們使用一種稱為無分類器引導(CFG)的技巧。在訓練期間,文字條件有時會留空,迫使模型學會在沒有任何文字資訊的情況下對影像進行去噪(無條件生成)。然後在推理時,我們進行兩次獨立的預測:一次使用文字提示作為條件,一次不使用。然後我們可以利用這兩個預測之間的差異,根據某個縮放因子(引導尺度),建立一個最終的組合預測,該預測在文字條件預測指示的方向上 更進一步,希望從而得到一個更符合提示的影像。上圖顯示了在不同引導尺度下對一個提示的輸出——如你所見,更高的值會產生更符合描述的影像。

其他型別的條件:超解析度、修復和深度圖到影像

可以建立接受其他型別條件的 Stable Diffusion 版本。例如,深度圖到影像模型 具有額外的輸入通道,可以接收有關正在去噪的影像的深度資訊,在推理時,我們可以輸入目標影像的深度圖(使用另一個模型估計),以期生成具有相似整體結構的影像。

depth to image example
深度條件 SD 能夠生成具有相同整體結構的不同影像(示例來自 StabilityAI)

以類似的方式,我們可以輸入一張低解析度影像作為條件,讓模型生成高解析度版本(如 Stable Diffusion 放大器所使用的)。最後,我們可以輸入一個顯示影像中需要重新生成區域的掩碼,作為“影像修復”任務的一部分,其中非掩碼區域需要保持不變,而為掩碼區域生成新內容。

使用 DreamBooth 進行微調

dreambooth diagram 圖片來自 dreambooth 專案頁面,基於 Imagen 模型

DreamBooth 是一種微調文生圖模型的技術,用於“教”它一個新概念,例如特定的物體或風格。該技術最初是為谷歌的 Imagen 模型開發的,但很快被改編以用於 stable diffusion。效果可能非常驚人(如果你最近在社交媒體上看到有人用 AI 頭像,很可能它來自基於 dreambooth 的服務),但該技術對所用設定也很敏感,所以請檢視我們的筆記本和這篇關於不同訓練引數的精彩研究,以獲取使其儘可能好地工作的技巧。

動手實踐筆記本

章節 Colab Kaggle Gradient Studio Lab
Stable Diffusion 簡介 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab
DreamBooth 駭客松筆記本 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab
Stable Diffusion 深度解析 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab

到這裡,你已經瞭解了足夠多的知識,可以開始使用附帶的筆記本了!使用上面的連結在你選擇的平臺上開啟它們。DreamBooth 需要相當大的計算能力,所以如果你正在使用 Kaggle 或 Google Colab,請確保將執行時型別設定為“GPU”以獲得最佳效果。

“Stable Diffusion 簡介”筆記本是對使用 🤗 Diffusers 庫進行 stable diffusion 的簡短介紹,透過一些基本的使用示例,使用 pipeline 來生成和修改影像。

在 DreamBooth 駭客松筆記本中(位於 hackathon 資料夾),我們展示瞭如何在你自己的影像上微調 SD,以建立一個涵蓋新風格或概念的自定義模型版本。

最後,“Stable Diffusion 深度解析”筆記本和影片分解了典型生成流程中的每一步,並提出了一些新穎的方法來修改每個階段以獲得額外的創意控制。

專案時間

按照 DreamBooth 筆記本中的說明,為你自己選擇的特定類別訓練一個模型。確保在你的提交中包含示例輸出,以便我們能選出每個類別中的最佳模型!有關獎品、GPU 額度等詳細資訊,請參見駭客松資訊

一些額外資源

發現了更多優質資源?告訴我們,我們會將它們新增到此列表中。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.