Создайте, обучите и проверьте алгоритм обнаружения видеоаномалий, используя предварительно обученные модели пространства-времени, такие как TimeSformer, R(2+1)D или SlowFast 3D ResNet, с традиционным автокодировщиком.

1. Введение

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

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

Следующий пост очень интересен. Он направлен на решение аналогичной проблемы с использованием сверточного автокодировщика LSTM. После обучения модели с нуля на неаномальных событиях во время вывода она стремится восстановить исходный клип и вычислить ошибку реконструкции непосредственно в пиксельном (2+1) мерном пространстве-времени.



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

Для выполнения этого упражнения я буду использовать Набор данных спортивных действий UCF [1, 2], который включает в себя в общей сложности 150 видеоклипов с разрешением 720 x 480, сгруппированных по 10 различным спортивным действиям. Я разделил клипы на две группы. Первая группа из семи категорий содержит разрешенные спортивные действия. Остальные три моделируют незаконные аномальные действия, которые система, которую я разработаю, должна уметь идентифицировать как аномальные события.

Полный код этого поста вы можете найти в репозитории GitHub.

2. Свойства набора данных

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



Набор данных включает в себя следующие 10 действий: прыжки в воду, замах в гольфе, удары ногой, подъем, езда на лошади, бег, катание на скейтборде, скамья на качелях, поворот на боку, ходьба. Многие этапы предварительной обработки подробно обсуждаются в предыдущем посте. Здесь я лишь перечислю основные шаги, выполняемые в скрипте preprocess_dataset_ucf_action_sport.py.

  1. Конвертируйте файлы .avi в формат .mp4.
  2. Сгруппируйте Golf-Swing-Back, Golf-Swing-Front и Golf-Swing-Side в Golf-Swing; сгруппируйте Kicking-Front и Kicking-Side в Kicking
  3. Удалите те клипы .mp4, которые повреждены или имеют нулевую продолжительность.
  4. Сгруппируйте действия «Идти вперед», «Подъем» и «Скейтбординг вперед» в набор аномалий. Разделите оставшиеся клипы на поезд, проверку и тестирование.
  5. Увеличьте количество обучающих и проверочных роликов соответственно до 200 и 10 роликов для каждой категории. Таким образом я сбалансировал количество обучающих выборок в каждом классе.
  6. Сгенерируйте для каждого окончательного набора данных обучения, проверки, тестирования и аномалий соответствующий фрейм данных .csv для сбора пути и метки для каждого клипа.

После выполнения шагов предварительной обработки распределение видеоклипов по каждому набору данных показано на рис. [1].

3. Предварительно обученные модели пространства-времени

Под моделями пространства-времени я имею в виду те модели, которые предварительно обучены задаче распознавания действий. За последние годы в этой области было много достижений, поэтому для выполнения этого упражнения я выбираю три разные архитектуры: R(2+1)D, SlowFast 3D ResNet и TimeSformer, все они предварительно обучены в наборе данных Kinetics. -400 [3]. Как показано в приведенном ниже фрагменте кода, взятом из сценария model, я загружаю архитектуры, соответствующие им веса и вырезаю каждую модель перед заголовком классификатора. Таким образом, для каждого входного видео функция Forward извлекает соответствующий вектор внедрения.

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

Р(2+1)Д Реснет

В статье «Более внимательный взгляд на пространственно-временные свертки для распознавания действий» [4] оцениваются различные архитектуры пространственно-временных сверток для распознавания действий в рамках остаточного обучения.

На первый взгляд, 3D-сверточные сети кажутся идеальной архитектурой для работы с видеоклипами. Они сохраняют временную информацию и распространяют ее по уровням сети. Как показано на рис.[2], полная 3D-свертка выполняется с использованием фильтра размером t × d × d, где t обозначает временной экстент, а d — пространственная ширина и высота, поэтому фильтры свертываются как по временным, так и по пространственным измерениям.

Другой пространственно-временной вариант — это сверточный блок «(2+1)D», который явно разлагает 3D-свертку на две отдельные и последовательные операции: 2D-пространственную свертку и 1D-временную свертку. Как показано на рис.[2], сверточные фильтры N_i 3D размером Ni−1 × t × d × d в i-м блоке заменяются блоком (2+1)D, состоящим из M_i 2D сверточных фильтров размером размером Ni−1 × 1 × d × d и N_i временных сверточных фильтров размером Mi × t × 1 × 1. Гиперпараметр M_i определяет размерность промежуточного подпространства, куда проецируется сигнал между пространственной и временной свертками, и его значение фиксировано так, чтобы количество параметров в блоке (2+1)D соответствовало количеству параметров в полном 3D-сверточном блоке.

