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

Вероятно, все мы понимаем, что компьютеры и алгоритмы с каждым днем ​​становятся лучше, «думая», анализируя ситуации и принимая решения, аналогично тому, как это делают люди. Понимание компьютерного зрения - неотъемлемая часть этого прогресса в области машинного интеллекта. Десять лет назад обнаружение объектов было загадкой; о слежении за объектом даже упоминать не приходилось. Эти технологии далеко продвинулись в этом отношении, и по мере того, как мы говорим, границы меняются и расширяются.

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

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

Обнаружение объектов и отслеживание объектов

Если вы новичок в компьютерном зрении и глубоком обучении, вы можете спросить, в чем разница между «Обнаружением объектов» и «Отслеживанием объектов»?

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

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

Проблемы

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

Окклюзия:

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

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

Нестационарная камера:

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

Аннотирование данных тренировки:

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

Традиционные методы

Метод среднего сдвига.

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

Цель алгоритма - найти все режимы в предоставленном распределении данных. Кроме того, этот алгоритм не требует оптимального значения «K», как K-средних.

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

Подробнее о среднем сдвиге см. Здесь.

Метод оптического потока

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

Здесь мы сосредоточены на получении вектора смещения для отслеживаемого объекта по кадрам. Отслеживание с помощью оптического потока основывается на четырех основных допущениях:

  1. Постоянство яркости: предполагается, что яркость вокруг небольшой области остается почти постоянной, хотя расположение области может измениться;
  2. Пространственная согласованность: соседние точки в сцене обычно принадлежат одной и той же поверхности и, следовательно, обычно имеют схожие движения;
  3. Временная стойкость: движение пятна постепенно изменяется;
  4. Ограниченное движение: точки не перемещаются очень далеко или беспорядочно.

Когда эти критерии удовлетворены, мы используем метод Lucas-Kanade для получения уравнения скорости конкретных точек, которые необходимо отслеживать (обычно это легко обнаруживаемые особенности). Используя уравнение и некоторые методы прогнозирования, данный объект можно отслеживать на протяжении видеокадров.

Подробнее об оптическом потоке см. Здесь.

Фильтр Калмана

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

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

Например, теперь мы можем обучить неплохой детектор объектов YOLOv3, который обнаруживает человека. Но он не такой точный и иногда пропускает обнаружение, скажем, 10% кадров. Чтобы эффективно отслеживать и прогнозировать следующее состояние человека, давайте возьмем «модель постоянной скорости». Теперь, когда мы определили простую модель в соответствии с законами физики, учитывая текущее обнаружение, мы можем сделать отличное предположение о том, где будет находиться человек в следующем кадре. Все это звучит идеально в идеальном мире, но всегда присутствует шумовая составляющая. Итак, у нас есть:

  • Шум связан с моделью постоянной скорости, которая будет следовать за человеком. Мы не можем всегда ожидать постоянной скорости. Мы называем это «технологическим шумом»;
  • Поскольку выходной сигнал детектора, на основе которого мы делаем прогнозы, также неточен, с ним связан «шум измерения».

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

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

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

Подходы к отслеживанию объектов на основе глубокого обучения

Сети глубокой регрессии

Одним из первых методов, которые использовали глубокое обучение для отслеживания одного объекта, были Сети глубокой регрессии (ECCV, 2016). Модель была обучена на наборе данных, состоящем из видео с помеченными целевыми кадрами. Цель модели - отслеживать данный объект по заданному кадру изображения.

Для этого они используют двухкадровую архитектуру CNN, которая использует как текущий, так и предыдущий кадры для точного перехода к объекту:

Как показано на приведенном выше рисунке, мы берем обрезку из предыдущего кадра на основе прогнозов и определяем «Область поиска» в текущей структуре на основе этой обрезки. Теперь сеть обучена регрессировать для объекта в этой области поиска. Сетевая архитектура проста с CNN, за которыми следуют полносвязные слои, которые напрямую дают нам координаты ограничивающего прямоугольника.

ROLO - Recurrent Yolo

ROLO Recurrent Yolo (ISCAS 2016) - элегантный способ отслеживания объектов с использованием глубокого CNN. Слегка модифицированный детектор YOLO с присоединенным повторяющимся блоком LSTM на конце помогает отслеживать объекты, фиксируя пространственно-временные особенности. Вот архитектура:

Как показано на изображении выше, архитектура довольно проста. Обнаружения из YOLO (ограничивающие прямоугольники) объединяются с вектором признаков из экстрактора признаков на основе CNN (мы можем либо повторно использовать бэкэнд YOLO, либо использовать специализированный экстрактор признаков). Теперь этот объединенный вектор признаков, который представляет большую часть пространственной информации, связанной с текущим объектом, вместе с информацией о предыдущем состоянии, передается в ячейку LSTM.

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

Глубокая сортировка

Самым популярным и широко используемым фреймворком для отслеживания объектов является Deep SORT (Simple Real-time Tracker).

В трекере Deep Sort фильтр Калмана является важным компонентом. Сценарий отслеживания Калмана определяется в восьмимерном пространстве состояний (u, v, a, h, u ', v', a ', h'), которое содержит положение центра ограничивающего прямоугольника ( u, v) - центры ограничивающих рамок, a - соотношение сторон, а h - высота изображения. Остальные переменные - это соответствующие скорости переменных.

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

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

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

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

