🌱

Kaggle 草コンペ振り返り & 上位解法まとめ | CSIRO - Image2Biomass Prediction

に公開

Kaggle の草コンペこと 「CSIRO - Image2Biomass Prediction」 が、日本時間 2026年1月29日に終了しました。本記事では、コンペ終了後の振り返りとして、概要と上位入賞チームのアプローチをまとめました。

個人的に、草コンペは狙って上位に入るのは難しいものの、タスクの明瞭さと手軽さからCVコンペに触れてみたい初心者の方がまず取り組むのにオススメできるコンペだと感じます。

コンペ概要

https://www.kaggle.com/competitions/csiro-biomass

CSIRO - Image2Biomass Prediction (以下、草コンペ)は、下のような牧草地の草画像からバイオマス量を予測する画像回帰タスクを扱うコンペでした。

コンペで扱うデータ

草の画像
学習データの草画像[1]

画像は 2000×1000 の固定サイズの横長画像であり、画像一枚に対して以下のような 5つのバイオマス量を予測するのが目的です。

  • 乾燥した緑生植物の量 (Dry_Green_g)
  • 乾燥した枯死物質の量 (Dry_Dead_g)
  • 乾燥したクローバーの量 (Dry_Clover_g)
  • 乾燥した緑生物質の量 (GDM_g)
  • 合計の乾燥したバイオマスの量 (Dry_Total_g)

評価指標

草コンペの評価指標は重み付け決定係数 R^2_w であり、ターゲットごとに以下の重みがつけられています。行ごとに R^2 を計算するのではなく、すべての行に対してターゲットごとに重み付き R^2 を計算します。

Dry_Green_g Dry_Dead_g Dry_Clover_g GDM_g Dry_Total_g
重み 0.1 0.1 0.1 0.2 0.5

具体的な計算式は、以下のとおりです。

  • y_j: データの Ground-Truth
  • \hat{y}_j: モデルの予測値
  • w_j: ターゲットごとの重み
  • \bar{y}_w: 全ての Ground-Truth の加重平均
R^2_w = 1 - \frac{\sum_j w_j (y_j - \hat{y}_j)^2}{\sum_j w_j (y_j - \bar{y}_w)^2}

コンペの難しい点

草コンペの難しい点で一番重要なのは Train データが約350件しかないのに対して、Test データは800枚以上あった点が挙げられます。また、この Discussion にあるように、Test データには Train にない期間や地域で撮影された画像が含まれていました。そのため、少数データでどのように信頼できるCVを構築するかが参加者の腕の見せ所であったと言えます。

草の画像
学習データの草画像(再掲)

また、高解像度でアスペクト比が極端 (2:1) な画像をどのようにモデルの入力に組み込むかにも参加者間で戦略の違いが現れたと思います。

コンペ中に流行っていた定番解法紹介

コンペ中に多くの参加者が取り入れていた手法として、DINOv2DINOv3 といった強力な画像特徴が得られるバックボーンを用いて3個のターゲットもしくは5個のターゲット全てを予測するヘッドを学習する Linear Probing が挙げられます。

また、Linear Probing に限らず、バックボーン自体を学習させる・全体のn% の層を学習・Linear Probing をした後に Full Fine-Tuning をするいわゆる LP-FT[2] など、様々な学習戦略が見受けられました。

さらに、入力画像の全てが 2000×1000 の横長画像かつ草画像の細かいテクスチャが重要そうである点に加え、およそ正方形で学習されている事前学習済みモデルと相性が悪いという問題があったため、画像を左右に分けて二つの画像特徴を融合させる Dual-Stream の戦略が多く見られました。

よく見られたアーキテクチャ
コンペで一番よく見られたアーキテクチャ

上位解法紹介

1st Place Solution

1位は Baiphさんをはじめとする、チーム「卷不动了」でした。(日本語で「もう疲れた」のような意味のようです)

要約すると、定番解法+ターゲット値の区間を推定する補助タスク+テストデータでのオンライン学習が工夫点として挙げられます。

https://www.kaggle.com/competitions/csiro-biomass/writeups/1st-place-solution

モデル戦略

基本となるモデル構造は バックボーンが DINOv3 で 定番解法と同じなのですが、左右に分割した画像特徴に対して Self-Attention → MLP を通している部分と、3つではなく5つの回帰ヘッドを採用している点が違いとして挙げられます。