По сравнению с полной трехмерной сверткой разложение (2+1)D дает два преимущества. Во-первых, несмотря на то, что количество параметров не меняется, оно удваивает количество нелинейностей в сети за счет дополнительного ReLU между 2D- и 1D-сверткой в ​​каждом блоке. Более того, ошибка обучения меньше для тех же слоев. Это проиллюстрировано на рисунке [3], где показаны ошибки обучения и тестирования для R3D и R(2+1)D, имеющих 18 и 34 слоя. Видно, что для того же количества слоев (и параметров) R(2+1)D дает не только меньшую ошибку тестирования, но и меньшую ошибку обучения по сравнению с R3D.

В моем приложении я рассматриваю модель R(2+1)D ResNet18, работающую с видеоклипами размером 8×112×112 и извлекающую векторы внедрения размером 512.

Медленный быстрый 3D ResNet

В статье «Медленные сети для распознавания видео» [5] предполагается, что не все пространственно-временные направления в видеоклипе одинаково вероятны. Например, размахивание руками не меняет своей идентичности как «рук» на протяжении всего размахивания, и человек всегда находится в категории «человек», даже если он/она может перейти от ходьбы к бегу. Поскольку категориальная пространственная семантика визуального контента часто развивается медленно, его распознавание также может обновляться относительно медленно. С другой стороны, выполняемое движение может развиваться гораздо быстрее, чем идентичность субъекта, например хлопки в ладоши, махание руками, тряска, ходьба или прыжки. В этом случае может быть желательно использовать быстро обновляющиеся кадры для эффективного моделирования потенциально быстро меняющегося движения.

На основе этих наблюдений возникает двухпутевая модель SlowFast. Как показано на рис.[4], путь Slow предназначен для захвата семантической информации, которая может быть предоставлена ​​изображениями или несколькими разреженными кадрами, и работает с низкой частотой кадров и медленной скоростью обновления. Напротив, путь Быстрый отвечает за захват быстро меняющегося движения, работая с высокой скоростью обновления и высоким временным разрешением.

Медленный путь может представлять собой любую сверточную модель, которая работает с видеоклипом как с пространственно-временным объемом. Просто у него большой временной шаг на входных кадрах. Быстрый путь имеет небольшой временной шаг, так что если T — это кадры для Медленного пути, то alpha*T с alpha›1 — это кадр, обрабатываемый Быстрый путь. Более того, быстрый путь не имеет слоев временной понижающей дискретизации до уровня глобального пула перед классификацией, поэтому тензоры признаков всегда имеют alpha*T кадры во временном измерении. Наконец, хотя быстрый путь представляет собой сверточную сеть, аналогичную медленной, он имеет соотношение beta и beta‹1 среди своих каналов. Это делает быстрый путь более эффективным в вычислениях, чем медленный.

В моем приложении я рассматриваю модель SlowFast ResNet50, работающую с видеоклипами (8×256×256, 32×256×256) соответственно для медленного и быстрого пути и обеспечивающую встраивание векторов размерностью 2304.

Таймсформеры

За последние несколько лет в области обработки естественного языка (НЛП) произошла революция благодаря появлению методов, основанных на самовнимании. Этот механизм также применялся в области распознавания и классификации изображений с помощью моделей Vision Transformer (ViT). Применение этого метода и к видео было лишь вопросом времени.

Архитектура TimeSformer, представленная в статье «Все ли внимание, необходимое для понимания видео?» [6] представляет собой подход к классификации видео без сверток, основанный исключительно на самоконтроле над пространством и временем. Этот метод адаптирует стандартную архитектуру Transformer к видео, позволяя изучать пространственно-временные функции непосредственно из последовательности патчей на уровне кадра. Как и в ViT, каждый патч линейно отображается во вложение и дополняется информацией о положении. Это позволяет интерпретировать результирующую последовательность векторов как встраивание токенов, которые можно передать в кодировщик Transformer, аналогично функциям токенов, вычисляемым из слов в НЛП.

В статье рассматриваются пять пространственно-временных схем самообслуживания, показанных на рис.[5]. Наиболее эффективной архитектурой пространственно-временного внимания является так называемая «Разделенное пространственно-временное внимание» (обозначается T+S), где временное и пространственное внимание применяются отдельно друг за другом. Во-первых, вычисляется временное внимание путем сравнения каждого участка (p, t) со всеми участками в том же пространственном положении в других кадрах. Таким образом, оценивается внимание между этим патчем и всеми остальными в одном и том же кадре в заданное фиксированное время.

TimeSformer представлен в трех вариантах. Версия по умолчанию работает с видеоклипами размером 8×224×224. TimeSformer-HR, вариант с высоким пространственным разрешением, работает с видеоклипами 16 × 448 × 448. Наконец, TimeSformer-L — это конфигурация дальнего действия, работающая с видеоклипами 96×224×224.

