【kaggle】kaggle初心者が銅メダル入賞したSVGお絵描きコンペを振り返る【2025】

新月一2025-06-03DeepLearningAI kaggle

画面イメージ

この記事に載っていること

  • kaggle初挑戦の記録
  • drawing with LLMs参戦記録(銅メダル)

はじめに

また前回から少し期間が空いてしまいました。

今回は初kaggle参戦記録となります。

会社でkaggleを始めるきっかけがあり、自分のスキルを向上させるいい機会だと思って初のkaggle参戦です。

色々コンペを見てみて、kaggleの使い方を学んで、初のコンペで銅メダルを取得することができました。

選ぶサブミッションによっては銀メダルも可能ではあったため、少し悔やまれる結果となりましたが、初参戦にしては上々の結果であろうと自分を褒めたい気持ちもあります。

トップ画になっているのは、今回の最終解法で比較的高いスコアが出ていたほうの出力です。平均するともっとスコアは低いので、これは上出来なほうです。

参戦したコンペ

drawing with LLMs というコンペです。URLは以下。

https://www.kaggle.com/competitions/drawing-with-llms

概要としては、与えられたテキスト(海を見下ろす灯台とか)を表現したSVGをLLMで作成するというものです。

まず、SVGについての基礎知識が必要とされるため、まずはそこから知る必要がありました。色々なコンペに参加すると自分の中に蓄積される知識がどんどん増えていく感じは楽しいですね。

評価関数

このコンペのメトリクスは色々と途中で変更が入りました。

期間的に言うと自分は途中でこのコンペに参加したのですが、最初のメトリクスは完全にハックされていたらしく、ひとつのデフォルトSVGを出力するだけで、高得点が取れたりしていたようです。

最終的なメトリクスはAuthetic ScoreとVQA ScoreとOCR Scoreの調和平均でした。VQAスコアは、各テキストに対して与えられた質問文をAIが正解の解答を答える確率によってスコアが算出され、Authetic Scoreは絵の美しさをモデルが評価します。OCRスコアは、モデルが画像に対してOCRを行い、3文字以上見つかるとペナルティが与えられるというものです。

ちなみに1位のグループはこのメトリクスを完全にハックしていました。自分は特に批判的な気持ちはなく、ただ賞賛の念が浮かびました。

LLMの限界

このコンペは元々LLMでSVGを作成するというタスクを評価するためのものでした。しかし、kaggleのリソース(L4 * 2, P100)のVRAM 16GB程度で動かせるLLMで出せる最大のスコアは0.5~0.6のあたりが最高だったようです。

変わりに銀メダル・銅メダル圏内を埋め尽くしたのは、text to imageのモデルを使った画像生成と画像からopencv等の機能を使ってSVG化する手法です。

独走していたトップはターゲットの文字列をOCRで検出できないレベルでぼやけさせたSVGと、diffusionモデルで出力させた画像をその一部に組み込んでいました。開示されてもまだわけわからん。

完全に幻影旅団に潜入したカルト状態ですわ。

「今フェイント何回入れた!? てゆうか何であの体勢から攻撃しながら跳べ・・・わっもうあんなトコいる」

レベルが違う・・・

SVG生成周りの技術的調査

コンペに臨むにあたって、SVGを生成する研究の調査をDeep Researchや検索等で行いました。

潮流としては、Diffusionモデルの出力を画像ではなくSVGで生成したりするものから、最近はLLMに回帰している感じはありそうです。

気になったのはOmniSVGでQwen 2.5 VL 7Bを学習させたもののようです。

https://omnisvg.github.io/open in new window

ただ、gitはあるんですがweightとソースが公開されていなかったので使うことはできませんでした。というかキャラクター関連とか著作権大丈夫なんだろうか。さすが中国。

このOmniSVGがLLM4SVGというもので学習できるらしく、そちらも確認し、学習を試してみました。

https://github.com/ximinng/LLM4SVGopen in new window

Qwenに対する学習はLlamaFactoryで行うのですが、結果からいうと、うまくいきませんでした。学習自体はできたのはできたんですが、性能が上がらなかったという感じです。

理由としては、まず7Bを学習させるVRAMが足りなかったこと、そして、3Bに対しても、ファインチューニングするのが限界だったというところです。Loraはアダプターからどれだけ根本までのパラメータを学習させるかによってVRAMの使用量が決まるので、やっぱりリソースが必要なのかなという無念さがあります。

Google Colab Proに月額課金(1000円ぐらい)もしてみましたが、P100は10時間ぐらいで月額分のチャージ(100コンピューティングユニット)は尽きてしまうので、とてもではないが本格的な学習は難しいと言う感じですね。Google Colab Pro+ だと500コンピューティングユニットぐらいもらえるので、多分50時間ぐらいは学習できると思います。でも5000円は高えよう。

