Как я писал трекинг парковочных мест
Здесь предисловие. Это мой первый пост на Хабре, да и вообще первая публикация в стиле, в котором я постараюсь все разложить по полочкам и рассказать с какими трудностями, я новичок во всей этой теме (студент второго курса) столкнулся и как я их решил (возможно примитивно).
Идея
Передо мной появилась задача сделать отслеживание занятых парковочных мест. Очевидно, что ее нужно как-то было разбить на подзадачи и они опять же довольно очевидные:
Детектирование автомобилей
Распознавание парковочных мест
Соединить это всё вместе
В каждом из этих пунктов у меня возникали вопросы либо проблемы, с некоторыми из которых я довольно долго бодался. Перейдем к ним!
Проблемы, с которыми столкнулся
С детектированием автомобилей возникал сразу вопрос, а какую модель использовать? Тут я метался очень сильно. Первое, что знал и что очень хорошо работало — это YOLOv7, даже на процессоре она выдавала довольно хорошую производительность (хотя в нашем деле это и не так важно, но все же), но за слабым бэкграундом я не смог до конца переделать код, который был в документации, поэтому отложил это в сторону (в планах есть перейти на YOLO). Дальше мой выбор пал на фреймворк OpenVINO, в котором есть предобученные модели от самого intel и публичные. Сразу скажу, что пробовал только модели от Intel, т.к не хотел долго разбираться с публичными, а в них кажется всё работает как-то чуть иначе, но не суть. Но модели от Intel были не готовы распознавать машины при виде сверху от слова совсем. Ниже пример :)
Результат работы сетки от Intel
Мной было стратегическое решение найти что-то довольно простое и более-менее удобное в использовании. Это стала библиотека torchvision! Там есть предобученные веса (что в целом было везде), но мне было довольно просто с этим разобраться, чтобы хотя бы просто начать. В итоге за основу я взял модель Fast RCNN, которая как мне кажется, ну оооочень медленная, но зато даёт результат, которого не так тяжело добиться! Ниже уже FRCNN даёт результат
Результат работы FRCNN
Да, во всяком случае она определяет машины как телефоны, но в моём решении это не было важно, сейчас объясню почему.
Парковочные места
Следующей мыслью уже было: «А как же мне понять, где парковочное место?» Моё решение очень тривиальное! Просто его разметить! Очевидно, что у этого способа многовато недостатков в виде сдвига камеры, трудозатрат и всякого подобного. Но обучить модель определять парковочные места мне кажется будет довольно сложно, т.к места либо никак не размечены на парковке, либо они под снегом, либо под грязью + опять же всё упиралось в то, что я хотел сделать максимально быстро и максимально просто, чтобы была первая версия, а дальше уже доработать. В общем я принял такую логику работы своего проекта.
Логика
А она очень проста. Я нахожу центр bounding box’a и если этот центр находится в размеченном парковочном месте, то оно занято, если машина вне это прямоугольника, то оно свободно. Чем хорош и плох этот способ? В моем понимании он хорош, если в сжатые сроки и максимально просто нужно решить задачу. Если применять к реальной жизни — это будет работать хорошо, когда камера висит перпендикулярно парковке, всё четко видит без всяких наклонов. На практике такое встречается довольно редко. То есть следующая передо мной задача стоит как понимать где парковочное место. Как раз на Хабре я натыкался на публикацию, где это решили методом: если машина находится на месте какое-то время, то там парковочное место. Опять же это закономерно и логично, но мне еще предстоит подумать над реализацией этого всего
Итог
В итоге я получил простенький код, который считает свободные парковочные места, причем очень точно если камера находится ровно перпендикулярно над парковкой, но от этого и имеет ряд недостатков, с которыми мне еще предстоит побороться. Так же буду ждать советов, как можно было сделать лучше и где. Оставляю ссылку на github этого проекта. Накидайте звездочек, если не тяжело) На данный момент результат, которого мне удалось достичь показан ниже (красные bb — парковочные места, зеленые точки занятые парковочные места) Если машина не отмечена совсем, то она не стоит на парковочном месте (то есть я его не разметил)
Финальный результат