Stable Diffusion 作為開源影像生成模型,在本地或雲端環境皆可執行,但需要 NVIDIA、AMD GPU 或 Apple Silicon 晶片支援。安裝 Stable Diffusion 需先安裝 Hugging Face 的 diffusers 函式庫及其他依賴項,並下載模型建立推理管道。ControlNet 模型則能精準控制生成影像的風格和組成,提升品質和可控性。AUTOMATIC1111 的 Stable Diffusion WebUI 提供更便捷的網頁操作介面,簡化模型選擇、引數調整及影像生成流程,同時支援影像轉換、上取樣和修復等功能,並可整合社群開發的擴充套件,大幅提升使用彈性。

進階影像生成技術:使用Stable Diffusion和AUTOMATIC1111

在前一章中,我們探討了使用diffusion模型進行影像生成的標準實踐,包括格式修改器、藝術風格修改器和負面提示等。這一章,我們將更深入地探討影像生成的進階技術,包括如何利用Stable Diffusion和AUTOMATIC1111來提高影像生成的品質和控制度。

Stable Diffusion的執行

Stable Diffusion是一個開源的影像生成模型,可以在本地電腦上執行,前提是您有一塊NVIDIA或AMD的GPU,或者是Apple Silicon晶片。您也可以在Google Colab上執行Stable Diffusion,Google Colab提供了一個免費的GPU雲端服務。

安裝Stable Diffusion

要安裝Stable Diffusion,您需要先安裝Hugging Face的diffusers函式庫,然後安裝其他依賴函式庫。以下是安裝命令:

!pip install diffusers==0.11.1
!pip install transformers scipy ftfy accelerate

接下來,您需要下載和使用Stable Diffusion模型。以下是建立一個推理管道的程式碼:

import torch
from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    torch_dtype=torch.float16)

pipe = pipe.to("cuda")

這段程式碼建立了一個Stable Diffusion管道,然後將其移到GPU上。

ControlNet模型

ControlNet是一種可以用於控制影像生成風格和組成的模型。它可以用於生成更高品質和更具控制性的影像。以下是使用ControlNet模型的程式碼:

from diffusers import ControlNetModel

control_net = ControlNetModel.from_pretrained(
    "your_control_net_model",
    torch_dtype=torch.float16)

control_net = control_net.to("cuda")

這段程式碼建立了一個ControlNet模型,然後將其移到GPU上。

AUTOMATIC1111的Stable Diffusion WebUI

AUTOMATIC1111的Stable Diffusion WebUI是一個根據網頁的介面,允許您輕鬆地使用Stable Diffusion模型生成影像。以下是使用AUTOMATIC1111的Stable Diffusion WebUI的步驟:

  1. 下載和安裝AUTOMATIC1111的Stable Diffusion WebUI。
  2. 啟動WebUI並選擇您要使用的模型。
  3. 輸入您的提示和引數。
  4. 生成影像。

圖表翻譯:

  graph LR
    A[使用者輸入提示] --> B[Stable Diffusion模型]
    B --> C[ControlNet模型]
    C --> D[影像生成]
    D --> E[影像輸出]

這個圖表展示了使用Stable Diffusion和ControlNet模型生成影像的流程。

使用PyTorch和Stable Diffusion進行影像生成

環境設定

首先,我們需要匯入必要的函式庫,包括PyTorch和diffusers。PyTorch是一個開源的機器學習函式庫,diffusers是一個根據PyTorch的函式庫,提供了Stable Diffusion模型的實作。

import torch
from diffusers import StableDiffusionPipeline

載入預訓練模型

接下來,我們需要載入預訓練的Stable Diffusion模型。這裡,我們使用的是CompVis/stable-diffusion-v1-4模型,並指定使用float16資料型別以加速計算和減少記憶體使用。

pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16)

移動模型到GPU

為了加速計算,我們將模型移到GPU上。這裡,我們假設系統中有可用的GPU。

pipe = pipe.to("cuda")

執行推理

現在,我們可以使用模型生成影像了。這裡,我們定義了一個提示(prompt),用於指導影像生成。同時,我們也設定了一些其他引數,如隨機種子、推理步數和指導比例。

prompt = "一張宇航員騎馬的照片"
generator = torch.Generator("cuda").manual_seed(1024)
image = pipe(prompt, num_inference_steps=50, guidance_scale=7, generator=generator).images[0]

顯示和儲存影像

生成的影像可以直接顯示,也可以儲存到檔案中。

image.save(f"宇航員騎馬.png")
image

使用Dream Studio進行影像生成

除了本地執行Stable Diffusion模型外,還可以使用Stability AI的Dream Studio進行影像生成。Dream Studio提供了一個根據Web的介面,允許使用者生成影像並自定義引數。

使用API存取Dream Studio

如果需要在程式中生成大量影像,可以使用Dream Studio的API。這需要先獲得API金鑰並充值信用額度。

import os
import base64
import requests
from IPython.display import Image

這些程式碼片段展示瞭如何使用PyTorch和Stable Diffusion進行影像生成,以及如何使用Dream Studio的API進行影像生成。透過這些工具和技術,可以創造出豐富多樣的影像,並根據特定的需求自定義生成過程。

使用Stable Diffusion進行影像生成

Stable Diffusion是一種強大的影像生成模型,能夠根據輸入的文字提示生成高品質的影像。以下是使用Stable Diffusion進行影像生成的步驟和程式碼。

步驟1:安裝必要的函式庫和設定API金鑰

首先,需要安裝requestsos函式庫,並設定Stability API金鑰。

import os
import requests

api_key = os.getenv("STABILITY_API_KEY")

步驟2:定義影像生成引擎和API主機

定義Stable Diffusion影像生成引擎和API主機。

engine_id = "stable-diffusion-xl-1024-v1-0"
api_host = "https://api.stability.ai"

步驟3:定義影像描述和風格

定義影像描述和風格。

image_description = "computers being tied together"
prompt = f"""an illustration of {image_description}. in the style of corporate memphis, white background, professional, clean lines, warm pastel colors"""

步驟4:傳送POST請求到Stability API

傳送POST請求到Stability API,包含影像描述、風格和其他引數。

response = requests.post(
    f"{api_host}/v1/generation/{engine_id}/text-to-image",
    headers={
        "Content-Type": "application/json",
        "Accept": "application/json",
        "Authorization": f"Bearer {api_key}"
    },
    json={
        "text_prompts": [
            {
                "text": prompt,
            }
        ],
        "cfg_scale": 7,
        "height": 1024,
        "width": 1024,
        "samples": 1,
        "steps": 30,
    }
)

步驟5:處理API回應

處理API回應,檢查狀態碼是否為200,如果不是,則丟擲異常。

if response.status_code!= 200:
    raise Exception("Non-200 response: " + str(response.text))

步驟6:解析API回應和儲存影像

解析API回應,取得影像路徑,並儲存影像到本地。

data = response.json()
image_paths = []

if not os.path.exists("./out"):
    os.makedirs("./out")

內容解密:

以上程式碼使用Stable Diffusion模型生成影像,根據輸入的文字提示和風格。程式碼中定義了影像描述、風格和其他引數,然後傳送POST請求到Stability API。API回應包含影像路徑,程式碼解析回應並儲存影像到本地。

圖表翻譯:

以下是程式碼的Mermaid流程圖:

  flowchart TD
    A[開始] --> B[定義影像描述和風格]
    B --> C[傳送POST請求到Stability API]
    C --> D[處理API回應]
    D --> E[解析API回應和儲存影像]
    E --> F[結束]

圖表說明:

此流程圖展示了使用Stable Diffusion進行影像生成的步驟。從定義影像描述和風格開始,然後傳送POST請求到Stability API,處理API回應,解析API回應和儲存影像,最後結束。

進階技術:使用Stable Diffusion進行影像生成

在上一節中,我們探討瞭如何使用Stable Diffusion API進行影像生成。然而,使用Stable Diffusion的服務有一個缺點,就是缺乏自定義的控制。Stable Diffusion是一個開源模型,這意味著我們可以修改模型的各個方面,並利用社群開發的進階功能。

使用AUTOMATIC1111 Web使用者介面

Stable Diffusion的重度使用者通常推薦使用AUTOMATIC1111(發音為「automatic eleven eleven」)Web使用者介面,因為它功能豐富,並且有多個由玄貓開發的擴充套件。這個專案是利用Stable Diffusion最佳方面的入口:活躍的開源社群,他們致力於將進階功能整合到工具中。

