【kaggleコンペ】Image Matching Challenge 2025 参加記

x facebook hatena

 

目次


ARISE analyticsのDX Technology Division, Technological Development Unit, ドローンサービス開発 Teamに所属する髙橋、柴田です。

チーム内勉強会の一環として、2025年4月~6月に開催されたImage Matching Challenge 2025に参加し、銅メダル(51位/943チーム)を獲得することができました。そこで今回は、本コンペの概要及び解法の解説を行いたいと思います。

コンペ概要

Image Matching Challengeは、コンピュータビジョンのトップカンファレンスの1つであるCVPRのワークショップの一部として開催されているコンペです。特に2023年以降は、与えられた二次元画像群から三次元マップを再構成する、Structure from Motion (SfM)と呼ばれるタスクの精度を競うものとなっています。

コンペの目的

本コンペは、与えられたひとまとまりの画像群(以降「データセット」と呼びます)を複数のクラスターに分割したうえで、クラスターごとに各画像のカメラポーズ(回転行列及び並進ベクトル)を推測し、その精度を競うコンペです。

まずはクラスターへの分割について説明します。

あるデータセットが与えられます。各データセットには複数の三次元マップの再構成対象が含まれており、これらを「シーン」と呼びます。データセット内のシーンの数は与えられていません。また、データセットの中には「アウトライア(outlier)」と呼ばれる、三次元マップの再構成対象とはしないものも含まれていることがあります。クラスターへの分割とは、データセット内のシーンの数Nを決めたうえで、各画像をシーン1、シーン2、、、シーンi、、、もしくはアウトライアのいずれに割り振るかを推測することを指します。以下に、食器の画像データセット(コンペ中のデータとは異なります)を2つのシーンと1つのアウトライアへ分割した例を示します。

image-20250818-120401
データセットのシーンへの分割

続いて、三次元再構成について簡単に述べたうえで、カメラポーズの推定について説明します。

三次元再構成とは、カメラやレーザーなどの測定器を用いて、対象物体の三次元形状を計算機上で再現することを指します。[1] 三次元形状の再現に関してはさまざまな形式が存在しますが、特にSfMにおいては、点群形式と呼ばれる形式で表現することが多いです。対象物の各点の座標及び輝度情報の集合体からなり、物体の正確な3Dモデルを作成する基盤となるため、建設や製造、自動車業界など、多様な分野で利用されています[2] 特に近年は、ドローンを航行させて撮影した画像を用いることで、工事現場やダムといった大規模構造物を三次元化することも可能となっています。[3]

三次元再構成は能動的な手法と受動的な手法に分けることができます。特に、受動的な手法では、二次元画像で得られる情報だけを使って三次元構造を構造を推定します。[1] 今回のコンペでも、受動的な手法での再構成が求められていると言えます。受動的な手法の中に、ステレオビジョンと呼ばれる、2台のカメラを使って立体形状を再構成する方法が存在します。[4] 三角測量の原理を用いた方法で、ある同一の点が映った2枚の画像と、それらを撮影した2台のカメラの相対的な位置関係が分かれば、対象となる点が三次元空間におけるどの位置に存在するかを算出することができます。逆に言うと、画像の集合から三次元構造を正確に再現するには、それぞれの画像を撮影したカメラが座標空間のどの点に存在していたのか、を精確に把握することが必要であると言えます。ここで、基準とする空間座標系と各カメラ座標系の相対的な関係として、「カメラの位置」を表現することを考えます。このとき、この2つの座標系の変換は、回転行列\(R\)及び並進ベクトル\(t\)を用いて数値的に表現することが可能です。[5]

$$\left( \begin{array}{rr} X_{camera} \\ Y_{camera} \\ Z_{camera} \end{array} \right) = \boldsymbol{R}\left( \begin{array}{rr} X_{world} \\ Y_{world} \\ Z_{world} \end{array} \right)  + \boldsymbol{t}  \qquad (1)$$

カメラポーズの推定とは、この回転行列及び並進ベクトルを画像の集合から推定することを指しています。

image-20250620-0124322つの座標系の関係

評価指標

本コンペの評価指標は、コンペの目的に沿って設計されていました。すなわち、各データセットごとに、クラスターへの分割のスコアと、カメラポーズの推定のスコアが計算され、その調和平均をとることでデータセットごとの最終的なスコアが定まるというものでした。 説明の都合上、まずはクラスターごとのカメラポーズの推定に関するスコア(mAA)について説明します。あるクラスターについて、各画像に対するカメラパラメータ(回転行列\(R\)及び並進ベクトル\(t\))が求まっているとします。カメラ中心はカメラ座標系の原点(0, 0, 0)であることを踏まえると、式(1)から、カメラの中心が空間座標系においてどの位置に存在するかを計算することができます。(式(2))
$$\left( \begin{array}{rr} X_{world} \\ Y_{world} \\ Z_{world} \end{array} \right) = -\boldsymbol{R}^\boldsymbol{T} \boldsymbol{t} \qquad (2)$$

この式(2)により求まる推定空間座標と真値との誤差をカメラポーズ推定の評価値とすればよいと考えられます。(注:後述の通り、実際のコンペにおける評価指標とは異なります)しかし、式(2)から求まる空間座標はあくまでも相対的なものであり、その座標原点及び軸方位は、真値におけるそれと必ずしも一致しません。そこで、評価値の計算の前に、最も評価値がよくなるように推定座標を変換しています。より具体的には、以下の手順で行列T'を求め、それぞれの推定座標を座標変換します。

  1. 推定座標のうち有効なものの総数をNとする。

  2. 最良の評価値 best_errorをINFで初期化する。

  3. N個のうち異なる3個を選ぶ\(\binom{N}{3}\)通りすべてについて、以下の計算を行う。

    1. 選ばれた3つの画像の推定座標及び真値の座標を用いて変換行列T_tempを計算する。(空間座標どうしの変換行列は、3つ組どうしの情報を用いて計算できる)

    2. この変換行列を用いて推定座標群を変換し、評価値temp_errorを計算する。

    3. この評価値が現在のbest_errorを下回っている場合、best_errorをtemp_errorで更新し、変換行列T'をT_tempへと更新する。

このようにして評価値がもっともよくなる変換行列T'を計算し、作用させたうえで評価値を計算します。以下では、この評価値(mAA)の具体的な計算方法を説明します。以降、推定座標はT'で変換済みであるとします。

式(2)で求まるカメラ中心の推定座標と、真値とのユークリッド距離を計算し、その値がある閾値\(t\)以下であるときに「その画像が正しく登録された(registered)」であると定めます。このとき、「全画像のうち何枚がregisterされたか」のパーセンテージを\(r_i\)とします。いくつかの閾値に対して\(r_i\)を計算し、その平均をとることで、そのクラスターにおける評価値mAA(mean Average Accuracy)が求まります。このmAAが、コンペにおけるカメラポーズ推定の評価指標です。

 

続いて、クラスターへの分割に関する評価指標に関して説明します。推定したクラスターは、mAAを最大化するようなあるシーンに紐づけることができます。このとき、「ユーザーが推定したクラスターサイズのうち、紐づいたシーンに属している画像の数」をクラスターへの分割のスコアとします。以下の図に示すように、クラスター1'はシーン1に、クラスター2'はシーン2にそれぞれ紐づき、スコアはいずれも0.66 (= 2/3)となります。

image-20250818-120318クラスターとシーンの紐づけ

パイプライン

本コンペでは基本的にはホストが提供してくれたベースライン[6]に基づいたパイプラインを使用します。パイプラインは主に画像ペア選択、特徴点抽出、特徴点マッチング、COLMAPによる三次元再構成という4つの処理で構成されます。ここでは画像ペア選択、特徴点抽出、特徴点マッチングの処理の内容を順に説明します。

画像ペア選択

パイプラインでは、画像枚数が一定以下の場合は、全画像間で後続の特徴点抽出・特徴点マッチングの処理を行います。一方、画像枚数が一定より多い場合は、全画像間での特徴点抽出・特徴点マッチングを計算することが計算時間の観点で不可能であるため、特徴点抽出・特徴点マッチングを計算するペア群(shortlist)を列挙する処理(画像ペア選択)を行います。

画像ペア選択の処理では、まず最初にDINOv2により画像全体のグローバル特徴を取得し、ユークリッド距離で類似度行列を計算します。その類似度行列に基づいて、類似度が一定の閾値以上の画像ペアを選択し、さらに各画像について最小ペア数を満たさない場合には、距離の近い順に選択することで、計算対象の画像ペアのリストを作成します。

特徴の抽出に使用されるDINOv2は2023年にMeta AI Researchが発表した自己教師あり学習による視覚表現学習モデルで、Image Matching Challengeコンペで2023年から使用されています。

特徴点抽出

特徴点抽出では、各画像内から重要で識別可能な点とその点の周辺領域の特徴をベクトルで表現した記述子を抽出します。パイプラインではALIKED[7]という特徴点抽出モデルが使用されています。

ALIKEDはA Lighter Keypoint and descriptor Extraction network with Deformable transformationの略で、2023年に発表された特徴点抽出モデルです。ALIKEの改良版として開発され、Sparse Deformable Descriptor Head(SDDH)を導入することで、従来よりも効率的かつロバストな記述子抽出を実現しています。

image-20250817-225011特徴点抽出の例([7]より引用)

特徴点マッチング

特徴点マッチングでは、異なる画像間で同じ点や領域に対応する特徴点のペアを見つける処理を行います。パイプラインではLightGlue[8]という特徴点マッチングモデルが使用されています。

LightGlueは2023年に発表された高速で高精度な特徴点マッチングモデルで、画像間の疎な局所特徴をマチングすることが可能な深層学習モデルです。SuperGlueの最先端技術を再検討し、シンプルで効率的な改良を導入することで、メモリと計算の両面で効率的かつ正確に処理をすることが可能です。

image-20250817-224551特徴点マッチングの例([8]より引用)

解法概要

我々のチームでは、主に特徴点密集領域のクロップ処理、高速化のためのGPU並列処理、Pre-Clustering処理を追加することで上記のパイプラインを改良しました。ここでは追加したそれぞれの処理の内容を順に説明します。

特徴点密集領域のクロップ処理

我々のチームではまず特徴点抽出の処理の改良を試みました。具体的には過去のコンペでも採用されているマルチスケールTTA(特徴点抽出モデルに入力する画像のサイズを変える処理)と特徴点密集領域のクロップ処理をパイプラインに組み込むことにしました。ここでは後者の特徴点密集領域のクロップ処理について説明します。

特徴点密集領域のクロップ処理には画像ペアごとのクロップ処理と画像ごとクロップ処理とがあります。画像ペアごとのクロップ処理はImage Matching 2022で提案された手法で、画像ペアごとにマッチングしたキーポイントに対してDBSCANを用いてクラスタリングし、8割~9割のマッチングしたキーポイントのみを抽出することで画像ペアごとに代表領域をクロップします。この方法では、元画像においてマッチングしなかった場合には重要な領域を無視してしまうというリスクがありました。そこで、我々のチームではImage Matching 2024の1st place solution[9]において導入された画像ごとのクロップ処理を採用しました。

画像ごとのクロップ処理ではまず画像内の各キーポイントに対して他の画像とどれだけマッチしているかをカウントしマッチング頻度を正規化します。その後、一定の閾値以上の頻度でマッチしているキーポイントのみを抽出してDBSCANを用いてクラスタリングします。最終的に、クラスタリングの結果から外れ値を除外し、最大クラスタに対する比率が一定以上のクラスタのみを選択し、重要領域としてクロップします。

マルチスケールTTAと特徴点密集領域のクロップ処理を採用することで、public-LBの値を3~4程度上昇させることができました。

高速化のためのGPU並列処理

特徴点抽出処理を改善したことで実行時間制限(9h)に収まらなくなったため、全体の高速化を試みました。Image Matching 2024 の1st place solution[9]において、T4のGPU2つを使った並列処理が組み込まれていたので、公開されているNotebookを参考に同様の処理を組み込むことにしました。Image Matching 2025の上位解法においても、同様の高速化を組み込んでいる解法が見られました。

具体的には以下の方法で処理を行いました。Notebookを上から実行していく過程でデータセットの数および各データセットに含まれている画像の数を把握します。そして、合計の画像枚数がなるべく均等になるように各データセットをグループ0, 1に割り振ります。そして、subprocessライブラリを用いてNotebookの中でGPU0, 1に対応させたプロセスを実行します。以下の図のようなイメージです。

image-20250711-001759並列処理のイメージ図

コードとして記入すると以下のようになります。パイプラインの実装が固まっていれば、pyファイルとして環境にアップロードし、ライブラリとして呼び出して使うほうが好ましいと思われますが、コンペ中はNotebookに記入したものを%%writefileでファイルとして書き出す方法を採用しました。

この工夫により、処理時間を9時間オーバーから5 ~ 6時間に短縮することができました。

%%writefile imc25_scripts/inference.py

import argparse

def parse_args():
    """
    Parse command line arguments
    """
    parser = argparse.ArgumentParser(description="IMC25 Inference Script")
    parser.add_argument("--device_id", type=int, default = 0, help="ID of the GPU device to use")
    parser.add_argument("--datasets", nargs='*', default=None, help="List of datasets to process. If not provided, all datasets will be processed.")
    return parser.parse_args()
    
