このリポジトリは、kerasでの微調整の安定した拡散のコードを提供します。このスクリプトから顔を抱き締めることで採用されています。微調整に使用される事前に訓練されたモデルは、Kerascvからのものです。元のモデルについて知るには、このドキュメントをご覧ください。
このリポジトリで提供されるコードは、研究目的のみを目的としています。潜在的なユースケースと制限の詳細については、このセクションをご覧ください。
このモデルをロードすることにより、https://raw.githubusercontent.com/compvis/stable-diffusion/main/licenseでcreativemlオープンレールmライセンスを受け入れます。
このリポジトリの付随するリソースを探しているだけなら、ここにリンクがあります。
目次:
このリポジトリには、安定した拡散のためのさまざまな展開パターンをカバーする姉妹リポジトリ(Keras-SD-Serving)があります。
更新2023年1月13日:このプロジェクトは、Googleが主催した史上初のKerasコミュニティ賞コンペティションで2位を獲得しました。
ハグFaceの元のスクリプトに従って、このリポジトリはポケモンデータセットも使用します。しかし、 tf.dataでよりよく機能するように再生されました。データセットの再生バージョンはここでホストされています。詳細については、そのリンクをご覧ください。
微調整コードはfinetune.pyで提供されます。トレーニングを実行する前に、依存関係( requirements.txtを参照)をインストールしていることを確認してください。
python finetune.pyを実行して、デフォルトの引数を使用してトレーニングを開始できます。 python finetune.py -hを実行して、サポートされているコマンドライン引数について知ります。 --mpフラグを渡すことにより、混合精度トレーニングを有効にできます。
トレーニングを開始すると、現在の損失が前の損失よりも低い場合にのみ、拡散モデルチェックポイントがエポックごとに生成されます。
OOMを回避し、より速いトレーニングを行うには、少なくともV100 GPUを使用することをお勧めします。 A100を使用しました。
注意すべきいくつかの重要な詳細:
トレーニングの詳細:
256x256と512x512の2つの異なる解像度でモデルを微調整しました。これら2つの異なる解像度で微調整するために、エポックのバッチサイズと数の数だけを変化させました。勾配蓄積を使用しなかったため、このコードスニペットを使用してエポックの数を導き出します。
python finetune.py --batch_size 4 --num_epochs 577python finetune.py --img_height 512 --img_width 512 --batch_size 1 --num_epochs 72 --mp256x256の解像度では、計算時間を節約するためにエポックの数を意図的に減らしました。
微調整されたウェイト:
ここで、微調整された拡散モデルの重みを見つけることができます。
このリポジトリで使用されるデフォルトのポケモンデータセットには、次の構造が付属しています。
pokemon_dataset/
data.csv
image_24.png
image_3.png
image_550.png
image_700.png
... data.csvそうです:
カスタムデータセットがこの構造に従う限り、 dataset_archiveを除いて、現在のコードベースに何も変更する必要はありません。
データセットに画像ごとに複数のキャプションがある場合は、トレーニング中に画像ごとにキャプションのプールからランダムに選択できます。
データセットに基づいて、ハイパーパラメーターを調整する必要がある場合があります。
import keras_cv
import matplotlib . pyplot as plt
from tensorflow import keras
IMG_HEIGHT = IMG_WIDTH = 512
def plot_images ( images , title ):
plt . figure ( figsize = ( 20 , 20 ))
for i in range ( len ( images )):
ax = plt . subplot ( 1 , len ( images ), i + 1 )
plt . title ( title )
plt . imshow ( images [ i ])
plt . axis ( "off" )
# We just have to load the fine-tuned weights into the diffusion model.
weights_path = keras . utils . get_file (
origin = "https://huggingface.co/sayakpaul/kerascv_sd_pokemon_finetuned/resolve/main/ckpt_epochs_72_res_512_mp_True.h5"
)
pokemon_model = keras_cv . models . StableDiffusion (
img_height = IMG_HEIGHT , img_width = IMG_WIDTH
)
pokemon_model . diffusion_model . load_weights ( weights_path )
# Generate images.
generated_images = pokemon_model . text_to_image ( "Yoda" , batch_size = 3 )
plot_images ( generated_images , "Fine-tuned on the Pokemon dataset" ) weights_path ( diffusion_modelと互換性があるはずです)を持ち込み、コードスニペットを再利用できます。
このColabノートブックをチェックして、推論コードで再生してください。
最初は、256x256の解像度でモデルを微調整しました。元のモデルの結果との比較とともに、いくつかの結果を以下に示します。
| 画像 | プロンプト |
|---|---|
| ヨーダ | |
| 翼のあるロボット猫 | |
| ハローキティ |
微調整されたモデルには、元のモデルよりも安定した出力があることがわかります。結果は審美的にはるかに改善される可能性がありますが、微調整効果が見えます。また、256x256の解像度のために、Faceのスクリプトを抱きしめてから同じハイパーパラメータをたどりました(エポック数とバッチサイズの数を除く)。より良いハイパーパラメーターでは、結果が改善される可能性があります。
512x512の解像度については、同様のことを観察します。そのため、 unconditional_guidance_scaleパラメーターを実験し、40に設定されている場合(他の引数を固定している間)、結果が良くなったことに気付きました。
| 画像 | プロンプト |
|---|---|
| ヨーダ | |
| 翼のあるロボット猫 | |
| ハローキティ |
注:512x512の微調整は、この執筆時点でまだ進行中です。しかし、分散トレーニングとグラジエントの蓄積が存在することなく、単一のエポックを完了するのに多くの時間がかかります。上記の結果は、60番目の時代の後に導き出されたチェックポイントからのものです。
同様のレシピで(ただし、より最適化ステップのために訓練されています)、Lambda Labsは驚くべき結果を示しています。