Как я писал трекинг парковочных мест +27


Здесь предисловие. Это мой первый пост на Хабре, да и вообще первая публикация в стиле, в котором я постараюсь все разложить по полочкам и рассказать с какими трудностями, я новичок во всей этой теме (студент второго курса) столкнулся и как я их решил (возможно примитивно).

Идея

Передо мной появилась задача сделать отслеживание занятых парковочных мест. Очевидно, что ее нужно как-то было разбить на подзадачи и они опять же довольно очевидные:

  • Детектирование автомобилей

  • Распознавание парковочных мест

  • Соединить это всё вместе

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

Проблемы, с которыми столкнулся

С детектированием автомобилей возникал сразу вопрос, а какую модель использовать? Тут я метался очень сильно. Первое, что знал и что очень хорошо работало - это YOLOv7, даже на процессоре она выдавала довольно хорошую производительность (хотя в нашем деле это и не так важно, но все же), но за слабым бэкграундом я не смог до конца переделать код, который был в документации, поэтому отложил это в сторону (в планах есть перейти на YOLO). Дальше мой выбор пал на фреймворк OpenVINO, в котором есть предобученные модели от самого intel и публичные. Сразу скажу, что пробовал только модели от Intel, т.к не хотел долго разбираться с публичными, а в них кажется всё работает как-то чуть иначе, но не суть. Но модели от Intel были не готовы распознавать машины при виде сверху от слова совсем. Ниже пример :)

Результат работы сетки от Intel
Результат работы сетки от Intel

Мной было принято стратегическое решение найти что-то довольно простое и более-менее удобное в использовании. Это стала библиотека torchvision! Там есть предобученные веса (что в целом было везде), но мне было довольно просто с этим разобраться, чтобы хотя бы просто начать. В итоге за основу я взял модель Fast RCNN, которая как мне кажется, ну оооочень медленная, но зато даёт результат, которого не так тяжело добиться! Ниже уже FRCNN даёт результат

Результат работы FRCNN
Результат работы FRCNN

Да, во всяком случае она определяет машины как телефоны, но в моём решении это не было важно, сейчас объясню почему.

Парковочные места

Следующей мыслью уже было: "А как же мне понять, где парковочное место?" Моё решение очень тривиальное! Просто его разметить! Очевидно, что у этого способа многовато недостатков в виде сдвига камеры, трудозатрат и всякого подобного. Но обучить модель определять парковочные места мне кажется будет довольно сложно, т.к места либо никак не размечены на парковке, либо они под снегом, либо под грязью + опять же всё упиралось в то, что я хотел сделать максимально быстро и максимально просто, чтобы была первая версия, а дальше уже доработать. В общем я принял такую логику работы своего проекта.

Логика

А она очень проста. Я нахожу центр bounding box'a и если этот центр находится в размеченном парковочном месте, то оно занято, если машина вне это прямоугольника, то оно свободно. Чем хорош и плох этот способ? В моем понимании он хорош, если в сжатые сроки и максимально просто нужно решить задачу. Если применять к реальной жизни - это будет работать хорошо, когда камера висит перпендикулярно парковке, всё четко видит без всяких наклонов. На практике такое встречается довольно редко. То есть следующая передо мной задача стоит как понимать где парковочное место. Как раз на Хабре я натыкался на публикацию, где это решили методом: если машина находится на месте какое-то время, то там парковочное место. Опять же это закономерно и логично, но мне еще предстоит подумать над реализацией этого всего

Итог

В итоге я получил простенький код, который считает свободные парковочные места, причем очень точно если камера находится ровно перпендикулярно над парковкой, но от этого и имеет ряд недостатков, с которыми мне еще предстоит побороться. Так же буду ждать советов, как можно было сделать лучше и где. Оставляю ссылку на github этого проекта. Накидайте звездочек, если не тяжело) На данный момент результат, которого мне удалось достичь показан ниже (красные bb - парковочные места, зеленые точки занятые парковочные места) Если машина не отмечена совсем, то она не стоит на парковочном месте (то есть я его не разметил)

Финальный результат
Финальный результат

PS. Ещё у меня есть свой телеграмм канал, в котором тоже порой бывает что-то интересное на подобные темы (у меня есть ещё мысль, разобрать так же проект, о котором есть пара слов на канале)




