🚀 LightGlue
LightGlueは、キーポイント検出に使用されるモデルです。このモデルは、画像内の2組の特徴点をマッチングさせることができ、コンピュータビジョンにおける特徴マッチングや姿勢推定の問題を解決し、多視点幾何学の問題に広く応用されています。
🚀 クイックスタート
このモデルの使用方法のクイックサンプルを以下に示します。このモデルは画像マッチングモデルであるため、マッチングには画像のペアが必要です。元の出力には、キーポイント検出器が検出したキーポイントのリストと、マッチングペアとそれに対応するマッチングスコアが含まれます。
from transformers import AutoImageProcessor, AutoModel
import torch
from PIL import Image
import requests
url_image1 = "https://raw.githubusercontent.com/magicleap/SuperGluePretrainedNetwork/refs/heads/master/assets/phototourism_sample_images/united_states_capitol_98169888_3347710852.jpg"
image1 = Image.open(requests.get(url_image1, stream=True).raw)
url_image2 = "https://raw.githubusercontent.com/magicleap/SuperGluePretrainedNetwork/refs/heads/master/assets/phototourism_sample_images/united_states_capitol_26757027_6717084061.jpg"
image2 = Image.open(requests.get(url_image2, stream=True).raw)
images = [image1, image2]
processor = AutoImageProcessor.from_pretrained("stevenbucaille/lightglue_superpoint")
model = AutoModel.from_pretrained("stevenbucaille/lightglue_superpoint")
inputs = processor(images, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
LightGlueImageProcessor
のpost_process_keypoint_matching
メソッドを使用すると、読みやすい形式でキーポイントとマッチングペアを取得できます。
image_sizes = [[(image.height, image.width) for image in images]]
outputs = processor.post_process_keypoint_matching(outputs, image_sizes, threshold=0.2)
for i, output in enumerate(outputs):
print("For the image pair", i)
for keypoint0, keypoint1, matching_score in zip(
output["keypoints0"], output["keypoints1"], output["matching_scores"]
):
print(
f"Keypoint at coordinate {keypoint0.numpy()} in the first image matches with keypoint at coordinate {keypoint1.numpy()} in the second image with a score of {matching_score}."
)
このメソッドに元の画像と出力を渡すことで、画像間のマッチングを可視化できます。
processor.plot_keypoint_matching(images, outputs)

✨ 主な機能
- 高効率かつ高精度:LightGlueモデルは、メモリと計算の面でより効率的で、より高い精度を持ち、長らく圧倒的な存在であったSuperGlueよりも訓練が容易です。
- 適応的計算:このモデルは、各画像ペアのマッチング難易度に応じて計算量を適応的に調整することができます。視覚的な重複が大きい、または外観の変化が限られているなど、マッチングが容易な画像ペアに対しては、推論速度が速くなります。
- リアルタイム実行:効率的に設計されており、最新のGPU上でリアルタイムに実行できるため、リアルタイムアプリケーションに適しています。
💻 使用例
基本的な使用法
from transformers import AutoImageProcessor, AutoModel
import torch
from PIL import Image
import requests
url_image1 = "https://raw.githubusercontent.com/magicleap/SuperGluePretrainedNetwork/refs/heads/master/assets/phototourism_sample_images/united_states_capitol_98169888_3347710852.jpg"
image1 = Image.open(requests.get(url_image1, stream=True).raw)
url_image2 = "https://raw.githubusercontent.com/magicleap/SuperGluePretrainedNetwork/refs/heads/master/assets/phototourism_sample_images/united_states_capitol_26757027_6717084061.jpg"
image2 = Image.open(requests.get(url_image2, stream=True).raw)
images = [image1, image2]
processor = AutoImageProcessor.from_pretrained("stevenbucaille/lightglue_superpoint")
model = AutoModel.from_pretrained("stevenbucaille/lightglue_superpoint")
inputs = processor(images, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
高度な使用法
image_sizes = [[(image.height, image.width) for image in images]]
outputs = processor.post_process_keypoint_matching(outputs, image_sizes, threshold=0.2)
for i, output in enumerate(outputs):
print("For the image pair", i)
for keypoint0, keypoint1, matching_score in zip(
output["keypoints0"], output["keypoints1"], output["matching_scores"]
):
print(
f"Keypoint at coordinate {keypoint0.numpy()} in the first image matches with keypoint at coordinate {keypoint1.numpy()} in the second image with a score of {matching_score}."
)
processor.plot_keypoint_matching(images, outputs)
📚 ドキュメント
モデルの説明
LightGlueは、ニューラルネットワークであり、対応関係を同時に検索し、マッチングできない点を拒否することで、2組の局所特徴をマッチングさせます。SuperGlueの成功を踏まえ、このモデルは自身の予測の信頼度を内省することができます。マッチングする各画像ペアの難易度に応じて計算量を調整し、その深さと幅は適応的です。
- すべての予測が完了した場合、推論は早期の層で停止することができます。
- マッチングできないと見なされる点は、後続のステップでできるだけ早く破棄されます。
最終的に得られるLightGlueモデルは、長らく圧倒的な存在であったSuperGlueよりも高速、高精度で、訓練が容易です。
| 属性 | 詳細 |
|------|------|
| 開発チーム | スイス連邦工科大学 - コンピュータビジョンと幾何学研究所 |
| モデルタイプ | 画像マッチング |
| ライセンス | 学術または非営利組織の非商業研究用途のみ(SuperPointをキーポイント検出器として使用しているため暗黙的に適用) |
モデルのソース
- リポジトリ:https://github.com/cvg/LightGlue
- 論文:http://arxiv.org/abs/2306.13643
- デモ:https://colab.research.google.com/github/cvg/LightGlue/blob/main/demo.ipynb
使用シーン
LightGlueは、コンピュータビジョンにおける特徴マッチングと姿勢推定タスク向けに設計されています。様々な多視点幾何学の問題に適用でき、挑戦的な現実の屋内および屋外環境を処理することができます。ただし、物体検出や画像分類など、異なるタイプの視覚理解を必要とするタスクでは、性能が低下する可能性があります。
🔧 技術詳細
訓練の詳細
LightGlueは、姿勢推定用の大規模な注釈付きデータセットで訓練されており、姿勢推定の事前知識を学習し、3Dシーンを推論することができます。訓練データは、真の対応関係を持つ画像ペアと、真の姿勢と深度マップから導出された未マッチングのキーポイントで構成されています。
LightGlueは、SuperGlueの教師あり訓練設定に従います。まず、100万枚の画像からサンプリングされた合成ホモグラフィーを使用して事前訓練されます。この拡張方法は、完全でノイズのない監督を提供しますが、細かい調整が必要です。その後、LightGlueはMegaDepthデータセットを使用して微調整されます。このデータセットは、196の観光名所を描いた100万枚の众包画像を含み、カメラキャリブレーションと姿勢はSfMで復元され、密集深度は多視点立体視で復元されています。
訓練ハイパーパラメータ
速度、サイズ、時間
LightGlueは効率的に設計されており、最新のGPU上でリアルタイムに実行できます。画像ペアの場合、順伝播に約44ミリ秒(22 FPS)かかります。このモデルは1370万個のパラメータを持ち、他のいくつかの深層学習モデルと比較して比較的コンパクトです。LightGlueの推論速度はリアルタイムアプリケーションに適しており、最新の同時定位と地図構築(SLAM)または構造から運動復元(SfM)システムに簡単に統合できます。
📄 ライセンス
このモデルのライセンスは、学術または非営利組織の非商業研究用途のみ(SuperPointをキーポイント検出器として使用しているため暗黙的に適用)です。
引用
BibTeX:
@inproceedings{lindenberger2023lightglue,
author = {Philipp Lindenberger and
Paul-Edouard Sarlin and
Marc Pollefeys},
title = {{LightGlue: Local Feature Matching at Light Speed}},
booktitle = {ICCV},
year = {2023}
}
モデルカード作成者
Steven Bucaille