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

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

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

Для этого проекта мы будем довольно широко использовать OpenCV. Идея этой реализации довольно проста. Поскольку фон анализируемого видео не меняется, мы можем рассматривать неизменяющуюся часть видео как часть фона. Затем, если мы вычтем фон, передний план должен дать нам движущиеся машины. Все, что нам нужно оттуда, - это отслеживать эти машины от кадра к кадру.

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

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

После обучения вычитателя фона мы начинаем считывать видео кадр за кадром. Для каждого кадра мы будем помещать его в конвейер обработки. Трубопровод выглядит следующим образом:

  1. Обнаружение контура
  2. Счетчик транспортных средств
  3. Визуализатор
  4. Писатель CSV

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

Обнаружение контура

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

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

Отслеживание транспортных средств

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

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

Визуализация результата

Далее идет класс визуализатора. Цель этого класса - нарисовать маску выхода на каждом кадре (если маски выхода включены), поместить ограничивающие рамки вокруг каждого транспортного средства, поставить некоторые конечные точки на этих ограничивающих прямоугольниках, когда транспортные средства движутся по дороге, и, наконец, отобразить транспортное средство. прилавок. Этот класс получает «пути» от класса vehicle_counter и просто рисует на кадрах кучу прямоугольников и линий.

Запись данных

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

Конвейерный процессор

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

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

Возможные варианты использования

Как мы видим, метод вычитания фона может быть эффективным при отслеживании движущихся объектов от кадра к кадру. Однако у него есть много ограничений, и поэтому он будет хорошо работать только в очень определенных обстоятельствах. В этом случае камера движения чрезвычайно устойчива, поскольку она расположена прямо над шоссе, а движущиеся объекты от одного кадра к другому - это почти исключительно автомобили, которые мы хотим отслеживать. Логика, которую мы применяем для отслеживания этих транспортных средств, также может нуждаться в изменении, если перспектива видео отличается - поскольку, в отличие от методов глубокого обучения, мы на самом деле не обучаем программное обеспечение распознавать автомобили и т. Д.

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