このリポジトリは、KerasCV と TensorFlow を使用した DreamBooth の実装を提供します。この実装は、Hugging Face のdiffusers
の例から大きく参照されています。
DreamBooth は、新しいビジュアル コンセプトについて Stable Diffusion をすばやく教える (微調整する) 方法です。詳細については、このドキュメントを参照してください。
このリポジトリで提供されるコードは研究目的のみに使用されます。潜在的な使用例と制限について詳しく知りたい場合は、このセクションを確認してください。
このモデルをロードすると、https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE で CreativeML Open RAIL-M ライセンスに同意したことになります。
このリポジトリの付随リソースだけを探している場合は、次のリンクを参照してください。
2023 年 2 月 15 日更新: Soumik Rakshit に感謝します。重みとバイアスをサポートするためのより優れたユーティリティが追加されました (#22 を参照)。
前提条件をインストールします: pip install -r requirements.txt
。
まず、一意の識別子が追加されるクラスを選択する必要があります。このリポジトリ コードベースは、一意の識別子としてsks
使用し、クラスとしてdog
使用してテストされました。
次に、2 種類のプロンプトが生成されます。
(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 ノートブックを使用して、事前保存損失でのトレーニングに使用されるいくつかの画像を生成します。次に、生成されたイメージを単一のアーカイブとしてアーカイブし、内部で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
プロジェクトにアップロードします。これは、 WandbModelCheckpoint
コールバックを使用して構築されたDreamBoothCheckpointCallback
を使用して行われます。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
実行例です。
私たちは 2 つの異なる方法で実装をテストしました: (a) 拡散モデル (UNet) のみを微調整する、(b) テキスト エンコーダとともに拡散モデルを微調整する。実験は、トレーニング中のlearning rate
とtraining steps
、推論中のnumber of steps
とunconditional guidance scale
(ugs) の幅広いハイパーパラメータに対して行われました。ただし、ここには (私たちの観点から) 最も顕著な結果のみが含まれています。さまざまなハイパーパラメータが生成される画質にどのような影響を与えるかについて興味がある場合は、各セクションの完全なレポートへのリンクを見つけてください。
私たちの実験は、Hugging Face のこのブログ投稿に基づいていることに注意してください。
ここでは、私たちが行ったさまざまな実験から選ばれたいくつかの結果を紹介します。この設定の実験ログはここから入手できます。その他の視覚化画像 (これらの実験のチェックポイントを使用して生成されたもの) は、ここから入手できます。
画像 | ステップ | UGS | 設定 |
---|---|---|---|
50 | 30 | LR: 1e-6 トレーニングステップ: 800 (ウェイト) | |
25 | 15 | LR: 1e-6 トレーニングステップ: 1000 (ウェイト) | |
75 | 15 | LR: 3e-6 トレーニングステップ: 1200 (ウェイト) |
画像 | ステップ | ブス |
---|---|---|
75 | 15 | |
75 | 30 |
学習率 = 9e-06、最大トレーニング ステップ = 200 (重み | レポート)
画像 | ステップ | ブス |
---|---|---|
150 | 15 | |
75 | 30 |
学習率 = 9e-06、最大訓練ステップ = 200 (データセット | レポート)
diffusers
ライブラリは、安定拡散を含むさまざまな拡散モデルを実験するための最先端のツールを提供します。これには、大規模な安定拡散チェックポイントを使用する場合にdiffusers
による効率的な推論を実行するために利用できるさまざまな最適化テクニックが含まれています。 diffusers
特に有利な機能の 1 つは、実行時に構成でき、互換性のあるディフュージョン モデルに統合できるさまざまなスケジューラーをサポートしていることです。
このコードベースを使用して 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 ]
詳細については、このガイドに従ってください。
犬の画像の微調整されたチェックポイントをディフューザー互換の 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 に感謝します。