
El software de geolocalización de imágenes a nivel de calle más sofisticado del mundo
Geolocalización por IA de última generación a partir de una sola imagen.
La idea • Cómo funciona • Primeros pasos • Community Hub • Instalación
Tienes una fotografía. Quizá sea una captura de pantalla de un vídeo. Quizá sea una foto de móvil recortada y borrosa que alguien publicó en línea. Quizá muestre solo un escaparate, un tramo de carretera o la esquina de un edificio. Quieres saber exactamente dónde se tomó.
Netryx Astra V2 responde a esa pregunta.
Es un sistema de geolocalización de código abierto que toma una sola imagen y encuentra las coordenadas GPS precisas comparándola con una base de datos de panorámicas de Street View. Sube tu foto y, en cuestión de minutos, te indica la calle, la ciudad y las coordenadas, hasta unos pocos metros.
Lo que diferencia a V2 del Netryx original (y de otras herramientas existentes) es el pipeline de emparejamiento. Reconstruimos todo desde cero usando dos modelos que no existían cuando empezamos este proyecto:
MegaLoc (CVPR 2025) — el modelo de recuperación de imágenes más preciso para el reconocimiento de lugares, entrenado con seis conjuntos de datos que cubren variaciones de interior, exterior, día, noche y estación. Encuentra el vecindario correcto.
MASt3R (ECCV 2024) — un emparejador denso con conciencia 3D que entiende la geometría de las escenas, no solo los patrones de píxeles. Confirma la ubicación exacta, incluso a partir de fotos parciales o muy recortadas que romperían a los emparejadores tradicionales.
El resultado es un pipeline de tres pasos que es a la vez más simple y más preciso que el sistema de nueve etapas al que reemplazó.
El Netryx original usaba CosPlace para la recuperación y una pila de DISK + LightGlue + LoFTR + RANSAC + salto de descriptores (descriptor hopping) + expansión de vecindario para la verificación. Funcionaba, pero era frágil: muchas heurísticas apiladas unas sobre otras, cada una como solución temporal a una limitación de la etapa anterior.
V2 tiró todo eso por la borda. Esto es lo que reemplazó a qué:
La simplificación no es solo estética. Menos etapas significa menos puntos donde algo pueda salir mal, búsquedas más rápidas y un código que de verdad se puede mantener.
El pipeline tiene tres etapas. No es una simplificación excesiva: es que de verdad son solo tres.
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
Tu imagen de consulta se convierte en un descriptor compacto: un vector de 8448 dimensiones que captura la esencia visual de la escena. Se reduce con PCA a 1024 dimensiones y luego se compara con cada ubicación indexada mediante similitud por producto punto.
También extraemos un descriptor para un recorte central ligeramente ampliado y para una versión reflejada horizontalmente de la consulta, y luego fusionamos los resultados. Esto cubre los casos en los que la consulta tiene un nivel de zoom diferente o está orientada en dirección opuesta a la vista indexada.
La salida son las 500 mejores ubicaciones candidatas del índice, ordenadas por similitud visual.
MegaLoc proviene del laboratorio de Gabriele Berton (el mismo grupo que creó CosPlace y EigenPlaces). Es lo más reciente de su línea de trabajo, entrenado simultáneamente con SF-XL, GSV-Cities, MSLS y datos de recuperación de landmarks. Ningún otro modelo de recuperación lo supera de forma consistente en todos los benchmarks: interior, exterior, urbano, rural, día y noche.
Para cada uno de esos 500 candidatos, descargamos la panorámica de Street View correspondiente, la recortamos en el ángulo de orientación (heading) indexado y ejecutamos MASt3R para encontrar correspondencias densas de píxeles entre la consulta y el recorte.
Aquí es donde ocurre la magia con las consultas difíciles. Los emparejadores tradicionales como SuperPoint + LightGlue extraen quizá entre 500 y 2000 keypoints dispersos e intentan emparejarlos. Si tu imagen de consulta solo se solapa un 20% con la imagen de la base de datos, quizá solo haya 50 keypoints co-visibles, insuficientes para una coincidencia fiable.
MASt3R funciona de forma completamente distinta. Trata el emparejamiento como un problema de reconstrucción 3D, prediciendo mapas de puntos densos y descriptores de características locales para cada píxel. Incluso una región de solapamiento pequeña produce cientos de correspondencias fiables, porque entiende la estructura 3D de la escena, no solo los patrones de píxeles en 2D.
En el benchmark de localización Map-free (una única imagen de referencia y cambios de punto de vista de hasta 180°), MASt3R supera a los métodos anteriores en un 30%. No es una mejora incremental: es un salto generacional.
Este es el problema de limitarse a elegir el candidato con la puntuación de coincidencia más alta: existen los falsos positivos. Dos restaurantes de cadena idénticos a 5 km de distancia producirán ambos puntuaciones altas de MASt3R. Una hilera de bloques de apartamentos de la era soviética se ve toda igual.
El consenso espacial resuelve esto. Dividimos el área de búsqueda en celdas de cuadrícula de ~50 metros y agrupamos geográficamente todas las coincidencias buenas. Cada celda recibe una puntuación basada en la evidencia combinada de todas las coincidencias de esa celda y sus vecinas.
Un único valor atípico con 200 inliers en la ubicación equivocada queda superado por un grupo de 5 coincidencias con 80-150 inliers cada una en la ubicación correcta. La mejor coincidencia del grupo ganador se convierte en la respuesta final.
Por eso la precisión se mantiene incluso con radios de búsqueda mayores, donde hay más ubicaciones de aspecto similar.
En esta imagen podemos observar que no hay absolutamente nada por donde empezar; es solo una pequeña parte recortada. El OSINT convencional fracasaría por completo aquí. Sin embargo, Netryx Astra la geolocalizó hasta sus coordenadas exactas, sin metadatos ni pistas previas, ejecutándose por completo en local.
Una pequeña foto recortada de un edificio: eso fue todo lo que hizo falta para encontrar su ubicación en un radio de 1 km en Moscú.
Esta es la parte que más nos entusiasma.
Indexar una ciudad requiere horas de cómputo. Es un desperdicio que cada usuario indexe la misma ciudad por separado. Así que construimos un sistema de intercambio: una persona indexa Moscú, sube el resultado y todos los demás lo descargan en minutos.
La vía más rápida. Alguien ya hizo el trabajo de indexación: tú solo descargas su índice preconstruido.
Configura el modo en Search, haz clic en Run Search y selecciona tu imagen de consulta. Las coordenadas del mapa y el radio de búsqueda se rellenan automáticamente desde los metadatos del índice. Esta función solo funciona si la comunidad contribuye y se apoya mutuamente; si indexas una región, todos te agradeceremos que la subas.
NOTA IMPORTANTE: si la aplicación se congela por quedarse sin memoria durante el ajuste del PCA, usa este comando en la terminal: python3 -c "from test_super import build_compact_index; build_compact_index()"
¿Quieres indexar una ciudad o zona que nadie ha hecho todavía? La aplicación se encarga de todo: descargar panorámicas, extraer descriptores y construir el índice de búsqueda.
python test_super.py
Lo que ocurre bajo el capó: la aplicación genera una cuadrícula de puntos dentro del radio, encuentra todas las ubicaciones de panorámicas disponibles, descarga cada panorámica por teselas y las une, recorta cada panorámica en varios ángulos de orientación, extrae los descriptores MegaLoc de cada recorte, ajusta el PCA sobre todos los descriptores y construye un índice de búsqueda compacto.
¿Tienes un archivo .netryx de un amigo, de un servidor de Discord o de un enlace de descarga? Solo tienes que hacer clic en 📥 Import Index en la aplicación, seleccionar el archivo y ya puedes buscar. No necesitas cuenta ni internet: es un flujo de trabajo totalmente sin conexión.
Los índices se alojan en Hugging Face Hub como conjuntos de datos públicos. Cualquiera puede descargarlos sin cuenta. Contribuir (subir) requiere una cuenta gratuita de Hugging Face.
Desde la GUI: haz clic en el botón 🌐 Community Hub para explorar, buscar y descargar los índices disponibles. Haz clic en ⬆ Upload Current Index para compartir el tuyo.
Los paquetes de índice usan el formato .netryx: un archivo ZIP que contiene:
Al exportar, el filtrado geográfico ocurre automáticamente. Si tu índice contiene Moscú + París + Tokio pero exportas "Moscow 1km", solo se incluyen las entradas de Moscú. Puedes extraer regiones concretas de un índice más grande sin ningún trabajo manual.
¿No quieres usar Hugging Face? Solo exporta y comparte el archivo como quieras:
# Export
python netryx_hub.py export \
--index-dir ./netryx_data/index \
-o moscow_1km.netryx \
--city moscow --radius 1 --lat 55.75 --lon 37.62
# Send the file via Discord, email, Google Drive, whatever
# Other person imports
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
Después, haz doble clic en setup.bat para instalar todo. Cuando termine, haz doble clic en run.bat para iniciarlo.
Y ya está. El script de configuración crea un entorno virtual, instala todas las dependencias, clona MASt3R junto al repositorio y descarga previamente los pesos del modelo. No se necesita configuración manual.
Los pesos de MASt3R se descargan automáticamente de Hugging Face en la primera ejecución.
Tu estructura de carpetas debería tener este aspecto:
some_folder/
├── netryx-astra-v2/ # This repo
│ ├── test_super.py
│ ├── megaloc_utils.py
│ ├── mast3r_utils.py
│ ├── netryx_hub.py
│ └── ...
└── mast3r/ # Cloned separately
├── mast3r/
├── dust3r/
└── ...
mast3r_utils.py encuentra e importa automáticamente el directorio mast3r/ adyacente en tiempo de ejecución. No se necesita configuración de rutas.
Todo funciona en Apple Silicon sin configuración adicional. El código gestiona automáticamente las peculiaridades de MPS: respaldo a CPU para operaciones no implementadas, monkey-patching de .view() → .reshape() para tensores no contiguos y limpieza de la caché de MPS durante indexaciones largas.
Si tienes un Mac M1/M2/M3/M4, usarás la aceleración por GPU automáticamente. No se necesita configuración.
Tendrás que instalar rocm/pytorch para tu dispositivo específico manualmente en el venv después de ejecutar el script de instalación.
Usa las compilaciones de pytorch de TheRock para tu dispositivo: https://github.com/ROCm/TheRock/blob/main/RELEASES.md#installing-pytorch-python-packages
Para instalar, por ejemplo, en tarjetas de la serie RX7xxx:
pip install --index-url https://rocm.nightlies.amd.com/v2/gfx110X-all/ torch torchaudio torchvision
NOTA: asegúrate de que el usuario pertenezca al grupo render:
sudo usermod -aG render <userid>
y de que el driver base esté instalado: 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 # Main application — GUI, pipeline, everything
├── megaloc_utils.py # MegaLoc model loading, descriptor extraction, PCA
├── megaloc_model.py # Self-contained MegaLoc architecture (fallback if torch.hub fails)
├── mast3r_utils.py # MASt3R loading and dense matching
├── netryx_hub.py # Community Hub — upload, download, export, import
├── README.md
├── LICENSE
└── requirements.txt
# Created at runtime (not committed to git):
netryx_data/
├── megaloc_parts/ # Raw 8448-dim descriptor chunks (created during indexing)
└── index/ # The compact search index
├── megaloc_descriptors.npy # PCA-reduced descriptors
├── metadata.npz # Coordinates, headings, panoid IDs
├── megaloc_pca.pkl # PCA model for query-time transformation
└── manifest.json # Present if downloaded from Community Hub
# External dependency (cloned separately, NOT inside this repo):
../mast3r/ # https://github.com/naver/mast3r
Puedes ajustar estos parámetros en test_super.py si lo necesitas. Los valores predeterminados funcionan bien para la mayoría de los casos de uso.
Lo principal que quizá quieras ajustar es INDEX_TARGET_DIM: bajarlo a 512 reduce el tamaño del índice a la mitad con solo una pérdida de precisión del ~2-3%.
Creemos en ser transparentes sobre lo que esta herramienta puede y no puede hacer.
Solo encuentra lugares que están en el índice. Si una ubicación no ha sido indexada por ti ni descargada de la comunidad, no se encontrará. Ningún modelo, por avanzado que sea, puede emparejar contra datos que no existen. El techo de precisión lo fija la cobertura, no los modelos.
La arquitectura repetitiva provoca falsos positivos. Las cadenas de tiendas, las urbanizaciones residenciales y las hileras de bloques de apartamentos idénticos realmente se ven iguales desde el nivel de la calle. El consenso espacial ayuda (un grupo de coincidencias cercanas supera a un único valor atípico aislado), pero no es infalible, especialmente con radios de búsqueda grandes (10 km o más), donde hay más candidatos de aspecto similar. Es un problema sin resolver en el campo, no una limitación específica de Netryx.
Existen vacíos de cobertura en algunas áreas. Las zonas rurales, los países en desarrollo, los barrios de nueva construcción y los espacios interiores pueden tener poca o ninguna imagen a nivel de calle disponible para indexar.
No es un sistema en tiempo real. Ejecutar MASt3R sobre 500 candidatos tarda varios minutos en una GPU de consumo. Está diseñado para el análisis forense — periodismo de investigación, documentación de derechos humanos, investigación OSINT, investigación de fraude de seguros — no para navegación ni seguimiento en vivo.
Indexar requiere una potencia de cómputo considerable. El backbone DINOv2 de MegaLoc es unas 5 veces más pesado que el backbone CosPlace usado en V1. Indexar un radio de 1 km tarda entre 20 y 30 minutos. Una ciudad entera (10 km o más) es trabajo de toda la noche. Para eso existe el Community Hub: para que ese coste se pague una sola vez y se comparta. Además, la coincidencia con más inliers no es necesariamente la correcta; por eso devuelve varios resultados para que puedas contrastarlos tú mismo.
Si usas Netryx Astra V2 en tu investigación o trabajo, agradeceríamos una cita:
@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}
}
Licencia MIT. Consulta LICENSE para más detalles.
Los pesos de MegaLoc tienen licencia MIT. MASt3R tiene licencia Apache 2.0. DINOv2 tiene licencia Apache 2.0. Los índices compartidos por la comunidad tienen licencia CC-BY-4.0.
Creado por Sairaj Balaji
También creó PrismX, presentado en Fast Company · 404 Media · Deutsche Welle
| V1 (Original) | V2 (Astra) |
|---|
| Búsqueda de candidatos | CosPlace (ResNet-50, 512-dim) | MegaLoc (DINOv2 ViT-B/14, 8448-dim → PCA 1024) |
| Confirmación de coincidencias | DISK + LightGlue + RANSAC | Emparejamiento 3D denso de MASt3R |
| Manejo de casos límite | Respaldo de LoFTR, salto de descriptores, expansión de vecindario, Ultra Mode | Consenso espacial, y ya está |
| Etapas totales del pipeline | 9+ | 3 |
| Emparejamiento de imágenes parciales | Débil: los keypoints dispersos fallan con solapamientos pequeños | Fuerte: MASt3R encuentra correspondencias densas en regiones diminutas |
| Compartir índices | No posible | Community Hub vía Hugging Face + paquetes .netryx sin conexión |
| Parámetro | Valor por defecto | Qué hace |
|---|
INDEX_TARGET_DIM | 1024 | Dimensión de salida del PCA. 512 = índice más pequeño, algo menos preciso. 1024 = buen equilibrio. |
MAX_PANOID_WORKERS | 16 | Cuántas panorámicas descargar en paralelo durante la indexación |
MAX_DOWNLOAD_WORKERS | 100 | Conexiones de descarga de teselas concurrentes (cada pano = 8 teselas) |
EARLY_EXIT_INLIER_THRESHOLD | 450 | Si MASt3R encuentra esta cantidad de coincidencias densas, detén la búsqueda antes de tiempo: es un acierto seguro |
MAST3R_STAGE2_TOP_N | 500 | Cuántos candidatos de MegaLoc pasar por MASt3R |