Стоит признать, мы таки живем в эпоху киберпанка. Он не похож (пока) на мрачные миры Ридли Скотта и братьев Вачовски, но вполне отвечает меткому определению: high tech, low life. К третьему десятилетию двадцать первого века российская провинция так и не научилась содержать пешеходную инфраструктуру в достойном состоянии, но плотно обвешалась уличными веб‑камерами, круглосуточно взирающими на пробирающихся по заснеженным тропинкам пешеходов.

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

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

Шаг первый: детектируем пешеходов

Чтобы не быть голословным, сразу статья: Object Detection in 2023: The Definitive Guide. Тема очень популярная, написано по ней немало. Подходы делятся на два периода. Первый — традиционный, главное из него: детектор Виолы — Джонса (2001), детектор на основе гистограммы направленных градиентов (2006), а также детектор на основе модели деформируемых деталей (2008). После 2014 года безоговорочную власть в этой области захватили алгоритмы на основе свёрточных нейронных сетей. Среди последних выигрывает YOLO, он точен и достаточно быстр (есть шустрая tiny‑версия, немного жертвующая точностью).

Точность детектирования - Average Precision (AP). Из статьи, озвученной выше.
Точность детектирования - Average Precision (AP). Из статьи, озвученной выше.

Не долго думая, решаем в сторону YOLO. Он живет на GitHub, где можно скачать веса предобученных моделей. В нашей задаче вполне достаточно tiny‑версии, по причине, которую озвучу позже.

Шаг второй: отслеживаем пешеходов

Итак, пешеходов на видео нашли. Но этого не достаточно, чтобы отследить их передвижение — пока что все детектированные объекты на видео — один и тот же квантовый пешеход. С задачей трекинга в связке с YOLO отлично справляется алгоритм DeepSort. Связывание строится на основе внешних признаков объектов и их динамики движения. Есть статья на Хабре, есть готовый код на GitHub.

Результат работы YOLOv4 и DeepSort
Результат работы YOLOv4 и DeepSort

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

Шаг третий: исправляем дисторсию

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

В коде с использованием OpenCV в Python это выглядит следующим образом
import numpy as np
import cv2

# исходное изображение
src = cv2.imread("frame.jpg")
width  = src.shape[1]
height = src.shape[0]

# коэффициенты дисторсии
distCoeff = np.zeros((4, 1),np.float64)

# уникальны для конкретной модели
k1 = -1.0e-5;
k2 = 0.0;
p1 = 0.0;
p2 = 0.0;

distCoeff[0,0] = k1;
distCoeff[1,0] = k2;
distCoeff[2,0] = p1;
distCoeff[3,0] = p2;

# внутренняя матрица камеры
cam = np.eye(3, dtype=np.float32)

cam[0,2] = width/2.0  # центр по x
cam[1,2] = height/2.0 # центр по y
cam[0,0] = 10.        # фокусное расстояние по x
cam[1,1] = 10.        # фокусное расстояние по y

# исправленное изображение
dst = cv2.undistort(src, cam, distCoeff)

Исходное изображение и результат коррекции дисторсии
Исходное изображение и результат коррекции дисторсии

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

Шаг четвертый: проецируем землю

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

Поле зрения камеры
Поле зрения камеры

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

Как преобразование выглядит в коде
import cv2
import numpy as np

points_from = [[15, 225], ...] # исходные точки
points_to = [[960, 225], ...] # точки после преобразования

src = np.float32(points_from)
dst = np.float32(points_to)

M = cv2.getPerspectiveTransform(src, dst) # прямая матрица трансформации
Minv = cv2.getPerspectiveTransform(dst, src) # обратная матрица трансформации

Перемножая координаты в плоскости кадра на полученную матрицу мы переводим их в координаты земной поверхности. Наглядно это можно увидеть, подействовав матрицей на изображение с помощью функции OpenCV warpPerspective. При этом получается следующее изображение, примерно отвечающее виду сверху на рассматриваемую сцену:

Проекция кадра в плоскость земной поверхности
Проекция кадра в плоскость земной поверхности

Проекция импровизированной координатной сетки с помощью обратной матрицы трансформации в плоскость кадра дает следующий результат:

Проекция координатной сетки в плоскость кадра
Проекция координатной сетки в плоскость кадра

Шаг пятый: вычисляем скорость

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

Для каждой из полученных координат мы сохранили соответствующий порядковый номер кадра. Это спасает нас в ситуации, когда детектор пропускал цель один или несколько кадров подряд. Этим грешит tiny‑версия YOLO. Но пешеходы, как правило, движутся прямолинейно, и сохраненный номер кадра позволяет вычислить скорость даже с пропущенным в процессе движения координатами.

Как выглядит вычисление скорости
PX_PER_METER = 235 # пикселей на метр в проекции
FRAMES_PER_SECOND = 14.4 # частота кадров в видео

distance = 6 # на сколько пикселей сместился пешеход между кадрами
frames_passed = 2 # сколько кадров сменилось между последовательными детектированиями

speed = (distance / frames_passed) * (FRAMES_PER_SECOND / PX_PER_METER)    

Для перевода полученного значения скорости в км/ч его необходимо домножить на 3.6 дополнительно.

