
世界で最も洗練されたストリートレベル画像ジオロケーションソフトウェア
一枚の画像から、最先端のAI地理特定。
アイデア • 仕組み • はじめに • コミュニティハブ • インストール
あなたは写真を持っている。動画のスクリーンショットかもしれない。誰かがオンラインに投稿した、トリミングされぼやけた携帯電話の写真かもしれない。店先、道路の一部、または建物の角だけが写っているかもしれない。あなたはそれが正確にどこで撮影されたのか知りたい。
Netryx Astra V2はその質問に答える。
これはオープンソースの地理特定システムで、一枚の画像を、ストリートビューのパノラマデータベースと照合して正確なGPS座標を見つけ出す。写真をアップロードすれば、数分以内に通り、都市、座標が数メートル単位で表示される。
V2がオリジナルのNetryx(および他のツール)と異なる点は、マッチングパイプラインにある。私たちはこのプロジェクトを開始した時点では存在しなかった2つのモデルを使用して、すべてをゼロから再構築した。
その結果、置き換えた9段階のシステムよりもシンプルで正確な3段階パイプラインが実現した。
オリジナルのNetryxは、検索にCosPlace、検証にDISK + LightGlue + LoFTR + RANSAC + 記述子ホッピング + 近傍拡張のスタックを使用していた。動作はしたが、脆弱だった。多くのヒューリスティックが積み重なり、それぞれが前段階の制限を回避するためのものであった。
V2はそれらをすべて捨てた。以下が置き換えの内訳である。
単純化は見た目だけではない。段数が少ないということは、問題が発生する箇所が減り、検索が高速化し、コードが実際に保守可能になることを意味する。
パイプラインは3段階。誇張ではなく、本当に3段階だけである。
Query Image
│
▼
┌─────────────┐
│ MegaLoc │ "Where in the city could this be?"
│ Retrieval │
└─────┬───────┘
│ Top 500 candidates
▼
┌─────────────┐
│ MASt3R │ "Is this actually the same place?"
│ Matching │
└─────┬───────┘
│ Scored candidates
▼
┌─────────────┐
│ Spatial │ "Which cluster of matches is most trustworthy?"
│ Consensus │
└─────┬───────┘
│
▼
📍 GPS Coordinates
クエリ画像はコンパクトな記述子(8448次元のベクトル)に変換され、シーンの視覚的な本質を捉える。これをPCAで1024次元に削減し、ドット積類似度でインデックス内のすべての位置と比較する。
また、クエリ画像を少しズームインした中央クロップと水平反転版の記述子も抽出し、結果を統合する。これにより、クエリがインデックス画像と異なるズームレベルや逆向きの場合も対応できる。
出力は、視覚的類似度でランク付けされた上位500件の候補位置である。
MegaLocはGabriele Bertonの研究室(CosPlaceやEigenPlacesを開発したグループ)による最新の成果で、SF-XL、GSV-Cities、MSLS、ランドマーク検索データを同時に学習している。屋内、屋外、都市、田舎、昼、夜のすべてのベンチマークで一貫して最高性能を達成する他の検索モデルは存在しない。
500件の候補それぞれについて、対応するストリートビューパノラマをダウンロードし、インデックスされた方位角でクロップし、MASt3Rを実行してクエリとクロップ間の高密度なピクセル対応を見つける。
これが難しいクエリに対する魔法である。従来のマッチャー(SuperPoint + LightGlueなど)はせいぜい500~2000のスパースキーポイントを抽出しマッチングを試みる。クエリ画像がデータベース画像と20%しか重なっていない場合、共視キーポイントは50個程度しかなく、信頼できるマッチングには不十分である。
MASt3Rは全く異なる方法で動作する。マッチングを3D再構成問題として扱い、すべてのピクセルに対して高密度な点群マップと局所特徴記述子を予測する。小さな重なり領域でも、シーンの3D構造を理解しているため、数百の信頼できる対応が得られる。これは単なる2Dピクセルパターンではない。
Map-free localizationベンチマーク(単一参照画像、視点変更最大180度)では、MASt3Rは従来手法を30%上回る性能を示した。これは漸進的な改善ではなく、世代を超えた飛躍である。
最大マッチングスコアの候補を選ぶだけの問題は、偽陽性が存在することである。5km離れた同一のチェーンレストランは両方とも高いMASt3Rスコアを生み出す。ソビエト時代のアパート群はすべて同じに見える。
空間コンセンサスがこれを解決する。検索エリアを約50メートルのグリッドセルに分割し、すべての良いマッチを地理的にクラスタリングする。各セルは、そのセルと隣接セル内のすべてのマッチからの総合的な証拠に基づいてスコア付けされる。
間違った場所に200のインライアを持つ単一の外れ値は、正しい場所にそれぞれ80~150のインライアを持つ5つのマッチのクラスターに負ける。勝ったクラスター内の最良のマッチが最終回答となる。
これが、より多くの類似位置が存在する大半径の検索でも精度が維持される理由である。
この写真では、手がかりとなるものが全くない。小さくトリミングされた部分だけである。従来のOSINTはここで完全に失敗する。しかしNetryx Astraは、メタデータや事前の手がかりなしに完全ローカルで実行し、正確な座標まで特定した。
建物の小さなトリミング写真。モスクワで半径1km以内の位置を見つけるにはこれだけで十分だった。
これが私たちが最も興奮している部分である。
都市のインデックス作成には数時間の計算時間がかかる。すべてのユーザーが同じ都市を個別にインデックスするのは無駄である。そこで共有システムを構築した。誰かがモスクワをインデックスし、結果をアップロードすれば、他の全員が数分でダウンロードできる。
最も速い方法。誰かがすでにインデックス作業を行っており、あなたはその事前構築済みインデックスをダウンロードするだけ。
モードをSearchに設定し、Run Searchをクリックし、クエリ画像を選択する。地図座標と検索半径はインデックスのメタデータから自動入力される。この機能はコミュニティが貢献し互いにサポートする場合にのみ機能する。もしあなたが地域をインデックスしたなら、それをアップロードしていただければ感謝される。
重要: PCAの適合中にアプリケーションがメモリ不足でフリーズした場合は、ターミナルで以下のコマンドを使用してください! python3 -c "from test_super import build_compact_index; build_compact_index()"
まだ誰もインデックスしていない都市や地域をインデックスしたいですか?アプリがパノラマのダウンロード、記述子の抽出、検索インデックスの構築まで全て処理する。
python test_super.py
内部で行われていること: アプリは半径内のグリッドポイントを生成し、利用可能なパノラマ位置をすべて見つけ、各パノラマをタイルとしてダウンロードして合成し、各パノラマを複数の方位角でクロップし、各クロップからMegaLoc記述子を抽出し、すべての記述子にPCAを適合させ、コンパクトな検索インデックスを構築する。
友人、Discordサーバー、ダウンロードリンクから.netryxファイルを入手した場合、アプリで📥 Import Indexをクリックし、ファイルを選択するだけで検索準備完了。アカウント不要、インターネット不要、完全オフラインワークフロー。
インデックスはHugging Face Hubに公開データセットとしてホストされている。誰でもアカウントなしでダウンロードできる。貢献(アップロード)には無料のHugging Faceアカウントが必要。
GUIから: 🌐 Community Hubボタンをクリックして、利用可能なインデックスを閲覧、検索、ダウンロード。⬆ Upload Current Indexをクリックして自分のインデックスを共有。
インデックスバンドルは.netryx形式を使用。ZIPアーカイブで以下を含む:
エクスポート時には地理的フィルタリングが自動で行われる。インデックスにモスクワ+パリ+東京が含まれていても、「モスクワ1km」をエクスポートすればモスクワのエントリのみが含まれる。大規模インデックスから特定の地域を手作業なしでスライスできる。
Hugging Faceを使いたくない場合、ファイルをエクスポートして好きな方法で共有する:
# エクスポート
python netryx_hub.py export \
--index-dir ./netryx_data/index \
-o moscow_1km.netryx \
--city moscow --radius 1 --lat 55.75 --lon 37.62
# Discord、メール、Google Driveなどでファイルを送信
# 相手がインポート
python netryx_hub.py import moscow_1km.netryx -o ./netryx_data/index
Mac / Linux:
git clone https://github.com/sparkyniner/Netryx-Astra-V2-Geolocation-Tool.git
cd netryx-astra-v2
chmod +x setup.sh && ./setup.sh
source venv/bin/activate
python3 test_super.py
Windows:
git clone https://github.com/sparkyniner/netryx-astra-v2.git
cd netryx-astra-v2
次に**setup.batをダブルクリックしてすべてインストール。完了したらrun.bat**をダブルクリックして起動。
以上。セットアップスクリプトが仮想環境を作成し、すべての依存関係をインストールし、リポジトリの隣にMASt3Rをクローンし、モデルの重みを事前ダウンロードする。手動設定は不要。
MASt3Rの重みは初回実行時にHugging Faceから自動ダウンロードされる。
フォルダ構造は以下のようになる:
some_folder/
├── netryx-astra-v2/ # このリポジトリ
│ ├── test_super.py
│ ├── megaloc_utils.py
│ ├── mast3r_utils.py
│ ├── netryx_hub.py
│ └── ...
└── mast3r/ # 別途クローン
├── mast3r/
├── dust3r/
└── ...
mast3r_utils.pyは実行時に隣接するmast3r/ディレクトリを自動的に検出してインポートする。パスの設定は不要。
すべてがApple Siliconでそのまま動作する。コードはMPSの癖を自動的に処理する。未実装の演算に対するCPUフォールバック、非連続テンソルに対する.view() → .reshape()のモンキーパッチ、長時間のインデックス作成時のMPSキャッシュクリーンアップなど。
M1/M2/M3/M4 Macをお持ちなら、自動的にGPUアクセラレーションが使用される。設定不要。
インストールスクリプト実行後、自分のデバイス用のrocm/pytorchを手動でvenvにインストールする必要がある。
デバイスに応じてTheRockのpytorchビルドを使用: https://github.com/ROCm/TheRock/blob/main/RELEASES.md#installing-pytorch-python-packages
例えば、RX7xxxシリーズカードの場合:
pip install --index-url https://rocm.nightlies.amd.com/v2/gfx110X-all/ torch torchaudio torchvision
注意: ユーザーがrenderグループに属していることを確認:
sudo usermod -aG render <userid>
ベースドライバがインストールされていること: https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/quick-start.html#amd-gpu-driver-installation
netryx-astra-v2/
├── test_super.py # メインアプリケーション — GUI、パイプライン、すべて
├── megaloc_utils.py # MegaLocモデル読み込み、記述子抽出、PCA
├── megaloc_model.py # 自己完結型MegaLocアーキテクチャ(torch.hubが失敗した場合のフォールバック)
├── mast3r_utils.py # MASt3R読み込みと高密度マッチング
├── netryx_hub.py # コミュニティハブ — アップロード、ダウンロード、エクスポート、インポート
├── README.md
├── LICENSE
└── requirements.txt
# 実行時に作成される(gitにはコミットしない):
netryx_data/
├── megaloc_parts/ # 生の8448次元記述子チャンク(インデックス作成中に生成)
└── index/ # コンパクト検索インデックス
├── megaloc_descriptors.npy # PCA削減済み記述子
├── metadata.npz # 座標、方位角、panoid ID
├── megaloc_pca.pkl # クエリ時変換用のPCAモデル
└── manifest.json # コミュニティハブからダウンロードした場合に存在
# 外部依存関係(別途クローン、このリポジトリ内には配置しない):
../mast3r/ # https://github.com/naver/mast3r
必要に応じてtest_super.py内の以下のパラメータを調整できる。デフォルト値はほとんどのユースケースで適切に動作する。
おそらく調整したい主なパラメータはINDEX_TARGET_DIMで、512に下げるとインデックスサイズが半分になり、精度低下は約2~3%に抑えられる。
このツールでできることとできないことについて、率直に説明する責任があると考えている。
インデックスに含まれる場所しか見つけられない。 あなた自身かコミュニティがインデックスしていない場所は見つからない。どんなに高度なモデルでも、存在しないデータとマッチングすることはできない。精度の上限はモデルではなくカバレッジによって決まる。
反復的な建築物は偽陽性を引き起こす。 チェーン店、郊外の住宅開発、同一のアパート群 — これらは街頭レベルで本当に同じように見える。空間コンセンサスは役立つ(近くのマッチのクラスターは単一の孤立した外れ値に勝る)が、特に検索半径が大きい場合(10km以上)は類似候補が増えるため、絶対確実ではない。これはNetryx固有の制限ではなく、この分野における未解決の問題である。
一部の地域ではカバレッグにギャップがある。 農村部、発展途上国、新しく開発された地区、屋内空間では、インデックス作成に利用可能な街頭画像が限られているか、存在しない場合がある。
これはリアルタイムシステムではない。 500件の候補に対してMASt3Rを実行するには、コンシューマーGPUで数分かかる。これはフォレンジック分析(調査報道、人権文書化、OSINT調査、保険詐欺調査)向けに設計されており、ナビゲーションやライブ追跡向けではない。
インデックス作成にはそれなりの計算リソースが必要。 MegaLocのDINOv2バックボーンはV1で使用されたCosPlaceバックボーンの約5倍の重さである。半径1kmのインデックス作成には約20~30分かかる。都市全体(10km以上)は一晩の作業である。そのため、コミュニティハブが存在する。このコストを一度だけ支払い、共有するためである。また、最も多くのインライアを持つマッチが必ずしも正しいマッチとは限らないため、複数の結果が返され、自分でクロスチェックできるようになっている。
Netryx Astra V2を研究や仕事で使用する場合は、引用をいただけると幸いです:
@software{netryx_astra_v2,
title={Netryx Astra V2: State-of-the-Art AI Geolocation},
author={Sairaj Balaji},
year={2026},
url={https://github.com/yourusername/netryx-astra-v2}
}
MIT License。詳細はLICENSEを参照。
MegaLocの重みはMITライセンス。MASt3RはApache 2.0ライセンス。DINOv2はApache 2.0ライセンス。コミュニティ共有インデックスはCC-BY-4.0。
Sairaj Balaji によって構築されました
PrismXも開発。 Fast Company · 404 Media · Deutsche Welle で紹介されました
| V1(オリジナル) | V2(Astra) |
|---|
| 候補の検出 | CosPlace(ResNet-50, 512-dim) | MegaLoc(DINOv2 ViT-B/14, 8448-dim → PCA 1024) |
| マッチの確認 | DISK + LightGlue + RANSAC | MASt3R 高密度3Dマッチング |
| エッジケースの処理 | LoFTRフォールバック、記述子ホッピング、近傍拡張、ウルトラモード | 空間コンセンサス — それだけ |
| 総パイプライン段数 | 9以上 | 3 |
| 部分画像マッチング | 弱い — スパースキーポイントは重なりが小さいと失敗 | 強い — MASt3Rが小さな領域でも高密度な対応を見つける |
| インデックスの共有 | 不可能 | Hugging Face + オフラインの .netryx バンドルによるコミュニティハブ |
| パラメータ | デフォルト | 説明 |
|---|
INDEX_TARGET_DIM | 1024 | PCA出力次元。512 = インデックスが小さくなるが精度がやや低下。1024 = バランス良好。 |
MAX_PANOID_WORKERS | 16 | インデックス作成中に並列ダウンロードするパノラマの最大数 |
MAX_DOWNLOAD_WORKERS | 100 | 同時タイルダウンロード接続数(各パノラマ=8タイル) |
EARLY_EXIT_INLIER_THRESHOLD | 450 | MASt3Rがこれだけの高密度マッチを見つけたら早期終了 — 確実なヒットと判断 |
MAST3R_STAGE2_TOP_N | 500 | MASt3Rで処理するMegaLoc候補の最大数 |