ru:https://highload.today/blogs/smart-parking-project/ ua:https://highload.today/uk/blogs/smart-parking-project/
logo
Machine Learning      04/11/2021

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

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

Студент в IT Step University

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

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

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

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

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

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

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

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

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

Первым делом нам нужно было как-то получить картинку с камеры. Для этой цели мы использовали VideoCapture из пакета OpenCV. Дальше пару шагов препроцесинга — и картинки готовы к использованию в модели. На этом моменте мы уперлись в стену.

Дело в том, что для качественного обучения нейронной сети нужно очень много размеченных изображений парковок, что уже само по себе сложно. Но это еще не все.

Для стабильного перформанса модели в реальном мире нужно собрать изображения с нескольких парковок, при разном освещении, с разной погодой и временем года.

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

Математика та статистика для Data Science.
Курс, на якому ви навчитеся проводити статистичний аналіз даних за допомогою Python та розвинете математичне мислення для розв'язання реальних завдань Data Science.
Більше про курс

Нам сказочно повезло, и мы нашли не только огроменный датасет на ~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 или человеком со сверхчеловеческими познаниями в области компьютерного зрения, так как здесь обязательно пригодятся знания баз данных, фронтенда и прочих прелестей.

Курс Fullstack Web Development.
Стань універсальним розробником, який може створювати веб-рішення з нуля.
Приєднатися

Как команда разноплановых разработчиков, можно создавать проекты которые объединяют, казалось бы, разные сферы IT: компьютерное зрение и фронтенд, «железо» и облачные технологии. Истина — в коммуникации между людьми.

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

Онлайн-курс Frontend-разробник.
Курс на якому ти напишеш свій чистий код на JavaScript, попрацюєш із різними видами верстки, а також адаптаціями проектів під будь-які екрани. .
Зарееструватися

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Топ-5 самых популярных блогеров февраля

Всего просмотровВсего просмотров
229
#1
Всего просмотровВсего просмотров
229
Всего просмотровВсего просмотров
209
#2
Всего просмотровВсего просмотров
209
QA в CodeGeeks Solutions
Всего просмотровВсего просмотров
156
#3
Всего просмотровВсего просмотров
156
Senior Project Manager at Nemesis
Всего просмотровВсего просмотров
99
#4
Всего просмотровВсего просмотров
99
Software Architect at Devlify
Всего просмотровВсего просмотров
95
#5
Всего просмотровВсего просмотров
95
Рейтинг блогеров

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: