MarkdownとBullet Journal

いわゆるプログラマーのつぶやき

【モデル化対応】DreamBoothをGoogle colabで使う

愛犬をサントリーニ島にワープさせた

2022.10.3追記

後述のノートブック①に、DreamBoothで学習させた新コンセプトを元のモデルにマージして、自分だけのオリジナルのモデルを作る機能が追加された。

  • 学習させたモデルをAUTOMATIC1111で利用できるようになった
  • 学習時間の削減:半分近くまで減った(1時間→30分程度)
  • Stable DIffusionやWaifu Diffusion、Trinart Diffusionなどの各モデルに対して、希望する人物や動物、イラスト、アイテムを追加学習出来る

DreamBoothとは

DreamBoothは、Googleが自社のAI画像生成ツールであるImagen(非公開)に対して、彼女の顔や愛犬など対象の画像を数枚学習するだけで特徴をトレーニングできるツール。学習時に指定したタグ(呼び出し名)をプロンプトで使うことで学んだ対象を画像に呼び出せる。似た技術としてtextual inversionがあるが、DreamBoothはStable Diffusion1.4などのモデル全体を最適化するためより強力に作動する。

強力な反面、これまで40GB程度のGPUがなければトレーニング出来なかったが、ここ数日でStable Diffusion上で動きかつ12.5GB程度でトレーニングもできるようになった。

よってGoogle colabの無料版でも学習が可能になった(引き当てたGPUメモリが15GBあることを確認のこと)。つくづくいい時代だと思う。

何が出来るか

覚えさせたい顔や動物など対象物が写った写真を数枚使ってモデルをトレーニングする(新コンセプトができる)。次に新コンセプトを元のモデルとマージした新モデルを生成する。トレーニング時に指定したタグ(hanakoなど)をプロンプト内に記載すれば画像に現れる。

「コンセプト」は既存のモデルに加える「新しい概念」を指す言葉で、従来のモデルを維持しつつ加えたい対象を新しい概念として学ばせることを意味する言葉として使われている

例えば下のように、愛犬の写真をトレーニングさせると、あたかも愛犬がギリシャ旅行をしたり、トリミングしたり泳いだりなどの絵を生成することが可能になる。

わずか4枚の写真で対象の特徴を学びプロンプトのタグで生成させている図

  • 指定した画像でトレーニングしたコンセプトと、そのコンセプトをマージした新モデルは作成者だけのオリジナル(別人が全く同じ写真を学習させない限り)
  • コンセプト、新モデルのいずれもGoogle Driveに保存できる。モデルはAUTOMATIC1111などの推論実行ツールで使用できる
  • タグはhanakoなどのユニークな固有名詞を用いること

実際に愛犬の写真を使ってやってみた。ギリシャサントリーニ島を散歩させ、サンノゼの海岸を走らせてみた。

サントリーニ島を散歩中

サンノゼのビーチを走る

導入

日々ノートブックの記載が変化している点に注意。ノートブックを用いたDreamBoothの利用方法を二通り実行してみた。

ノートブック①は特定学習データをマージした新モデルを作りGoogle Driveに保存する(に変更された)。

ノートブック②はコンセプトをHugging Faceのlibrary of conceptsに保存する(公開または非公開を選択)。

どちらも使えるが①の方が使いやすいので使用方法を補足として記載する。

なお学習用画像の枚数は3〜5枚となっているので、学習させたい対象の写真を準備する。ちなみに1枚だけでやってみるとうまく画像が生成されなかった。

写真が用意できない場合は、無料サイトなどで検索して4枚程度集める方法が便利だ。写真やイラストサイトをまとめた記事を紹介する。

programmingforever.hatenablog.com

 

 

補足1:ノートブック①の使い方

①下記のURLをクリックしてから「Open in colab」をクリック

github.com

またはノートブックを直接開く

Google Colab

②開いたノートブックを編集

2-1: ノートブックの設定を確認

  • GPUが選択されていること
  • colab proの方はランタイムの設定で、GPU はプレミアム、メモリはハイメモリを選択できる
  • (10/1からプレミアムの選択が追加された)

2-2: 5番目のセル「Name/Path of the initial model.」に学習モデルの情報を入力

現在のバージョンでは以下の様に表示される。

5番目のセル

Name/Path of the initial model.
MODEL_NAME: →ここは利用したいモデルの名前を書く(下記参照)

# Stable Diffusionの場合 : CompVis/stable-diffusion-v1-4
# Waifu Diffusionの場合 : hakurei/waifu-diffusion
# Trinart Diffusion V2の場合 : ayan4m1/trinart_diffusers_v2         