さらに、Crowd Counting 問題(参考記事)、特に UEPNet[3]から着想を得て、各ターゲット値が「どの値の区間に入るか」を予測する補助タスクを行なっています。以下は、採用されたターゲットごとの区間の境界値です。この追加ヘッドによって Public/Private LB で +0.03 の改善を達成したようです。

  BORDERS_DICT = {
      'Dry_Clover_g': [1.6e-05, 3.9, 10.5353, 20.6523, 37.5911, 71.7865],
      'Dry_Dead_g': [1.6e-05, 6.1407, 13.1192, 23.277, 38.8581, 83.8407],
      'Dry_Green_g': [1.6e-05, 13.4232, 27.0782, 45.5236, 79.834, 157.9836],
      'Dry_Total_g': [1.6e-05, 23.4907, 41.1, 61.1, 96.8288, 185.7],
      'GDM_g': [1.6e-05, 16.5143, 30.507, 49.5585, 81.0, 157.9836],
  }

CV は State, Sampling Date に基づいて 3fold で行われており、fold ごとに単一のモデルを学習しています。三つのフォールドで一つのモデルを学習したわけではないところが工夫でしょうか。("train a single-fold model" の意味が違っていたらすみません)

損失関数は回帰ヘッドに SmoothL1 Loss、分類ヘッドに Cross-Entropy Loss を採用しています。学習戦略としては DINO の重みを凍結した Linear Probing の後にモデル全体を Fine-Tuning する二段階の構成(LP-FT)になっています。

テスト時の工夫

テスト時には、テストデータを用いたオンライン学習が採用されています。フローとしては、

  1. LB Score から判断した4つの学習済みモデルでテストデータの擬似ラベルを作成
  2. 学習データ+擬似ラベルを付与したテストデータで2つの DINO-Large を学習(擬似ラベルへの過学習を防ぐため、最後に学習データのみで学習)
  3. 最終数エポック分の SWAアンサンブルモデル(複数モデルの予測値でなくモデルの重みをアンサンブルして単一モデルにする)を作成
  4. 同じ方法で DINO-Base モデルを2つ作成
  5. Base と Large モデルを 6:4 でアンサンブル(なぜか Base の方が重みが大きい)

最後に、後処理として Discussion でも見られた、各ターゲットごとに係数をかけて出力値を調整しています。

out_clover = out_clover * 0.8
if out_dead > 20:
    out_dead *= 1.1
elif out_dead < 10:
    out_dead *= 0.9

out_gdm = 0.5*out_gdm + 0.5*(out_green+out_clover)

pred_total1 = out_green + out_clover + out_dead
pred_total2 = out_gdm + out_dead
out_total = 0.5*out_total + 0.5*pred_total1 + 0.0*pred_total2

この後処理はPrivate LB で Shake down する危険もあったと思いますが、やはり Validation データより Public Test データの方が数が多いので LB Score から信用できたのだと考えられます。

2nd Place Solution

2位は Quan Vuさんの、チーム 「dino series」でした。

https://www.kaggle.com/competitions/csiro-biomass/writeups/2nd-weakly-supervised-semantic-segmentation-sy

合成データ作成

2位解法の面白い点は、画像生成モデルを用いた合成データを作成している点です。回帰タスクにおける合成データ作成には 「Ground-Truth の値をどう設定するか?」という難点がありますが、「学習データで訓練したモデルを用いた擬似ラベル付与」によって対処しています。

合成データは Qwen Image Edit を用いて、季節による気象変化・砂利や岩石などの人工物の付与・画像から草を除いて対応するターゲット値を0にするなどの工夫がされています。

合成データの例
合成データの例 (カメラが直置きされている画像は何?)

https://www.kaggle.com/datasets/quan0095/csiro-synthetic-dataset

モデリング戦略

モデルには DINOv3 が使われています。

Data Augmentation に関してはかなり多くの変換が行われていますが、著者曰く RandomResizedCrop と RandomErasing がかなり効いて驚いているようです。

また、画像を州ごとに分類するのが容易だったこと・データセットに何らかのバイアスが存在することから各州ごとに予測値に係数をかけてスケーリングをしたり、 np.clip で Clover/Dead/Green の値を特定の範囲にクリッピングしたりといった後処理が採用されています。

CV 戦略

State ごとの Stratified 5-Fold が採用されており、全ての Fold においてラベルの平均と分散が均一になるように工夫されています。State や Date で Grouping しないのはデータが少数すぎてラベル分布が崩れてしまう点と State によって存在する Species に偏りがないようにするためとのことです。このデータ分割は完璧でなかったため、学習したモデルは CV-LB相関とLBスコアによって評価されています。

3rd Place Solution

3位は Mayukh Bhattacharyyaさんの、チーム「embee」でした。

https://www.kaggle.com/competitions/csiro-biomass/writeups/3rd-place-solution

