Спутник для двора: как мы превратили 12 камер в панораму ЖК и научили её искать парковку

Всем привет! Меня зовут Александр Неварко, я выпускник МФТИ и Сколтеха, специалист по компьютерному зрению. Сейчас я – генеральный директор и сооснователь компании НКБТех, мы разрабатываем ИИ-решения с компьютерным зрением для бизнеса. Но этот проект я делал ещё как соло-разработчик в девелоперской компании «Самолет».

Этим рассказом я хочу открыть цикл статей о реальных кейсах. Сегодня о том, как мы создали «спутник» для жилого комплекса, чтобы решить проблему с парковкой.

Проблема: NPS и транспортный коллапс

Когда строительство ЖК завершено, его передают управляющей компании (УК). И вот тут начинается новая жизнь, где главный KPI – это удовлетворённость жителей (NPS). Практически в любом крупном комплексе есть три вечные головной боли: поиск свободного места для парковки, качество уборки снега и проезд для экстренных служб.

В одном из ЖК «Самолёта» случился настоящий транспортный коллапс. Машины стояли хаотично, жители тратили по 20 минут на поиск места, а УК не понимала, что происходит. Нужно было решение.

Идея: взгляд с высоты птичьего полёта

Мы хотели дать жителям и УК инструмент мониторинга. Самый логичный способ – повесить камеры и накрутить видеоаналитику. Но здесь возникает проблема масштабирования: чем больше камер, тем больше дорогих вычислительных ресурсов и затрат на прокладку коммуникаций.

Схема установки камер
Схема установки камер

Гуляя по сети, я наткнулся на кейсы Bird-Eye-View (вид сверху). Обычно это делают с помощью дронов или столбов. Но дроны не могут висеть вечно, а столбы – это дорого и некрасиво.

Тогда родилась идея: повесить камеры под крыши домов. С высоты 100 метров каждая камера охватывает огромную площадь. А если снимки с камер «склеить» в единую панораму, мы получим аналог спутникового снимка, но в высоком разрешении и обновляемый в реальном времени.

Для пилота взяли три дома. Повесили по 4 камеры на торцы (всего 12 штук) и покрыли почти 7 гектаров территории. Как показала практика, можно было обойтись и восемью – учтём на будущее.

Пример вида сверху на двор (источник: датасет <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fgithub.com%2FHMS97%2FEVD4UAV&postId=3004758" rel="nofollow noreferrer noopener" target="_blank">EVD4UAV</a>)
Пример вида сверху на двор (источник: датасет EVD4UAV)

Технические детали: как мы это сделали

Путь от «кучи камер» до «полезного бота» оказался нетривиальным. Вот основные шаги.

1. Калибровка и «выпрямление»

Камеры под крышей дают сильный эффект «рыбьего глаза» (дисторсию). Чтобы склеить их в плоскую картинку, нужно убрать искажения. Для этого мы снимали калибровочное видео с шахматной доской. Важный нюанс: камера должна прогреться до рабочей температуры, иначе на пиксельном уровне будут ошибки.

Оригинальная картинка с рыбьим глазом и с компенсацией искажений

2. Репроекция (перспектива)

Теперь нужно было «переложить» картинку с каждой камеры на плоскость земли. Эта задача давно решена в системах кругового обзора для автобусов и фур. Мы задали соответствие между точками на фото (углы зданий, столбы, дорожная разметка) и их реальными координатами из строительного плана. Алгоритм посчитал матрицу репроекции – и картинки стали похожи на снимок с дрона.

Пример исходных данных для расчета матриц репроекции (источник: <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fieeexplore.ieee.org%2Fdocument%2F6776674&postId=3004758" rel="nofollow noreferrer noopener" target="_blank">Spatio-temporal bird's-eye view images using multiple fish-eye cameras</a>)
Пример исходных данных для расчета матриц репроекции (источник: Spatio-temporal bird's-eye view images using multiple fish-eye cameras)

3. Склейка в панораму

После калибровки мы «сшили» 12 картинок в одну бесшовную панораму всего двора. Первым инсайтом стал недельный таймлапс: оказалось, что большинство машин вообще не двигаются. Так мы нашли «автохлам» –машины, занявшие места навсегда. Это дало пищу для размышлений и УК, и проектировщикам.

Недельный таймлапс двора 

Мониторинг парковок: первая версия

Имея панораму, мы решили подсвечивать для жителей свободные места. Сначала пошли по простому пути: нарисовали на картинке прямоугольники парковочных мест и обучили нейросеть-классификатор (ResNet14) определять, занято место или нет.

Разметка парковочных мест 
Разметка парковочных мест 

Натренировав модель на кропах с недельного таймлапса, мы получили точность 98%. В проде это давало 1–2 ошибки на каждые 280 мест – приемлемо.

Но тут мы столкнулись с «любимой» категорией водителей – «не такие как все». Машины, припаркованные по диагонали, поперёк разметки или вообще в неположенном месте. Статичная разметка против них была бессильна.

Необычное автовладельцы
Необычное автовладельцы

Вторая версия: YOLO и Oriented Bounding Boxes

Мы решили пойти другим путём. Вместо фиксированных прямоугольников – детектировать сами машины и уже в реальном времени вычислять, есть ли между ними место.

Детектирование места между машинами 
Детектирование места между машинами 

Взяли YOLOv8 с поддержкой Oriented Bounding Boxes (OBB). Это позволяет выделять машины повёрнутыми прямоугольниками, точно по контуру. Но своих данных для обучения было мало. На помощь пришёл открытый датасет EVD4UAV – 10 тысяч снимков с дронов, 245 тысяч размеченных машин. Мы докинули всего 30 своих фотографий, и модель подтянулась до Precision 0.95 и Recall 0.92.

Алгоритм по детектированным машинам внутри полигона парковки начал искать свободное пространство. Получилось элегантно и гибко.

Детектирование машин
Детектирование машин

Ночная проблема и итоговое решение

Ночью детекторная модель оказалась слабее: тёмные машины на тёмном асфальте она пропускала. Классификатор из первой версии работал лучше, так как цеплялся за блики фар и фонарей. Поэтому мы оставили обе версии, решив, что точность для пользователя важнее «красоты» алгоритма.

Интеграция и результат

Всё было упаковано в Docker-контейнер с двумя сервисами:

1. Генератор снимков – раз в 30 секунд склеивает панораму, прогоняет через модель и сохраняет готовую картинку.

2. Телеграм-бот – мгновенно отдаёт пользователю актуальную карту двора с подсветкой свободных мест.

Бот получил положительный фидбэк от жителей, а УК – новый инструмент контроля. Экономия времени на поиск парковки – до 15 минут в день.

Итоговая картинка для пользователя
Итоговая картинка для пользователя

Что дальше?

Этот проект стал базой. Теперь у нас есть уникальный «глаз сверху», который можно использовать для других задач:

  • контроль уборки снега и качества выполнения ЖКХ услуг;
  • отслеживание перекрытий движению для экстренных служб;
  • сигнализация о нештатных ситуациях;
  • маршрутизация курьеров и робокурьеров;
  • сигнализация о парковке в неположенном месте;
  • и многое другое)

В следующих статьях я расскажу о других неочевидных применениях компьютерного зрения в реальном секторе.

P.S. Подписывайтесь на наш телеграм-канал @nkb_tech, там мы показываем больше технических деталей и кейсов.

2