Заказчик пришёл за целой стратегией цифровизации жилого комплекса в Москве. Мы работали над серией проектов, где умный паркинг — лишь малая часть. Но об остальном расскажу чуть позже.
Первое, что мы решили сделать — решить вопрос навигации. Проблема подземных парковок в том, что по ним очень тяжело ориентироваться из-за нескончаемого количества этажей и поворотов.
Когда мы сели думать, как решить эту боль, я сразу же вспомнил свою первую компьютерную игру — NFS Underground. Это игра в жанре аркадных автогонок, в которой путь машине игрока указывают неоновые стрелки.
Мы с командой сошлись во мнении, что это штука вообще-то гениальна, и пошли думать как всё это дело реализовать.
Мы не из тех ребят, которые просят заказчика всё самостоятельно организовать и обеспечить стабильный приход данных, а только потом приступают к задачам.
На проектах мы часто используем алгоритмы CV для обработки и анализа данных. Нам важно делать всё своими руками — устанавливать девайсы, тестировать решения и ошибаться.
На -1 этаже этого ЖК мы выделили зону, для тестов. А в кладовке организовали серверную часть.
Тут ничего нового выдумывать не пришлось — люди давно научились распознавать номера и лица.
Подобрали сервис, который устроил и нас по функционалу, и клиента по бюджету.
Собрали hardware device из четырех камер, колонок и звуковых датчиков.
Камеры направили по четырем плоскостям: две из них контролировали сам проезд и трекали машины, а ещё две — соседние парковочные места.
Установили Raspberry Pi и поставили отдельный сервер с GPU, чтобы считывать и стримить видеопоток с камер. А всю функциональность оркестрировал бэкенд.
Так как у Raspberry Pi четыре USB-разъема, мы решили, что подключить к нему все наши камеры, чтобы считывать видеопотоки — отличная идея.
Это решение оказалось главной ошибкой на проекте.
Нужно было создать систему, которая сможет качественно и без перебоев стримить все видеопотоки на сервер. Но уже на этапе тестов возникли проблемы.
Главная проблема была в USB-камерах — они отправляли на сервер не сжатые кадры. Из-за этого файлы не влезали в стандартный Ethernet.
Чтобы решить эту проблему, нам приходилось уменьшать frame rate и разрешение видео.
Ещё одна проблема была в том, что серверная часть находилась в 100 метрах от самого девайса.
И несмотря на то, что рядом с устройствами стоял коммутатор, расстояние не обрабатывалось и сигнал не проходил. Также помехи могли создавать силовые кабели вокруг парковки.
Как только мы переносили оборудование к устройствам — всё начинало работать.
Так, спустя несколько итераций, мы стали таскать с собой раскладные стулья и стол, чтобы прямо там сидеть и прогать.
Дружеский совет — заменяйте USB-камеры на сетевые, чтобы уменьшить лаги и нагрузку на сеть.
Идея была в том, что по LED-ленте будет бежать жучок и сопровождать машину до назначенного ей места.
Одна машина — один жучок, который гаснет на той части пути, которую водитель уже преодолел.
Чтобы трекать машину на уровне пикселей, мы разделили всё пространство на небольшие сектора — квадраты 3х3 со своим уникальным ID.
Разметили их футбольными конусами, просто потому что удобно.
Тут появился ещё один вопрос — а как навигировать машину так, чтобы она добралась до места, даже если водитель сбился с маршрута?
Сама лента тоже состоит из секторов. Мы связали определенные участки ленты с квадратами, чтобы понимать, какие отрезки ленты зажигать. А когда водитель сбивается с маршрута — отрабатывает алгоритм детекции.
Если машина должна находиться в другом секторе — автоматически отправляется сигнал на микроконтроллер, который включает другие светодиоды и перестраивает маршрут.
Тестировали точность и обучали модели ИИ на размеченных секторах.
И смогли определять, когда машина заняла часть соседнего квадрата, а значит — чужое место или участок дороги.
Никаких готовых решений этой задачи мы не нашли, поэтому стали думать как это реализовать самостоятельно.
Мы сразу учли, что в ЖК часто паркуются машины S-класса, которые могут не помещаться на своё место из-за длины машины. И трекали автомобили только относительно боковых границ парковки.
Сначала задаётся проекция машины на плоскость, затем модели нейросетей прогнозируют маску этой проекции.
Проекцию автомобиля получают с помощью машины с видеорегистратором, который отслеживает движение других автомобилей, чтобы проверить, выходит ли проекция за пределы допустимой линии.
Мы поняли, что если пойдём этим путём, то точно прогорим, потому что такой алгоритм не устойчив к высоте и углу, на котором будет расположена камера.
К тому же, большинство готовых датасетов заточены только под сами дороги, и их пришлось бы серьёзно дорабатывать.
Мы видим, что контур автомобиля выходит за пределы места. Это и стало ключом к решению нашей задачи. Зафиксировали эту мысль и на её основе разработали свой алгоритм.
Мы создали проекцию боковых линий машины на землю, чтобы проверять пересечения с границами парковочного места.
Чтобы построить эти линии, мы использовали алгоритм, который включает аппроксимацию по ключевым точкам и линейную регрессию.
При построении линий мы учли разные размеры машин и немного расширили границы линий, чтобы добавиться максимальной точности.
MVP-версия проекта удалась, и получилась даже лучше, чем мы предполагали. Проект всё ещё требует доработок, но основной функционал готов к реализации и использованию.
Общая стоимость проекта составила ~50k USD.
B подписывайтесь на наш телеграм. Там не будет новостей о новом ChatGPT и ответов на вопрос «Заменят ли нейросети человека». Будем рассказывать о разработке AI для ентерпрайза.