モデリング戦略

3位解法は様々なモデルタイプとCV戦略を組み合わせた19モデルアンサンブルです。

Data Augmentation 周りの工夫としては、モデルが色情報ではなく草画像の特徴を見られるようにグレースケール変換の導入や lambda を 0.2~0.3 に設定した MixUpの導入などがあります。

また、面白いものとして画像に4つの垂直カットを入れて4つのセグメントに分割し、セグメントの順番をランダムに入れ替える変換を導入しています。これは、セグメントを入れ替えてもバイオマス量の総量は変わらないことから着想を得ています。併せて左右の画像を入れ替える Augmentation も行なっています。

画像をセグメントに分けたデータ補強
画像をセグメントに分けた Data Augmentation の図示(多分こんな感じ)

ターゲット値のスケーリングは3位解法でも用いられていました。また、CV-LB 相関は取れていなかったようで、複数のモデルによって汎化性能を出しつつ LB-Trust で進められたようです。

4th Place Solution

4位は yanqiangmiffyさんでした。

※元の4位の方がLBから消えたため、繰り上がりで5位→4位となっています。

https://www.kaggle.com/competitions/csiro-biomass/writeups/physics-constrained-regression-integrating-biolog

入力画像への工夫点

4位解法で行われている工夫として、画像の前処理として写真にタイムスタンプが載っているような画像を OpenCV でノイズ除去している点が挙げられます。

画像の前処理
写真のタイムスタンプ除去

def clean_image(img):
    """
    Image preprocessing: Remove bottom artifacts and date stamp.
    """
    # Detect orange date stamp in HSV space
    hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
    # Define orange range
    lower = np.array([5, 150, 150])
    upper = np.array([25, 255, 255])
    mask = cv2.inRange(hsv, lower, upper)

    # Dilate mask to cover text edges
    mask = cv2.dilate(mask, np.ones((3, 3), np.uint8), iterations=2)

    # Inpaint if timestamp detected
    if np.sum(mask) > 0:
        img = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)

    return img

モデリング戦略

また、モデルへの画像入力戦略も定番解法の左右分割に加え、画像全体を含めた 3-Stream で学習が行われています。また、MoE (Mixture of Experts) も導入され、入力画像の特性に応じたヘッドの自動選択が採用されています。

モデルは先述した 3-stream 入力のモデル、State/Species の分類ヘッドを持ったモデル、メタ特徴量の埋め込みを利用したモデルの3種類が用いられています。

さらに、train.csv だけに存在する NDVI/Height/Species/State の情報を使って補助タスクの学習や、 R^2 の外れ値誤差に対処するための GaussianNLLLoss、BackboneとHead の学習率を変える、ターゲットの State ごとの後処理やクリッピングが採用されています。

4位チームも提出モデルの選定には苦しんでおり、最終的に LB-Trust で Public LB スコアに従って決められました。

5th Place Solution

5位は Kinosukeさんでした。

https://www.kaggle.com/competitions/csiro-biomass/writeups/5th-place-solution

モデリング戦略

DINOv3 をベースにしている部分は定番解法と同様なのですが、以下の画像のように DINOv3 がゼロショットの状態で密度推定能力に優れていることに着目し、回帰ヘッドを付けた単純な回帰問題を解くのではなく、可能な限り局所的な画像特徴を用いる工夫が凝らされています。


DINOv3 によるゼロショットの密度推定結果[4]

画像入力においても、左右分割した画像を融合した Dual-Stream の定番解法とは異なり、左右に分割したそれぞれの画像を一つの画像として扱い、ターゲット値も半分にして別画像として扱うことで少数データ対策をする工夫がありました。

具体的なモデルのアーキテクチャは、上記で得た 1000x1000 の画像を DINOv3 のバックボーンに通し、パッチトークンを 1x1 Conv に通すことで、5つのターゲットに対する密度予測値を得ます。ここで Softplus により、ターゲット値が非負である制約を課し、「密度値xパッチの面積=パッチに存在するバイオマス量」という処理を全てのパッチに対して行い、積分によってバイオマス量を求めている点が鮮やかです。

5位解法紹介 に書かれた擬似アーキテクチャを図示すると以下のようになります。

1x1 Conv の部分は隣接パッチ間の関係保持のために 3x3 Conv も試されたようですが、Loss が NaN になる問題が発生し学習を安定化するのが難しかったみたいです。

学習戦略

DINOv3 の学習済みの重みを崩さないように、出力ヘッドに近い層から50%の層を段階的に Unfreeze して学習していく方式を採用しています。

