此儲存庫提供了使用 KerasCV 和 TensorFlow 的 DreamBooth 實作。此實作大量引用了 Hugging Face 的diffusers
範例。
DreamBooth 是一種快速教授(微調)新視覺概念的穩定擴散的方法。有關更多詳細信息,請參閱此文件。
此存儲庫中提供的程式碼僅用於研究目的。請查看本節以了解有關潛在用例和限制的更多資訊。
透過載入此模型,您接受 https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE 上的 CreativeML Open RAIL-M 授權。
如果您只是尋找此儲存庫的隨附資源,請點擊以下連結:
更新 15/02/2023 :感謝 Soumik Rakshit;我們現在有更好的實用程式來支持權重和偏差(參見#22)。
安裝先決條件: pip install -r requirements.txt
。
您首先需要選擇一個附加唯一識別碼的類別。這個儲存庫程式碼庫使用sks
作為唯一識別碼和dog
作為類別進行了測試。
然後會產生兩種類型的提示:
(a)實例提示:f“{self.unique_id} {self.class_category} 的照片” (b)班級提示:f“{self.class_category} 的照片”
實例影像
取得一些代表要對模型進行微調的概念的圖像 (3 - 10)。這些圖像將與instance_prompt
相關聯。這些圖像在程式碼庫中被稱為instance_images
。將這些映像存檔並將其託管在網路上某處,以便可以在內部使用tf.keras.utils.get_file()
函數下載檔案。
班級形象
DreamBooth 使用先驗保留損失來規範訓練。長話短說,先驗保留損失有助於模型根據其可能擁有的任何關於該概念的先驗知識,慢慢適應所考慮的新概念。要使用事先保留損失,我們需要如上所示的類別提示。類別提示用於產生預定義數量的圖像,這些圖像用於計算 DreamBooth 訓練的最終損失。
根據此資源,使用課堂提示產生的 200 - 300 個圖像在大多數情況下效果很好。
因此,在您決定了instance_prompt
和class_prompt
後,請使用此 Colab Notebook 產生一些影像,這些影像將用於使用先前保留損失進行訓練。然後將生成的映像存檔為單一存檔並將其線上託管,以便可以在內部使用tf.keras.utils.get_file()
函數下載。在程式碼庫中,我們將這些圖像簡單地稱為class_images
。
無需使用先前的保存損失即可進行 DreamBooth 訓練。這個儲存庫總是使用它。為了讓人們輕鬆測試這個程式碼庫,我們在這裡託管了實例和類別圖像。
啟動訓練!您可以使用許多超參數。請參閱train_dreambooth.py
腳本以了解有關它們的更多資訊。以下命令啟動混合精度和其他預設值的訓練:
python train_dreambooth.py --mp
您也可以透過指定--train_text_encoder
選項來微調文字編碼器。
此外,該腳本支援與權重和偏差 ( wandb
) 整合。如果您指定--log_wandb
,
WandbMetricsLogger
回呼自動將訓練指標記錄到您的wandb
儀表板。wandb
項目,作為模型版本控制的工件。這是使用DreamBoothCheckpointCallback
完成的,該回調是使用WandbModelCheckpoint
回調建構的。wandb
儀表板中的wandb.Table
。這是使用QualitativeValidationCallback
完成的,它也會在訓練結束時將產生的影像記錄到wandb
儀表板上的媒體面板中。以下命令可啟動訓練並將訓練指標和產生的影像記錄到權重和偏差工作區:
python train_dreambooth.py
--log_wandb
--validation_prompts
" a photo of sks dog with a cat "
" a photo of sks dog riding a bicycle "
" a photo of sks dog peeing "
" a photo of sks dog playing cricket "
" a photo of sks dog as an astronaut "
這是一個wandb
運行範例,您可以在其中找到生成的圖像以及模型檢查點。
我們用兩種不同的方法測試了我們的實作:(a) 僅微調擴散模型(UNet),(b) 微調擴散模型和文字編碼器。這些實驗是在訓練期間的learning rate
和training steps
以及推理期間的number of steps
和unconditional guidance scale
(ugs) 的各種超參數上進行的。但這裡只包含最顯著的結果(從我們的角度來看)。如果您對不同的超參數如何影響生成的圖像品質感到好奇,請找到每個部分中完整報告的連結。
請注意,我們的實驗是由 Hugging Face 的這篇部落格文章指導的。
以下是我們進行的各種實驗中精選的一些結果。我們對此設定的實驗日誌可在此處找到。更多可視化圖像(透過這些實驗的檢查點生成)可在此處獲得。
圖片 | 步驟 | 地下地質調查局 | 環境 |
---|---|---|---|
50 | 30 | LR:1e-6 訓練步數:800(重量) | |
25 | 15 | LR:1e-6 訓練步數:1000(重量) | |
75 | 15 | LR:3e-6 訓練步數:1200(重量) |
圖片 | 步驟 | 烏格斯 |
---|---|---|
75 | 15 | |
75 | 30 |
w/學習率=9e-06,最大訓練步數=200(權重|報告)
圖片 | 步驟 | 烏格斯 |
---|---|---|
150 | 15 | |
75 | 30 |
w/學習率=9e-06,最大訓練步數=200(資料集|報告)
diffusers
庫提供了最先進的工具,用於試驗不同的擴散模型,包括穩定擴散。它包括不同的最佳化技術,在使用大型穩定擴散檢查點時,可利用這些最佳化技術對diffusers
執行有效的推理。 diffusers
的一項特別有利的功能是它支援不同的調度程序,這些調度程序可以在運行時配置,並且可以整合到任何相容的擴散模型中。
一旦您使用此程式碼庫獲得了 DreamBooth 微調檢查點,您實際上可以將它們匯出到方便的StableDiffusionPipeline
中並直接從diffusers
庫中使用它。
考慮這個存儲庫:chansung/dreambooth-dog。執行一些小步驟後,您可以在StableDiffusionPipeline
中使用此儲存庫的檢查點:
from diffusers import StableDiffusionPipeline
# checkpoint of the converted Stable Diffusion from KerasCV
model_ckpt = "sayakpaul/text-unet-dogs-kerascv_sd_diffusers_pipeline"
pipeline = StableDiffusionPipeline . from_pretrained ( model_ckpt )
pipeline . to ( "cuda" )
unique_id = "sks"
class_label = "dog"
prompt = f"A photo of { unique_id } { class_label } in a bucket"
image = pipeline ( prompt , num_inference_steps = 50 ). images [ 0 ]
請按照本指南了解更多資訊。
我們已將狗圖像的微調檢查點轉換為與 Diffusers 相容的 StableDiffusionPipeline,並使用不同的調度程序設定進行了各種實驗。例如, DDIMScheduler
的下列參數在不同的guidance_scale
和num_inference_steps
集上進行測試。
num_inference_steps_list = [ 25 , 50 , 75 , 100 ]
guidance_scale_list = [ 7.5 , 15 , 30 ]
scheduler_configs = {
"DDIMScheduler" : {
"beta_value" : [
[ 0.000001 , 0.02 ],
[ 0.000005 , 0.02 ],
[ 0.00001 , 0.02 ],
[ 0.00005 , 0.02 ],
[ 0.0001 , 0.02 ],
[ 0.0005 , 0.02 ]
],
"beta_schedule" : [
"linear" ,
"scaled_linear" ,
"squaredcos_cap_v2"
],
"clip_sample" : [ True , False ],
"set_alpha_to_one" : [ True , False ],
"prediction_type" : [
"epsilon" ,
"sample" ,
"v_prediction"
]
}
}
以下是beta_schedule
參數不同值的比較,而其他參數則固定為預設值。查看原始報告,其中包括其他調度程序(例如PNDMScheduler
和LMSDiscreteScheduler
的結果。
人們經常觀察到預設設定確實可以保證產生品質更好的影像。例如, guidance_scale
和beta_schedule
的預設值設定為 7.5 和linear
。然而,當guidance_scale
設定為7.5時, beta_schedule
的scaled_linear
似乎工作得更好。或者,當beta_schedule
設定為linear
時,更高的guidance_scale
似乎效果更好。
我們進行了 4,800 次實驗,總共產生了 38,400 張影像。這些實驗記錄在權重和偏差中。如果您好奇,請在此處查看它們以及用於運行實驗的腳本。
除了本部落格文章中分享的提示和技巧之外,我們在準備對人臉進行 DreamBooth 訓練的實例時還遵循以下內容:
感謝 Abhishek Thakur 分享這些技巧。