金が欲しい・・・この世はすべて金だ!

自分の解法

最終的に90位ぐらいに落ち着いたのですが、私の解法としてはStable Diffusion系で生成した画像からSVGを生成する方向です。コンペで一番多かった方針だと思います。LLMでは太刀打ちできなかった・・・

基本的に共有されているコードを組み合わせてなんとかくらいついて行った感じです。

モデルはSDXLのFlashを使い、SVG生成の部分は共有コードのopencvで境界線からpathを得るものと、

Vtracer https://github.com/visioncortex/vtraceropen in new window

を使って作成したSVGをそれぞれ評価のモデルにかけて、一番スコアが高いものを選択するというものでした。

Stable Diffusionで生成される画像にはランダム性があるため、このあたりが安定的に高い精度を出すために役立ってくれました。

Stable Diffusionのモデルたち

高速対応されているモデルと、最新で性能が高いモデルを試しました。

高速対応モデル

Discussionで共有されていた高速対応モデルはライセンスがまずいものを除いて色々と試しましたが、SANAのライセンスがNVIDIAライセンス的なもので使えないと勘違いしていたことが悔やまれます。SANAはもう少し上位の解法にも登場していたので・・・

SANA apache 2.0になってた・・・

https://github.com/NVlabs/Sanaopen in new window

DXL Turbo by StabilityAI https://huggingface.co/stabilityai/sdxl-turboopen in new window

SDXL Lightning by ByteDance https://huggingface.co/ByteDance/SDXL-Lightningopen in new window

SANA-1.5 Collection https://huggingface.co/collections/Efficient-Large-Model/sana-15-67d6803867cb21c780e4open in new window

SSD-1B by SegMind https://huggingface.co/segmind/SSD-1Bopen in new window

FLUX 1-lite-8B by Freepik https://huggingface.co/Freepik/flux.1-lite-8Bopen in new window

SDXL Flash by the SD Community https://huggingface.co/sd-community/sdxl-flashopen in new window

Fluently-XL-v3 Lightning by Fluently https://huggingface.co/fluently/Fluently-XL-v3-Lightningopen in new window

Hyper-SD by ByteDance https://huggingface.co/ByteDance/Hyper-SDopen in new window

SVDQ-INT4-Flux.1-Schnell by MIT Han Lab https://huggingface.co/mit-han-lab/svdq-int4-flux.1-schnellopen in new window

最新のモデル

ふたつの図形を指定したテキストの出力が悪い傾向にあったので、GenEvalという評価指標でふたつのオブジェクトの出力のスコアが高いモデルを試しました。

CogView4-6B 8bit量子化版で動きましたが、時間制限的に一枚しか生成できないのと、LBが0.65ぐらいで収まっていたため最終提出には採用しませんでした。

https://huggingface.co/THUDM/CogView4-6Bopen in new window

Janus Pro 8Bのほうはメモリ制限上動かず、1Bが限界でした。これも、ふたつのオブジェクトの生成は確かに良さそうでしたが、出力される画像の品質にばらつきがあるため、あまり良いスコアは出ませんでした。

https://huggingface.co/deepseek-ai/Janus-Pro-1Bopen in new window

2つの工夫

スコアをおそらく大きく上げた二つの工夫があります。 共有コードで途中から登場したものですが、メトリクスのOCRの精度には問題があり、文字が含まれていないものが文字判定されてスコアが下がることが多々ありました。これを、あえて1文字だけ認識できる文字を置いておくと、OCRスコアが正常になるというものです。コンペ内ではこれをOCRデコイと呼んでいました。

もうひとつ、Autheticスコアが上がるというのが、画像の周りを黒く塗りつぶした感じにするというものです。これでAutheticスコアが平均的に上がったようですが、これについては若干の疑問があり、実際提出した後のスコアを見ると、あってもなくてもあんまり変わらない気はしました。

結論

kaggleってこんな感じなんだ、とチュートリアルを済ませた感じがします。

銅メダルというのはめちゃくちゃ誇れるものではないと思いますが、それなりに頑張ったので少なからず形に残るものが得られてよかったです。

あとは、このコンペを通じて以下が得られた点かなと思います。

  • SVGそのものについての知識
  • SVG生成の研究動向
  • Stable Diffusion系画像生成モデルの最新情報のキャッチアップ
  • メトリクスに適合する解法を作り上げる経験

これ系の記事を出すのはかなり今更感ありますが、kaggle自体、データサイエンス系を志す方にとってはとても良いサービスだと思います。

皆さんもぜひやってみてください。