custom-diffusion - カスタム拡散:テキストから画像への拡散のマルチコンセプトカスタマイズ

(Custom Diffusion: Multi-Concept Customization of Text-to-Image Diffusion)

Created at: 2022-12-09 03:18:41
Language: Python
License: NOASSERTION

カスタム拡散

ウェブサイト||グラジオデモ


カスタム拡散を使用すると、新しい概念 (~4-20) のいくつかの画像を指定して、安定した拡散などのテキストから画像への拡散モデルを微調整できます。この方法は高速(2つのA100 GPUで~6分)で、クロスアテンションレイヤーのモデルパラメータのサブセット、つまりキーと値の射影行列のみを微調整します。これにより、追加のコンセプトごとに追加のストレージが75MBに削減されます。

この方法では、さらに、新しいオブジェクト+新しい芸術的スタイル、複数の新しいオブジェクト、新しいオブジェクト+新しいカテゴリなど、複数の概念を組み合わせて使用できます。より視覚的な結果については、マルチコンセプトの結果を参照してください。

テキストから画像への拡散
のマルチコンセプトカスタマイズ ヌプール・クマリ, ビンリャン・チャン, リチャード・チャン, イーライ・シェヒトマン, ジュンヤン・ジュン
朱 arXivプレプリントarXiv:2212.04488

業績

すべての結果は、安定した拡散v1-4モデルの微調整に基づいています。 シーン、ペット、身の具、スタイルなど、さまざまなカテゴリの画像と、さまざまな数のトレーニングサンプルの結果を表示します。 より多くの世代と並行メソッドとの比較については、当社のWebページギャラリーを参照してください。

単一コンセプトの結果

マルチコンセプトの結果

メソッドの詳細

概念のユーザー提供の画像が少ないことを考えると、私たちの方法は、事前にトレーニングされたテキストから画像への拡散モデルを強化し、目に見えないコンテキストで概念の新世代を可能にします。 モデルの重みの小さなサブセット、つまり、拡散モデルのクロスアテンションレイヤーのテキストから潜在特徴へのキーと値のマッピングを微調整します。 また、この方法では、オーバーフィットを防ぐために、小さな正則化画像(200)のセットを使用します。個人カテゴリの場合は、カテゴリ名の前に新しい修飾子トークン V* を追加します (例: V* dog)。複数の概念については、2つの概念のデータセットで共同学習を行います。我々の手法では、最適化を使用して2つの微調整されたモデルをマージすることもできます。詳しくは論文をご覧ください。

はじめ

git clone git@github.com:adobe-research/custom-diffusion.git
cd custom-diffusion
git clone https://github.com/CompVis/stable-diffusion.git
cd stable-diffusion
conda env create -f environment.yaml
conda activate ldm
pip install clip-retrieval

私たちのコードは、次の安定版拡散のコミットに基づいて開発されました。

#21f890f9da3cfbeaba8e2ac3c425ee9e998d5229

安定拡散モデルチェックポイントのダウンロードについては、こちらを参照してください。

データセット:論文で使用されているデータセットの一部をここで公開します。 UnSplashから撮影された画像はUnSplashライセンスの下にあります。ムーンゲートデータセットはこちらからダウンロードできます。

モデル:すべてのモデルはここからダウンロードできます。

単一コンセプトの微調整

正則化としての実像

## download dataset
wget https://www.cs.cmu.edu/~custom-diffusion/assets/data.zip
unzip data.zip

## run training (30 GB on 2 GPUs)
bash scripts/finetune_real.sh "cat" data/cat real_reg/samples_cat  cat finetune_addtoken.yaml <pretrained-model-path>

## save updated model weights
python src/get_deltas.py --path logs/<folder-name> --newtoken 1

## sample
python sample.py --prompt "<new1> cat playing with a ball" --delta_ckpt logs/<folder-name>/checkpoints/delta_epoch\=000004.ckpt --ckpt <pretrained-model-path>

論文の結果は、正則化サンプルとして実際の画像を取得するためのクリップ検索に基づいていません。しかし、これも同様の結果につながります。

正則化として生成された画像

bash scripts/finetune_gen.sh "cat" data/cat gen_reg/samples_cat  cat finetune_addtoken.yaml <pretrained-model-path>

マルチコンセプトの微調整

合同研修

## run training (30 GB on 2 GPUs)
bash scripts/finetune_joint.sh "wooden pot" data/wooden_pot real_reg/samples_wooden_pot \
                                    "cat" data/cat real_reg/samples_cat  \
                                    wooden_pot+cat finetune_joint.yaml <pretrained-model-path>

## save updated model weights
python src/get_deltas.py --path logs/<folder-name> --newtoken 2

## sample
python sample.py --prompt "the <new2> cat sculpture in the style of a <new1> wooden pot" --delta_ckpt logs/<folder-name>/checkpoints/delta_epoch\=000004.ckpt --ckpt <pretrained-model-path>

最適化ベースの重みのマージ

2 つの微調整されたモデルの重みと任意の 2 つのカテゴリを指定すると、次に示すように、重みをマージして 1 つのモデルを作成できます。

