
Самое совершенное в мире программное обеспечение для геолокации изображений на уровне улиц
Современная AI-геолокация по одному изображению.
Идея • Как это работает • Начало работы • Сообщество • Установка
У вас есть фотография. Может быть, это скриншот из видео. Может быть, это обрезанное, размытое фото с телефона, которое кто-то выложил в интернет. Возможно, на ней изображён только витрина магазина, участок дороги или угол здания. Вы хотите узнать точно, где это было снято.
Netryx Astra V2 отвечает на этот вопрос.
Это система геолокации с открытым исходным кодом, которая берет одно изображение и находит точные GPS-координаты, сопоставляя его с базой данных панорам уличного обзора. Загрузите своё фото, и в течение нескольких минут она сообщит вам улицу, город, координаты — с точностью до нескольких метров.
Что отличает V2 от оригинального Netryx (и от других существующих инструментов) — это конвейер сопоставления. Мы перестроили всё с нуля, используя две модели, которых не существовало, когда мы начинали этот проект:
MegaLoc (CVPR 2025) — самая точная модель поиска изображений для распознавания мест, обученная на шести наборах данных, охватывающих внутренние и внешние сцены, день, ночь и сезонные изменения. Она находит нужный район.
MASt3R (ECCV 2024) — 3D-осознанный плотный матчер, который понимает геометрию сцен, а не только шаблоны пикселей. Он подтверждает точное местоположение даже на частичных или сильно обрезанных фотографиях, которые сломали бы традиционные матчеры.
В результате получился трёхэтапный конвейер, который проще и точнее девятиэтапной системы, которую он заменил.
Оригинальный Netryx использовал CosPlace для поиска и стек из DISK + LightGlue + LoFTR + RANSAC + дескрипторный хоппинг + расширение окрестности для проверки. Это работало, но было хрупким — множество эвристик, наложенных друг на друга, каждая из которых была обходным путём для ограничений предыдущего этапа.
V2 выбросил всё это. Вот что заменило что:
Упрощение — не только эстетическое. Меньше этапов означает меньше мест, где что-то может пойти не так, более быстрый поиск и код, который действительно можно поддерживать.
Конвейер состоит из трёх этапов. Это не упрощение — он действительно состоит из трёх этапов.
Query Image
│
▼
┌─────────────┐
│ MegaLoc │ "Где в городе это может быть?"
│ Retrieval │
└─────┬───────┘
│ Топ-500 кандидатов
▼
┌─────────────┐
│ MASt3R │ "Действительно ли это то же самое место?"
│ Matching │
└─────┬───────┘
│ Оценённые кандидаты
▼
┌─────────────┐
│ Spatial │ "Какой кластер совпадений наиболее заслуживает доверия?"
│ Consensus │
└─────┬───────┘
│
▼
📍 GPS Координаты
Ваше запрашиваемое изображение преобразуется в компактный дескриптор — 8448-мерный вектор, который фиксирует визуальную суть сцены. Он уменьшается по PCA до 1024 измерений, затем сравнивается с каждым проиндексированным местоположением через скалярное произведение.
Мы также извлекаем дескриптор для слегка увеличенного центрального кадра и для горизонтально отражённой версии запроса, затем объединяем результаты. Это обрабатывает случаи, когда запрос имеет другой уровень увеличения или направлен в противоположную сторону от индексированного обзора.
Результат — топ-500 местоположений-кандидатов из индекса, отсортированных по визуальному сходству.
MegaLoc создан в лаборатории Габриэле Бертона (той же группе, которая создала CosPlace и EigenPlaces). Это последняя работа в их линейке, обученная на наборах данных SF-XL, GSV-Cities, MSLS и landmark retrieval одновременно. Ни одна другая модель поиска не превосходит её стабильно во всех бенчмарках — внутренние, внешние, городские, сельские, день, ночь.
Для каждого из этих 500 кандидатов мы загружаем соответствующую панораму улицы, обрезаем её под угол направления индексации и запускаем MASt3R для поиска плотных соответствий пикселей между запросом и обрезком.
Здесь и происходит волшебство для сложных запросов. Традиционные матчеры, такие как SuperPoint + LightGlue, извлекают, возможно, 500-2000 разреженных ключевых точек и пытаются сопоставить их. Если ваше запрашиваемое изображение перекрывается с изображением из базы данных только на 20%, может быть всего 50 совместно видимых ключевых точек — недостаточно для надёжного совпадения.
MASt3R работает совершенно иначе. Он рассматривает сопоставление как задачу 3D-реконструкции, предсказывая плотные карты точек и локальные дескрипторы признаков для каждого пикселя. Даже небольшая область перекрытия даёт сотни надежных соответствий, потому что он понимает 3D-структуру сцены, а не только 2D-шаблоны пикселей.
На бенчмарке Map-free localization (одно эталонное изображение, изменение точки обзора до 180°) MASt3R превосходит предыдущие методы на 30%. Это не инкрементное улучшение — это скачок поколений.
Вот проблема с выбором только кандидата с наибольшей оценкой совпадения: существуют ложные срабатывания. Два одинаковых ресторанных сети в 5 км друг от друга будут давать высокие оценки MASt3R. Ряд советских многоквартирных домов выглядят одинаково.
Пространственный консенсус решает это. Мы делим область поиска на ячейки сетки размером ~50 метров и группируем все хорошие совпадения географически. Каждая ячейка получает оценку на основе совокупных доказательств от всех совпадений в этой ячейке и её соседях.
Один выброс с 200 внутренними точками в неправильном месте проигрывает кластеру из 5 совпадений с 80-150 внутренними точками каждое в правильном месте. Лучшее совпадение выигрывающего кластера становится окончательным ответом.
Вот почему точность сохраняется даже при больших радиусах поиска, где больше похожих мест.
На этом снимке мы можем наблюдать, что нет абсолютно никакой зацепки, это просто маленькая обрезанная часть. Традиционный OSINT здесь бы полностью провалился. Тем не менее Netryx Astra определила точные координаты без каких-либо метаданных или подсказок, работая полностью локально.
Маленькое обрезанное изображение здания — и этого было достаточно, чтобы найти его местоположение в радиусе 1 км в Москве.
Это та часть, которая нас больше всего радует.
Индексация города занимает часы вычислительного времени. Расточительно, чтобы каждый пользователь самостоятельно индексировал один и тот же город. Поэтому мы построили систему обмена: один человек индексирует Москву, загружает результат, а все остальные скачивают его за минуты.
Самый быстрый способ. Кто-то уже проделал работу по индексации — вы просто скачиваете его готовый индекс.
Установите режим Поиск, нажмите Запустить поиск и выберите запрашиваемое изображение. Координаты карты и радиус поиска автоматически заполняются из метаданных индекса. Эта функция работает только если сообщество вносит вклад и поддерживает друг друга: если вы индексируете регион, мы будем очень благодарны, если вы загрузите его.
ВАЖНОЕ ПРИМЕЧАНИЕ: если приложение зависает из-за нехватки памяти при выполнении PCA, используйте эту команду в терминале! python3 -c "from test_super import build_compact_index; build_compact_index()"
Хотите проиндексировать город или район, который ещё никто не сделал? Приложение обрабатывает всё — загрузку панорам, извлечение дескрипторов, построение поискового индекса.
python test_super.py
Что происходит под капотом: приложение генерирует сетку точек в пределах радиуса, находит все доступные местоположения панорам, загружает каждую панораму как тайлы и сшивает их, обрезает каждую панораму под несколькими углами направления, извлекает дескрипторы MegaLoc для каждой обрезки, подгоняет PCA на всех дескрипторах и строит компактный поисковый индекс.
У вас есть файл .netryx от друга, с сервера Discord или по ссылке для скачивания? Просто нажмите 📥 Импортировать индекс в приложении, выберите файл, и вы готовы к поиску. Никакой учётной записи не требуется, интернет не нужен — это полностью офлайн-рабочий процесс.
Индексы размещены на Hugging Face Hub как публичные наборы данных. Любой может скачать без учётной записи. Для внесения вклада (загрузки) требуется бесплатная учётная запись Hugging Face.
Из GUI: Нажмите кнопку 🌐 Сообщество, чтобы просмотреть, найти и скачать доступные индексы. Нажмите ⬆ Загрузить текущий индекс, чтобы поделиться своим.
Пакеты индексов используют формат .netryx — ZIP-архив, содержащий:
При экспорте географическая фильтрация происходит автоматически. Если ваш индекс содержит Москву + Париж + Токио, но вы экспортируете "Москва 1 км", в пакет попадут только записи о Москве. Вы можете вырезать конкретные регионы из более крупного индекса без какой-либо ручной работы.
Не хотите использовать 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, email, 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 для нереализованных операций, monkey-patching .view() → .reshape() для непоследовательных тензоров и очистка кэша MPS во время длительных операций индексации.
Если у вас Mac на M1/M2/M3/M4, он будет автоматически использовать ускорение GPU. Никакой настройки не требуется.
Вам нужно будет вручную установить rocm/pytorch для вашего конкретного устройства в виртуальное окружение после запуска скрипта установки.
Используйте сборки 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-dim (создаются при индексации)
└── index/ # Компактный поисковый индекс
├── megaloc_descriptors.npy # Дескрипторы, уменьшенные по PCA
├── metadata.npz # Координаты, направления, ID панорам
├── megaloc_pca.pkl # Модель PCA для преобразования запроса во время поиска
└── manifest.json # Присутствует, если скачано из Сообщества
# Внешняя зависимость (клонируется отдельно, НЕ внутри этого репозитория):
../mast3r/ # https://github.com/naver/mast3r
Вы можете настроить эти параметры в test_super.py при необходимости. Значения по умолчанию хорошо работают для большинства случаев использования.
Основное, что вы, возможно, захотите изменить — это INDEX_TARGET_DIM: снижение до 512 уменьшает размер индекса вдвое с потерей точности всего ~2-3%.
Мы верим в честность относительно того, что этот инструмент может и не может делать.
Он находит только те места, которые есть в индексе. Если местоположение не было проиндексировано вами или загружено из сообщества, оно не будет найдено. Ни одна модель, какой бы продвинутой она ни была, не может сопоставлять с данными, которых не существует. Потолок точности задаётся покрытием, а не моделями.
Повторяющаяся архитектура вызывает ложные срабатывания. Сетевые магазины, пригородные жилые комплексы, ряды одинаковых многоквартирных домов — они действительно выглядят одинаково с уровня улицы. Пространственный консенсус помогает (кластер близлежащих совпадений превосходит один изолированный выброс), но это не панацея, особенно при больших радиусах поиска (10 км+), где больше похожих кандидатов. Это нерешённая проблема в данной области, а не ограничение, присущее Netryx.
Пробелы в покрытии существуют в некоторых областях. Сельские районы, развивающиеся страны, новостройки и внутренние помещения могут иметь ограниченные или отсутствующие изображения уровня улицы для индексации.
Это не система реального времени. Запуск MASt3R на 500 кандидатов занимает несколько минут на потребительском GPU. Она предназначена для криминалистического анализа — журналистских расследований, документирования прав человека, OSINT-исследований, расследований страхового мошенничества — а не для навигации или отслеживания в реальном времени.
Индексация требует значительных вычислительных ресурсов. Магистраль DINOv2 в MegaLoc примерно в 5 раз тяжелее, чем магистраль CosPlace, использовавшаяся в V1. Индексация радиуса 1 км занимает ~20-30 минут. Полный город (10 км+) — это работа на всю ночь. Вот почему существует Сообщество — чтобы эти затраты были оплачены один раз и разделены. Кроме того, совпадение с наибольшим количеством внутренних точек не обязательно является правильным совпадением, поэтому возвращается несколько результатов, которые вы можете перепроверить самостоятельно.
Если вы используете 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.
Веса 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 | Плотное 3D-сопоставление MASt3R |
| Обработка крайних случаев | LoFTR fallback, дескрипторный хоппинг, расширение окрестности, Ultra Mode | Пространственный консенсус — и всё |
| Всего этапов пайплайна | 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 | Сколько кандидатов MegaLoc пропускать через MASt3R |