Шаг шестой: считаем метрики

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

  1. Средняя скорость пешеходов.

  2. Суммарная площадь траекторий.

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

Шаг седьмой: рисуем картинки и графики

Переходим к тепловым картам и графикам. Как уже было указано выше, были выбраны три типа погодных условий:

  • после снегопада (тротуары не расчищены);

  • гололедица (тротуары не обработаны);

  • небольшая плюсовая температура.

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

Пешеходное движение при небольшой плюсовой температуре
Пешеходное движение при небольшой плюсовой температуре

Далее смотрим на движение в гололедицу и замечаем как заметно падает скорость и плотность передвижения пешеходов.

Пешеходное движение в гололедицу
Пешеходное движение в гололедицу

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

Пешеходное движение по снегу
Пешеходное движение по снегу

Посмотрим на числовые значения скорости и площади. Скорость в километрах в час, площадь в «попугаях» — координатах импровизированной координатной сетки.

Скорость и площадь области передвижения пешеходов
Скорость и площадь области передвижения пешеходов

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

Итого

Небольшое упражнение на несколько вечеров показывает, что анализируя видео с городских уличных камер, можно на основе нескольких метрик оценить насколько качественно справляются со своей работой службы ЖКХ. Где не убран снег, а где не обработан лед. Потенциально эта оценка отражает именно то, для чего и производится уборка — комфорт передвижения пешеходов.

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

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


  1. kap1ik
    00.00.0000 00:00
    +3

    А если не убирать снег, но сделать duplex тропинки, то скорость потока даже может вырасти, получается?


    1. alexprozoroff Автор
      00.00.0000 00:00
      +1

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


    1. dimka11
      00.00.0000 00:00

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


  1. 2PAE
    00.00.0000 00:00
    +3

    И как только поток людей измениться, сразу понятно, очередной водитель припарковался на тротуаре.


    1. alexprozoroff Автор
      00.00.0000 00:00

      Точно, оценим работу и ЖКХ и ГИБДД


      1. 2PAE
        00.00.0000 00:00
        +1

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

        Оценить работу возможно. Но нужно ли это кому-то кроме тех, кто ходит по этим тротуарам?

        Вопрос риторический.


  1. JediPhilosopher
    00.00.0000 00:00
    +11

    Классика - попытка решить техническими способами проблемы, которые возникают совсем не из-за технических вещей.

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

    Но на всякую хитрою жопу найдется свой болт с левой резьбой, как говорится. В итоге техника ездит по улицам, жжет бензин, но НЕ УБИРАЕТ. Трактора ездят тупо с поднятыми щетками. Поливальные машины ездят, но не поливают. И так далее. Расходов меньше, прибыль выше.

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


    1. fiksii
      00.00.0000 00:00

      Интересно, у уборочной техники есть логгирование состояний?


      1. konst90
        00.00.0000 00:00
        +2

        На гайку с левой резьбой всё равно найдётся болт с двойным заходом.


        1. Nikita22007
          00.00.0000 00:00

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


          1. konst90
            00.00.0000 00:00
            +1

            Не то же самое.

            Если у вас есть "техническая" дыра - например, возможность перебрать пароль - то "техническое" решение (усложнение пароля) вам поможет. Если дыра "организационная" - например, пароль на бумажке приклеен к монитору - то можно делать его сколь угодно сложным, это не поможет, пока хакер может сфотографировать монитор.

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


    1. event1
      00.00.0000 00:00
      +1

      Классика - попытка решить техническими способами проблемы, которые возникают совсем не из-за технических вещей.

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


    1. Anton_Olegovich
      00.00.0000 00:00

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


      1. JediPhilosopher
        00.00.0000 00:00

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


  1. EgorovM
    00.00.0000 00:00

    Спасибо, отличная статья!

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


    1. alexprozoroff Автор
      00.00.0000 00:00
      +1

      Спасибо!

      Здесь, к сожалению, не удалось узнать модель камеры и, соответственно, найти готовые коэффициенты. Поэтому в формате несерьезного исследования остановился на том, что подобрал коэффициент для исправления «бочки» на глаз, сравнивая итоговый результат со спутниковыми снимками.

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


  1. powerbroker
    00.00.0000 00:00
    +1

    забавное развлечение, но боюсь, практическая экономия от неё псу под хвост.

    что действительно требует первоочередного применения искусственного интеллекта в сфере ЖКХ - так это распределение бюджетов. куда проще анализа картинок и в миллионы, если не миллиарды раз благодатнее.


  1. snakers4
    00.00.0000 00:00

    Отличная статья.


  1. Ivnika
    00.00.0000 00:00

    Интересна идея! И описано очень здорово - приятно читать.

    Сразу идеи применения - отслеживать поток пассажиров в/на транспорте /остановках. В различных торговых центрах и тд и тп.


  1. AterCattus
    00.00.0000 00:00

    Вспомнилось https://habr.com/ru/post/257563/


  1. Tarakanator
    00.00.0000 00:00

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

    Лучше. вы калибруете не камеры, а нормализуете скорость движения пешеходов.
    Т.е. если в каком-то месте лестница, и пешеходы замедляются из-за неё, то вы это тоже нормализуете.