Stable Diffusion 的基礎功能已能生成令人驚豔的影像,但要進一步提升影像品質和控制精確度,則需掌握更進階的技巧。本文將探討如何利用 Img2Img 功能實作影像放大、反向提示詞生成,以及 inpainting 和 outpainting 等區域性編輯技術,並解析如何透過 ControlNet 技術,藉由 Canny、Depth、Normal、OpenPose、M-LSD、SoftEdge、Segmentation 和 Scribble 等多種模型,精確控制生成影像的細節、構圖和風格。這些技術的應用,能大幅提升 Stable Diffusion 的創作彈性和影像品質,滿足更廣泛的應用需求。

使用Stable Diffusion進行影像生成的高階技術:影像放大與區域性編輯

在前面的章節中,我們已經介紹瞭如何使用Stable Diffusion生成基本的影像。然而,在實際應用中,我們往往需要更高解析度或更具針對性的影像編輯功能。本章將探討如何利用Img2Img功能實作影像放大(upscaling)、反向生成提示詞(Interrogate CLIP)、以及區域性編輯(inpainting和outpainting)。

影像放大技術詳解

在實際應用中,直接生成的512x512影像往往無法滿足需求。透過影像放大技術,我們可以將低解析度的影像擴充套件到所需的尺寸和解析度。

影像放大引數最佳化

要獲得最佳的影像放大效果,建議採用以下引數設定:

  • 步數(Steps):150-200以上
  • CFG Scale:8-15之間
  • Denoising Strength:0.1-0.2

這樣的引數設定可以在保持原始影像特徵的同時,生成更高品質的細節。影像放大的過程可能需要較長時間,在M2 MacBook Air上大約需要10-30分鐘。

實際操作流程

  1. 將原始影像上傳至Img2Img介面
  2. 設定適當的放大引數
  3. 點選"Generate"按鈕生成放大後的影像
  4. 可選擇下載高解析度影像或再次點選"Send to Img2Img"進行二次放大

反向生成提示詞:Interrogate CLIP技術

Img2Img介面中的Interrogate CLIP功能允許我們從影像反向推匯出可能的提示詞,這一功能類別似於Midjourney的Describe功能。

技術原理與應用

CLIP(Contrastive Language-Image Pre-training)模型透過對比學習的方式建立了影像與文字之間的關聯。Interrogate CLIP功能利用這一模型,可以從給定的影像中提取出可能的語義描述。

實際操作示例

當我們對一幅海盜主題的藝術作品使用Interrogate CLIP功能時,可能會得到如下的輸出結果:

a painting of a woman in a pirate costume on the beach 
with a pirate hat on her head and a pirate ship in the background,
a fine art painting, Chris Rallis, fantasy art, stanley artgerm lau

這一輸出結果為我們提供了對影像內容的詳細描述,包括人物、場景、藝術風格等關鍵資訊。

區域性編輯技術:Inpainting與Outpainting

Img2Img還支援區域性編輯功能,包括inpainting(填充指定區域)和outpainting(擴充套件影像邊界)。

Inpainting技術詳解

Inpainting允許我們對影像的特定區域進行編輯和修改。具體操作步驟如下:

  1. 在Img2Img介面中選擇"Inpaint"子標籤
  2. 上傳需要編輯的影像
  3. 使用畫筆工具標記需要修改的區域
  4. 輸入描述新內容的提示詞
引數設定建議
  • Inpaint area:選擇"Whole picture"以獲得更好的整體一致性
  • Denoising Strength:根據修改程度選擇合適的值(0.2-0.8)
  • Masked Content:根據需求選擇"Original"或"Latent Noise"

Outpainting技術實作

Outpainting功能透過"Poor man’s outpainting"指令碼實作,具體步驟如下:

  1. 在Script下拉選單中選擇"Poor man’s outpainting"
  2. 設定"Resize mode"為"Resize"
  3. 調整Denoising Strength到較高值
技術特點
  • 可以擴充套件影像的不同邊界
  • 需要設定適當的Masked Content和Mask Blur引數
  • 對擴充套件區域進行智慧填充

ControlNet:進階影像生成的精準控制技術

在前面的章節中,我們討論瞭如何使用提示詞(prompting)和 Img2Img 或基礎影像來控制生成影像的風格。然而,這些方法往往無法精確控制影像中人物的姿勢、場景的構圖或物體的結構。ControlNet 是一種先進的技術,能夠對輸入影像進行條件控制,從而實作對生成影像的更精確控制。

ControlNet 的原理與優勢

