Diffusers 中的 ControlNet

Hugging Face 已透過 StableDiffusionControlNetPipeline 將 ControlNet 整合至 diffusers 函式庫,讓使用者能以深度圖、分割圖、塗鴉以及關鍵點等特定空間資訊來條件化圖像生成。此整合提供了簡潔的介面以自訂生成流程,能夠執行將草圖轉為藝術畫作或在不同角色之間保持精確姿勢等任務。

ControlNet 架構與訓練

ControlNet 是由 Lvmin Zhang 與 Maneesh Agrawala 提出的框架,為文字到圖像的擴散模型加入條件控制。其架構透過建立擴散模型(例如 Stable Diffusion 的潛在 UNet)之「可訓練副本」同時保留原始參數的「鎖定副本」來運作。

Key technical details of the training process include:

  • Parameter Preservation: 鎖定副本保留了從大型資料集學得的一般知識,而可訓練副本則學習特定任務的空間條件。
  • Zero Convolutions: 可訓練副本與鎖定副本透過「零卷積」層相連。這些層在訓練過程中被優化,以確保已凍結模型所學的語意在加入新條件時仍得以保留。
  • Conditioning Specificity: 每一種新的空間條件都需要一套獨立的已訓練 ControlNet 權重。例如,Canny 邊緣圖與語意分割圖會使用不同的權重。

推論與記憶體管理

執行 ControlNet 需要同時載入預訓練的擴散模型權重與特定的 ControlNet 權重。例如,使用 Stable Diffusion v1-5 搭配 ControlNet 檢查點會額外增加約 7 億個參數,較標準的 Stable Diffusion 需要更多記憶體。

為了最佳化效能,Hugging Face 在 diffusers 的實作中建議以下幾種技術:

  • Smart CPU Offloading: 使用 enable_model_cpu_offload() 可確保模型元件(CLIP 文字編碼器、UNet、ControlNet、VAE 解碼器)僅在需要時載入 GPU 記憶體,顯著降低 VRAM 用量。
  • Fast Schedulers: 將預設的 PNDMScheduler 替換為 UniPCMultistepScheduler,可將推論步數從 50 減少至 20,且不會有 顯著 的品質損失。
  • Attention Acceleration: 啟用 xformers 記憶體高效注意力可進一步優化速度與記憶體使用。

透過這些最佳化,圖像生成在 V100 GPU 上大約只需 3 秒,使用約 4 GB 的 VRAM。

實作與使用案例

StableDiffusionControlNetPipeline 允許透過結合文字提示與空間條件,靈活地生成圖像。

單一條件範例

  • Canny Edge Detection: 使用者可利用 OpenCV 產生圖像的 Canny 邊緣圖,ControlNet 會根據此圖保持原圖的精確構圖,同時更換主題(例如,以經典畫作的姿勢呈現不同名人)。
  • OpenPose: 透過 controlnet_aux 中的 OpenposeDetector,使用者可從圖像中擷取人體姿勢,並將這些精確姿勢套用到新生成的角色上,例如超級英雄做瑜伽。
  • DreamBooth Integration: ControlNet 可與微調模型結合。透過 DreamBooth 微調的模型(例如 Mr. Potato Head 模型)可在 StableDiffusionControlNetPipeline 中使用,將特定主體放入受控的空間構圖中。

結合多重條件

多個 ControlNet 條件可同時用於單一圖像。只要將 ControlNetModel 實例的列表以及相對應的條件列表傳入管線,使用者即可結合不同的空間控制。

為了最佳化多條件的結果,建議採用以下策略:

  • Masking: 為其中一個條件圖遮罩區域,使其不與其他條件重疊(例如,遮罩 Canny 圖的中心以為 OpenPose 圖騰出空間)。
  • Conditioning Scale: 調整 controlnet_conditioning_scale 以在空間條件之間設定優先順序。

支援的條件模型

Diffusers 支援以下條件模型:

  • 深度 (sd-controlnet-depth)
  • HED (sd-controlnet-hed)
  • 法線 (sd-controlnet-normal)
  • 塗鴉 (sd-controlnet-scribble)
  • 分割 (sd-controlnet-seg)
  • OpenPose (sd-controlnet-openpose)
  • MLSD (sd-controlnet-mlsd)
  • Canny (sd-controlnet-canny)

Sources