
Le logiciel de géolocalisation d'images de rue le plus sophistiqué au monde
Géolocalisation IA de pointe à partir d'une seule image.
L'idée • Comment ça marche • Pour commencer • Hub communautaire • Installation
Vous avez une photographie. Peut-être une capture d'écran d'une vidéo. Peut-être une photo floue et recadrée prise par téléphone, postée en ligne. Peut-être qu'elle montre juste une devanture de magasin, un tronçon de route ou le coin d'un bâtiment. Vous voulez savoir exactement où elle a été prise.
Netryx Astra V2 répond à cette question.
C'est un système de géolocalisation open-source qui prend une seule image et trouve les coordonnées GPS précises en la comparant à une base de données de panoramas Street View. Téléchargez votre photo, et en quelques minutes, il vous indique la rue, la ville, les coordonnées – à quelques mètres près.
Ce qui distingue V2 du Netryx original (et des autres outils disponibles), c'est le pipeline de correspondance. Nous avons tout reconstruit de zéro en utilisant deux modèles qui n'existaient pas lorsque nous avons commencé ce projet :
MegaLoc (CVPR 2025) – le modèle de récupération d'images le plus précis pour la reconnaissance de lieux, entraîné sur six ensembles de données couvrant les variations intérieures, extérieures, diurnes, nocturnes et saisonnières. Il trouve le bon quartier.
MASt3R (ECCV 2024) – un matcher dense sensible à la 3D qui comprend la géométrie des scènes, pas seulement les motifs de pixels. Il confirme l'emplacement exact, même à partir de photos partielles ou fortement recadrées qui briseraient les matchers traditionnels.
Le résultat est un pipeline en trois étapes à la fois plus simple et plus précis que le système en neuf étapes qu'il remplace.
L'original Netryx utilisait CosPlace pour la récupération et une pile de DISK + LightGlue + LoFTR + RANSAC + saut de descripteurs + expansion de voisinage pour la vérification. Cela fonctionnait, mais c'était fragile – beaucoup d'heuristiques superposées, chacune étant une solution de contournement pour une limitation de l'étape précédente.
V2 a jeté tout cela. Voici ce qui a remplacé quoi :
La simplification n'est pas seulement esthétique. Moins d'étapes signifie moins d'endroits où les choses peuvent mal tourner, des recherches plus rapides et un code réellement maintenable.
Le pipeline comporte trois étapes. Ce n'est pas une simplification excessive – c'est vraiment juste trois étapes.
Query Image
|
v
+-------------+
| MegaLoc | "Où dans la ville cela pourrait-il être ?"
| Retrieval |
+------+------+
| Top 500 candidats
v
+-------------+
| MASt3R | "Est-ce vraiment le même endroit ?"
| Matching |
+------+------+
| Candidats notés
v
+-------------+
| Spatial | "Quel groupe de correspondances est le plus fiable ?"
| Consensus |
+------+------+
|
v
Coordonnées GPS
Votre image de requête est convertie en un descripteur compact – un vecteur de 8448 dimensions qui capture l'essence visuelle de la scène. Il est réduit par PCA à 1024 dimensions, puis comparé à chaque emplacement indexé via une similarité par produit scalaire.
Nous extrayons également un descripteur pour un recadrage central légèrement zoomé et pour une version retournée horizontalement de la requête, puis fusionnons les résultats. Cela gère les cas où la requête est à un niveau de zoom différent ou orientée dans la direction opposée par rapport à la vue indexée.
Le résultat est la liste des 500 emplacements candidats les plus proches de l'index, classés par similarité visuelle.
MegaLoc provient du laboratoire de Gabriele Berton (le même groupe qui a créé CosPlace et EigenPlaces). C'est le plus récent de leurs travaux, entraîné simultanément sur SF-XL, GSV-Cities, MSLS et des données de repères. Aucun autre modèle de récupération ne le bat systématiquement sur tous les benchmarks – intérieur, extérieur, urbain, rural, jour, nuit.
Pour chacun de ces 500 candidats, nous téléchargeons le panorama Street View correspondant, le recadrons à l'angle de cap indexé, et exécutons MASt3R pour trouver des correspondances denses de pixels entre la requête et le recadrage.
C'est là que la magie opère pour les requêtes difficiles. Les matchers traditionnels comme SuperPoint + LightGlue extraient peut-être 500 à 2000 points clés épars et tentent de les faire correspondre. Si votre image de requête ne chevauche qu'à 20 % l'image de la base de données, il peut n'y avoir que 50 points clés co-visibles – pas assez pour une correspondance fiable.
MASt3R fonctionne complètement différemment. Il traite la correspondance comme un problème de reconstruction 3D, en prédisant des cartes de points denses et des descripteurs de caractéristiques locales pour chaque pixel. Même une petite région de chevauchement produit des centaines de correspondances fiables, car il comprend la structure 3D de la scène, et non seulement les motifs de pixels 2D.
Sur le benchmark Map-free localization (image de référence unique, changements de point de vue jusqu'à 180°), MASt3R bat les méthodes précédentes de 30 %. Ce n'est pas une amélioration incrémentale – c'est un bond générationnel.
Voici le problème si l'on se contente de choisir le candidat avec le score de correspondance le plus élevé : les faux positifs existent. Deux chaînes de restaurants identiques à 5 km de distance produiront toutes deux des scores MASt3R élevés. Une rangée d'immeubles soviétiques se ressemblent tous.
Le consensus spatial résout cela. Nous divisons la zone de recherche en cellules de grille d'environ 50 mètres et regroupons géographiquement toutes les bonnes correspondances. Chaque cellule reçoit un score basé sur les preuves combinées de toutes les correspondances dans cette cellule et ses voisines.
Un seul candidat aberrant avec 200 inliers au mauvais endroit est surpassé par un groupe de 5 correspondances avec 80 à 150 inliers chacune au bon endroit. La meilleure correspondance du groupe gagnant devient la réponse finale.
C'est pourquoi la précision reste élevée même aux grands rayons de recherche où il y a plus d'emplacements similaires.
Nous pouvons observer sur cette image qu'il n'y a absolument rien sur quoi s'appuyer, ce n'est qu'une petite partie recadrée. L'OSINT conventionnel échouerait complètement ici. Pourtant, Netryx Astra l'a géolocalisé jusqu'à ses coordonnées exactes, sans aucune métadonnée ni indice préalable, en s'exécutant entièrement en local.
Une petite image recadrée d'un bâtiment, cela a suffi pour trouver son emplacement dans un rayon de 1 km à Moscou.
C'est la partie qui nous enthousiasme le plus.
Indexer une ville prend des heures de calcul. Il est inutile que chaque utilisateur indexe indépendamment la même ville. Nous avons donc construit un système de partage : une personne indexe Moscou, télécharge le résultat, et tout le monde le télécharge en quelques minutes.
Le moyen le plus rapide. Quelqu'un d'autre a déjà fait le travail d'indexation – vous téléchargez simplement son index pré-construit.
Réglez le mode sur Recherche, cliquez sur Lancer la recherche, et sélectionnez votre image de requête. Les coordonnées cartographiques et le rayon de recherche se remplissent automatiquement à partir des métadonnées de l'index. Cette fonctionnalité fonctionne uniquement si la communauté contribue et se soutient mutuellement. Si vous indexez une région, nous vous serons tous reconnaissants si vous la téléchargez.
NOTE IMPORTANTE : si l'application se bloque en raison d'un manque de mémoire lors de l'ajustement de la PCA, utilisez cette commande dans le terminal ! python3 -c "from test_super import build_compact_index; build_compact_index()"
Vous souhaitez indexer une ville ou une zone que personne n'a encore faite ? L'application gère tout – téléchargement des panoramas, extraction des descripteurs, construction de l'index de recherche.
python test_super.py
Ce qui se passe sous le capot : l'application génère une grille de points dans le rayon, trouve tous les emplacements panoramiques disponibles, télécharge chaque panorama sous forme de tuiles et les assemble, recadre chaque panorama sous plusieurs angles de cap, extrait les descripteurs MegaLoc pour chaque recadrage, ajuste la PCA sur tous les descripteurs et construit un index de recherche compact.
Vous avez un fichier .netryx d'un ami, d'un serveur Discord ou d'un lien de téléchargement ? Cliquez simplement sur 📥 Importer l'index dans l'application, sélectionnez le fichier, et vous êtes prêt à chercher. Pas besoin de compte, pas besoin d'internet – c'est un workflow entièrement hors ligne.
Les index sont hébergés sur Hugging Face Hub en tant qu'ensembles de données publics. N'importe qui peut les télécharger sans compte. Contribuer (télécharger) nécessite un compte Hugging Face gratuit.
Depuis l'interface graphique : Cliquez sur le bouton 🌐 Hub communautaire pour parcourir, rechercher et télécharger les index disponibles. Cliquez sur ⬆ Télécharger l'index actuel pour partager le vôtre.
Les bundles d'index utilisent le format .netryx – une archive ZIP contenant :
Lorsque vous exportez, le filtrage géographique se fait automatiquement. Si votre index contient Moscou + Paris + Tokyo mais que vous exportez "Moscou 1 km", seules les entrées de Moscou sont incluses. Vous pouvez découper des régions spécifiques d'un index plus vaste sans aucun travail manuel.
Vous ne voulez pas utiliser Hugging Face ? Exportez et partagez simplement le fichier comme vous le souhaitez :
# Exporter
python netryx_hub.py export \
--index-dir ./netryx_data/index \
-o moscow_1km.netryx \
--city moscow --radius 1 --lat 55.75 --lon 37.62
# Envoyer le fichier via Discord, email, Google Drive, peu importe
# L'autre personne importe
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
Double-cliquez ensuite sur setup.bat pour tout installer. Une fois terminé, double-cliquez sur run.bat pour lancer.
C'est tout. Le script de configuration crée un environnement virtuel, installe toutes les dépendances, clone MASt3R à côté du dépôt et pré-télécharge les poids du modèle. Aucune configuration manuelle nécessaire.
Les poids de MASt3R se téléchargent automatiquement depuis Hugging Face lors de la première exécution.
La structure de vos dossiers devrait ressembler à ceci :
some_folder/
├── netryx-astra-v2/ # Ce dépôt
│ ├── test_super.py
│ ├── megaloc_utils.py
│ ├── mast3r_utils.py
│ ├── netryx_hub.py
│ └── ...
└── mast3r/ # Cloné séparément
├── mast3r/
├── dust3r/
└── ...
mast3r_utils.py trouve et importe automatiquement le répertoire adjacent mast3r/ à l'exécution. Aucune configuration de chemin nécessaire.
Tout fonctionne sur Apple Silicon dès la sortie de la boîte. Le code gère automatiquement les particularités de MPS – repli CPU pour les opérations non implémentées, correction de .view() → .reshape() pour les tenseurs non contigus, et nettoyage du cache MPS lors des longues exécutions d'indexation.
Si vous avez un Mac M1/M2/M3/M4, il utilisera automatiquement l'accélération GPU. Aucune configuration nécessaire.
Vous devrez installer rocm/pytorch pour votre périphérique spécifique manuellement dans le venv après avoir exécuté le script d'installation.
Utilisez les builds TheRock pytorch pour votre périphérique : https://github.com/ROCm/TheRock/blob/main/RELEASES.md#installing-pytorch-python-packages
Pour installer par exemple, pour les cartes série RX7xxx :
pip install --index-url https://rocm.nightlies.amd.com/v2/gfx110X-all/ torch torchaudio torchvision
NOTE : assurez-vous que l'utilisateur fait partie du groupe render :
sudo usermod -aG render <userid>
et que le pilote de base est installé : 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 # Application principale – interface graphique, pipeline, tout
├── megaloc_utils.py # Chargement du modèle MegaLoc, extraction de descripteurs, PCA
├── megaloc_model.py # Architecture MegaLoc autonome (solution de repli si torch.hub échoue)
├── mast3r_utils.py # Chargement de MASt3R et correspondance dense
├── netryx_hub.py # Hub communautaire – téléchargement, téléchargement, export, import
├── README.md
├── LICENSE
└── requirements.txt
# Créé à l'exécution (non commité dans git) :
netryx_data/
├── megaloc_parts/ # Morceaux de descripteurs bruts 8448-dim (créés lors de l'indexation)
└── index/ # L'index de recherche compact
├── megaloc_descriptors.npy # Descripteurs réduits par PCA
├── metadata.npz # Coordonnées, caps, ID panoid
├── megaloc_pca.pkl # Modèle PCA pour la transformation lors de la requête
└── manifest.json # Présent si téléchargé depuis le Hub communautaire
# Dépendance externe (clonée séparément, PAS à l'intérieur de ce dépôt) :
../mast3r/ # https://github.com/naver/mast3r
Vous pouvez ajuster ces paramètres dans test_super.py si nécessaire. Les valeurs par défaut fonctionnent bien pour la plupart des cas d'utilisation.
La principale chose que vous pourriez vouloir ajuster est INDEX_TARGET_DIM – le passer à 512 réduit de moitié la taille de votre index avec seulement ~2-3 % de perte de précision.
Nous croyons qu'il est important d'être honnête sur ce que cet outil peut et ne peut pas faire.
Il ne trouve que les endroits qui sont dans l'index. Si un emplacement n'a pas été indexé par vous ou téléchargé depuis la communauté, il ne sera pas trouvé. Aucun modèle, aussi avancé soit-il, ne peut faire correspondre des données qui n'existent pas. Le plafond de précision est fixé par la couverture, pas par les modèles.
L'architecture répétitive provoque des faux positifs. Les chaînes de magasins, les lotissements de banlieue, les rangées d'immeubles identiques – ceux-ci se ressemblent vraiment au niveau de la rue. Le consensus spatial aide (un groupe de correspondances proches bat un seul isolé aberrant), mais ce n'est pas infaillible, surtout avec de grands rayons de recherche (10 km+) où il y a plus de candidats similaires. C'est un problème non résolu dans le domaine, pas une limitation spécifique à Netryx.
Il existe des lacunes de couverture dans certaines zones. Les zones rurales, les pays en développement, les quartiers nouvellement construits et les espaces intérieurs peuvent avoir une imagerie de rue limitée ou inexistante pour l'indexation.
Ce n'est pas un système temps réel. L'exécution de MASt3R sur 500 candidats prend plusieurs minutes sur un GPU grand public. Cet outil est conçu pour l'analyse forensique – journalisme d'investigation, documentation des droits de l'homme, recherche OSINT, enquête sur les fraudes à l'assurance – pas pour la navigation ou le suivi en direct.
L'indexation nécessite une puissance de calcul significative. Le backbone DINOv2 de MegaLoc est environ 5 fois plus lourd que celui de CosPlace utilisé dans V1. L'indexation d'un rayon de 1 km prend environ 20 à 30 minutes. Une ville entière (10 km+) est un travail de nuit. C'est pourquoi le Hub communautaire existe – pour que ce coût soit payé une fois et partagé. De plus, la correspondance avec le plus d'inliers n'est pas nécessairement la bonne correspondance, c'est pourquoi elle renvoie plusieurs résultats que vous pouvez recouper vous-même.
Si vous utilisez Netryx Astra V2 dans votre recherche ou votre travail, nous apprécierions une citation :
@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}
}
Licence MIT. Voir LICENSE pour les détails.
Les poids de MegaLoc sont sous licence MIT. MASt3R est sous licence Apache 2.0. DINOv2 est sous licence Apache 2.0. Les index partagés par la communauté sont sous licence CC-BY-4.0.
Construit par Sairaj Balaji
A également construit PrismX présenté dans Fast Company · 404 Media · Deutsche Welle
| V1 (Original) | V2 (Astra) |
|---|
| Trouver des candidats | CosPlace (ResNet-50, 512-dim) | MegaLoc (DINOv2 ViT-B/14, 8448-dim → PCA 1024) |
| Confirmer les correspondances | DISK + LightGlue + RANSAC | Correspondance dense 3D MASt3R |
| Gérer les cas limites | Repli LoFTR, saut de descripteurs, expansion de voisinage, Ultra Mode | Consensus spatial – c'est tout |
| Nombre total d'étapes du pipeline | 9+ | 3 |
| Correspondance d'image partielle | Faible – les points clés épars échouent sur de petits chevauchements | Forte – MASt3R trouve des correspondances denses dans de minuscules régions |
| Partage des index | Impossible | Hub communautaire via Hugging Face + bundles .netryx hors ligne |
| Paramètre | Défaut | Fonction |
|---|
INDEX_TARGET_DIM | 1024 | Dimension de sortie de la PCA. 512 = index plus petit, légèrement moins précis. 1024 = bon équilibre. |
MAX_PANOID_WORKERS | 16 | Combien de panoramas télécharger en parallèle lors de l'indexation |
MAX_DOWNLOAD_WORKERS | 100 | Connexions simultanées pour le téléchargement de tuiles (chaque pano = 8 tuiles) |
EARLY_EXIT_INLIER_THRESHOLD | 450 | Si MASt3R trouve autant de correspondances denses, arrêtez la recherche plus tôt – c'est un résultat fiable |
MAST3R_STAGE2_TOP_N | 500 | Combien de candidats MegaLoc passer à travers MASt3R |