Как давно вы пытались припарковаться в центральной части города или даже в собственном жилом комплексе? Думаю, вы понимаете, о чем я! Меня зовут Богдан Борисей, я — студент в IT Step University и один из авторов проекта Smart Parking. Наша разработка анализирует наличие свободных мест для парковки по видеопотоку IP-камер. Одну или несколько камер можно установить на открытой площадке, а ML-модели будут обрабатывать видеопоток и анализировать, где остались свободные места для парковки.
В этой статье мы расскажем об особенностях разработки проекта с компьютерным зрением и подводных камнях, которые просто не могли не возникнуть в процессе.
Компьютерное зрение и наш механизм обработки изображений
Для всех кто впервые слышит о компьютерном зрении, ловите определение из Википедии:
Компьютерное зрение — это междисциплинарная научная область, которая занимается тем, как компьютеры могут получить общее представление о цифровых изображениях или видео. С точки зрения инженерии, она стремится понять и автоматизировать задачи, которые может выполнять зрительная система человека.
Почти во всех приложениях, использующих компьютерное зрение, прослеживается примерно одинаковый процесс. Мы берем изображение, каким-то образом его обрабатываем и приводим в нужный нам вид. После чего оно пушится в ML-модель, где, собственно, и происходит вся «магия».
Мы не стали придумывать велосипед и тоже решили использовать этот подход, о чем ни разу не пожалели.
Первым делом нам нужно было как-то получить картинку с камеры. Для этой цели мы использовали VideoCapture из пакета OpenCV. Дальше пару шагов препроцесинга — и картинки готовы к использованию в модели. На этом моменте мы уперлись в стену.
Дело в том, что для качественного обучения нейронной сети нужно очень много размеченных изображений парковок, что уже само по себе сложно. Но это еще не все.
Для стабильного перформанса модели в реальном мире нужно собрать изображения с нескольких парковок, при разном освещении, с разной погодой и временем года.
Самое время упомянуть, что это был студенческий проект, и как вы уже догадались, ресурсами для таких масштабных телодвижений мы не обладали. Поэтому пришлось серфить на просторах интернета в поисках датасета, который бы подошел для наших целей.
Нам сказочно повезло, и мы нашли не только огроменный датасет на ~1М примеров, но и модель, которая была на нем натренирована.Как и все студенты, мы пошли путем наименьшего сопротивления и позаимствовали модель у наших менее ленивых коллег.
Вернемся к механизму обработки изображений. После того, как модель определила статусы мест для парковок, эта информация отправляется на сервер.
Архитектура и подключение
Как упоминалось выше, мы отправляем данные с камер на главный сервер, который начинает за ширмой с ними работать дальше. Это все выглядит нехитрым образом.
Сервер: что под капотом
Практически самый важный шаг — это сохранение полученной информации о свободных и занятых местах на парковке в базе данных, для того чтобы в результате не забыть их. Обычно на этом этапе появляются вопросы о том, как сохранять то, что мы собрали — к счастью, мы заранее продумали, как это все должно выглядеть, и создали в базе несколько таблиц с хорошо описанными взаимосвязями между ними.
Помимо всего прочего, важно, что этот главный сервер не выполняет обработку лично, а курирует передачу данных ответственным частям проекта, используя технологии, о которых сейчас и поговорим.
Технологии
За основу мы взяли базу данных PostgreSQL. Сам сервер, так называемый Core, работал на Python 3 вместе с веб-фреймворком Django 3.
REST API использовалось в основном для того, чтобы добавлять новые парковки, настраивать там парковочные места, а также и для видеопроцессора (работа которого мы описали в разделе о компьютерном зрении), чтобы он мог отправлять нам все, что распознал.
Выстраивание связей
Начнем с того, что сервер должен не просто получать и сохранять для себя информацию, но также передавать ее и другим частям проекта, которые выполняют свою важные функции. Способов и методик реализовать это довольно много. Наш взор пал на легкую и открытую библиотеку обмена сообщениями ZeroMQ.
Эта библиотека позволила управлять сокетами между нашими сервисами так, что это было похоже на обыкновенную почту: сервисы подписывались на рассылку (а в нашем случае — рассылались данные с парковки), а сервер отправлял по готовности свои условные письма.
Сервисы
Идея с Visual Board
Visual Board представляет собой экран, расположенный на въезде на парковку. Основная функция борда — упрощение процесса парковки для водителей за счет использования простой и понятной визуализации, которая показывает план парковки и все доступные места.
Доска отображает в реальном времени любые обновления, которые происходят на стоянке, например, когда автомобиль только что припарковался или покинул место. Таким образом парковка станет более эффективной и займет гораздо меньше времени.
Разработка веб-приложения
После доработки основной системы распознавания и передачи информации, было бы неплохо как-то предоставить это все конечному юзеру. Для этого планировалось создать мобильное приложение. Планы были грандиозные, но сроки поджимали, поэтому пришлось как-то выкручиваться.
Было решено создать SPA-приложение (Single Page Application) с помощью набирающего популярность концепта PWA (Progressive Web Application).
Это дало нам возможность иметь доступ к аппаратному обеспечению устройства, правда, с определенными ограничениями. Приложение было реализовано, как ни странно, на React, так как это, по нашему мнению, лучший инструмент для быстрой и качественной разработки сайта.
Приключения с выбором карты
Подготовительная работа окончена, пора перейти к главному гостю программы — выбору карты для отображения парковок. Сначала мы выбрали инструмент MapBox, он нам очень понравился, но проблем с ним было куда больше:
- Во-первых, тулза очень большая, и на слабых смартфонах были проблемы с оптимизацией (долгая загрузка, лаги при перемещении и т.п.).
- Во-вторых, даже после хоть какой то оптимизации коробки оставался открытый вопрос, как проложить путь от пользователя до заветной парковки. И как оказалось, библиотека, которая работает с прокладыванием путей в MapBox, не могла даже установиться! Мы нашли открытый код на GitHub, но ковыряться в нем оказалось себе дороже. После такого рода извращений, мы решили полностью заменить карту на старую добрую альтернативу от дядюшки Google. Да, она платная, но на процесс разработки нам с головой хватило трайала GCP. После установки Google Maps от проблем с оптимизацией и прокладыванием путей не осталось и следа.
Интеграция с сервисами
Естественно, сырая карта никому не нужна, так что настало время подключить другие сервисы. С помощью сервера мы получаем данные о парковках, точнее — о расположении парковок на карте, а также количестве свободных/занятых мест. Также для внутреннего просмотра парковки был внедрен описанный выше Visual Board — с его помощью пользователь всегда сможет посмотреть, где именно находятся свободные места.
Бороться с теми, кто не платит
PLPD (Parking Lot Payment Detection) — сервис, который поможет нам бороться с людьми, которые не хотят платить за парковку. Сервис использует библиотеку zeromq, для того чтобы проверять паркоместа только тогда, когда на них кто-то заезжает. Когда это происходит, PLPD ставит таймер на 15 минут для оплаты парковки, а по истечении времени отправляет оповещение.
Вместо итогов
Как видите, необязательно быть гуру Data Science или человеком со сверхчеловеческими познаниями в области компьютерного зрения, так как здесь обязательно пригодятся знания баз данных, фронтенда и прочих прелестей.
Как команда разноплановых разработчиков, можно создавать проекты которые объединяют, казалось бы, разные сферы IT: компьютерное зрение и фронтенд, «железо» и облачные технологии. Истина — в коммуникации между людьми.
Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: