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

    View Slide

  2. ▪ コンペティション概要
    ▪ ベースライン手法
    ▪ Topチーム / 自チームSolution
    Agenda

    View Slide

  3. ▪ コンペティション概要
    ▪ ベースライン手法
    ▪ Topチーム / 自チームSolution
    Agenda

    View Slide

  4. ▪ 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提供データ

    View Slide

  5. ▪ 運営から与えられるデータは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提供データ

    View Slide

  6. ▪ 16位で金メダルも獲れず。。。
    ▪ 上位者とのアプローチの違いを分析して反省をします。。。
    コンペティション概要: 結果
    Leaderboard

    View Slide

  7. ▪ コンペティション概要
    ▪ ベースライン手法
    ▪ Topチーム / 自チームSolution
    Agenda

    View Slide

  8. プロンプト例
    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

    View Slide

  9. ▪ 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提供データ

    View Slide

  10. ▪ 画像エンコーダで直接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提供データ
    ※アカウント削除によりリンク消失

    View Slide

  11. ▪ 検索ベースのアプローチ
    1. 参照プロンプトデータセットの準備
    ▪ 事前に候補テキストを大量に準備(約6600万件: 画像は不要)
    ▪ 候補テキストに対してCLIP Text Encoderで埋め込み取得
    2. 推論対象画像に対する類似プロンプトTopK件を取得
    ▪ 推論対象画像をCLIP Image Encoderで埋め込み取得
    3. 類似TopK件のSentence Transformer埋め込みの重み付け和を取得
    ベースライン by @motono0223(LB: 0.55313)
    SDIP CLIP kNNRegression by @motono0223

    View Slide

  12. ▪ 訓練データは無限に作成可能だが、計算コストが非常に大きい
    ▪ 1st place: 1060万画像 →(単純計算だと)V100 * 736 日。。。
    ▪ Preeptibleインスタンスを使ってもGPUコストだけで $13,073
    ▪ 高速化・効率化の両面で工夫の余地がある
    訓練データ作成の難しさ: ① 計算コスト
    benchmarked by @ipythonx

    View Slide

  13. ▪ 高品質で多様なプロンプトで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より引用

    View Slide

  14. ▪ コンペティション概要
    ▪ ベースライン手法
    ▪ Topチーム / 自チームSolution
    Agenda

    View Slide

  15. ▪ 以下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): データセット

    View Slide

  16. ▪ @shoheiazumaと同様のアプローチ
    ▪ 出力層手前に大規模中間層を加えることで大幅に改善
    ▪ bottom layers(backbone?)にLoRAを使うことで少し改善
    ▪ PROMPTS_LQで事前学習→PROMPTS_HQでFine-Tuning
    ▪ 同一epochでは同一プロンプトから1件ランダムサンプル
    ▪ Aug: CLIPでは非使用、BLIP2ではデフォルト利用
    1st place (bestfitting): モデル
    1st place (@bestfitting)

    View Slide

  17. 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)

    View Slide

  18. ▪ データソース
    ▪ 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件ランダム
    に選択

    View Slide

  19. ▪ SD2生成プロセスの高速化
    ▪ Sheduler: DDIM→DPMSolver++へ変更
    ▪ ステップ数: 50→16へ変更
    ▪ xformer使用(30%高速化)
    ▪ 乱数は画像全体に影響を与えるため、乱数シードをプロンプト毎に変更
    することで、スコアが大幅に向上
    2nd place (KaizaburoChubachi): データセット

    View Slide

  20. ▪ @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)

    View Slide

  21. ▪ 以下データソースで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): データセット

    View Slide

  22. ▪ @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): モデル

    View Slide

  23. ▪ 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): データセット

    View Slide

  24. ▪ 4種のモデルのアンサンブル
    ▪ テキスト候補に対する検索
    ▪ ① CLIP bigG(@motono0223と同様のアプローチ)
    ▪ ② CLIP Interrogator(@leonidkulykと同様のアプローチ)
    ▪ ③ CoCa(@motono0223と同様のアプローチ)
    ▪ ④ ViT Encoder(@shoheiazumaと同様のアプローチ)
    4th place (Gerwyn): モデル
    4th place (@gerwynng)

    View Slide

  25. ▪ 以下で構成される約500万件のプロンプトをSD2で画像生成
    ▪ 乱数シード違いで複数枚生成した画像は、Epoch毎に1件サンプリング
    5th place (kydrt): データセット
    5th place (@knjcode)

    View Slide

  26. ▪ @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)

    View Slide

  27. ▪ 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): データセット

    View Slide

  28. ▪ @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): モデル

    View Slide

  29. 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万
    ✔ ✔ ✔ ✔

    View Slide

  30. ▪ データを固定したモデルの有効性検証は精緻に行えた
    ▪ 学習プロセス(層別LRなど)、backbone(EVA-02など)など、モデル改善
    に繋がる手法は複数発見できた
    ▪ 主な(表面上の)敗因は以下であると考えている
    ▪ Vizwizを見つけられなかった
    ▪ SD1データを除外しなかった
    ▪ SD2による訓練データ生成を200万件で止めてしまった
    ▪ なぜこの意思決定に至ったのか?
    → データ追加に対する精度貢献の検証が不十分だった
    ▪ SD2で150万件生成したあたりから、データを増やしても精度が伸びない
    (むしろ少し下がる)ようになった
    ▪ この時点で、”データを増やすのはこれ以上必要ない” と判断してしまった
    ▪ 実際には終盤に生成利用していたプロンプト品質の問題だったと考えられる
    振り返り

    View Slide

  31. ▪ ではどうすべきだったか?
    → モデルを固定したデータ群の有効性検証を丁寧に実施すべきだった
    ▪ 特に精度が伸びなくなったタイミングで、引き算でデータ群の価値を
    確認できていると良かった
    ▪ SD1のデータを捨てる判断や、特に効果的なデータ群を確認し、
    類似データを増やす判断などができたかもしれない
    ▪ Vizwizを探す旅に出られていたかどうかは謎
    ▪ 上記は計算コストが大きくなるので、モデルは軽量なもので固定する
    ことで、検証サイクルを早く回せると良かった
    ▪ 実際、bestfittingもViT-Lで精緻に検証していた
    振り返り

    View Slide