Студенты во Львове сделали приложение для поиска парковки с помощью компьютерного зрения: как оно работает

Богдан Борисей

Как давно вы пытались припарковаться в центральной части города или даже в собственном жилом комплексе? Думаю, вы понимаете, о чем я! Меня зовут Богдан Борисей, я — студент в IT Step University и один из авторов проекта Smart Parking. Наша разработка анализирует наличие свободных мест для парковки по видеопотоку IP-камер. Одну или несколько камер можно установить на открытой площадке, а ML-модели будут обрабатывать видеопоток и анализировать, где остались свободные места для парковки.

В этой статье мы расскажем об особенностях разработки проекта с компьютерным зрением и подводных камнях, которые просто не могли не возникнуть в процессе.

Компьютерное зрение и наш механизм обработки изображений

Для всех кто впервые слышит о компьютерном зрении, ловите определение из Википедии:

Компьютерное зрение — это междисциплинарная научная область, которая занимается тем, как компьютеры могут получить общее представление о цифровых изображениях или видео. С точки зрения инженерии, она стремится понять и автоматизировать задачи, которые может выполнять зрительная система человека.

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

Мы не стали придумывать велосипед и тоже решили использовать этот подход, о чем ни разу не пожалели.

Так выглядит «магия» (CNR Park)

Первым делом нам нужно было как-то получить картинку с камеры. Для этой цели мы использовали 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: компьютерное зрение и фронтенд, «железо» и облачные технологии. Истина — в коммуникации между людьми.

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Останні статті

Токсичные коллеги. Как не стать одним из них и прекратить ныть

В благословенные офисные времена, когда не было большой войны и коронавируса, люди гораздо больше общались…

07.12.2023

Делать что-то впервые всегда очень трудно. Две истории о начале карьеры PM

Вот две истории из собственного опыта, с тех пор, когда только начинал делать свою карьеру…

04.12.2023

«Тыжпрограммист». Как люди не из ІТ-отрасли обесценивают профессию

«Ты же программист». За свою жизнь я много раз слышал эту фразу. От всех. Кто…

15.11.2023

Почему чат GitHub Copilot лучше для разработчиков, чем ChatGPT

Отличные новости! Если вы пропустили, GitHub Copilot — это уже не отдельный продукт, а набор…

13.11.2023

Как мы используем ИИ и Low-Code технологии для разработки IT-продукта

Несколько месяцев назад мы с командой Promodo (агентство инвестировало в продукт более $100 000) запустили…

07.11.2023

Университет или курсы. Что лучше для получения IT-образования

Пару дней назад прочитал сообщение о том, что хорошие курсы могут стать альтернативой классическому образованию.…

19.10.2023