ControlNet 是由 Zhang、Rao 和 Agrawala 在 2023 年提出的技術,透過在文字到影像擴散模型中新增條件控制,實作了對生成影像的精確控制。它允許使用者透過邊緣檢測、姿勢、深度等多種技術來控制生成影像的構圖和結構。使用者只需上傳一張想要模仿的影像,並選擇適合的預訓練模型,即可生成具有相同構圖但不同風格的影像。

安裝與使用 ControlNet

要使用 ControlNet,首先需要在 AUTOMATIC1111 中安裝 ControlNet 擴充功能。以下是安裝步驟:

  1. 進入「Extensions」標籤頁,點選「Available」子標籤。
  2. 點選「Load from」按鈕。
  3. 在搜尋框中輸入 sd-webui-controlnet 以找到該擴充功能。
  4. 點選右側的「Install」按鈕進行安裝。
  5. 等待 Web UI 下載並安裝必要的檔案。

如果上述步驟遇到問題,可以嘗試以下替代方法:

  1. 進入「Extensions」標籤頁,點選「Install from URL」子標籤。
  2. 在 Git 儲存函式庫的 URL 欄位中貼上 https://github.com/Mikubill/sd-webui-controlnet
  3. 點選「Install」按鈕。
  4. 等待 WebUI 下載並安裝必要的檔案。

安裝完成後,重啟 AUTOMATIC1111 或在「Settings」中點選「Apply and restart UI」。ControlNet 擴充功能將出現在 Stable Diffusion 的引數選項下方的一個摺疊式標籤頁中(圖 9-19)。

使用 ControlNet 的步驟

  1. 上傳一張影像。
  2. 點選「Enable」以啟用 ControlNet。
  3. 選擇適合的 ControlNet 前處理器和模型。
  4. 如果系統 VRAM 小於 6 GB,勾選「Low VRAM」選項。
  5. 根據任務需求,調整 ControlNet 的引數,例如 Control Weight、Starting Control Steps 和 Ending Control Steps,以獲得最佳結果。

ControlNet 的關鍵引數

  • Control Weight:控制 ControlNet 輸入對生成影像的影響程度,類別似於提示詞的權重設定。
  • Starting Control Steps 和 Ending Control Steps:控制 ControlNet 在擴散過程中的應用時間範圍,預設為從開始到結束(0 到 1)。調整這些引數可以影響生成影像的細節程度。
  • Preprocessor Resolution:決定中間影像處理步驟中的細節程度,有助於維持對生成影像的控制。
  • Canny Low 和 High Thresholds:用於邊緣檢測模型,決定哪些畫素構成邊緣。
  • Control Mode:決定模型遵循 ControlNet 輸入的程度,相對於提示詞的影響。

下載與使用 ControlNet 模型

首次安裝 ControlNet 時,不會自動下載任何模型。使用者需要手動從模型頁面下載所需的模型,並將其放入 Models > ControlNet 資料夾中。建議從 Canny edge detection 模型開始,因為它是最通用的模型。每個模型的大小約為幾 GB,因此只下載計畫使用的模型。

以下範例展示了使用不同 ControlNet 模型的結果,所有影像均使用 DPM++ SDE Karras 取樣器、CFG scale 為 1.5、Control Mode 設定為 Balanced、Resize Mode 設定為 Crop and Resize,並且進行 30 次取樣步驟。

# 範例程式碼:使用 ControlNet 生成影像
import torch
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel

# 載入 ControlNet 模型和 Stable Diffusion pipeline
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny")
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5", controlnet=controlnet
)

# 設定提示詞和影像
prompt = "a high-quality image of a castle in the mountains"
image = load_image("path/to/input/image.png")

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

# 儲存生成的影像
output.save("path/to/output/image.png")

程式碼解析:

此範例程式碼展示瞭如何使用 diffusers 函式庫中的 StableDiffusionControlNetPipelineControlNetModel 來載入預訓練的 ControlNet 模型和 Stable Diffusion pipeline。透過設定提示詞和輸入影像,並調整 controlnet_conditioning_scale 引數來控制生成影像的構圖和風格。

後續發展方向

隨著 ControlNet 技術的不斷進步,未來可能會出現更多創新應用,例如在虛擬實境、遊戲開發和動畫製作等領域。使用者可以期待更精確的控制和更豐富的創作可能性。

圖表翻譯:

此圖示展示了使用 ControlNet 和 Canny edge detection 生成影像的過程。可以看到輸入影像經過邊緣檢測後,如何影響最終生成的影像構圖和細節。

隨著 AI 技術的發展,像 ControlNet 這樣的工具將越來越強大,為創作者提供更多的可能性。未來,我們可能會看到更多根據擴散模型的創新應用,不僅限於影像生成,還包括視訊處理、3D 建模等更多領域。

圖表說明:

圖 9-18 和圖 9-19 分別展示了使用 Canny edge detection 的 ControlNet 結果和 AUTOMATIC1111 中的 ControlNet 介面。這些圖表幫助讀者理解如何使用 ControlNet 控制生成影像,並展示了不同引數設定的效果。

總結來說,ControlNet 提供了一個強大的工具,讓使用者能夠更精確地控制 Stable Diffusion 生成的影像。這項技術不僅提升了生成影像的品質,也為創作者提供了更多的創作自由度。未來,我們可以期待看到更多根據這項技術的創新應用和發展。

ControlNet 在 Stable Diffusion 中的應用與技術解析

ControlNet 為 Stable Diffusion 提供了一系列進階的圖片生成控制技術,透過不同的模型與前處理器組合,能夠實作對生成圖片的精細控制。以下將探討各種 ControlNet 模型的工作原理、適用場景及其優缺點。

Canny 邊緣偵測模型

Canny 邊緣偵測是一種經典的影像處理技術,用於擷取圖片中的高對比度區域邊緣,形成銳利的畫素輪廓。該模型在需要保留細節的圖片轉換任務中表現出色,例如將城市天際線以特定風格重新繪製。

技術特點:

  • 擅長捕捉高對比度區域的細節
  • 可能引入不必要的噪訊
  • 對細節保留要求高的場景效果佳

實際應用範例:

將紐約市的天際線圖片轉換為吉卜力工作室風格。

# 使用 Canny 模型的範例程式碼
import cv2
from controlnet_aux import CannyDetector

# 初始化 Canny 偵測器
canny_detector = CannyDetector()

# 處理輸入圖片
input_image = cv2.imread("input.jpg")
processed_image = canny_detector(input_image)

# 將處理後的圖片用於 ControlNet 生成

內容解密:

上述程式碼展示瞭如何使用 CannyDetector 對輸入圖片進行邊緣偵測處理。處理後的圖片將作為 ControlNet 的輸入,用於指導圖片生成過程。

Depth 深度模型

Depth 模型透過估算圖片的深度資訊,生成深度圖,用於控制圖片元素的空間位置與構圖。該模型在需要保持原圖空間關係的轉換任務中尤為有效。

技術特點:

  • 能夠保留圖片元素的深度資訊
  • 有助於避免 img2img 轉換中的元素混淆問題

實際應用範例:

將一張樂隊照片轉換為軍隊巡邏的場景,同時保持原有的深度與構圖。

# 使用 Depth 模型的範例程式碼
from controlnet_aux import MidasDetector

# 初始化 Midas 深度偵測器
midas_detector = MidasDetector()

# 處理輸入圖片
depth_map = midas_detector(input_image)

# 將深度圖用於 ControlNet 生成

內容解密:

此範例程式碼使用 MidasDetector 生成輸入圖片的深度圖。深度圖中的亮度值代表距離觀測者的相對距離,用於指導 ControlNet 生成具有相同深度關係的圖片。

Normal 法線模型

Normal 模型生成圖片中物體的法線對映,作為物體表面幾何形狀的估計。該模型在需要保留物體紋理與光照資訊的轉換任務中表現良好。

技術特點:

  • 能夠提供物體表面的幾何細節
  • 可能對臉部等細節過度敏感,限制創作自由度

實際應用範例:

將一位女性彈鋼琴的畫面轉換為大蕭條時代的場景。

# 使用 Normal 模型的範例程式碼
from controlnet_aux import NormalBaeDetector

# 初始化 NormalBae 偵測器
normalbae_detector = NormalBaeDetector()

# 處理輸入圖片
normal_map = normalbae_detector(input_image)

# 將法線圖用於 ControlNet 生成

內容解密:

上述程式碼使用 NormalBaeDetector 生成輸入圖片的法線圖。法線圖包含物體表面的朝向資訊,用於指導 ControlNet 生成具有正確光照與紋理的圖片。

OpenPose 人體姿態模型

OpenPose 模型透過偵測人體關鍵點,生成人體骨架圖,用於控制生成圖片中的人物姿態與表情。該模型在需要精確控制人物姿態的任務中非常有用。

技術特點:

  • 能夠精確控制人物的姿態與表情
  • 需要完整的人體輪廓作為輸入

實際應用範例:

將蒙娜麗莎的姿態轉移到 Rachel Weisz 的肖像上。

# 使用 OpenPose 模型的範例程式碼
from controlnet_aux import OpenposeDetector

# 初始化 OpenPose 偵測器
openpose_detector = OpenposeDetector()

# 處理輸入圖片
pose_map = openpose_detector(input_image)

# 將姿態圖用於 ControlNet 生成

內容解密:

此範例程式碼使用 OpenposeDetector 生成輸入圖片中人物的骨架圖。骨架圖包含人物的姿態與表情資訊,用於指導 ControlNet 生成具有相同姿態的人物圖片。

M-LSD 直線偵測模型

M-LSD 模型專門用於偵測圖片中的直線段,適合用於建築與室內設計相關的圖片轉換任務。

技術特點:

  • 擅長捕捉直線段,適合人造物體
  • 不適合自然場景

實際應用範例:

將現代公寓重新設計為 Mad Men 風格。

# 使用 M-LSD 模型的範例程式碼
from controlnet_aux import MLSDdetector

# 初始化 MLSD 偵測器
mlsd_detector = MLSDdetector()

# 處理輸入圖片
lines_map = mlsd_detector(input_image)

# 將直線圖用於 ControlNet 生成

內容解密:

上述程式碼使用 MLSDdetector 生成輸入圖片中的直線段圖。直線段圖包含圖片中的直線資訊,用於指導 ControlNet 生成具有相同直線特徵的圖片。

SoftEdge 軟邊緣模型

SoftEdge(HED)是一種替代 Canny 的邊緣偵測技術,提供更平滑的邊緣輪廓,在風格化與色彩變更任務中表現出色。

技術特點:

  • 提供比 Canny 更平滑的邊緣輪廓
  • 在臉部重現與風格化任務中效果更佳

實際應用範例:

將維梅爾的名畫《戴珍珠耳環的少女》重新詮釋為 Scarlett Johansson 的形象。

# 使用 SoftEdge 模型的範例程式碼
from controlnet_aux import HEDdetector

# 初始化 HED 偵測器
hed_detector = HEDdetector()

# 處理輸入圖片
softedge_map = hed_detector(input_image)

# 將軟邊緣圖用於 ControlNet 生成

內容解密:

此範例程式碼使用 HEDdetector 生成輸入圖片的軟邊緣圖。軟邊緣圖提供比 Canny 更平滑的邊緣輪廓,用於指導 ControlNet 生成風格化圖片。

Segmentation 分割模型

分割模型將圖片劃分為語義相關的區域,用於精細控制不同物件的外觀與風格,在建築與室外場景中特別有效。

技術特點:

  • 能夠精細控制不同物件的外觀與風格
  • 在複雜場景中表現出色

實際應用範例:

將現代城堡照片轉換為奇幻風格插畫。

# 使用 Segmentation 模型的範例程式碼
from controlnet_aux import UniformerDetector

# 初始化 Uniformer 分割偵測器
uniformer_detector = UniformerDetector()

# 處理輸入圖片
segmentation_map = uniformer_detector(input_image)

# 將分割圖用於 ControlNet 生成

內容解密:

上述程式碼使用 UniformerDetector 生成輸入圖片的分割圖。分割圖包含不同語義區域的資訊,用於指導 ControlNet 生成具有精細控制的圖片。

Scribble 簡筆畫模型

Scribble 模型允許使用者手繪草圖,直接作為 ControlNet 的輸入,用於生成創意插畫。

技術特點:

  • 使用者可以直接手繪輸入,快速迭代創意
  • 對繪畫技巧要求不高,簡單草圖即可生效

實際應用範例:

根據簡單草圖生成兒童繪本插畫。

# 使用 Scribble 模型的範例程式碼(簡化示意)
from controlnet_aux import ScribbleDetector

# 初始化 Scribble 偵測器
scribble_detector = ScribbleDetector()

# 處理手繪草圖
scribble_map = scribble_detector(scribble_input)

# 將草圖用於 ControlNet 生成插畫

內容解密:

此範例展示如何使用 ScribbleDetector 處理手繪草圖,並將其用於 ControlNet 生成創意插畫。

圖表翻譯:ControlNet 各模型比較分析圖示說明

此圖示呈現了不同 ControlNet 方法的核心功能和應用場景差異,包括其在邊緣檢測、深度估計、人物姿態控制等方面的專長。透過對比這些方法的功能特點,使用者能夠更清晰地瞭解如何在不同的創作需求中選擇最合適的工具。