Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Stable Diffusion - Image to Prompts

Stable Diffusion - Image to Prompts

Kaggleコンペティション: Stable Diffusion - Image to Prompts の上位ソリューション / 自チームソリューションについて、社内勉強会で紹介した資料です。

Kazuki Fujikawa

May 26, 2023
Tweet

More Decks by Kazuki Fujikawa

Other Decks in Science

Transcript

  1. Kaggle反省会: Stable Diffusion - Image to Prompts 2023.05. DS輪講 Kazuki

    Fujikawa 株式会社ディー・エヌ・エー + 株式会社 Mobility Technologies
  2. ▪ SD2で生成された画像を基に、生成に使用されたプロンプト (の埋め込みベクトル)を推定するタスク ▪ Image2textでGTpromptを推定→Sentence Transformerで埋め込んで も良いし、画像から直接Sentence Transformer埋め込みを推定してもOK ▪ コサイン類似度で評価

    コンペティション概要: タスク an astronaut standing on a engaging white rose, in the midst of by ivory cherry blossoms Input GT prompt Prediction (384d vector) GT Target (384d vector) Cosine similarity Sentence Transformer Model 引用: Kaggle提供データ
  3. ▪ 運営から与えられるデータは7件のみ ▪ LB: 16,000件(Pub:Pri=20:80)で評価(Code competition) ▪ 解像度は一律(768x768→512x512にresize) ▪ 画像生成スクリプトは共有されているため、プロンプトさえあれば

    無限に訓練データを生成可能 コンペティション概要: データ an astronaut standing on a engaging white rose, in the midst of by ivory cherry blossoms Kaggle employee Phil at a donut shop ordering all the best donuts, with a speech bubble that proclai... portrait painting of a shimmering greek hero, next to a loud frill- necked lizard a thundering retro robot crane inks on parchment with a droopy french bulldog ultrasaurus holding a black bean taco in the woods, near an identical cheneosaurus ramen carved out of fractal rose ebony, in the style of hudson river school hyper realistic photo of very friendly and dystopian crater 引用: Kaggle提供データ
  4. プロンプト例 monsters playing board games, oil painting by justin gerard,

    deviantart, pixar, bright colors a void beast with shadowy tendrils and piercing red eyes creeping through a white background, grunge, artstation, high quality, hyper detailed still of emma watson as scarlett witch, cushart, krenz 画像例 課題 解像度が運営提供と 大きく異なる 画像が壊れている 画像とプロンプトが 一致していない ▪ SD Discordサーバから収集したデータセット ▪ 収集期間: 2022/08/07 - 2022/08/21(SD1系と考えられる) ▪ 180万ユニークプロンプト・1400万画像 ▪ 解像度・品質が様々で、偏りも大きいためフィルタリングは必須 主要なデータセット: DiffusionDB 引用: DiffusionDB
  5. ▪ CLIP Interrogatorベースの手法で画像プロンプトを生成 1. BLIP(image captioning)でキャプションを生成 2. CLIPで画像 ⇔ 事前に準備したサブプロンプトの類似度を計算し、

    各カテゴリで類似度が高いものを 1. に結合 ベースライン by @leonidkulyk(LB: 0.45836) BLIP CLIP a man in an astronaut suit waliking down a path by A. B. Jackson by Van Gogh by Pablo Picasso … a man in an astronaut suit waliking down a path, by A. B. Jackson, portrait portrait anime 4k … artist.txt flavor.txt 引用: Kaggle提供データ
  6. ▪ 画像エンコーダで直接384d vectorを推定 ▪ CosineEmbeddingLoss でコンペ指標を直接最適化 ▪ DiffusionDB から訓練データを厳選(Notebook) ▪

    解像度: 512x512に限定 ▪ プロンプト: 英語以外を除外・5単語未満を除外 ▪ 最初 or 最後の15文字が一致しているプロンプトを重複として除外 ベースライン by @shoheiazuma(LB: 0.50619) an astronaut standing on a engaging white rose, in the midst of by ivory cherry blossoms Input GT prompt Prediction (384d vector) GT Target (384d vector) Cosine similarity Sentence Transformer ViT 引用: Kaggle提供データ ※アカウント削除によりリンク消失
  7. ▪ 検索ベースのアプローチ 1. 参照プロンプトデータセットの準備 ▪ 事前に候補テキストを大量に準備(約6600万件: 画像は不要) ▪ 候補テキストに対してCLIP Text

    Encoderで埋め込み取得 2. 推論対象画像に対する類似プロンプトTopK件を取得 ▪ 推論対象画像をCLIP Image Encoderで埋め込み取得 3. 類似TopK件のSentence Transformer埋め込みの重み付け和を取得 ベースライン by @motono0223(LB: 0.55313) SDIP CLIP kNNRegression by @motono0223
  8. ▪ 訓練データは無限に作成可能だが、計算コストが非常に大きい ▪ 1st place: 1060万画像 →(単純計算だと)V100 * 736 日。。。

    ▪ Preeptibleインスタンスを使ってもGPUコストだけで $13,073 ▪ 高速化・効率化の両面で工夫の余地がある 訓練データ作成の難しさ: ① 計算コスト benchmarked by @ipythonx
  9. ▪ 高品質で多様なプロンプトでSD2生成することが重要 ▪ 画像⇔プロンプトが強い対応関係にあるのが望ましい ▪ 画像に対応し得るプロンプトの分散が大きいとLossが下がりづらく なり、学習全体に悪影響を与える 訓練データ作成の難しさ: ② 適切なプロンプト選択

    プロンプト例 astraunaut does a debt consolidation affect credit changing it providers – should i stay or should i go? 🐍🐍🐍 lying in the desert. 画像例 乱数シード 8件で生成 課題 プロンプトが曖昧で 説明的でない。 画像での説明が困難なプロンプト内容である。 内容が全然違うのに似た画像が生成される → 画像に対応するプロンプトの分散が 大きくなる 重要なキーワード(🐍)が、 SD2側では辞書登録 されているが、 SentenceTransformer側 では辞書登録されていない 画像: Stable Diffusion 2.0 で生成 プロンプト: laion2B-enより引用
  10. ▪ 以下2種類のプロンプトデータセットを構築・SD2で生成 ▪ PROMPTS_HQ: 200万プロンプト, 400万画像 ▪ DiffusionDB 2M, COCO

    Captions, VizWiz, Open Image … ▪ 前処理: 類似度0.8を超えるプロンプトを除外 ▪ 各prompt 2seedずつ生成 ▪ PROMPTS_LQ: 660万プロンプト, 660万画像 ▪ COYO-700M(総勢7億4700万) ▪ 前処理: 画像⇔テキストの類似性0.3以上、重複排除など ▪ 事前学習のみに使用(+0.008~0.01) ▪ 画像生成を高速化 ▪ xformers(15s/img→10s/img) ▪ FP16(10s/img→5s/img) ▪ 512x512を直接出力・stepを50→25へ変更(2s/img) 1st place (bestfitting): データセット
  11. ▪ @shoheiazumaと同様のアプローチ ▪ 出力層手前に大規模中間層を加えることで大幅に改善 ▪ bottom layers(backbone?)にLoRAを使うことで少し改善 ▪ PROMPTS_LQで事前学習→PROMPTS_HQでFine-Tuning ▪

    同一epochでは同一プロンプトから1件ランダムサンプル ▪ Aug: CLIPでは非使用、BLIP2ではデフォルト利用 1st place (bestfitting): モデル 1st place (@bestfitting)
  12. OID1,2,4,5 ① “a photo of” に続けてキャプション生成(Aとする) ② "a photo of"

    + A に続けてキャプション生成(Bとする) ③ A + B をキャプションとする OID3 ① chain=1で生成した短いキャプションをSentenceTransformerでベクトル化 ② Spherical KMeansで1000クラスタへ分割 ③ 2クラスタの組み合わせからランダムに1件ずつキャプションを選択、コンマで結合 ▪ データソース ▪ DiffusionDB、COCOCaptions ▪ 180万 + 50万 プロンプトに対してSD2で画像生成 ▪ Open Images Dataset V3(OID) ▪ 900万画像のうち最初の500万画像に対してBLIP2でキャプション化 ▪ 複雑なキャプションを得るため、以下を実行 2nd place (KaizaburoChubachi): データセット 2nd place (@zaburo)
  13. ▪ データソース ▪ ChatGPT (gpt-3.5-turbo) ▪ 公開ノートブックのアイデアを活用 ▪ 生成物を多様化するため、プロンプトに生成物をランダムで追加 ▪

    100万プロンプト生成 → 100万画像をSD2で生成 2nd place (KaizaburoChubachi): データセット Describe a fairly random scene with multiple objects by one short sentence with some modifiers in one line. Here are some examples of such texts: hyper realistic photo of very friendly and dystopian crater ramen carved out of fractal rose ebony, in the style of hudson river school ultrasaurus holding a black bean taco in the woods, near an identical cheneosaurus a thundering retro robot crane inks on parchment with a droopy french bulldog portrait painting of a shimmering greek hero, next to a loud frill-necked lizard xxxx… yyyy… zzzz… 導入部 運営提供サンプル から4件ランダム に選択 生成済みサンプル から3件ランダム に選択
  14. ▪ SD2生成プロセスの高速化 ▪ Sheduler: DDIM→DPMSolver++へ変更 ▪ ステップ数: 50→16へ変更 ▪ xformer使用(30%高速化)

    ▪ 乱数は画像全体に影響を与えるため、乱数シードをプロンプト毎に変更 することで、スコアが大幅に向上 2nd place (KaizaburoChubachi): データセット
  15. ▪ @shoheiazumaと同様のアプローチ ▪ backbone: ConvNext XXL, BLIP2, EVA02-L, EVA02-e ▪

    Linear-Probing (LP), LP-FTが有効 ▪ 位置埋め込みを拡張し、事前学習済みViTの解像度を上げて学習 ▪ SentenceTransformerのトークン埋め込みの情報を教師に使うため、 Q-formerで画像パッチ⇔文トークン埋め込み間の対応関係を学習 ▪ +0.001 ~ +0.003 で大きくは精度改善に寄与せず 2nd place (KaizaburoChubachi): モデル LP, LP-FT概要図 Kumar+, 2022 Q-former概要図 Li+, 2023 2nd place (@zaburo)
  16. ▪ 以下データソースで40万件程度(!)の画像を生成 ▪ Vizwiz image caption(~7万件) ▪ このデータの有無で、Local val vs

    LBのギャップが大きく異なる 最重要データセット。(0.5528/0.48765 → 0.5415/0.5309) ▪ 視覚障害者への画像説明を目的として作成されたデータセットであり、 多様で説明的なキャプションで構成されている ▪ 1画像に最大5件のプロンプトが紐づくため、3件をサンプリング ▪ DiffusionDB(30万件) ▪ SD2で生成した画像のみを使用(オリジナルデータは非使用) ▪ @shoheiazuma によるフィルタ済みサンプル21万件 + 学習済みモデル によって検出されたハードサンプル8万件 ▪ COCO(2.5万件)+ Lexica.art(1万件) ▪ 大きくは精度に寄与せず 3rd place (Fumihiro Kaneko): データセット
  17. ▪ @shoheiazumaと同様のアプローチ ▪ backbone: ViT-L ▪ LP-FT, EMA, 層毎の学習率減衰 ▪

    ref: Dong+, 2022 ▪ Crop/RandomErase/RandAug ▪ 水平フリップもパフォーマンス低下 ▪ 10%のDiffusionDB、20%のVizwizは、同一プロンプトで3件、 乱数を変えて画像生成している ▪ 上記サンプルに対しては、epoch毎に1件サンプリングする ▪ invisible-watermark augmentation ▪ スコア向上には寄与せず 3rd place (Fumihiro Kaneko): モデル
  18. ▪ ViT学習用データセット(約700万件) ▪ Caption Dataset(~520万件) ▪ DiffusionDB, Gustavosta, COCO, …

    ▪ WIT: Wikipedia-based Image Text Dataset(~100万件) ▪ GPT生成データセット(~100万件) ▪ leonidkulyk, xiaozhouwang sd2gpt2, sd2hardcode ▪ 検索用データセット(約5600万件) ▪ Caption Dataset(~520万件) ▪ WIT(~250万件) ▪ GPT生成データセット(~1000万件) ▪ YFCC 100M(~400万件) ▪ Laion COCO(2700万件からサンプリング) etc. 4th place (Gerwyn): データセット
  19. ▪ 4種のモデルのアンサンブル ▪ テキスト候補に対する検索 ▪ ① CLIP bigG(@motono0223と同様のアプローチ) ▪ ②

    CLIP Interrogator(@leonidkulykと同様のアプローチ) ▪ ③ CoCa(@motono0223と同様のアプローチ) ▪ ④ ViT Encoder(@shoheiazumaと同様のアプローチ) 4th place (Gerwyn): モデル 4th place (@gerwynng)
  20. ▪ @shoheiazumaと同様のアプローチ ▪ backbone: eva01, ConvNext L・XXL, ViT L ▪

    @zaburo同様、ViTの解像度を拡大してモデルを訓練 ▪ 1~3 epochはFC Layerのみ訓練(LR: 1e-2~1e-4) ▪ その後、全レイヤ訓練(LR: 1e-4~1e-7) ▪ Aug: RandomResizedCrop, ColorJitter 5th place (kydrt): モデル 5th place (@knjcode)
  21. ▪ Filtered DiffusionDB(約100万件) ▪ 下記条件でフィルタした上で、画像もオリジナルを利用(非SD2) ▪ 解像度: 縦横512以上、縦=横(正方形)に限定 ▪ CLIP

    ViT Bで画像⇔プロンプト類似度0.15以上 ▪ SD2による画像生成(約200万件) ▪ プロンプトデータセット ▪ DiffusionDB(Filtered DiffusionDBで除外された60万件) ▪ gustavosta(11万件), midjourney(6万件)etc. ▪ 大規模データセット: データセット追加済みプロンプトTop1類似度 0.5未満の事例を中心に追加 ▪ CC3M(40万件), laion-coco(16万件) ▪ JAX・TPU利用で高速化・コスト削減 ▪ Kaggle VM: 3.1s/img, Colab: 5.6s/img 16th place (KF): データセット
  22. ▪ @shoheiazumaと同様のアプローチ ▪ プロンプト埋め込みをDBSCAN(ε=0.05)でクラスタリングし、 同一epochで各クラスタから最大1件サンプリング ▪ backbone: ConvNeXT-XXL, EVA02-L, ViT-bigG

    ▪ 層別LR(~¾: LR1e-6, ¾~: LR1e-4) ▪ TargetにBLIP+CLIP Integratorで生成したプロンプト埋め込みを混合 ▪ Manifold MixUp, CutMix, AWP(効果は限定的) 16th place (KF): モデル
  23. Topチーム/自チームソリューション比較 Place 訓練 画像数 Vizwiz ViT ConvN eXT EVA02 BLIP2

    解像度 拡大 大規模 中間層 FC LoRA LP-FT 層別LR EMA 1 1060 万 ✔ ✔ ✔ ✔ ✔ ✔ 2 700万 ✔ ✔ ✔ ✔ ✔ 3 40万 ✔ ✔ ✔ ✔ ✔ 4 700万 ✔ ✔ 5 500万 ✔ ✔ ✔ ✔ ✔ 16 SD1: 100万 SD2: 200万 ✔ ✔ ✔ ✔
  24. ▪ データを固定したモデルの有効性検証は精緻に行えた ▪ 学習プロセス(層別LRなど)、backbone(EVA-02など)など、モデル改善 に繋がる手法は複数発見できた ▪ 主な(表面上の)敗因は以下であると考えている ▪ Vizwizを見つけられなかった ▪

    SD1データを除外しなかった ▪ SD2による訓練データ生成を200万件で止めてしまった ▪ なぜこの意思決定に至ったのか? → データ追加に対する精度貢献の検証が不十分だった ▪ SD2で150万件生成したあたりから、データを増やしても精度が伸びない (むしろ少し下がる)ようになった ▪ この時点で、”データを増やすのはこれ以上必要ない” と判断してしまった ▪ 実際には終盤に生成利用していたプロンプト品質の問題だったと考えられる 振り返り
  25. ▪ ではどうすべきだったか? → モデルを固定したデータ群の有効性検証を丁寧に実施すべきだった ▪ 特に精度が伸びなくなったタイミングで、引き算でデータ群の価値を 確認できていると良かった ▪ SD1のデータを捨てる判断や、特に効果的なデータ群を確認し、 類似データを増やす判断などができたかもしれない

    ▪ Vizwizを探す旅に出られていたかどうかは謎 ▪ 上記は計算コストが大きくなるので、モデルは軽量なもので固定する ことで、検証サイクルを早く回せると良かった ▪ 実際、bestfittingもViT-Lで精緻に検証していた 振り返り