pipe = StableDiffusionPipeline.from_pretrained(


Path for images of the concept for training.
INSTANCE_DIR: →ここは学習用画像を格納するフォルダ名:/content/data/sks

A general name for class like dog for dog images.
CLASS_NAME: →ここは学習させる対象の一般名称を書く:dogなど

Enter the directory name to save model at.
OUTPUT_DIR:→ここは学習させたモデルを格納するフォルダ名:stable_diffusion_weights/sks

sksは固有名詞に変える(sks のままでもよい)

hanakoという名前の愛犬をモデルにした例を記載

Name/Path of the initial model.
MODEL_NAME: CompVis/stable-diffusion-v1-4

Path for images of the concept for training.
INSTANCE_DIR: /content/data/hanako

A general name for class like dog for dog images.
CLASS_NAME: dog

Enter the directory name to save model at.
OUTPUT_DIR:stable_diffusion_weights/hanako

2-3: 6番目のセル「Upload your (5-6) images by running this cell.」で画像を格納

ここは実行させず画面左のファイルを開いて、学習用で指定したフォルダ(上の設定なら/content/data/hanako)を探して、そこに直接画像をドラッグ&ドロップするのが簡単。

2-4: 7番目のセル「Start Training」を修正

上から7行目のinstance_promptをsksから変更した名前に変える。

今回の例なら"photo of hanako{CLASS_NAME}"に変更する。

!accelerate launch train_dreambooth.py \
  --pretrained_model_name_or_path=$MODEL_NAME --use_auth_token \
  --instance_data_dir=$INSTANCE_DIR \
  --class_data_dir=$CLASS_DIR \
  --output_dir=$OUTPUT_DIR \
  --with_prior_preservation --prior_loss_weight=1.0 \
  --instance_prompt="photo of sks {CLASS_NAME}" \
  --class_prompt="photo of a {CLASS_NAME}" \
  --seed=1337 \
  --resolution=512 \
  --center_crop \
  --train_batch_size=1 \
  --mixed_precision="fp16" \
  --use_8bit_adam \
  --gradient_accumulation_steps=1 \
  --learning_rate=5e-6 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --num_class_images=12 \
  --sample_batch_size=4 \
  --max_train_steps=800

③学習の実行とノートブック保存

  • 1番セル「Check type of GPU and VRAM available.」から4番セル「Login to HF and run」まで実行、ここでHugging Faceのトークンを入力
  • 5番セル「Name/Path of the initial model.」を実行
  • 6番セル「Upload your (5-6) images by running this cell.」は実行せず、代わりに学習用で指定したフォルダに画像をコピーする
  • 7番セル「Start Training」を実行。30分前後かかる
  • 8番セルと9番セルを実行。この「Convert weights to ckpt to use in web UIs like AUTOMATIC1111.」は新機能で、学習結果をマージした新モデルを保存出来るようになった。
  • 完了したらDreamBoost_learning_hanako(例)などの名前でノートブックをGoogle Driveに保存

④推論を実行(そのまま続いて実行する場合)

  • 10番セル「Inference」を編集:mode_passをGoogle Driveの保存フォルダ名に書き換える
# 書き換えの例
model_path = "/content/drive/MyDrive/stable_diffusion_weights/hanako/"  
  • 編集したら10番セルを実行
  • 続いて画像生成方法を選ぶ

4-1: コマンドラインで生成したい場合

  • 11番:seed固定したい場合のみ実行、不要ならスルー
  • 12番「Run for generating images」:下記のようなプロンプトを入力後に実行で画像生成。
# プロンプトの例:`photo of hanako dog`を含めること

photo of hanako dog, in the streets of London

4-2: web UIで生成したい場合(お勧め)

  • 11と12を飛ばして13番:Run Gradio UI for generating images.のセルを実行
  • プロンプトはinstance_promptで決めた、photo of hanako dogを含めること
  • 連続して画像生成したい時はやっぱりweb UIが便利だ。

  • 以上完了したら上書き保存

 

 

新モデルを使って後日に画像生成する場合

方法①:AUTOMATIC1111のノートブックで実行する

  • このノートブックはもう不要なので閉じる
  • AUTOMATIC1111に新モデルをロードして使用する。以下参照。

programmingforever.hatenablog.com

方法②:DreamBoostのノートブックで実行する

2-1: 推論用ノートブックを作成

  • 学習時に保存したDreamBoost_learning_hanako(例)のノートブックを開く
  • そのノートブックをコピーして推論用(画像生成用)のノートブックを作る
  • 推論用のノートブックはDreamBoost_inference_hanakoなど自分が分かる名前を付ける

2-2: 推論用のノートブックを編集

  • 1番セル「Check type of GPU and VRAM available.」は残す
  • 2番セル「Install Requirements」は残す
  • 3番セル削除:「Install xformers from precompiled wheel.」を消す
  • 4番セル「Login to HF and run」は残す(Hugging Faceのトークンを入力)
  • 5番セル「Name/Path of the initial model.」は残す
  • 6番セル削除:「Upload your (5-6) images by running this cell.」を消す
  • 7番セル削除:「Start Training」を削除
  • 8番セル削除:「Convert weights to ckpt to use in web UIs like AUTOMATIC1111.」を削除
  • 9番セル削除:同様に削除
  • 10番セル「Inference」を編集:mode_passをGoogle Driveの保存フォルダ名に書き換える
# 書き換えの例
model_path = "/content/drive/MyDrive/stable_diffusion_weights/hanako/"  

2-3: 続いて画像生成方法を選ぶ

2-3-1: コマンドラインで生成したい場合
  • 11~12番のセルを残し、13番目を削除
  • 11番はseed固定したい用途向け
  • 12番目はコマンドプロンプトによる画像生成。
2-3-2: web UIで生成したい場合(お勧め)
  • 11~12番目のセルを削除し、13番目を残す
  • 連続して画像生成したい時はやっぱりweb UIが便利だ。

  • 以上完了したら、推論用ノートブックを保存

2-4: 推論実行(画像生成)

  • 編集した最初のセルから全て実行する
  • それぞれ選んだ方式でプロンプトや画像の生成数を入力して実行
# プロンプトの例:`photo of hanako dog`を含めること
photo of hanako dog, digital painting

web UIでの生成例

webUIで実行した例

 

 

補足2:ノートブック②の使い方

ノートブック①が便利なのでこちらはnpakaさんの記事を転載するに留める。

note.com