Комментарии (41):

  1. vadimr
    /#24974820 / +3

    Как мне кажется из водительского опыта, основная проблема состоит в том, что неправильно поставленная машина может занимать два и более парковочных мест.

    • vyunolbek
      /#24975472 / +2

      В таком случае наверное лучше использовать не критерий, если точка внутри BB, то занято, а если IoU больше какого-нибудь числа, то оно занято, отчасти это должно решить проблему

      • powernic
        /#24979358 / +1

        У меня сейчас похожий пет-проект. Как раз используется алгоритм - если машина заняло площадь парковки больше определенного значения. Работает с любым количеством камер а так же имеет онлайн режим. https://github.com/powernic/parking-lot-occupancy

        • vyunolbek
          /#24979452

          Супер! Спасибо)
          Но как я понял парковочные места у вас тоже размечены заранее?

          • powernic
            /#24979496 / +2

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

            • vyunolbek
              /#24979690

              Но в моем случае получается как-то не очень будто бы с IoU если подумать
              Потому что машины мне видно сбоку и одна машина может перейти за порог IoU для соседнего места, а оно будет свободным
              Может можно эту проблему как-то решить...

              • powernic
                /#24979818 / +2

                С ручной разметкой решается проще, нужно лишь правильно указать парковочное место(разметку положения автомобиля) и указать достаточно большой порог, чтобы соседнее место не считалось занятым

                • powernic
                  /#24979846 / +2

                  Но бывают очень большие машины - например грузовики, которые полностью перекрывают парковочное место, в таких случаях даже человек не определит есть ли там свободное место

                • vyunolbek
                  /#24979992

                  А есть какая-нибудь встроенная в torch функция, чтобы не писать свою?
                  Или вам это неизвестно?

                  • powernic
                    /#24980008 / +1

                    Я не работал с питоном и в частности torch. Распознаванием машин занимался отдельный сервис deepstack. Ui разметки, API, бизнес-логика приложения писалась своя

    • Segmentq
      /#24975990

      Машина может быть просто большая и занять несколько мест сразу.

  2. Exchan-ge
    /#24974822 / +7

    «А как же мне понять, где парковочное место?» Моё решение очень тривиальное! Просто его разметить!


    А потом народ начинает парковаться вкривь и вкось.
    Причем стоит только одному начать, чтобы процесс пошел по нарастающей.
    Более того, он еще и наследуемый :)

    Заголовок спойлера
    image

    • victor30608
      /#24974838 / +3

      Когда-то решал задачу аналогичную той, что предоставил автор. Для таких случаев у нас были "паттерны" расположения, т.е. мы собрали статистику за промежуток времени, а затем произвели разметку. Это позволяло учитывать случаи, когда люди криво паркуются. Итоговой алгоритм должен был выбрать лучший паттерн исходя из максимального числа свободных мест.
      Остался даже репозиторий - https://github.com/Vanna-IVision/IVISION_HACK.

      • Exchan-ge
        /#24974896 / +1

        Когда-то решал задачу аналогичную той, что предоставил автор


        «Передо мной появилась задача сделать отслеживание занятых парковочных мест» (с)

        Т.е. конкретная цель у задачи автором не указана.
        Могу поставить более точную — есть двор, с обширным паркингом, причем в виде аж пяти площадок, разнесенных в пространстве (по вертикали тоже :), так, что находясь на одной из них — нет никакой возможности узнать о наличии свободного месте на любой другой.

        Как результат, водители катаются из одного места в другое, ища свободную парковку (а процесс этот сложен, так как мест для разворота мало, а движение довольно интенсивное, особенно в определенный час, когда почти все возвращаются с работы.
        Получается и так, что после разворота и возврата — место уже оказывается занятым (есть практика бронирования путем оставления на месте супруги с сумками в качестве преграды :)
        При всем этом весь двор просматривается камерами видеонаблюдения.

        И тут у многих рождается идея для стартапа — системы, позволяющей находить автоматически свободные (или уже освобождающиеся места) и пересылающей эту инфу по запросу на мобильный водителя (например, через Телеграм).

        Причем так, чтобы человек уже в дороге знал, есть ли во дворе свободные места и надо ли ему искать другое место парковки.
        (загрузка парковок крайне нестабильная — может быть и днем все занято, а может быть — и в полночь есть свободные места).

        • funca
          /#24975168 / +1

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

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

          • Exchan-ge
            /#24975324 / +2

            то оценивать обстановку со свободными местами на них можно и глазками,


            Вот, буквально пять минут назад я сделал круг почета по двору. Свободные места заметны только тогда, когда уже проезжаешь мимо (а сзади тебя уже подпирает пара других машин). И главное — все мы проскочили мимо и дружно пошли на второй круг :)
            (местная особенность — маневрировать при заезде в парковочную щель удобно только на «Смарте». Всем остальным надо тщательно прицеливаться)

        • Newcss
          /#24975888

          Эм... А откуда вы планируете брать картинку обстановки? Коптер запускать?) Не проще поставить несколько камер с высоким разрешением, разметить картинку и без всякого ИИ получать инфу о свободных местах?

          • Exchan-ge
            /#24976256

            Эм… А откуда вы планируете брать картинку обстановки? Коптер запускать?)


            Выше: «При всем этом весь двор просматривается камерами видеонаблюдения»

            Весь хард уже есть, нужен софт :)

            и без всякого ИИ получать инфу о свободных местах?


            А представьте этот процесс в реале — в плотном дорожном потоке вы всматриваетесь в экранчик смарта, пытаясь разглядеть свободное место (особенно сейчас, когда темнеет чуть ли не в три часа так называемого дня :)

            И да, внутри двора в дорожный прайм-тайм плотность движения не ниже, чем на магистрали.

            • Newcss
              /#24977408 / +1

              Для меня просто странно из пушки стрелять по воробьям. В разработке, я всегда за принцип KISS. Самое первое что приходит на ум - давайте обучим ИИ решать задачу. Другие подходы рассматривали? Решение любой задачи начинается - с поиска аналогичных решений... Я бы для начала поигрался с тем, что есть. Если территория просматривается камерами, различные условия - день\вечер\ночь времена года... Можно перевести в черно-белое и посмотреть что из этого будет, разметить места, выделить признаки, сделать простейший классификатор...

              • Exchan-ge
                /#24978426 / +1

                Для меня просто странно из пушки стрелять по воробьям.


                Я так понимаю, программное решение будет универсальным и его можно будет продать (хотя бы один раз :) практически каждому дому, имеющему проблемы с парковкой. А это уже хлеб :)

                Кстати, на общественных паркингах, особенно «подземно/подвальных» эта проблема тоже актуальна.

                Народ пытается решить ее при помощи лампочек (как на кассах в супермаркетах): красная — место занято, зеленая — свободно.

                Но там есть существенная проблема — датчики плохо реагируют на маленькие автомобили :)
                (ИИ им в помощь :)

                • Akr0n
                  /#24978478

                  Только есть нюанс - проблемы дома с парковками это не решит. Дело не в ИИ, а в мудаках.

                • Newcss
                  /#24980650

                  Универсальное? Ни одного универсального решения я в своей жизни не видел. Всегда нужно что-то допиливать... И считать. Берем подземный паркинг - в отличае от уличного его сложно покрыть камерами, нужно будет велосипедить с разметкой мест. Сервер с ИИ понадобиться достаточно мощный. Когда в том же подземном паркинге достаточно поставить ультразвуковые датчики приближения (300р датчик + 200 рублей модуль управления arduino, esp32, esp8266). ИИ ни какой не требуется, разметку делать просто. В паркинге поставить WiFi, либо хардкорно пробросить по проводам. Стоимость подключения машино\места 500рублей, точность не хуже ИИ, вычислительные мощности в разы меньше, ПО писать тоже особо не нужно, если нужен прототип - HomeAssistant, Esphome, немного навыка рисования, ТГ бот практически из коробки. С уличным решением достаточно интереснее и сложнее, тут больше различных вариантов действий)

                  • vyunolbek
                    /#24980752

                    В этой статье разговор как раз скорее всего об уличном варианте и идет. Очевидно, чтобы сделать что-то такое на подземном паркинге это для начала надо покрыть камерами, а высота там совсем маленькая, в общем это крайне нерентабельно.
                    А вот в ситуации с уличной парковкой это уже решение отличное, потому что грубо говоря на одну парковку требуется одна камера и не сказать, чтобы совсем сильное железо)

                    • Newcss
                      /#24981334

                      Согласен, я просто ответил на комментарий выше), где сказали про универсальное решение, которое можно тиражировать на крытый паркинг. С уличным решением тоже есть вопросы... Когда вы в Москве и дом этаже в 25, то да - камера высокой четкости на крыше дома и задача решаема. У меня двор вытянут, дом не высокий (10 этажей), во дворе много деревьев, которые летом закрывают видимость парковочных мест сверху... Остается вариант - установки камер на высоте 2 этажа, но тогда много камер + разметка территории + обучение ИИ.

                      • vyunolbek
                        /#24981408

                        Да, это уже проблемно и практически как у меня)

                        Только я на пятом)))

      • vyunolbek
        /#24975582

        Спасибо)
        Интересно почитать ;)

  3. Akr0n
    /#24974934 / +6

    Если у вас зафиксированная навечно камера, не проще ли просто разметить в этом ракурсе полигоны парковочных мест и тупо сверять текущую картинку с, грубо говоря, пустой парковкой? Без всяких нейросетей. Полигон похож на пустой асфальт\снег - место свободно, не похож более чем на какой-то процент (найти опытным путем) - место занято. Работать будет на любом железе.

    • sci_nov
      /#24975656

      когда коту нечего делать, он яйца ест :).

    • dimas062
      /#24975852 / +2

      Лужи, сугробы, мусор, люди, тени... и еще миллион "предметов"

    • vvzvlad
      /#24976102 / +2

      Если крытая с обычным освещением, то норм. Если улица-фонарь-снег-дождь-кучка мусора-дети рисуют мелом-ветер колышит дерево и тень под ним, то нифига — картинка пустой парковки будет зависеть от времени года и освещения. Отчасти решается средне-взвешенной картинки парковки за последний месяц, где любые различия проигрывают тому, что постоянно, но тогда постоянно стоящие машины начинают считаться за пустое место.

  4. BogdanPetrov
    /#24975186 / +2

    Не так давно была похожая статья, там еще много полезных комментариев, на всякий случай оставлю ссылку: https://habr.com/ru/post/685108/

    Тоже хотел как-то заняться чем-то подобным, но столкнулся с тем, что не нашел простого способа захватить видеопоток с камеры (Xiaomi Mi Home Security Camera 360 1080p, пишется просто на флешку, не на сервер). Отсюда два вопроса: 1. Кто-то знает, как подключиться к этой камере? Максимум, что нашел: https://github.com/rytilahti/python-miio, но вроде бы там нет этого функционала. 2. Какие камеры лучше подойдут для таких домашних задач?

    • Akr0n
      /#24975262 / +1

      TP-link TAPO C200 - стоит недорого, картинка приличная, умеет RTSP. Вытащил поток и делай с ним, что хочешь.

      • powernic
        /#24979716 / +1

        Покупал TP-link TAPO C100 в качестве видеоняни, сейчас используется в качестве камеры для слежения за парковой, решал ту-же задачу что и ТС только с интеграцией с яндекс навигатором

        • Akr0n
          /#24980002

          Это все одна модель, я так понимаю, фактически разница только в маркетинге.

    • SunUp
      /#24975762 / +1

      Докину ещё вот + любой сервер захвата RTSP потока, но у меня этой камеры нет и сам я это не пробовал и на простой путь тоже наверное не совсем тянет.

  5. gagarinas
    /#24975800

    А подсчитать площадь транспортного средства возможно? И потом подсчитать какую то усредненную свободную площадь и т.д.

    • vyunolbek
      /#24975854

      Можно, но тут уже нужно использовать семантическую сегментацию)
      Опять же стоит придумать к этому какую-то конкретную метрику. То есть к чему мы будем примерять площадь автомобиля?

  6. Mishootk
    /#24979266 / +1

    Не в укор вам (нормально для 2 курса), но это классический пример решения задачи ради задачи. Пока не попробуете выполнить задачу для заказчика. Важно же что? Чтобы клиент удовлетворился. Ваш заказчик будет удовлетворен когда? В жизни реального заказчика интересуют только некоторые моменты (зачастую удовлетворение одного из пунктов - это все что надо для счастья). 1. Знание о количестве автомобилей внутри парковочной области. 2. Знание какие именно места заняты, какие свободны (возможно это требование не по всей парковке). 3. Факт нарушения разметки парковки. В основном пункт 1 покрывает большинство потребностей.

    Просто сейчас определитесь, для чего будет использоваться ваш продукт. Тогда он грамотно обрастет функционалом и вам будет над чем продуктивно работать.

    • vyunolbek
      /#24980090

      Спасибо большое)
      Как по мне с первыми двумя пунктами мой проект неплохо справляется, но это лишь по мне и очевидно, что там есть ряд проблем)
      А вот по по поводу 3го пункта я немного не понял. То есть знать, правильно ли припаркована машина?

      • Mishootk
        /#24980266 / +1

        У нас вряд-ли особо штрафуют за нарушение границ парковочных мест. А вот задача определить заезд на газон, тротуар, перекрытие занижения бордюра для пешеходов, елочка где нельзя и наоборот, блокировка помойки, ворот, подъезда - такой контроль на своей или прилегающей терртитории в автомате бывает полезно вести.