def main():
    """
    Main function of pipeline
    """
    args = parse_args()
    # pipeline...

    
if __name__ == "__main__":
    main()
    
def make_command(device_id, datasets):
    """
    Create a list of strings representing the command and its arguments
    """
    command = f"python3 imc25_scripts/inference.py --device_id {device_id} --datasets {' '.join(datasets)}"
    ret = command.split(" ")
    if ret[-1] == '':
        ret.pop()
    return ret

def split_dataset(
    competition_data: pd.DataFrame,
    alpha = 1, 
):
    """
    split datasets into 2 groups
    """
    mapping_image_number = {}
    for _, row in competition_data.iterrows():
        if row.dataset not in image_number_mapping.keys():
            image_number_mapping[row.dataset] = 0
        image_number_mapping[row.dataset] += 1
    
    arr_image_number = []
    for k, v in image_number_mapping.items():
        arr_image_number.append((v, k))
    arr_image_number = sorted(arr_image_number)
    group1, group2 = [], []
    sum1, sum2 = 0, 0
    for val, dataset in arr_image_number:
        if sum1 <= sum2:
            group1.append(dataset)
            sum1 += val ** alpha
        else:
            group2.append(dataset)
            sum2 += val ** alpha
            
    return group1, group2
    
import subprocess

datasets1, datasets2 = split_dataset(
    pd.read_csv(config.sample_submission_csv), 
    alpha = 1, 
)

proc0 = subprocess.Popen(make_command(0, datasets1))
proc1 = subprocess.Popen(make_command(1, datasets2))
proc0.wait()
proc1.wait()
    

Pre-clustering

クラスタリングの精度及びCOLMAPの再構成精度を高めるために、COLMAPの処理の前にクラスタリングを行うことを試みました(1st place Solution[10]ではpre-clusteringと呼ばれていました)。我々のチームは、各画像間のマッチ数を計算し、画像を頂点、マッチ数を辺の重みと見たグラフに着目したpre-clusteringを実施しました。各データセットにはいくつかのシーン(アウトライア含む)が含まれていますが、同一のシーンに含まれる画像どうしのマッチ数は多く、シーンが異なる場合はマッチ数が少ないことが期待されます。辺の重み(マッチ数)を辺の太さとして可視化したイメージ図を示します。

image-20250711-005524辺の重みを辺の太さとしたグラフのイメージ図

このとき、「ある重み以上の辺だけを残したときの連結成分」をクラスターの結果とすればよさそうです。以下の図のイメージです。

image-20250711-005904

辺の重みをもとにしたクラスタリングのイメージ

ここで、閾値となる重みを定数としてしまうと、データセットによってはクラスターが細かくなりすぎたり、すべてのシーンが同一のクラスターとなってしまったり、とあまりうまくいきませんでした。したがって、閾値となる重みをデータセットごとに動的に変更する必要がありました。

ここで、データを観察すると、データセット内の各画像に対して、「画角が近く、マッチ数が多い画像」が数枚ずつは含まれている傾向にあることがわかります。このように、ある画像に対して多くのマッチングが得られる画像を数枚ずつ選んで辺を張ることを繰り返していけば、良いpre-clusteringが得られるのではないかと考えました。コンペ中は、「各頂点に注目したとき、X本以上の辺が張られている割合がY%以上」という条件を満たす辺重みを二分探索的に求めることで閾値の動的な決定を行いました。X, Yを含めたハイパーパラメータのパターンを複数試し、public-LBの値が良く、trainデータに対するクラスタリング精度もよいもの(X = 5, Y = 95)を採用しました。このpre-clusteringを採用することで、public-LBの値を1.5程度上昇させることができました。

解法まとめ

ここまで紹介した3つの処理をパイプラインに組み込むことで、public-LBの値を4.5~5.5程度上昇させることができました。また、最終的に、public-LBの値が良くハイパーパラメータの値が異なるコードを提出することで、private score 37.32を達成することができました。

なお、コンペ終了後の検証では、画像ペア選択の最小ペア数の値を調整することでprivate scoreをさらに大幅に改善できることが判明しました。今後の課題として、ハイパーパラメータ調整のための時間を十分に確保することが重要であると感じています。

上位解法

ここからはコンペ後に公開された上位解法のうち、いくつかを抜粋して紹介します。

1st place solution [10]

