SDXL 模型引入裁剪坐標與目標寬高比作為條件訊號,有效控制影像主體位置和構圖,避免裁剪失誤。其 UNet 架構規模約為 Stable Diffusion 模型的三倍,能更好地處理新增的條件訊號。SDXL 的 VAE 訓練批次更大,並採用 EMA 技術更新權重,提升了生成影像的品質。此外,SDXL 的精煉模型專注於噪聲時間表的前 20%,進一步強化了影像細節和紋理。這些技術共同作用,使 SDXL 能夠生成更高解析度、更少 artifact 的影像。設定 Stable Diffusion 引數時,需調整高度、寬度、推理步數、引導比例和隨機種子。文字嵌入過程則涉及 tokenization、文字編碼和嵌入拼接。理解這些引數和流程,有助於精確控制影像生成結果。Classifier-Free Guidance(CFG)技術則透過調整 guidance scale,控制生成影像與文字提示的契合度,在實際應用中能有效提升影像生成品質。

裁剪坐標條件

在訓練過程中,輸入影像通常會被隨機裁剪,因為批次中的所有影像必須具有相同的大小。隨機裁剪可能會產生不想要的效果,例如截斷主體頭部或完全移除主體,即使它們可能在文字提示中被描述。透過提供裁剪坐標作為條件訊號,模型可以在推理過程中產生更好的品質,並且主體更有可能被置於框架中心。

目標寬高比條件

在預訓練平方影像之後,SDXL在各種寬高比上進行了微調,並使用原始寬高比的資訊作為另一個條件訊號。這使得模型可以產生更真實的風景和肖像影像,具有較少的artifact。

更高解析度

SDXL設計用於產生1024 × 1024畫素的影像(或非平方影像,總畫素數約為1,024^2)。這一特性是在微調階段實作的。

UNet架構

UNet架構約三倍於原始Stable Diffusion模型,以適應增加的條件訊號。

改進的VAE

SDXL使用與原始Stable Diffusion相同的架構,但訓練批次大小更大,並使用指數移動平均(EMA)技術更新權重。

精煉模型

除了基礎模型之外,SDXL還包括一個額外的精煉模型,該模型在與基礎模型相同的潛在空間中工作。然而,這個模型只在噪聲時間表的前20%上訓練了高品質影像。

內容解密

上述內容描述了SDXL的技術細節,包括其使用的條件訊號、UNet架構、VAE和精煉模型等。這些技術使得SDXL能夠產生高品質的影像,並且具有較少的artifact。透過瞭解這些技術細節,我們可以更好地掌握SDXL的工作原理和其應用場景。

  graph LR
    A[時間步長] --> B[文字嵌入]
    B --> C[影像大小條件]
    C --> D[裁剪坐標條件]
    D --> E[目標寬高比條件]
    E --> F[UNet架構]
    F --> G[改進的VAE]
    G --> H[精煉模型]

圖表翻譯

上述Mermaid圖表描述了SDXL中各個技術模組之間的關係。時間步長和文字嵌入是基礎條件訊號,然後是影像大小條件、裁剪坐標條件和目標寬高比條件。UNet架構、改進的VAE和精煉模型都是根據這些條件訊號的。這個圖表幫助我們理解SDXL中各個技術模組之間的邏輯關係和工作流程。

影像生成技術的進展

近年來,影像生成技術取得了顯著的進展,尤其是在 Stable Diffusion 模型的開發上。這種模型可以根據輸入的文字提示生成高品質的影像,並且可以學習到影像的細節和紋理。

SDXL 模型

SDXL 模型是 Stable Diffusion 模型的一種變體,它結合了多種技術來提高影像生成的品質。這種模型可以根據輸入的文字提示生成高品質的影像,並且可以學習到影像的細節和紋理。然而,SDXL 模型的執行速度較慢,且需要更多的記憶體。

FLUX、SD3 和 Video

近年來,還有其他的影像生成模型被提出,例如 FLUX、SD3 和 Video。這些模型都使用了不同的架構和技術來提高影像生成的品質。例如,FLUX 模型使用了 rectified flow matching schedulers 和 diffusion transformer 架構,而 SD3 模型使用了不同的 scheduler 和架構。

Classifier-Free Guidance

Classifier-Free Guidance (CFG) 是一種技術,用於控制影像生成的過程。它透過修改 loss function 或使用模型來評估結果並將其 loss signal 作為生成過程的一部分。CFG 可以用於偏向特定的方向,例如特定的顏色或風格。

CFG 的實作