具体的には最初の5エポックは学習率を高めにしてヘッド部分のみを学習し、残りの35エポックで DINOv3 Large の場合は 50% (24個の Transformerブロック中 12個分)を段階的に学習します。学習率スケジューラを使うと後半のエポックで学習される層が学習できないため、学習率は線形的に 1e-5〜3e-5 まで変化させています。

CV戦略

CVはこちらの Discussionを参考に、予測が難しい Clover と Dead の分布を均すことで CV-LB の相関を取ったとのことです。(元の Discussion の親コメントが削除されていたため見逃していました。。)

この結果、かなり信頼できる CV-LB 相関が取れています。


CV-LB の相関[4:1]

また、Feedback Prize コンペの Psi 氏の解法を参考に、2つのシードを用いて学習と評価を行うことでモデルの汎化性能の検証をしています。

その他の解法

その他の解法を簡単に紹介します。

元 4th Place Solution (なぜかLBにはいない)

https://www.kaggle.com/competitions/csiro-biomass/writeups/vit-huge-dinov3-and-multi-modal-feature-fusion

7th Place Solution

横長画像をそのまま入力する Single-Stream モデルと、左右分割の Dual-Stream モデルを活用し、テストデータに擬似ラベルを付与してオンライン学習をしています。

https://www.kaggle.com/competitions/csiro-biomass/writeups/8th-place-solution-singledual-ttt

9th Place Solution

DINOv3 Huge+ を用いて左右分割画像の特徴を Mamba ブロックで結合するモデルの 12モデルアンサンブルです。

https://www.kaggle.com/competitions/csiro-biomass/writeups/9th-place-solution

10th Place Solution

5つのターゲットに対する回帰ヘッドを DINOv3 に付けて、後半の層を含めて部分的に Fine-Tuning しています。

https://www.kaggle.com/competitions/csiro-biomass/writeups/10th-place-solution

参加中の小ネタ

備忘録として、コンペ中の面白エピソードを残しておきます。

コンペ終了直前のデータ追加

ちなみに、草コンペ終了一ヶ月前にセグメンテーション画像を追加データとして配布するという衝撃的なアナウンスがありましたが、多くのマイナス投票と参加者によるお気持ち表明によってキャンセルされました。

草コンペの追加データ報告
ホストが追加データを載せようとしたときのアナウンス

LLM の現実的な撤退

また、先述したとおり学習データの少なさと恐らくドメインギャップに由来した CV-LB 相関を取る困難さから SoTA の LLM も銅圏スコアを越えることに匙を投げ、撤退(現実的)を薦める場面も垣間見えました。今後、撤退しない LLM の性能向上に期待です。

https://x.com/Kinosuke_sophi/status/2015733628781961580?s=20

さいごに

草コンペでは、CV-LB 相関を取るのが難しいという課題があったものの、事前学習済みモデルを timm から呼び出して Linear Probing や バックボーンの Fine-Tuning を行う基本的な処理であったり、少数データや学習データにしかない情報をどう活用するかといった、今後のコンペや業務にも活かせそうな知見を身につけることが出来た良いコンペでした。

個人的に自前で学習したモデルの汎化性能を信じたものの全然勝てなかった点と、Public LB から算出したハイパラ係数の後処理は解せないところがありますが、結果が全てということで歯を食いしばりながら眠ることにします。。。

この記事が CVコンペの参加者の何らかの役に立つことを祈っています!

Happy Kaggling!!

脚注
  1. Qiyu Liao, Dadong Wang, Rhys Pirie, Joshua Whelan, Rebecca Haling, Jiajun Liu, Rizwan Khokher, Xun Li, Martyna Plomecka, and Addison Howard. CSIRO - Image2Biomass Prediction. https://kaggle.com/competitions/csiro-biomass, 2025. Kaggle. ↩︎

  2. Ananya Kumar and Aditi Raghunathan and Robbie Jones and Tengyu Ma and Percy Liang. Fine-Tuning can Distort Pretrained Features and Underperform Out-of-Distribution. ICLR 2022. https://arxiv.org/abs/2202.10054 ↩︎

  3. Wang, Changan, Qingyu Song, Boshen Zhang, Yabiao Wang, Ying Tai, Xuyi Hu, Chengjie Wang, Jilin Li, Jiayi Ma, and Yang Wu. "Uniformity in heterogeneity: Diving deep into count interval partition for crowd counting." In Proceedings of the IEEE/CVF international conference on computer vision, pp. 3234-3242. 2021. ↩︎

  4. https://www.kaggle.com/competitions/csiro-biomass/writeups/5th-place-solution ↩︎ ↩︎

Discussion