В моем приложении я рассматриваю версию по умолчанию, работающую с видеоклипами размером 8×224×224 и обеспечивающую встраивание векторов размером 768.

В таблице [1] показаны результаты проверки набора Kinetics-400 для трех различных архитектур.

4. Алгоритм обнаружения аномалий

Модель обнаружения аномалий, которую я хочу изучить в этом упражнении, состоит из двух основных частей. Как показано на рис.[6], первый компонент представляет собой предварительно обученную модель пространства-времени. Он принимает последовательность кадров в качестве входных данных и возвращает соответствующий вектор внедрения. Затем автоэнкодер принимает вектор внедрения в качестве входных данных и пытается восстановить его на выходе.

Следующий фрагмент кода, взятый из сценария model.py, подробно показывает, как построить полную сеть. Это достигается путем создания экземпляра класса SpaceTimeAutoencoder. Выбор пространственно-временной модели, а также свойства автоэнкодера, а именно количество скрытых слоев и соответствующих им узлов, могут быть заданы конфигурацией. В экспериментах я установлю три скрытых слоя со скрытым скрытым пространством размерностью 128. Кроме того, в момент его создания я замораживаю веса модели пространства-времени, откладывая любую тонкую настройку на последующих этапах.

Класс Dataset управляет этапами загрузки и преобразования, происходящими на этапах обучения, проверки и тестирования. Для каждого клипа через объект UniformTemporalSubsample выбирается заданное количество равномерно разделенных кадров по длительности клипа. Таким образом, кадры нормализуются и изменяются. Только для модели SlowFast кадры разделены классом PackPatway в два списка. Первый для медленного пути, второй для быстрого компонента с несколькими альфа кадрами относительно первого. Тензор загруженного кадра имеет размерность (C, N, H, W) для моделей R(2+1)D и SlowFast, где C — цветовой канал, N — количество кадров, а H и W — высота и ширина. . Вместо этого мне нужно поменять местами измерения C и N для модели TimeSformer, как показано в функции getitem.

5. Обучение и оценка

После загрузки файла конфигурации, как показано в следующей части кода сценария train_test_autoencoder.py, процесс обучения начинает создавать экземпляры загрузчиков данных для набора данных поезда, проверки, теста и аномалий. Таким образом, я создаю модель, оптимизатор Адама и планировщик скорости обучения Step. В качестве критерия оптимизации я установил функцию MSELoss, которая будет получать на входе вектор внедрения, извлеченный пространственно-временной моделью, и восстановленный вектор внедрения, полученный автокодировщиком. На самом деле, для набора обучающих данных решение проблемы будет намного лучше, поскольку восстановленные векторы внедрения приближаются к тем, которые генерируются пространственно-временной моделью. С другой стороны, для аномальных случаев ошибка восстановления должна быть достаточно высокой.

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

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

6. Эксперименты и результаты

Для каждой модели пространства-времени я обучил две конфигурации. В первом случае обучается только автоэнкодер, а модель пространства-времени остается замороженной. Во втором, помимо автоэнкодера, я также разморозил последние слои модели пространства-времени, точно настроив ее веса в соответствии с моим пользовательским набором данных. То есть для R(2+1)D я разблокировал последние 12 слоев из 110, для SlowFast — последние 30 из 329, а для TimeSformer — последние 22 слоя из 246.

На рисунках [7] и [8] для каждой лучшей модели в двух разных конфигурациях показано, как ошибка реконструкции распределяется в наборах данных поезда, проверки, тестирования и аномалий. Поскольку цель предложенного здесь метода состоит в том, чтобы минимизировать ошибку реконструкции в наборах поездов, проверки и тестирования и максимизировать ее в наборе данных аномалий, архитектура, которая лучше всего соответствует этому запросу, — это автоэнкодер с TimeSformer в качестве модели пространства-времени. В этом случае для обеих конфигураций распределение ошибок аномального набора данных сосредоточено на более высоких значениях и с меньшим перекрытием с другими наборами данных.

Последний шаг заключается в том, чтобы зафиксировать порог разделения, чтобы во время вывода я мог распознать видеоклип как нормальный или нет. С этой целью, глядя на диаграммы на рис. [7] и [8], я пробую разные значения функции evaluate_anomaly_accuracy скрипта test_anomaly_clips.py, выбирая такое, которое распознает максимальное количество аномальные клипы воспринимаются как аномальные и как можно меньше сбивают с толку нормальные клипы как аномальные.

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

Спасибо за прочтение. Если вам это нравится, похлопайте в ладоши!

Рекомендации