CFG 的實作涉及到修改 noise prediction 並將其與 guidance scale 相乘。這個小小的改變可以使得影像生成的結果更好地符合文字提示。

noise_pred_uncond =...
noise_pred_text =...
guidance_scale =...

noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)

CFG 的應用

CFG 可以用於提高影像生成的品質。例如,可以使用 CFG 來生成更符合文字提示的影像。以下是使用 CFG 生成影像的例子:

prompt = "An oil painting of a collie in a top hat"
guidance_scale = 1

image = pipe(prompt, guidance_scale=guidance_scale).images[0]

影像生成的未來

影像生成技術的未來看起來很光明。隨著新的模型和技術的提出,影像生成的品質將會不斷提高。同時,影像生成技術也將會被應用於更多的領域,例如影片生成和 3D 模型生成。

圖表翻譯:

  flowchart TD
    A[文字提示] --> B[影像生成模型]
    B --> C[CFG]
    C --> D[影像生成]
    D --> E[結果]

內容解密:

上述流程圖展示了影像生成的過程。首先,輸入文字提示到影像生成模型中。然後,使用 CFG 來控制影像生成的過程。最後,生成影像並輸出結果。

Stable Diffusion 引數設定與文字嵌入

在使用 Stable Diffusion 進行影像生成之前,需要設定幾個重要的引數,並對輸入的文字進行嵌入。以下是設定過程的詳細步驟。

引數設定

首先,設定 Stable Diffusion 的預設高度和寬度。這兩個引數決定了生成影像的尺寸。

height = 512  #預設高度
width = 512  #預設寬度

接下來,設定生成影像的細節程度和引導比例。num_inference_steps 控制生成影像的細節程度,而 guidance_scale 則控制引導比例。

num_inference_steps = 30  # 推理步數
guidance_scale = 7.5  # 引導比例

為了確保結果的一致性,設定一個隨機種子。

seed = 42  # 隨機種子

文字嵌入

現在,對輸入的文字進行嵌入。這一步驟將文字轉換為模型可以理解的向量表示。首先,定義輸入的文字提示。

prompt = "Acrylic palette knife painting of a flower"

然後,對這個文字提示進行tokenization,並且對空字串進行相同的處理,以便於後續的無條件輸入。

text_input = pipe.tokenizer(
    prompt,
    padding="max_length",
    return_tensors="pt",
)

uncond_input = pipe.tokenizer(
    "",
    padding="max_length",
    return_tensors="pt",
)

接下來,將這兩個輸入透過文字編碼器,以獲得文字嵌入。

with torch.inference_mode():
    text_embeddings = pipe.text_encoder(text_input.input_ids.to(device))[0]
    uncond_embeddings = pipe.text_encoder(uncond_input.input_ids.to(device))[0]

最後,將有條件和無條件的文字嵌入進行拼接。

text_embeddings = torch.cat([uncond_embeddings, text_embeddings])

初始化隨機潛在變數和排程器

生成影像的下一步是建立隨機初始潛在變數和設定排程器,以便控制生成過程。

# 初始化隨機潛在變數和設定排程器

這些步驟為使用 Stable Diffusion 生成影像做好了準備。接下來,可以使用這些嵌入和引數設定來生成影像。

圖表翻譯:

  graph LR
    A[文字輸入] -->|Tokenization|> B[文字嵌入]
    B -->|Encoder|> C[文字向量]
    C -->|拼接|> D[最終文字嵌入]
    D -->|生成影像|> E[影像輸出]

這個流程圖展示了從文字輸入到生成影像的整個過程,包括文字嵌入、encoder處理和最終的影像生成。

Stable Diffusion 和條件生成

在深度學習中,Stable Diffusion是一種強大的生成模型,能夠產生高品質的影像和其他資料。條件生成是指在生成過程中加入條件或限制,從而控制生成結果的方向和內容。在這個章節中,我們將探討如何使用Stable Diffusion進行條件生成。

準備排程器

首先,我們需要準備排程器(scheduler),它負責控制生成過程的步驟和時間。排程器的設定包括設定推理步驟數(num_inference_steps)。

pipe.scheduler.set_timesteps(num_inference_steps)

準備隨機初始潛變數

接下來,我們需要準備隨機初始潛變數(latents),它們將作為生成過程的起點。這些潛變數是使用PyTorch的torch.randn函式生成的,並轉換為適合計算的格式。

latents = torch.randn(
    #...
).to(device).half()
latents = latents * pipe.scheduler.init_noise_sigma

迴圈迭代生成步驟

現在,我們開始迴圈迭代生成步驟。在每一步中,我們會根據模型預測更新潛變數。

