stable diffusion是一種潛在擴散模型,可以從文本生成人工智能圖像。為什么叫做潛在擴散模型呢?這是因為與在高維圖像空間中操作不同,它首先將圖像壓縮到潛在空間中,然后再進行操作。
在這篇文章中,我們將深入了解它到底是如何工作的,還能夠知道文生圖的工作方式與圖生圖的的工作方式有何不同?CFG scale是什么?去噪強度是什么?
了解stable diffusion工作原理的好處: 可以更加正確的使用這個工具,從而實現更加可控的結果。
stable diffusion有什么用處?
簡單來說,穩定擴散是一種文本到圖像的模型。給它一個文本提示,它會返回一個與文本匹配的AI圖像。
stable diffusion模型
穩定擴散屬于一類稱為擴散模型的深度學習模型。它們是生成模型,意味著它們被設計用來生成類似于訓練數據的新數據。而在stable diffusion中下,這些數據就是圖像。
那么為什么它被稱為擴散模型?
因為它的實現原理看起來非常像物理學中的擴散。接下來讓我們看看他的底層原理實現。這里我以最常見的1girl作為例子來說明。
正向擴散
在正向擴散過程中,會向訓練圖像添加噪音,逐漸將其轉化為不具有特征的噪音圖像。正向過程會將任何1girl的圖像轉變為噪音圖像。最終,你將無法判斷它們最初到底是什么。(這很重要)
就像一滴墨水落入了一杯水中。墨水滴在水中擴散開來。幾分鐘后,它會隨機分布在整個水中。你再也無法判斷它最初是落在中心還是靠近邊緣。
下面是一個圖像經歷正向擴散的示例。1girl的圖像變成了隨機噪音。
逆向擴散
正向擴展很好理解,那么接下來就是神奇的部分,如果我們能夠逆向擴散呢?就像倒放視頻一樣,倒退時間。
從一個嘈雜、毫無意義的圖像開始,逆向擴散可以恢復出一張原始的1girl的圖像。這就是主要的想法。
訓練過程
逆擴散的概念肯定是有創意的。但是,現在的問題是,“怎樣才能實現逆擴散呢?”
為了逆轉擴散,最根本的是我們需要知道圖像添加了多少噪音。
diffusion中使用了一個神經網絡模型來預測添加的噪音。這就是穩定擴散中的噪音預測器。它是一個U-Net模型。訓練過程如下。
-
選擇一張訓練圖像,比如1girl的照片。
-
生成一個隨機的噪音圖像。
-
通過在訓練的不同步數中添加一定的噪音圖像來破壞訓練圖像。
-
通過調整噪音預測器的權重,來訓練噪音預測器,從而告訴他,我們添加了多少噪音。
訓練后,我們有了一個能夠預估圖像添加的噪音的噪音預測器。
逆擴散
現在我們有了噪聲預測器。如何使用它呢?
首先,我們生成一個完全隨機的圖像,并要求噪聲預測器告訴我們噪聲。然后我們從原始圖像中減去這個估計的噪聲。重復這個過程幾次。最終你會得到一張1girl的圖像。
當然現在我們還無法控制生成的圖像,現在這個過程完全是隨機的。
穩定擴散模型Stable Diffusion model
上面講了那么多原理,但是其實那并不是stable diffusion的工作原理!
原因是上述擴散過程是在圖像空間進行的。因為圖像空間非常的大,所以計算速度非常的慢。
舉個例子:一個512×512像素的圖像有三個顏色通道(紅色、綠色和藍色),就是一個786,432維的空間!(你需要為一個圖像指定那么多數值。)這是一個非常大的數字,在現有的GPU硬件條件下,很難快速的生成需要的圖片。
所以很多公司對這個像素空間的擴散模型做了優化,比如谷歌的Imagen和Open AI的DALL-E,它們使用了一些技巧來加快模型速度,但這樣還是不夠的。
潛在擴散模型Latent diffusion model
Stable diffuion中引入了一個叫做潛在擴散空間的概念,從而解決在像素空間的擴散模型計算速度慢的問題。下面是它的工作原理。
穩定擴散是一種潛在擴散模型。它不是在高維圖像空間中運行,而是首先將圖像壓縮到潛在空間中。
以上面的512×512像素的圖像為例,穩定擴散模型的潛在空間是4x64x64,這個潛在空間是原圖像像素空間的1/48。
因為潛在空間只有之前的1/48,因此它能夠在計算更少的數字的情況下獲得結果。這就是為什么它更快的原因。
變分自動編碼器VAE
從像素空間到潛在空間的變化,是通過一種稱為**變分自動編碼器(variational autoencoder)**的技術來實現的。是的,這就是我們經常看到的VAE。
變分自動編碼器(VAE)是由兩部分組成:(1)編碼器和(2)解碼器。編碼器將圖像壓縮到潛在空間,解碼器從潛在空間恢復圖像。
**我們所說的所有前向和反向擴散實際上都是在潛在空間中進行的。因此,在訓練過程中,它不是生成一個嘈雜的圖像,而是在潛在空間中生成一個隨機張量(潛在噪聲)。它不是用噪音損壞圖像,而是用潛在噪聲損壞圖像在潛在空間中的表示。**這樣做的原因是潛在空間較小,因此速度更快。
圖像分辨率
圖像分辨率反映在潛在圖像張量的大小上。對于僅有512×512像素的圖像,潛在圖像的大小為4x64x64。對于768×512像素的肖像圖像,潛在圖像的大小為4x96x64。
這就是為什么生成更大的圖像需要更長的時間和更多的VRAM。
這里想解釋一下為什么我們在使用stable diffusion的時候,如果生成大于512×512像素的圖像,有時候會出現雙頭的問題。
這是因為Stable Diffusion v1是在512×512像素圖像上進行訓練的。
圖像放大
那么我們怎么才能生成分辨率更大的圖片呢?最好的辦法是保證圖像至少有一邊達到512像素,然后使用AI放大器或img2img的功能進行圖像放大。
另外,可以使用SDXL模型。它具有更大的默認尺寸,為1024 x 1024像素。
為什么潛在空間可以工作?
你可能會想知道為什么變分自動編碼器(VAE)可以將圖像壓縮成一個更小的潛在空間而不丟失信息。
原因是,自然圖像并不是隨機的,它們具有很高的規律性:一張臉遵循著眼睛、鼻子、臉頰和嘴巴之間特定的空間關系。一只狗有四條腿并且具有特定的形狀。
換句話說,圖像的高維度是人為的。自然圖像可以很容易地壓縮到更小的潛在空間而不丟失任何信息。這在機器學習中被稱為流形假設。
潛在空間中的反向擴散
以下是stable diffusion中潛在空間反向擴散的工作原理。
-
生成一個隨機潛在空間矩陣。
-
噪聲預測器預測潛在矩陣的噪聲。
-
然后從潛在矩陣中減去預測的噪聲。
-
根據特定的采樣步數,重復2,3這兩步。
-
VAE的解碼器將潛在矩陣轉換為最終圖像。
什么是VAE文件?
VAE文件是在Stable Diffusion v1中用于改進眼睛和臉部的生成效果。它們是我們剛剛談到的自動編碼器的解碼器。通過進一步微調解碼器,模型可以繪制出更精細的細節。
之前提到自然圖像并不是隨機的,它們具有很高的規律性,雖然是這樣,但是將圖像壓縮到潛在空間確實會丟失信息,因為原始的VAE沒有恢復細節。而這個VAE文件或者VAE解碼器的作用就是負責繪制細節。
條件控制
到這里基本上運行流程已經差不多了,但是我們還缺了一部分:我們寫的文本prompt是在哪里發揮作用的呢?
這些prompt實際上就是條件控制。條件控制的目的是引導噪聲預測器,使得預測的噪聲在從圖像中減去后能夠給我們想要的結果。
txt2img(文本到圖像)
以下是對txt2img如何被處理并輸入到噪聲預測器的說明。
首先,分詞器(Tokenizer)將提示中的每個單詞轉換為一個稱為標記的數字。然后,每個標記被轉換為一個名為嵌入embedding的768值向量。這些嵌入然后被**文本變換器(text transformer)**處理,并準備好被噪聲預測器使用。
接下來,讓我們詳細介紹每一部分的含義。
分詞器Tokenizer
首先,文本提示被 CLIP 分詞器進行分詞。CLIP 是由 Open AI 開發的深度學習模型,用于生成任何圖像的文本描述。Stable Diffusion v1 使用了 CLIP 的分詞器。
分詞是計算機理解單詞的方法。我們人類可以讀單詞,但計算機只能讀數字。這就是為什么文本提示中的單詞首先被轉換為數字的原因。分詞器只能分詞它在訓練過程中見過的單詞。例如,CLIP 模型中有“butter”和“fly”,但沒有“butterfly”。分詞器會將單詞“butterfly”分解為兩個標記“butter”和“fly”。所以一個單詞并不總是意味著一個標記!
另一個細節是空格字符也是標記的一部分。在上面的情況中,短語“butter fly”產生了兩個標記“butter”和“[space]fly”。這些標記與“butterfly”產生的不同,“butterfly”的標記是“butter”和“fly”(在“fly”之前沒有空格)。
Stable Diffusion 模型在提示中僅限于使用75個標記。(這并不等同于75個單詞)
嵌入embedding
Stable diffusion v1采用了Open AI的ViT-L/14 Clip模型。embedding嵌入是一個768值的向量。每個標記都有自己獨特的嵌入向量。嵌入是由CLIP模型決定的,在訓練過程中學習的。
為什么我們需要嵌入?因為一些詞是密切相關的,我們希望能夠充分利用這些信息。例如,man、gentleman和guy的嵌入幾乎相同,因為它們可以互換使用。克勞德·莫奈、皮埃爾·奧古斯特·雷諾阿和愛德華·馬奈都是印象派風格繪畫的代表,但方式各有不同。所以這些名字在embedding中具有接近但不完全相同的值。
這就是我們討論的用于通過關鍵詞觸發樣式的嵌入。找到合適的嵌入可以觸發任意對象和風格,這是一種稱為文本反演(textual inversion)的微調技術。
embedding to noise predictor
在發送到噪聲預測器之前,嵌入需要通過文本轉換器進行處理處理。
轉換器就像一個通用適配器,用于條件處理。在這種情況下,它的輸入是文本嵌入向量,但它也可以是其他東西,比如標簽、圖像和深度圖。
注意力機制
在Stable Diffusion AI和類似的文本到圖像生成模型中,U-Net是一個關鍵的組件,它負責將文本提示轉換成圖像。U-Net是一個深度學習模型,通常用于圖像到圖像的任務,如圖像分割。在Stable Diffusion中,U-Net利用了一種稱為“注意力機制”的技術來理解和處理文本提示。
- 自注意力 (Self-Attention):
- 自注意力允許模型在處理提示時識別單詞之間的關系。比如一個藍色眼睛的男人,“藍”和“眼睛”通過自注意力機制被關聯起來,這樣模型就知道用戶想要生成的是一個擁有藍色眼睛的男人,而不是一個穿著藍色襯衫的男人。
- 交叉注意力 (Cross-Attention):
- 交叉注意力是文本和圖像之間的橋梁。在生成圖像的過程中,U-Net使用交叉注意力機制來確保生成的圖像與文本提示保持一致。這意味著模型會根據文本提示中的關鍵詞生成相應的圖像特征。
超網絡是一種調整穩定擴散模型的技術,它利用交叉注意力網絡來插入風格。
LoRA模型修改交叉注意力模塊的權重來改變風格。
僅僅修改這個模塊就能調整穩定擴散模型的結果,可見這個模塊是多么重要。
還有其他控制條件嗎?
穩定擴散模型可以被修改和設置的方式不止文本提示一種。
除了文本提示,深度圖像也可以被用來設置圖像模型。
比如ControlNet就可以使用檢測到的輪廓、人體姿勢等來設置噪聲預測器,并實現對圖像生成的出色控制。
Stable difussion逐步解析
現在你已經了解了穩定擴散的所有內部機制,讓我們通過一些例子來看看它在幕后到底發生了什么。
文字轉圖像
在文字轉圖像中,你輸入文字,模型會返回一個生成好的AI圖片。
步驟1。穩定擴散在潛在空間中生成一個隨機張量。你可以通過設置隨機數生成器的種子來控制這個張量。
如果你把種子設置為固定的值,那么你將始終得到相同的隨機張量。
最開始的圖像只是一片噪音。
步驟2。噪聲預測器 U-Net 將潛在的嘈雜圖像和文本提示作為輸入,并在潛在空間中預測噪音。
步驟3。從潛在圖像中減去潛在噪聲。這就成為了您的新潛在圖像。
步驟2和步驟3會重復一定數量的采樣步驟,這個步驟就是你設置的sample steps。
步驟4。最后,VAE 的解碼器將潛在圖像轉換回像素空間。這就是在運行穩定擴散后得到的圖像。
噪聲調度(Noise schedule)
圖片從嘈雜變得清晰。是因為每一步我們都從原始latent space中減去了預測到的噪聲。
每步減少多少噪聲,這個減去噪聲的調度過程,就叫做noise schedule。
下面是一個噪聲調度的例子。
noise schedule是通過我們使用的采樣器和采樣步數來決定的,我們可以在每一步中減去相同量的噪聲,也可以在開始階段減去更多的噪聲,就像上面的例子。
采樣器在每一步中減去恰好足夠的噪聲,以便在下一步達到期望的噪聲。
圖像到圖像
圖像到圖像的意思是使用穩定擴散將一幅圖像轉換成另一幅圖像。
SDEdit是一種圖像到圖像的編輯方法,它允許用戶通過結合輸入圖像和文本提示來控制圖像生成過程。這種方法首次提出時,旨在提高對生成圖像的控制能力,使得用戶可以更精確地實現他們的創意愿景。SDEdit可以應用于任何擴散模型,包括Stable Diffusion。
圖像到圖像的輸入是一幅圖像和一個文本提示。生成的圖像將同時受到輸入圖像和文本提示的影響。
比如我通過這左邊的素描圖加上提示詞:
“photo of young woman,no suit,no shirt,no bar,on the street,
rim lighting,studio lighting,looking at the camera,dslr,ultra quality,sharp focus,tack sharp,dof,film grain,Fujifilm XT3,crystal clear,8K UHD,highly detailed glossy eyes,high detailed skin,skin pores,”
就可以把它轉換成一張真實的圖片:
現在讓我們來看看具體的步驟。
步驟1. 將輸入圖像編碼為潛在空間。
步驟2. 將噪聲添加到潛在圖像。去噪強度控制添加的噪聲量。
如果為0,則不添加噪聲。如果為1,則添加最大量的噪聲,使潛在圖像變成完全隨機的張量。
步驟3. 噪聲預測器U-Net將潛在帶噪聲圖像和文本提示作為輸入,并預測潛在空間中的噪聲。
步驟4. 從潛在圖像中減去潛在噪聲。這就成為了你的新潛在圖像。
步驟3和步驟4會重復一定數量的采樣步驟,這個步驟就是你設置的sample steps。
步驟5. 最后,VAE的解碼器將潛在圖像轉換回像素空間。這就是你通過運行圖像到圖像得到的圖像。
所以現在你知道圖像到圖像是什么了:它只是在初始潛在圖像上加入一點噪聲和輸入圖像。
將去噪強度設置為1等同于文本到圖像,因為初始潛在圖像完全是隨機的。
圖像修復
圖像修復實際上只是圖像到圖像的特例。在需要修復的圖像部分添加了噪音。噪音的數量同樣由去噪強度控制。
什么是CFG值?
我們在使用stable diffusion的時候,有一個非常重要的參數叫做CFG。
在理解CFG之前,我們首先需要了解它的前身,分類器指導Classifier guidance
分類器指導Classifier guidance
分類器指導是在擴散模型中圖像標簽的一種整合方式。你可以使用標簽來指導擴散過程。例如,標簽“1girl”可以引導逆擴散過程生成女性的照片。
**分類器指導比例(**classifier guidance scale)是一個參數,用于控制擴散過程在多大程度上遵守這個分類標簽。
假設我們有三組圖像,分別帶有“貓”、“狗”和“人類”的標簽。如果擴散過程不受任何指導,模型可能會從每個類別中隨機抽取樣本。這可能導致生成的圖像同時符合兩個標簽的特征,比如一個男孩正在撫摸一只狗的場景。
在classifier guidance scale指導的條件下,擴散模型產出的圖像往往會傾向于典型或明確的樣本。比如,當你要求模型生成一只貓的圖片時,它將提供一張清晰無疑的貓的圖像,而非其他任何生物。
分類器指導比例(classifier guidance scale)調節著模型遵循標簽指導的嚴格程度,更高的值,意味著在生成圖像時,模型更加嚴格地依據所給標簽進行選擇。在實際操作中,這個比例的值實際上是一個乘數,它決定了模型在生成過程中向具有特定標簽的數據集偏移的程度。
無分類器引導Classifier-free guidance(CFG)
分類器引導雖然功能強大,但它需要額外的模型來提供指導,這給訓練過程帶來了一些挑戰。
而無分類器引導是一種創新的方法,它允許實現“無需分類器的分類器引導”。通過使用圖像的標題來訓練一個有條件的擴散模型,將分類器的功能整合為噪聲預測器U-Net的一個條件,從而實現了一種無需單獨圖像分類器的圖像生成引導。
另外,文本提示為文本到圖像的生成提供了一種引導機制,使得模型能夠根據文本描述生成相應的圖像。
無分類器引導規模(CFG scale)
現在,我們有一個使用條件控制的無分類器擴散過程。我們如何控制AI生成的圖像應該多大程度上遵循引導?
無分類器引導規模(CFG scale)是一個控制文本提示如何引導擴散過程的值。當CFG規模設置為0時,AI圖像生成是無條件的(即忽略提示)。較高的CFG規模會將擴散引導到提示方向。
穩定擴散 v1.5 與 v2 比較
模型差異
SD v2使用OpenClip進行文本嵌入。SD v1使用Open AI的CLIP ViT-L/14進行文本嵌入。這一變化的原因是:
-
OpenClip比原先的模型大了多達五倍。更大的文本編碼器模型可以提高圖像質量。
-
雖然Open AI的CLIP模型是開源的,但這些模型是使用專有數據進行訓練的。轉換到OpenClip模型能夠讓研究人員在研究和優化模型時更加透明。這對于長期發展是更有利的。
v2模型有兩種版本。
-
512版本生成512×512像素的圖像
-
768版本生成768×768像素的圖像
訓練數據差異
SD v1.4 是在名為 laion2B-en 的數據集上,以 256×256 的分辨率進行了 237,000 次訓練迭代。
接著,在 laion-high-resolution 數據集上,以 512×512 的分辨率進行了 194,000 次訓練迭代。
在“laion-aesthetics v2 5+”數據集上,同樣以 512×512 的分辨率,進行了 225,000 次訓練迭代,同時在文本條件中降低了 10% 的權重。
SD v2 則是在 LAION-5B 數據集的子集上,經過去除了顯式NSFW內容的篩選,并應用了 LAION-NSFW 分類器,以 punsafe=0.1
的參數和 aesthetic score >=4.5
的條件下,進行了 550,000 次訓練迭代。
此外,該模型還在相同數據集上以 256x256 的分辨率進行了 850,000 次訓練迭代,但這次只包括圖片分辨率大于或等于 512x512 的樣本。
之后,模型使用了 v-objective 目標函數,在相同數據集上進行了額外的 150,000 次訓練迭代。
最后,在 768x768 的圖片上繼續進行了 140,000 次訓練迭代。
SD v2.1 是在 v2.0 的基礎上進行了微調,先是以 punsafe=0.1
的參數額外訓練了 55,000 步,然后又以 punsafe=0.98
的參數額外訓練了 155,000 步。
值得注意的是,在最終的訓練階段,NSFW的過濾器被關閉了。
輸出表現的差異
人們在使用SD v2 來控制風格和生成名人圖像時,會更加的困難。因為雖然 Stability AI 并沒有明確排除藝術家和名人的名字,但在 v2 版本中,這些名字的效果要弱得多。這很可能是因為訓練數據的差異所致。Open AI 的專有數據可能包含更多的藝術作品和名人照片,而且這些數據很可能經過了高度篩選,以確保每件作品和每位人物都看起來都非常美觀。
因為這種原因,SD V2 和v2.1并沒有流行起來,用戶們更傾向于使用經過精細調整的 v1.5 和 SDXL 模型。
SDXL model
作為一個規模更大的模型,在人工智能領域,人們普遍認為其性能會更為出色。SDXL 模型的參數總數達到了驚人的 66 億,而相比之下,v1.5 模型的參數總數則為 9.8 億。
-
實際上,SDXL 模型由兩個模型組成:基礎模型和細化模型。基礎模型負責構建整體構圖,而細化模型則在此基礎上添加更精細的細節。
基礎模型可以獨立運行,不依賴細化模型。
SDXL 基礎模型的改進包括:
- 文本編碼器結合了最大的 OpenClip 模型(ViT-G/14)和 OpenAI 的專有 CLIP ViT-L。這樣的選擇讓 SDXL 更易于引導,同時保持了強大的性能,并且能夠使用 OpenClip 進行訓練。
- 新的圖像尺寸調節旨在使用小于 256×256 的訓練圖像。這通過不丟棄 39% 的圖像,顯著增加了訓練數據量。
- U-Net 的規模是 v1.5 模型的三倍。
- 默認的圖像尺寸為 1024×1024,是 v1.5 模型 512×512 的四倍。
點我查看更多精彩內容:www.flydean.com