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

Идея

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

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

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

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

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

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

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

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

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

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

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

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

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

Логика

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

Итог

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

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

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

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


  1. vadimr
    03.12.2022 13:38
    +3

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


    1. vyunolbek Автор
      03.12.2022 19:48
      +2

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


      1. powernic
        05.12.2022 12:31
        +1

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


        1. vyunolbek Автор
          05.12.2022 12:36

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


          1. powernic
            05.12.2022 12:40
            +2

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


            1. vyunolbek Автор
              05.12.2022 12:53

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


              1. powernic
                05.12.2022 13:01
                +2

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


                1. powernic
                  05.12.2022 13:02
                  +2

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


                1. vyunolbek Автор
                  05.12.2022 13:49

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


                  1. powernic
                    05.12.2022 13:57
                    +1

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


    1. Segmentq
      04.12.2022 00:10

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


  1. Exchan-ge
    03.12.2022 13:40
    +7

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


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

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


    1. victor30608
      03.12.2022 13:49
      +3

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


      1. Exchan-ge
        03.12.2022 14:20
        +1

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


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

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

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

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

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


        1. funca
          03.12.2022 16:50
          +1

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

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


          1. Exchan-ge
            03.12.2022 18:20
            +2

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


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


        1. Newcss
          03.12.2022 23:05

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


          1. Exchan-ge
            04.12.2022 05:53

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


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

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

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


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

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


            1. Newcss
              04.12.2022 18:13
              +1

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


              1. Exchan-ge
                05.12.2022 05:20
                +1

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


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

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

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

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


                1. Akr0n
                  05.12.2022 06:26

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


                1. Newcss
                  05.12.2022 17:14

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


                  1. vyunolbek Автор
                    05.12.2022 17:55

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


                    1. Newcss
                      05.12.2022 22:19

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


                      1. vyunolbek Автор
                        05.12.2022 23:03

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

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


      1. vyunolbek Автор
        03.12.2022 20:33

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


  1. Akr0n
    03.12.2022 14:43
    +6

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


    1. sci_nov
      03.12.2022 21:14

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


    1. dimas062
      03.12.2022 22:52
      +2

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


    1. vvzvlad
      04.12.2022 01:48
      +2

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


  1. BogdanPetrov
    03.12.2022 17:02
    +2

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

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


    1. Akr0n
      03.12.2022 17:42
      +1

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


      1. powernic
        05.12.2022 12:55
        +1

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


        1. Akr0n
          05.12.2022 13:55

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


    1. SunUp
      03.12.2022 22:09
      +1

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


  1. gagarinas
    03.12.2022 22:24

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


    1. vyunolbek Автор
      03.12.2022 22:53

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


  1. Mishootk
    05.12.2022 12:04
    +1

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

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


    1. vyunolbek Автор
      05.12.2022 14:21

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


      1. Mishootk
        05.12.2022 14:59
        +1

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


        1. vyunolbek Автор
          05.12.2022 15:52

          Понял вас, спасибо!