for t in pipe.scheduler.timesteps:
    #...

建立潛變數副本和縮放

在每一步中,我們需要建立兩個潛變數副本,以匹配無條件和有條件的文字嵌入(text embeddings)。然後,我們對這些副本進行縮放,以適應當前的時間步。

latent_input = torch.cat([latents] * 2)
latent_input = pipe.scheduler.scale_model_input(latent_input, t)

預測噪聲殘差

接下來,我們使用模型預測噪聲殘差,分別對於無條件和有條件的潛變數。

with torch.inference_mode():
    noise_pred = pipe.unet(
        latent_input, t, encoder_hidden_states=text_embeddings
    ).sample

分割預測結果

然後,我們將預測結果分割成無條件和有條件的版本。

noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)

進行分類別器免疫引導

最後,我們進行分類別器免疫引導(classifier-free guidance),以控制生成結果的方向和內容。

noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)

內容解密:

在上述程式碼中,我們首先準備了排程器和隨機初始潛變數。然後,我們迴圈迭代生成步驟,在每一步中更新潛變數。透過建立潛變數副本、縮放和預測噪聲殘差,我們實作了條件生成。最後,透過分類別器免疫引導,我們控制了生成結果的方向和內容。

圖表翻譯:

  flowchart TD
    A[開始] --> B[準備排程器]
    B --> C[準備隨機初始潛變數]
    C --> D[迴圈迭代生成步驟]
    D --> E[建立潛變數副本和縮放]
    E --> F[預測噪聲殘差]
    F --> G[分割預測結果]
    G --> H[進行分類別器免疫引導]
    H --> I[輸出最終結果]

在這個流程圖中,我們展示了條件生成的整個過程,從準備排程器到輸出最終結果。每一步驟都對應著特定的程式碼段,實作了高品質的影像和其他資料的生成。

玄貓的 Stable Diffusion 教學

什麼是 Stable Diffusion?

Stable Diffusion 是一種根據深度學習的文字到影像生成模型,能夠根據輸入的文字提示生成高品質的影像。這個模型是根據 Latent Diffusion 模型開發而來,並且已經在多個領域中取得了優異的成績。

如何使用 Stable Diffusion?

使用 Stable Diffusion 的第一步是安裝所需的函式庫和模型。然後,你可以使用以下程式碼來生成影像:

import torch
from diffusers import StableDiffusionPipeline

# 載入模型
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")

# 定義輸入文字
prompt = "一隻可愛的貓"

# 生成影像
image = pipe(prompt).images[0]

# 顯示影像
image.show()

CFG 和 Guidance Scale

CFG(Classifier-Free Guidance)是一種用於控制生成影像的方法。Guidance Scale 是一個用於調整 CFG 的引數,能夠控制生成影像的品質和多樣性。

# 定義 CFG 和 Guidance Scale
guidance_scale = 7.5
noise_pred_uncond = pipe.noise_scheduler_timesteps(noise_pred_text, t, latents)
noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)

LAION-5B 資料集

LAION-5B 是一個大型的影像和文字資料集,包含了超過 5 億個影像和文字對。這個資料集是用於訓練 Stable Diffusion 模型的。

# 載入 LAION-5B 資料集
from datasets import load_dataset
dataset = load_dataset("laion/laion5b")

Open Data 和 Open Models

Open Data 和 Open Models 是兩個重要的概念,指的是公開的資料集和模型。這些資源可以被任何人使用和修改,能夠促進研究和開發的進展。

# 使用 Open Data 和 Open Models
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")

Gradio 和 Interactive ML Demo

Gradio 是一個用於建立互動式機器學習演示的函式庫。使用 Gradio,你可以輕鬆地建立一個互動式的演示,讓使用者可以輸入文字提示並生成影像。

# 匯入 Gradio
import gradio as gr

# 定義輸入和輸出型別
inputs = gr.Textbox(label="輸入文字提示")
outputs = gr.Image(label="生成影像")

# 定義演示函式
def demo(prompt):
    # 生成影像
    image = pipe(prompt).images[0]
    return image

# 建立演示
demo = gr.Interface(demo, inputs, outputs)

圖表翻譯:

  graph LR
    A[輸入文字提示] --> B[生成影像]
    B --> C[顯示影像]

內容解密:

上述程式碼展示瞭如何使用 Stable Diffusion 生成影像,並且如何使用 Gradio 建立一個互動式的演示。這個演示可以讓使用者輸入文字提示並生成影像,能夠展示 Stable Diffusion 的能力。

