Я делаю Виртуальный музей архитектуры Сочи – интерактивный проект об архитектурном наследии города: 3D-модели зданий, AI-реставрации и исторические фотографии. Для этого я постоянно работаю с архивными снимками и в какой-то момент столкнулся с задачей, которая оказалась интереснее, чем я думал.
Если в двух словах о прототипе, решающем эту задачу: загружаете старое фото, отмечаете три узнаваемых объекта, вводите их координаты – браузер вычисляет откуда сделан снимок и показывает точку на карте.
🌐 Попробовать онлайн · GitHub
В прошлый раз я тестировал идею RAG-чата: скормил нейросети 40 статей ПИК и получил бота, который отвечает на вопросы по базе знаний. Теперь другая задача – из области истории города и архитектуры. Но подход тот же: взять конкретную боль, проверить гипотезу и собрать прототип.
Если вы не знаете, что такое Pastvu – это краудсорсинговый архив исторических фотографий с геолокацией. Миллионы снимков со всего мира, каждый привязан к точке на карте.
Но вот в чём проблема. Многие фотографии привязаны неточно или не привязаны вообще. Особенно панорамные снимки с возвышенностей. Когда в кадре весь город, иногда не совсем понятно, откуда именно сделан снимок. В комментариях к таким фото можно найти обсуждения, которые тянутся годами. Люди высказывают предположения, спорят, предлагают варианты. Иногда находят более точную локацию, а иногда нет.
В очередной раз я читал одну из таких дискуссий про одну из фотографий дореволюционного Сочи и подумал: подождите, это же можно решить геометрически. Если я вижу три узнаваемых объекта на снимке и знаю их координаты на карте, то можно математически вычислить точку, из которой был сделан снимок.
Представьте: вы берёте бумажную карту города, отмечаете три здания или точки, а затем вырезаете этот треугольник. Оставляете его лежащим на столе. Потом берёте в руки старую фотографию, на которой соединены эти же три здания. И начинаете ходить вокруг вырезанного треугольника, периодически поднося карту к глазам.
В какой-то момент форма треугольника на фото совпадёт с фрагментом карты. Это и есть ваша точка съёмки. И именно это я и хотел автоматизировать.
До создания прототипа, я не знал о том, что уже существует алгоритм решения. Задача называется Perspective-n-Point (PnP). Алгоритм итеративно перебирает возможные положения камеры в пространстве – координаты, высоту, азимут, угол наклона. Затем ищет то положение, при котором проекция известных точек на плоскость снимка совпадёт с тем, что отметил пользователь.
Я не профессиональный программист-разработчик. Я архитектор, которому интересны новые цифровые инструменты. Поэтому первый шаг был такой: написать подробный промпт в Google AI Studio и попросить сгенерировать прототип. Для первого теста идеи.
Результат почти не работал. Загрузка фото не срабатывала. Думаю, это было решаемо еще одной итерацией, до этого сервис выдавал мне интересные результаты. Но в этот раз я решил сохранить код и сразу передать его в Claude с просьбой найти проблемы. Он нашёл несколько критических багов: маркеры позиционировались неправильно, алгоритм использовал только X-координату точек, игнорируя Y. Исправил, запустил, заработало.
Дальше продолжил дорабатывать интерфейс, добавил фокусное расстояние (это добавляет точности для определения расстояния до точки съемки, об этом подробнее напишу дальше). Затем я несколько раз протестировал приложение.
Это был интересный момент. Фокусное расстояние объектива – это масштаб. Оно определяет, насколько "сжато" пространство на снимке. Без него задача не до конца определена: алгоритм не знает, находится ли камера близко с широкоугольным объективом или далеко с телевиком.
Я сделал поле для ручного ввода. По умолчанию стоит 50 мм – это стандартный объектив, который даёт угол зрения, близкий к человеческому. Для советских фотоаппаратов 1950-70-х годов это часто правильное значение. Я брал снимки дореволюционного Сочи, но в целом эти значения подошли.
Тест на реальном снимке Сочи показал следующее: при 50 мм точка съёмки оказалась чуть дальше реальной. Попробовал 40 мм – ближе. Поставил 35 мм и точка встала ровно туда, где её разместили на Pastvu. Это подтвердило, что алгоритм работает корректно, а фокусное расстояние реально влияет на результат.
Как узнать фокусное расстояние, если оно неизвестно? Есть два варианта: 1) Если снимок цифровой, оно часто записано в EXIF-данных файла; 2) Можно закинуть фото в любой бесплатный AI-чат и спросите: "Оцени примерное фокусное расстояние по перспективным линиям". Сегодняшние модели справляются с этим неплохо, протестировал. Можно также просто попробовать значения 35, 50, 85 мм. Для большинства архивных городских снимков это рабочий диапазон.
Интерфейс состоит из двух панелей. Слева – фото, справа – карта.
Загружаете историческую фотографию (перетащить или нажать)
Тыкаете на фото в узнаваемые объекты – появляются пронумерованные маркеры
К каждому маркеру вводите координаты объекта (можно скопировать из Яндекс Карт или Google Maps в формате десятичных градусов через запятую, например: "43.580913, 39.721456")
При желании уточняете фокусное расстояние
Нажимаете "Анализ"
На карте появляются: синие точки с известными координатами, треугольник между ними, иконка камеры на вычисленном месте съёмки, стрелка направления съёмки и круг погрешности.
Маркеры на фото можно перетаскивать после анализа и перезапускать расчет. Возможность двигать точки на карте пока не добавил, можно добавить в следующих версиях.
Тест №1
Тест №2
Тест №3
1) Для работы алгоритма нужно минимум три узнаваемых точки. Если на снимке видно только одно здание, то инструмент не поможет. Панорамные снимки с возвышенности подходят лучше всего: там обычно видно много объектов.
2) Точность зависит от геометрии треугольника. Если все три точки стоят рядом друг с другом или выстроены в одну линию, треугольник превращается почти в плоскость (на фото) и точность падает. Лучше, когда точки образуют широкий треугольник и разнесены по всему кадру.
3) Снимки с уровня улицы – это отдельный случай. Там объекты могут быть выше камеры. Для таких снимков нужно определять точки схода перспективы. Это возможно, но уже в следующей версии приложения.
4) Два объекта вместо трёх. Если узнаваемых точек только две, можно добавить третье ограничение – например, линию горизонта (но это лучше всего работает либо для прибрежных городов, где горизонт морской, либо там, где он действительно хорошо виден).
5) Точность сильно зависит от того как вы поставили маркеры на фото. Старайтесь нажимать в основание объекта – мысленно представьте где здание стоит на земле. Не в крышу, не в середину фасада. Если результат кажется неточным – подвигайте маркеры и запустите анализ повторно. Две-три итерации обычно заметно улучшают результат. В любом случае инструмент даёт быстрый старт: понять район и направление съёмки – это уже половина задачи.
Список того, что можно добавить (мини-roadmap):
Автоматическое определение фокусного расстояния по перспективным линиям зданий прямо в браузере
Режим для уличных снимков через точки схода перспективы
Режим "два объекта + горизонт"
Учёт рельефа местности (для горных городов вроде Сочи это особенно актуально)
Возможность ставить точки прямо на карте, а не вводить координаты вручную
Улучшение пользовательского опыта и интерфейса
Инструмент – это один HTML-файл без серверной части. Работает в браузере, данные никуда не отправляются. Можно запускать локально.
Стек:
Leaflet.js – интерактивная карта
CartoDB Voyager – тайлы карты
Vanilla JS – математические расчеты
PnP – основной алгоритм
Весь проект выложен на GitHub: Репозиторий проекта
Можно попробовать сразу онлайн: Photo-location-finder
Для меня это инструмент исследователя. Когда работаешь с архивными фотографиями города, то иногда трудно понять, откуда сделан снимок. Иногда это важнее самого снимка.
Для сообщества Pastvu и других подобных проектов – это может быть возможностью ускорить атрибуцию снимков, которые висят без точной локации годами.
Для краеведов и историков архитектуры – новый возможный инструмент в арсенале, который не требует специальных знаний и работает прямо в браузере.
Инструмент решает одну конкретную задачу и делает её неплохо. Прототип, это конечно, не финальный продукт, но он уже работает. Его нужно тестировать, возможны ошибки или другие баги. Если будет интерес и обратная связь, то возможно, смогу добавить новые функции.
Я архитектор, который делает цифровые прототипы. Я не программист.
Искусственный интеллект не заменит архитекторов с большим опытом, и считаю, что не заменит программиста с глубокой экспертизой в серьёзном продакшене. Но он позволяет людям с контекстом и идеями проверять гипотезы достаточно быстро. Для начала нужно понять задачу, сформулировать ее для себя, а потом попробовать довести до рабочего результата. Это по-прежнему человеческая работа. Возможно, в будущем что-то поменяется. Но пока AI просто убрал барьер между идеей и первым работающим прототипом.
Именно поэтому мне интересно это направление, и я продолжаю делать такие вещи.
Архитектор, член правления Союза архитекторов Сочи, лауреат «Зодчества» 2023, победитель Concept Awards 2024, создатель Виртуального музея архитектуры Сочи. Исследую применение AI в строительной отрасли, создаю цифровые прототипы.
Telegram: @vponomarev_ru - GitHub: github.com/vponomarev-tech - Проекты: vponomarev.ru - Виртуальный музей: @vmasochi
Источник