delta_ckpt1
delta_ckpt2

python src/composenW.py --paths <delta_ckpt1>+<delta_ckpt2> --categories  "wooden pot+cat"  --ckpt <pretrained-model-path> 

## sample
python sample.py --prompt "the <new2> cat sculpture in the style of a <new1> wooden pot" --delta_ckpt optimized_logs/<folder-name>/checkpoints/delta_epoch\=000000.ckpt --ckpt <pretrained-model-path>

ディフューザーライブラリを使用したトレーニング

## install requirements 
pip install accelerate
pip install modelcards
pip install transformers>=4.25.1
pip install deepspeed
accelerate config
export MODEL_NAME="CompVis/stable-diffusion-v1-4"

単一コンセプトの微調整

## launch training script (2 GPUs recommended, increase --max_train_steps to 500 if 1 GPU)

accelerate launch src/diffuser_training.py \
          --pretrained_model_name_or_path=$MODEL_NAME  \
          --instance_data_dir=./data/cat  \
          --class_data_dir=./real_reg/samples_cat/ \
          --output_dir=./logs/cat  \
          --with_prior_preservation --real_prior --prior_loss_weight=1.0 \
          --instance_prompt="photo of a <new1> cat"  \
          --class_prompt="cat" \
          --resolution=512  \
          --train_batch_size=2  \
          --learning_rate=1e-5  \
          --lr_warmup_steps=0 \
          --max_train_steps=250 \
          --num_class_images=200 \
          --scale_lr \
          --modifier_token "<new1>"

## sample 
python src/sample_diffuser.py --delta_ckpt logs/cat/delta.bin --ckpt "CompVis/stable-diffusion-v1-4" --prompt "<new1> cat playing with a ball"

マルチコンセプトの微調整

次のように、各概念に関する情報を含む json ファイルを提供します。

## launch training script (2 GPUs recommended, increase --max_train_steps to 1000 if 1 GPU)

CUDA_VISIBLE_DEVICES=2,3 accelerate launch src/diffuser_training.py \
          --pretrained_model_name_or_path=$MODEL_NAME  \
          --output_dir=./logs/cat_wooden_pot  \
          --concepts_list=./assets/concept_list.json \
          --with_prior_preservation --real_prior --prior_loss_weight=1.0 \
          --resolution=512  \
          --train_batch_size=2  \
          --learning_rate=1e-5  \
          --lr_warmup_steps=0 \
          --max_train_steps=500 \
          --num_class_images=200 \
          --scale_lr --hflip  \
          --modifier_token "<new1>+<new2>" 

## sample 
python src/sample_diffuser.py --delta_ckpt logs/cat_wooden_pot/delta.bin --ckpt "CompVis/stable-diffusion-v1-4" --prompt "<new1> cat sitting inside a <new2> wooden pot and looking up"

上記のコードは、次の DreamBooth テキスト反転トレーニングスクリプトから変更されています。アクセラレートの設定方法については、こちらを参照してください。

人間の顔の微調整

人間の顔の微調整には、上記のディフューザートレーニングスクリプトで、または安定拡散トレーニングスクリプトでconfigを使用することをお勧めします。

learning_rate=5e-6
max_train_steps=750
finetune_face.yaml

私たちの論文に示されている他のカテゴリと比較して、学習率が低く、トレーニングが長く、人間の顔の画像が多いと、より良い結果が得られます。画像が少ないほど、クロスアテンションのすべてのパラメーターを微調整するとわずかに良くなり、 で有効にできます。
ディフューザートレーニングスクリプトを使用したリチャードチャンの14枚のクローズアップ写真を使用した微調整の結果の例。

--freeze_model "crossattn"

モデルの圧縮

python src/compress.py --delta_ckpt <finetuned-delta-path> --ckpt <pretrained-model-path>

## sample
python sample.py --prompt "<new1> cat playing with a ball" --delta_ckpt logs/<folder-name>/checkpoints/compressed_delta_epoch\=000004.ckpt --ckpt <pretrained-model-path> --compress

圧縮レベルが異なるサンプル生成。デフォルトでは、コードは上位60%の特異値を含む低ランク近似を保存し、~15MBのモデルを生成します。

参照

@article{kumari2022customdiffusion,
  title={Multi-Concept Customization of Text-to-Image Diffusion},
  author={Kumari, Nupur and Zhang, Bingliang and Zhang, Richard and Shechtman, Eli and Zhu, Jun-Yan},
  journal = {arXiv},
  year = {2022}
}

確認

有益なコメントと議論をしてくれたNick Kolkin、David Bau、Sheng-Yu Wang、Gaurav Parmar、John Nack、Sylvain Paris、そしてドラフトを校正してくれたAllie Chang、Chen Wu、Sumith Kulal、Minguk Kang、Yotam Nitzan、Taesung Parkに感謝します。また、アートワークを共有してくれたミア・タンとアーロン・ハーツマンにも感謝します。一部のデータセットは Unsplash からダウンロードされます。この作業の一部は、アドビのインターンシップ中にNupur Kumariによって行われました。この作業の一部はAdobe Inc.によってサポートされています。