玄貓:根據文字的影像生成技術

緒論

近年來,根據文字的影像生成技術取得了重大突破,尤其是在 Stable Diffusion 模型的發展下。這種技術可以根據使用者提供的文字提示生成高品質的影像。然而,如何控制生成影像的風格、顏色和內容仍然是一個挑戰。這篇文章將介紹如何使用 Stable Diffusion 模型和 Gradio 來構建一個互動式的影像生成演示。

根據文字的影像生成

Stable Diffusion 模型是一種根據文字的影像生成模型,它使用了一種稱為「diffusion」的過程來生成影像。這種過程涉及將隨機噪聲逐步轉化為一張影像。模型使用了一個文字編碼器來將文字提示轉化為一個向量,然後使用這個向量來條件化 diffusion 過程。

Gradio 的應用

Gradio 是一個開源的函式庫,它允許使用者輕鬆地構建互動式的機器學習演示。透過使用 Gradio,我們可以輕鬆地構建一個根據文字的影像生成演示,讓使用者可以輸入文字提示並生成相應的影像。

實踐:構建一個互動式的影像生成演示

以下是構建一個互動式的影像生成演示的步驟:

  1. 安裝 Gradio 和 Stable Diffusion 模型。
  2. 載入 Stable Diffusion 模型和文字編碼器。
  3. 定義一個函式,該函式接受使用者輸入的文字提示並生成相應的影像。
  4. 使用 Gradio 來構建一個互動式的演示,讓使用者可以輸入文字提示並生成相應的影像。
import gradio as gr
from stable_diffusion import StableDiffusionPipeline

# 載入 Stable Diffusion 模型和文字編碼器
model = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")

# 定義一個函式,該函式接受使用者輸入的文字提示並生成相應的影像
def generate_image(prompt):
    image = model(prompt).images[0]
    return image

# 使用 Gradio 來構建一個互動式的演示
demo = gr.Interface(
    fn=generate_image,
    inputs="text",
    outputs="image",
    title="根據文字的影像生成",
    description="輸入文字提示並生成相應的影像",
)

# 啟動演示
demo.launch()
內容解密:

在上面的程式碼中,我們定義了一個函式 generate_image,該函式接受使用者輸入的文字提示並生成相應的影像。這個函式使用了 Stable Diffusion 模型來生成影像,並且傳回了生成的影像。

  flowchart TD
    A[使用者輸入文字提示] --> B[呼叫 generate_image 函式]
    B --> C[使用 Stable Diffusion 模型生成影像]
    C --> D[傳回生成的影像]

圖表翻譯:

上面的流程圖展示瞭如何使用 Stable Diffusion 模型和 Gradio 來構建一個互動式的影像生成演示。使用者輸入文字提示,然後呼叫 generate_image 函式,該函式使用 Stable Diffusion 模型生成相應的影像,並傳回生成的影像。

進一步瞭解語言模型的微調

在前面的章節中,我們探討了語言模型(LM)的基本工作原理和如何使用它們進行文字生成和序列分類別等任務。然而,預訓練模型的通用訓練可能不適合某些特定任務或領域。為了改善語言模型在特定任務上的效能,我們可以使用微調(fine-tuning)技術。

微調的目的

微調的主要目的是將預訓練模型的理解能力適應到特定任務或領域的細微差別。例如,在醫學研究領域,預訓練模型可能不會直接表現出色,但經過微調後,可以增強其生成相關醫學文字或從醫學檔案中提取資訊的能力。同樣,對於對話模型,雖然大型預訓練模型可以生成連貫的文字,但通常不適合生成高品質的對話文字或遵循指令。透過微調,這些模型可以被適應到輸出引人入勝的對話文字。

從技術架構視角來看,Stable Diffusion XL (SDXL) 的核心創新在於其多級條件機制,包含裁剪坐標、目標寬高比等,配合擴充套件的 UNet 架構和改良的 VAE,有效提升了生成影像的品質和解析度。分析其技術細節,SDXL 巧妙地整合了多種條件訊號,並透過精煉模型強化細節表現,彌補了前代模型的一些不足。然而,更高的解析度和更複雜的架構也帶來了運算資源的需求提升,這對硬體效能提出了更高的要求。展望未來,SDXL 的多條件生成策略可能成為影像生成領域的主流趨勢,進一步推動根據文字的影像生成技術的發展。對於追求高品質影像輸出的應用場景,SDXL 值得深入研究和應用。玄貓認為,SDXL 代表了影像生成技術的重要進步,其架構設計和條件生成策略值得其他影像生成模型借鑒。