社群計算機視覺課程文件
擴散模型的控制
並獲得增強的文件體驗
開始使用
擴散模型的控制
Dreambooth
儘管擴散模型和GAN可以生成許多獨特的影像,但它們並非總能精確生成您需要的影像。因此,您必須微調模型,這通常需要大量資料和計算。然而,有些技術可以透過少量示例來個性化模型。
一個例子是Google Research的Dreambooth,這是一種訓練技術,透過僅使用主題或風格的少量影像進行訓練來更新整個擴散模型。它的工作原理是將提示中的一個特殊詞與示例影像關聯起來。有關Dreambooth的詳細資訊可以在論文和Hugging Face Dreambooth訓練文件中找到。
下面您可以看到使用Dreambooth在4張狗的影像上進行訓練並進行一些推理示例的結果。
您可以按照上面給出的Hugging Face文件重現結果。
從這個例子可以看出,模型已經學會了關於那隻特定狗的資訊,並且可以生成該狗在不同姿勢和背景下的新影像。儘管計算、資料和時間都有改進,但其他人已經找到了更有效的方法來定製模型。
這就是目前最流行的方法:低秩適應(LoRA)。該方法最初由微軟在這篇論文中提出,旨在高效微調大型語言模型。其主要思想是將權重更新矩陣分解為兩個低秩矩陣,在訓練過程中最佳化這些矩陣,而模型的其餘部分則保持凍結。Hugging Face文件提供了一份關於LoRA工作原理的良好概念指南。
現在,如果我們把這些想法結合起來,就可以使用LoRA透過Dreambooth高效地用少量示例微調擴散模型。關於如何實現這一點的Google Colab教程可以在這裡找到。
由於這種方法的質量和效率,許多人建立了自己的LoRA引數,其中許多可以在Civitai和Hugging Face這兩個網站上找到。對於Civitai,您可以下載通常在50-500MB範圍內的LoRA權重;對於Hugging Face版本,您可以直接從模型中心載入模型。下面是兩種情況下如何載入LoRA權重,然後將它們與模型融合的示例。
我們可以從安裝diffusers庫開始。
pip install diffusers
我們將初始化 `StableDiffusionXLPipeline` 並載入LoRA介面卡權重。
from diffusers import StableDiffusionXLPipeline
import torch
model = "stabilityai/stable-diffusion-xl-base-1.0"
pipe = StableDiffusionXLPipeline.from_pretrained(model, torch_dtype=torch.float16)
pipe.load_lora_weights(
"lora_weights.safetensors"
) # if you want to install from a weight file
pipe.load_lora_weights(
"ostris/crayon_style_lora_sdxl"
) # if you wish to install a lora from a repository directly
pipe.fuse_lora(lora_scale=0.8)這使得載入定製的擴散模型並用於推理變得快速,特別是當有大量模型可供選擇時。然後,如果我們想移除LoRA權重,可以呼叫 `pipe.unfuse_lora()`,這會將模型恢復到其原始狀態。至於 `lora_scale` 引數,這是一個超引數,控制在推理過程中LoRA權重的使用程度。值為1.0表示LoRA權重完全使用,值為0.0表示LoRA權重完全不使用。最佳值通常在0.7到1.0之間,但值得嘗試不同的值,看看哪個最適合您的用例。
您可以在此Gradio演示中嘗試一些Hugging Face LoRA模型
透過ControlNet引導擴散
擴散模型有多種方式可以引導其建立所需的輸出,例如提示、反向提示、引導比例、影像修復等等。在這裡,我們將重點介紹一種具有許多變體且可以與所有其他方法結合使用的方法,稱為ControlNet。它由斯坦福大學在這篇論文中提出。該方法允許我們用通常包含非常特定資訊(如深度、姿態、邊緣等)的影像來引導擴散模型。這使得生成的影像具有更高的一致性,這在擴散模型中通常是一個問題。
ControlNet可以在文字到影像和影像到影像兩種模式下使用。下面是一個使用ControlNet的文字到影像示例,該ControlNet經過邊緣檢測條件訓練,左上角的影像用作輸入。在這裡,我們可以看到所有生成的影像形狀非常相似,但顏色不同。這是因為ControlNet正在引導擴散模型建立與輸入影像形狀相同的影像。
要使用Stable Diffusion XL執行ControlNet的程式碼,請參閱此處的官方文件,但如果您只想測試一些示例,請檢視此Gradio演示,它允許您嘗試不同型別的ControlNet。
< > 在 GitHub 上更新