HuggingFace ブログ : diffusers 🧨 による ControlNet の訓練

HuggingFace ブログ : diffusers 🧨 による ControlNet の訓練 (翻訳/解説)

翻訳 : クラスキャット セールスインフォメーション
作成日時 : 10/30/2023

* 本ページは、HuggingFace Blog の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

HuggingFace ブログ : diffusers 🧨 による ControlNet の訓練

イントロダクション

ControlNet は、追加の条件を追加することにより拡散モデルのきめ細かい制御を可能にするニューラルネットワーク構造です。この技術は論文 Adding Conditional Control to Text-to-Image Diffusion Models (テキスト-to-画像拡散モデルへの条件付き制御の追加) で初公開され、ポーズ推定、深度マップ、canny エッジ、スケッチ 等々 を含む、Stable Diffusion v1-5 を制御する 8 つの異なる条件のオープンソース diffusion コミュニティ・オーサーのリリースを素早く引き継ぎました。

このブログ投稿では、Uncanny Faces モデル – 3D 合成顔に基づいた顔のポーズのモデル – をどのように訓練したかの各ステップを詳細に説明します (uncanny face は実際には意図しない結果であり、それがどのように成し遂げられたかに注目してください)。

 

Stable Diffusion のための ControlNet の訓練を始める

独自の ControlNet の訓練は 3 ステップを必要とします :

  1. 条件の計画 : ControlNet は多くのタスクに対して Stable Diffusion を制御するのに十分に柔軟です。事前訓練済みモデルは広範囲な条件を実演し、コミュニティは ピクセル化されたカラーパレット で条件付けするような、他のモデルも構築しています。

  2. データセットの構築 : 条件が決定されたら、データセットを構築します。そのためには、データセットをゼロから構築するか、既存のデータセットの部分セットを使用できます。モデルを訓練するにはデータセットに 3 つのカラムが必要です : 正解画像、条件画像そしてプロンプトです。

  3. モデルの訓練 : データセットの準備ができたら、モデルを訓練します。これは diffusers 訓練スクリプト のおかげで最も簡単なパートです。少なくとも 8GB の VRAM を備えた GPU が必要です。

 

1. 条件の計画

条件を計画するには、2 つの質問を考えるのが役立ちます :

  1. どのような種類の条件を使用したいですか?
  2. “regular” 画像を私の条件に変換できる、既存のモデルが既にありますか?

例として、facial ランドマーク条件付けの使用について考えました。私たちの論法は : 1. 一般的なランドマークに条件付けられた ControlNet は上手く機能します。2. facial ランドマークは十分に普及した技術で、通常の写真の facial ランドマークを計算する複数のモデルがあります。特定の facial ランドマークに従うように、あるいは独自の facial 表現を模倣するように Stable Diffusion を制御することは楽しいでしょう。

 

2. データセットの構築

Okay! それで私たちは facial ランドマーク Stable Diffusion 条件付けを行なうことに決めました。従って、データセットを準備するには以下が必要です :

  • 正解画像 : この場合、顔の画像
  • 条件付け画像 (conditioning_image) : この場合、facial ランドマークが視覚化された画像
  • キャプション: 使用されている画像を説明するキャプション

このプロジェクトのために、Microsoft による FaceSynthetics データセットで進めることに決めました : それは 100K の合成顔を含むデータセットです。Celeb-A HQ, FFHQ のようなリアルな顔を含む他の顔研究データセットもありますが – このプロジェクトについては合成顔で進めることにしました。

FaceSynthetics データセットは素晴らしいスタートのように思えました : それは顔の正解画像、iBUG 68-facial ランドマーク形式でアノテートされた facial ランドマーク、そして顔のセグメントされた画像を含みます。

Perfect. Right? Unfortunately, not really.「条件付けの計画」ステップの 2 番目の質問を思い出してください – 通常の画像を条件付けに変換するモデルを持つ必要がある。顔をこのデータセットのアノテートされたランドマーク形式に変換できる既知のモデルがないことが判明しました。