功能概覽

AUTOMATIC1111 Web使用者介面提供了以下功能:

  • 影像生成:使用正常的文字轉影像Stable Diffusion模型
  • 影像轉影像:類別似於Midjourney中的基礎影像功能
  • 影像上取樣:對完成的影像進行上取樣以提高品質
  • 影像修復:提供了影像修復功能

自定義模型

在AUTOMATIC1111 Web使用者介面中,您甚至可以訓練和執行自定義模型。此外,還有成千上萬的模型在社群中公開分享,例如Hugging Face和Civitai。

注意事項

請注意,一些自定義開源模型可能包含不適合工作場所的內容(NSFW),因此瀏覽網站如Civitai時請謹慎。

程式碼實作

以下是使用Stable Diffusion API進行影像生成的程式碼實作:

import base64
import os
from PIL import Image
from IPython.display import display

# 設定環境變數
engine_id = "your_engine_id"
api_host = "your_api_host"
api_key = "your_api_key"

# 定義提示
prompt = "your_prompt"

# 傳送POST請求
response = requests.post(
    f"{api_host}/v1/inference/{engine_id}/stable-diffusion",
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    json={
        "prompt": prompt,
        "width": 512,
        "height": 512,
        "num_inference_steps": 50,
        "guidance_scale": 7.5,
    },
)

# 處理回應
if response.status_code!= 200:
    raise Exception(response.text)

response_json = response.json()

# 建立目錄
if not os.path.exists("out"):
    os.makedirs("out")

image_paths = []

# 處理影像
for i, image in enumerate(response_json["artifacts"]):
    filename = f"./out/image-{i}.png"
    with open(filename, "wb") as f:
        f.write(base64.b64decode(image["base64"]))
    image_paths.append(filename)

# 顯示第一張影像
display(Image(filename=image_paths[0]))

內容解密:

  1. 設定環境變數:首先,我們需要設定環境變數,包括engine_idapi_hostapi_key
  2. 定義提示:接下來,我們需要定義提示,包括影像的風格和顏色。
  3. 傳送POST請求:然後,我們傳送POST請求到Stable Diffusion API,包括提示、影像尺寸、推理步驟數和指導比例。
  4. 處理回應:如果回應狀態碼不是200,我們丟擲異常。否則,我們解析回應為JSON格式。
  5. 建立目錄:如果目錄不存在,我們建立目錄。
  6. 處理影像:我們遍歷回應中的影像,對於每張影像,我們設定檔名,解碼base64編碼的影像資料,寫入檔案,並追加檔案路徑到列表中。
  7. 顯示第一張影像:最後,我們顯示第一張影像。

圖表翻譯:

  flowchart TD
    A[設定環境變數] --> B[定義提示]
    B --> C[傳送POST請求]
    C --> D[處理回應]
    D --> E[建立目錄]
    E --> F[處理影像]
    F --> G[顯示第一張影像]

圖表翻譯:

這個流程圖展示了使用Stable Diffusion API進行影像生成的步驟,包括設定環境變數、定義提示、傳送POST請求、處理回應、建立目錄、處理影像和顯示第一張影像。

從技術架構視角來看,Stable Diffusion 和 AUTOMATIC1111 的結合,為影像生成領域帶來了顯著的進步。本文深入探討瞭如何利用 Stable Diffusion 模型,結合 ControlNet 和 AUTOMATIC1111 WebUI,實作更精細的影像生成控制。藉由本機安裝或雲端服務,使用者能根據需求彈性調整算力資源。ControlNet 的整合,更進一步提升了對影像風格和組成的掌控能力,而 AUTOMATIC1111 WebUI 則簡化了操作流程,並提供了豐富的社群資源和擴充功能,例如影像上取樣和修復等,大幅降低了使用門檻。然而,目前仍存在一些挑戰,例如需要一定的硬體資源或雲端服務費用,以及部分開源模型可能包含 NSFW 內容的風險。對於追求更高影像品質和控制力的使用者,建議深入研究 AUTOMATIC1111 WebUI 的各項功能,並探索社群提供的豐富模型資源。玄貓認為,隨著硬體成本下降和社群的持續貢獻,Stable Diffusion 及其相關工具將持續引領影像生成技術的發展,並在更多創意領域展現其巨大潛力。