Авторы Deep Sort решили использовать квадрат расстояния Махаланобиса (эффективная метрика при работе с распределениями), чтобы учесть неопределенности фильтра Калмана. Эта метрика более точна, чем евклидово расстояние, поскольку мы эффективно измеряем расстояние между двумя распределениями (все находится под фильтром Калмана). Установление порога этого расстояния может дать нам прекрасное представление о реальных ассоциациях. В этом случае авторы предложили использовать стандартный венгерский алгоритм, очень эффективный и простой комбинаторный алгоритм оптимизации, решающий задачу о назначениях.

Вектор признаков внешнего вида

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

Несмотря на эффективность фильтра Калмана, он не работает во многих реальных сценариях, таких как окклюзия, разные точки обзора и т. Д.

Поэтому, чтобы улучшить это, авторы Deep SORT ввели еще одну метрику расстояния, основанную на внешнем виде объекта.

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

Слой «Dense 10», показанный на рисунке выше, будет нашим вектором внешнего вида для данной культуры. После обучения нам нужно передать все обрезки обнаруженного ограничивающего прямоугольника из изображения в эту сеть и получить вектор пространственных признаков «128x1». Обновленная метрика расстояния будет:

Где Dk - расстояние Махаланобиса, Da - косинусное расстояние между векторами признаков внешнего вида, а лямбда - весовой коэффициент.

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

Реализация кода:

В этом руководстве я реализую наш общий объектный трекер на предварительно обученной (обученной на наборе данных COCO) модели YOLOv3.

Сначала вам нужно клонировать мой репозиторий GitHub и следовать инструкциям по установке из того же файла репозитория REAMDE.md. Если у вас есть проблемы, следуйте моему прошлому руководству по YOLOv3 (ссылки можно найти в конце этого руководства).

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

Папка deep_sort в репо имеет исходную реализацию глубокой сортировки, в комплекте с фильтром Калмана, венгерским алгоритмом и экстрактором признаков. Первоначально он был написан для работы с TensorFlow 1.x. Мне пришлось немного изменить исходные файлы, чтобы они работали с TensorFlow 2.

Давайте посмотрим на мой object_tracker.py скрипт:

То же, что и в детекторе объектов; Сначала мы инициализируем нашу модель YOLOv3, затем импортируем необходимые функции для нашего трекера Deep Sort.

В отличие от других моих функций в этом проекте, которые я вставил в сценарий yolov3/utils.py, теперь я создаю Object_tracking в том же файле. Мы вызываем эту функцию следующим образом:

Object_tracking(yolo, video_path, '', input_size=input_size, show=True, iou_threshold=0.1, rectangle_colors=(255,0,0), Track_only = [])

Где:

  • YOLO - наша модель YOLOv3;
  • video_path - это наш путь к видео, и если пути нет, он будет использовать веб-камеру;
  • input_size, show, iou_threshold = 0.1, rectangle_colors - очевидные параметры, не нуждающиеся в объяснении. В противном случае посмотрите мои предыдущие уроки;
  • Track_only используется для определения конкретных объектов для отслеживания, например Track_only = [«person»]. Тогда наш трекер будет отслеживать только людей.

Говоря о отслеживании, model_filename = 'model_data/mars-small128.pb' загружает предварительно обученную deep_SORT модель отслеживания CNN. Функция «tracker=Tracker(metric)» - один из самых важных элементов. Трекер - это объект класса Tracker, определенный в библиотеке deep_sort, который заботится о создании, отслеживании и возможном удалении всех треков.

Я не буду объяснять код поэтапно, только на абстрактном уровне. Обнаружение глубокой сортировки требует ввода полей в следующем формате (x, y, ширина, высота), но наш YOLOv3 выводит обнаружения как (x_min, y_min, x_max, y_max), поэтому мы выполняем преобразование.

Все трекинг ведется в двух строках:

tracker.predict()

tracker.update(detections)

В других строках мы выполняем операции с данными. Мы можем рассмотреть пример отслеживания объектов (отслеживание только людей), где я тестирую фреймворк deep_sort на test.mp4 видео:

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

Обучение извлечению настраиваемых функций

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

Но в этом уроке я не рассматриваю обучающую часть. Чтобы обучить авторов статей с метриками глубокой ассоциации на их GitHub, обратитесь к подходу https://github.com/nwojke/cosine_metric_learning, представленному в виде отдельного репозитория.

Заключение

Я надеюсь, что этот учебный пост помог вам получить полное представление об основных идеях и компонентах отслеживания объектов. Кроме того, я дал вам полностью рабочий код для тестирования отслеживания объектов, который вы можете использовать в своем проекте. У меня только одна просьба, если вы попробуете этот код в своем проекте, упомяните меня в своем проекте. Кроме того, было бы интересно посмотреть, какую проблему для решения вы используете, так что не стесняйтесь комментировать этот пост, на YouTube или даже написать мне электронное письмо! Хватит чтения; зайдите в мой GitHub, репозиторий клонов, и попробуйте все сами!

Первоначально опубликовано на https://pylessons.com/YOLOv3-TF2-DeepSort