そこで別のパスに従うことを決めました :

  • FaceSynthetics データセットの顔の正解画像を使用する。
  • 顔の任意の画像を iBUG の 68-facial ランドマーク形式に変換できる既知のモデルを使用する (私たちのケースでは、SOTA モデル SPIGA を使用しました)
  • facial ランドマークを、条件付け画像 (conditioning_image) として使用される素敵なイラスト・マスクに変換できるカスタムコードを使用する。
  • それを Hugging Face データセット としてセーブします。

FaceSynthetics データセットからの正解画像を illustrated マスクに変換して、それを Hugging Face データセットとしてセーブするために使用されるコードを ここで見つけることができます

さて、データセットの正解画像と条件付け画像では、1 ステップ : 各画像に対するキャプションが欠けています。このステップは強く勧められますが、空のプロンプトで実験して結果をレポートバックすることもできます。FaceSynthetics データセットに対するキャプションを持たなかったので、BLIP キャプショニング を通してそれを実行しました。すべての画像をキャプショニングするために使用されるコードを ここ で確認できます。

それにより、最終的なデータセットに到達しました!キャプションを持つ Face Synthetics SPIGA は、FaceSynthetics データセットの 100K 画像に対する正解画像、セグメンテーションとキャプションを含みます。モデルを訓練する準備が整いました!

 

3. モデルの訓練

データセットの準備 ができたので、モデルを訓練します!これは本来は過程の最も困難なパートでしたが、diffusers 訓練スクリプト により、最も簡単であることがわかりました。LambdaLabs で US$1.10/h でレンタルしたシングル A100 を使用しました。

 

私たちの訓練エクスペリエンス

私たちはモデルを 3 エポック (つまり 100K 画像のバッチがモデルに 3 回示されました) そしてバッチサイズ 4 (各ステップは 4 画像をモデルに見せます) で訓練しました。これは過度で、過剰適合であることが判明しました (そのためモデルはリアルな顔から少し分岐したコンセプトは忘れ、従って例えばプロンプトの “shrek” や “a cat” は shrek や a cat ではなく人間を作成するでしょう、そしてまたスタイルも無視し始めました)。

ちょうど 1 エポックで (つまりモデルが 100K 画像を「見た」後で)、それは既にポーズに従うように収束していて過剰適合しません。それで動作しますが、しかし… 顔合成データセット使用しましたので、モデルはリアリスティックな顔ではなく異様な 3D のような顔を学習する結果になりました。リアルな顔ではなく合成顔データセットを使用したことを考えるとこれは当然で、娯楽/memetic 目的で使用できます。ここに uncannyfaces_25K モデルがあります。

(訳注: 原文 参照)

 

訓練を行った方法

私たちが行なう必要があったすべては、依存関係をインストールすることです :

pip install git+https://github.com/huggingface/diffusers.git transformers accelerate xformers==0.0.16 wandb
huggingface-cli login
wandb login

And then run the train_controlnet.py code

!accelerate launch train_controlnet.py \
 --pretrained_model_name_or_path="stabilityai/stable-diffusion-2-1-base" \
 --output_dir="model_out" \
 --dataset_name=multimodalart/facesyntheticsspigacaptioned \
 --conditioning_image_column=spiga_seg \
 --image_column=image \
 --caption_column=image_caption \
 --resolution=512 \
 --learning_rate=1e-5 \
 --validation_image "./face_landmarks1.jpeg" "./face_landmarks2.jpeg" "./face_landmarks3.jpeg" \
 --validation_prompt "High-quality close-up dslr photo of man wearing a hat with trees in the background" "Girl smiling, professional dslr photograph, dark background, studio lights, high quality" "Portrait of a clown face, oil on canvas, bittersweet expression" \
 --train_batch_size=4 \
 --num_train_epochs=3 \
 --tracker_project_name="controlnet" \
 --enable_xformers_memory_efficient_attention \
 --checkpointing_steps=5000 \
 --validation_steps=5000 \
 --report_to wandb \
 --push_to_hub