MASt3R[11]という2024年に公開された論文のモデルを用いて、特徴点のマッチングを行うことを軸とした解法でした。

基本となるパイプラインにも組み込まれている画像ペア選択の精度を向上させ、再構成の際に重要となるペアを取りこぼさないことが重要であると述べられています。また、MASt3Rを用いたマッチングには時間がかかるため、その観点でもペア選択の精度向上が重要であるとのことでした。1位解法の中では、MASt3R-ASMK、MASt3R-SPoC、DINOv2、ISCと4つの異なるモデルで特徴抽出し、それぞれについてImage Retrieval (画像のベクトル検索)を行って、類似度が高い画像を選択してshortlistに加える、という処理を行っていました。

そして、shortlistに含まれる画像ペアごとに、MASt3R、ALIKEDおよびSuperPointで特徴点を抽出し、MASt3R-matcherで特徴点のマッチングを行い、COLMAPで再構成を行うという解法でした。

2nd place solution [12]

GIM(Generalizable Image Matcher)[13]という2024年に公開された学習手法を用いて学習した特徴点マッチングモデルを使用することを軸とした解法でした。

既存の学習ベースの特徴点マッチングモデルはベンチマーク上では高い性能を示す一方で、実世界の画像にはうまく一般化できないという問題を抱えていました。GIMはこの問題を解決するために提案された学習手法で、YouTubeなどのインターネット上の多様で豊富な動画を利用して自己学習を行い、既存の特徴点マッチングモデルから汎用的な特徴点マッチングモデルを得る手法です。

GIMは以下のような流れで学習を行います。まず、使用する特徴点マッチングモデルを既存のドメイン固有のデータセットで学習します。次に、インターネット動画の近接フレーム間で初期学習済みのモデルと複数の補完のためのマッチング手法を組み合わせてdense labelを生成します。これらのラベルからロバストなフィッティングにより外れ値を除去します。さらに、動画の時系列情報を利用して、これらのラベルを遠いフレームへと伝播させます。最後に強力なデータ拡張を用いて最終的なモデルを学習します。

GIMは任意の特徴点マッチングモデルに適用可能で、公式実装ではGIMで学習したLightGlue、LOFTR、DKM、Romaなどの重みと訓練用コードが公開されています。2位解法ではLightGlue(+SuperPoint)を採用しています。

まとめ

本記事ではImage Matching Challenge 2025のコンペ概要やタスク、および我々のチームの解法について紹介しました。三次元再構成を実際に扱うのは二人とも初めてでしたが、コンペ参加を通じて基本から最新のモデルまで学ぶことができ、非常に有意義でした。また、画像の類似度の推測や特徴点の抽出といったタスクにおいて、いくつかのモデルを組み合わせることで精度をより向上させられる可能性があるという知見は、Kaggleだけでなく実業務においても活用することができそうです。

ARISE analyticsでは、コンペ参加などを通じた自己研鑽も積極的に奨励されています。他コンペへの参加記やKaggle部など社内勉強会の紹介も公開されていますので、興味のある方はぜひご一読ください。

Automated Essay Scoring 2.0コンペ参加記
ARISE Kaggle部活動記 #6

参考

[1] https://www.mi.t.u-tokyo.ac.jp/research/3d_reconstruction

[2] https://kumonos.co.jp/media/point-cloud-data/

[3] https://liberaware.co.jp/company/obsession/

[4] https://www.aoki.ecei.tohoku.ac.jp/oc2022/3d/

[5] https://qiita.com/S-Kaito/items/ace10e742227fd63bd4c

[6]https://www.kaggle.com/code/eduardtrulls/imc25-submission

[7]https://arxiv.org/abs/2304.03608

[8]https://arxiv.org/abs/2306.13643

[9] https://www.kaggle.com/competitions/image-matching-challenge-2024/writeups/current-energy-voltage-1st-place-solution-high-ima

[10] https://www.kaggle.com/competitions/image-matching-challenge-2025/discussion/583058

[11] https://doi.org/10.48550/arXiv.2406.09756

[12] https://www.kaggle.com/competitions/image-matching-challenge-2025/writeups/nazarko99-2nd-place-solution

[13] Shen, Xuelun & Cai, Zhipeng & Yin, Wei & Müller, Matthias & Li, Zijun & Wang, Kaixuan & Chen, Xiaozhi & Wang, Cheng. (2024). GIM: Learning Generalizable Image Matcher From Internet Videos.

 

ご質問・お問い合わせは
こちらよりお送りください
採用
ARISE analyticsとは

PAGE TOP