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

Представим, что нам поставили задачу посчитать поток машин в определенном месте в разное время. На ум приходит только то, что человеку фактически придется вручную произвести примерный расчет по тем или иным показателям.

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

Для начала определимся с источником видеозаписей. Для примера можно взять портал https://weacom.ru/cams. На данном портале размещены в общий доступ различные камеры, которые имеют качественное изображение и хорошее расположение (отлично видно дорогу и автомобили)

В качестве примера камеры возьмем https://weacom.ru/cams/view/akademmost2

Данная камера отлично подойдет для примера, после попробуем усложнить задачу.

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

Имея данную ссылку, мы можем с использованием Python и OpenCV получать кадры с данного потока.

import cv2
import time

video_stream_widget = cv2.VideoCapture('https://cctv.baikal-telecom.net/Akademmost-2/index.m3u8')
video_stream_widget.set(cv2.CAP_PROP_FPS, 5)
success, frame = video_stream_widget.read()
prev = 0
print(video_stream_widget.get(cv2.CAP_PROP_FPS))

while success:
    time_elapsed = time.time() - prev
    success, frame = video_stream_widget.read()

    if time_elapsed > 1. / 5:
        prev = time.time()

    cv2.imshow('Weacom', cv2.resize(frame, (1280, 1080)))
    cv2.waitKey(20)
    key = cv2.waitKey(1)
    if key == ord('s'):
        video_stream_widget.capture.release()
        cv2.destroyAllWindows()
        exit(1)

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

Теперь, когда у нас есть кадры, наша задача - применить алгоритм для слежения за автомобилями. Для этого возьмем связку Yolo + Deepsort.

В качестве готовой реализации воспользуемся - https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch. Данный репозиторий в целом уже содержит все, что нам нужно, останется только перенести его себе и доработать под задачу.

Для начала склонируем репозиторий:

>> git clone --recurse-submodules https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch.git

И установим все необходимые библиотеки:

>> pip install -r requirements.txt

Так как yolo обучена на MS Сoco датасете, нам необходимо оставить в распознавании только те классы, которые нам нужны, а именно bus, car, truck. Изменим конфигурацию на классы 4 6 8.

Запустим код из коробки – посмотрим результат работы. Ради интереса попробовал запустить на другой рандомной камере:

python track.py --source https://cctv1.dreamnet.su:8090/hls/275779/8c728f28f72aea02c41d/playlist.m3u8 --classes 2 5 7 --show-vid

В целом мы видим, что алгоритм работает, слежение идет. Некоторое время понаблюдав за алгоритмом, я закрыл окно.

Вспоминаем нашу задачу – нам нужно посчитать трафик за определенный период времени.

Визуально алгоритм вроде бы уже это делает – но на самом деле точность алгоритма страдает сильно – проставленные id уже явно превышают количество визуально видимых авто.

В таком случае нам необходимо просто добавить счетчики на каждый новый ID.

Для этого внесем в track.py изменения:

Добавляем все уникальные id выявленных машин в список:

for j, (output, conf) in enumerate(zip(outputs, confs)): 

    bboxes = output[0:4]
    id = output[4]
    cls = output[5]
    ids_list.append(id)

А в конце просто убираем дубликаты и выводим длину списка

print(len(list(set(ids_list))))

Запустим алгоритм еще раз – посмотрим на результаты – выглядит уже лучше.

В целом данный алгоритм можно оставить для тестирования.

В следующих статьях рассмотрим мультипоточное отслеживание потоков с разных камер.

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


  1. ivankudryavtsev
    25.10.2021 08:49

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

    Забавно это читать в 2021м году. Используйте Nvidia DeepStream или Intel DL-Streamer и считайте спокойно все кадры. Как минимум, с кадровкой 1 FPS у вас трекинг явно не будет работать валидно, поскольку скорость и направленность движения транспорта очень вариативна, а вы используете только детектор без реидентификации.

    Что такое COMPUTER VISION 4?


    1. ZlodeiBaal
      26.10.2021 17:06

      Зачем тащить DeepStream в любительский проект?
      Я даже от прода на нем всегда отговариваю. Уж лучше GStreamer для грабинга + тритон, например. Куда проще любая дальнейшая миграция, куда проще логика использования, и нет сложности с нестандартными сетками.
      Это не делает статью хорошей и интересной, а подход примененный тут правильным (трекинг с 1 FPS это вообще круто). Но даже я, когда делаю что-то по фану делаю все на чистом питончике.


      1. ivankudryavtsev
        26.10.2021 17:49

        Ну, а мы делаем на DeepStream + python. Тоже все хорошо выходит…


        1. easymickey
          18.11.2021 15:09

          Спасибо за ОС, это был своего рода эксперимент, разберусь с указанными инструментами.

          В названии ошибка.


  1. vvovas
    26.10.2021 00:19
    +2

    Простите, но накипело...

    Вот такой уровень "обучающих" статей я вижу последние несколько лет.
    Есть задача? Скопируй код по этой ссылке (поставь вот этот пакет), напиши вот эту строчку и у тебя заработает.
    Почему этот пакет? Как он работает? Что это за строчка? Это знать не нужно, потому что задача решена.

    А если не решена, то вот еще надо дописать чуть-чуть: возьми список -> преврати в множество -> преврати в список (зачем?!) -> получи длину.
    Но даже мне, человеку, который ни разу не работал с питоном, хватило полминуты, чтобы найти в документации, что можно сразу использовать множество. https://docs.python.org/3/library/stdtypes.html#set