設定の幾つかを分解しましょう、そしてまた訓練用の VRAM を 8GB ほどに少なくするための幾つかの最適化のヒントを調べましょう。

  • pretrained_model_name_or_path: 使用したい Stable Diffusion ベースモデル (ここでは v2-1 を選択します、それは顔をより良くレンダリングできるからです)

  • output_dir: モデルをセーブしたいディレクトリ

  • dataset_name: 訓練のために使用されるデータセット。この場合はキャプションを持つ Face Synthetics SPIGA です。

  • conditioning_image_column: 条件付け画像を含むデータセットのカラム名 (この場合 spiga_seg)

  • image_column: 正解画像を含むデータセットのカラム名 (この場合 image)

  • caption_column: 画像のキャプションを含むデータセットのカラム名 (この場合 image_caption)

  • resolution: 条件画像と正解画像の両方の解像度 (この場合 512×512)

  • learning_rate: 学習率。これらのサンプルのためには 1e-5 が上手く動作することを見出しましたが、例えば 1e-4 から 2e-6 の範囲の様々な値で実験することができます。

  • validation_image: これは訓練の間に貴方がこっそり見るためのものです!検証画像は validation_steps の量毎に実行されますので、訓練がどのように進んでいるかを確認できます。ここに任意の数の条件付け画像へのローカルパスを挿入します。

  • validation_prompt: 検証画像と一緒に実行されるプロンプト。モデルが上手く訓練されているかをテストできるものであれば何でも良いです。

  • train_batch_size: GPU に収まる訓練バッチのサイズです。私たちは A100 を持っていたので 4 の余裕がありますが、少ない VRAM の GPU の場合にはこの値は 1 に下げることを勧めます。

  • num_train_epochs: 各エポックは、訓練セットの画像が何回モデルにより「見られる」かに相当します。3 エポックで実験しましたが、ベストな結果は 1 エポックより少し多くを必要とするだけで、3 エポックではモデルは過剰適合することがわかりました。

  • checkpointing_steps: 中間的なチェックポイントを x ステップ毎にセーブします (この場合 5000)。5000 ステップ毎に、中間的なチェックポイントがセーブされました。

  • validation_steps: x ステップ毎に validaton_prompt と validation_image が実行されます。

  • report_to: 訓練をどこに報告するか。ここでは Weights と Biases を使用しました、これは この素晴らしいレポート を与えました。しかし train_batch_size の 4 から 1 への減少は、訓練を小さい GPU にフィットさせるには十分ではないかもしれません、ここに各 GPU VRAM サイズのために幾つかの追加パラメータがあります。

  • push_to_hub: 最終的な訓練モデルを Hugging Face ハブにプッシュするパラメータ。

 

Fitting on a 16GB VRAM GPU

pip install bitsandbytes

--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--gradient_checkpointing \
--use_8bit_adam

1 のバッチサイズと 4 の gradient accumulation ステップの組み合わせは、私たちの例で使用した元の 4 のバッチサイズを使用することと同等です。更に、追加のメモリ節約のために gradient checkpointing と 8-bit Adam を有効にしました。

 

Fitting on a 12GB VRAM GPU

--gradient_accumulation_steps=4 \
--gradient_checkpointing \
--use_8bit_adam
--set_grads_to_none

 

Fitting on a 8GB VRAM GPU

Please follow our guide here

 

4. Conclusion!

This experience of training a ControlNet was a lot of fun. We succesfully trained a model that can follow real face poses – however it learned to make uncanny 3D faces instead of real 3D faces because this was the dataset it was trained on, which has its own charm and flare.

Try out our Hugging Face Space !

As for next steps for us – in order to create realistically looking faces, while still not using a real face dataset, one idea is running the entire FaceSynthetics dataset through Stable Diffusion Image2Image, converting the 3D-looking faces into realistically looking ones, and then trainign another ControlNet.

And stay tuned, as we will have a ControlNet Training event soon! Follow Hugging Face on Twitter or join our Discord to stay up to date on that.

 

以上