Привет! С вами Кирилл Тузов, Data Scientist в команде видеоаналитики бэк-офиса Wildberries & Russ.
Камеры видят всё. Вопрос в том, распознают ли наши алгоритмы, что именно они видят, — и насколько быстро, надёжно и без тонны ручной работы это происходит. В этой статье я расскажу, как мы используем Self-Supervised, Zero-Shot и мультимодальные модели, чтобы приблизиться к максимально возможной эффективности.
Зачем нужна видеоаналитика?
Видеоаналитикой называют любые подходы и алгоритмы, которые позволяют в автоматическом режиме отслеживать видеопоток и находить интересующие события или объекты.
Мы говорим об аналитике в контексте складских операций, и тут для бизнеса могут быть полезны следующие задачи:
Предотвращение фродовых действий — отслеживание нарушений и реагирование на них в прямом эфире.
Контроль техники безопасности. Не посещают ли сотрудники запретные зоны? Носят ли необходимую экипировку? Как выполняют действия, связанные с опасностью травматизма?
Контроль за логистикой — процессами упаковки, погрузки и разгрузки.
Отслеживание перемещения исполнителей и техники по территории складов и ПВЗ. Оптимизируем не только внешнюю, но и внутреннюю логистику!
Традиционный ответ на подобный набор запросов таков:
Выделяется множество разных ML-задач: image, classification, object, detection, action, recognition и т. д.
Для каждой задачи — собственная архитектура.
Используется большое число разных разметок, потому что для каждой модели разметка должна быть выполнена отдельно и в уникальном формате.
Нам это не подходит
Видеоаналитика Wildberries выполняется в довольно сложных условиях: 100+ складов общей площадью более 3 млн кв. м и 50+ тыс. ПВЗ, подключённых к системе видеоаналитики. В сумме — более 100 тыс. камер.
И сами камеры, и типы обзора различаются — в зависимости от помещения и других условий видимости. Видеопоток также бывает нечётким и шумным.
Что касается инцидентов, мы отслеживаем достаточно редкие события — около 200 штук в день. Поиск инцидентов для создания датасетов не отличается от поиска иголок в стоге сена.
С такими вводными целый зоопарк разнообразных, независимых друг от друга моделей тяжело поддерживать даже технически: один видеофайл или одну картинку нужно прогнать через несколько моделей параллельно. А мы ожидаем, что кейсы будут работать в онлайн-режиме.
При большом количестве моделей и редкости нужных объектов ручная разметка становится узким горлышком, которое сильно затрудняет масштабирование и движение вперёд.
Что делать? Создавать универсальную модель, которая поможет упростить архитектуру и сократить трудозатраты.
Наш путь к универсальности
Первый шаг — Self-Supervised Learning (самостоятельная супервизия, самоконтроль).
Мы хотим обучить единую модель, которая сможет качественно обрабатывать видео и генерировать универсальные представления из них. При этом мы будем обучать модель на сырых неразмеченных данных. Задача будет формулироваться так, чтобы её можно было контролировать автоматически.
Как проходит обучение? Например, прячем от модели часть видео и просим её восстановить этот фрагмент, чтобы измерить качество работы модели. Когда ребёнок учится говорить, он не понимает смысл слов, так что ему повторяют одно и то же много раз для механического запоминания и осознания контекста. Так и с моделью: скармливаем ей большое количество видео, ничего не объясняя, и она учится самостоятельно определять, что происходит.
Модель генерирует низкоразмерные эмбеддинги, которые учитывают и передают связи между объектами, их расположением в кадре и действиями.
Как пример хорошей реализации предлагаю рассмотреть модель VideoMAE. В архитектуре у неё лежит декодер-энкодер. MAE = Masked AutoEncoder (маскированный автоэнкодер).
Модель получает видео с частичной маскировкой участков, которые должна восстановить, и за счёт этих действий учит связь между кадрами и контекст происходящего:

Разбиваем небольшой видеоклип на фиксированное количество кадров — 16 или 24. Разбиваем каждый кадр на фиксированное количество ячеек и рандомно выбираем малый объём данных, которые сохраним (несколько ячеек, 5–10% всей информации).
Далее передаём объём данных энкодеру. Задача декодера — восстановить изначальный вид видео. При этом мы будем измерять качество только на тех данных, которые были скрыты при обучении.
В версии VideoMAE V2 авторы развили идею: кроме маскировки входных видеопотоков можно добавлять маскировку в пространстве эмбеддингов и прятать около 50%.

В этой модели также оптимизирован процесс обучения и есть поддержка тяжёлых Backbones — порядка миллиарда параметров. На выходе — модель, которая умеет генерировать качественные эмбеддинги и показывает отличные результаты на целом ряде задач.
Например, в Action Classification по метрике Top 5 Accuracy модель занимает первое место на нескольких бенчмарках и является на данный момент State-of-the-Art.

В других рейтингах модель также держит высокие позиции. Например, пятое и четвёртое место на датасетах Kinetics-400 и Kinetics-600 соответственно.
Temporal Action Localization — ещё один пример задачи, которую решает модель. Мы предполагаем, что в видео не одно, а несколько событий, и задача в том, чтобы предсказать, когда именно они происходят. В качестве предсказания модель выдаёт набор действий и время их начала и окончания.
По метрике Mean Average Precision (mAP) модель занимает четвёртое и пятое место в нескольких датасетах FineAction и THUMOS’14. Это хорошие позиции для повышенной сложности.

Как ещё одну задачу со звёздочкой рассмотрим Spatio-Temporal Action Detection. Теперь важно не только то, когда действие происходит, но и где конкретно в кадре оно происходит. На выходе мы ожидаем от модели получить покадровый набор Bounding Boxes и описание самого действия. По метрике Mean Average Precision (mAP) модель снова занимает первое место, являясь State-of-the-Art на датасете AVA-Kinetics. Великолепно!

Что нам даёт модель, обученная через Self-Supervised подход?
Один Backbone — множество задач. Вместо того чтобы заводить и поддерживать целый ряд независимых тяжёлых моделей, мы обучаем один тяжёлый Backbone, к которому можно подключать головы для даунстрим-задач.
Обучение без разметки. Backbone обучается на огромном количестве сырых неразмеченных данных.
Масштабируемость. Благодаря единому фундаменту систему легко развивать. Чтобы подключить новый сценарий, мы делаем новую специализированную голову и обучаем её на сравнительно небольшом объёме данных.
Устойчивость к шуму и реальным условиям. Благодаря тому, что модель обучается на больших объёмах данных, куда включены все возможные виды обзора, ожидаемые на складах и ПВЗ, она может работать устойчиво в любых условиях.
А если мы хотим обойтись без обучения?
Помогут Zero-Shot и мультимодальные модели!
Zero-Shot подход заставляет предсказывать по текстовому описанию детекции, классы и объекты, которых могло не быть в обучающей выборке в явной форме.
Допустим, модель не видела зебру при обучении, но она знает, как выглядят полоски и как выглядит лошадь. Если ей сказать, что зебра — это полосатая лошадь, она сможет её распознать:

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

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

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

VLM — универсальный помощник?
Современные визуально-языковые модели — мощный инструмент, который по текстовому описанию может решать большое количество задач. Быть классификатором и детектором изображений, описывать найденные объекты, читать тексты на разных языках и «понимать» контекст.
Кроме изображений современные модели хорошо решают даунстрим-задачи, связанные с видеофрагментами.
Вот пример, как модель решает задачу Structured Video Captioning (структурированное описание происходящих событий в заданном формате):


Однако мы в Wildberries & Russ работаем на огромных объёмах данных, и наша производительность всё-таки ограничивается некоторыми физическими препятствиями. Возможно, в будущем видеоаналитика сведётся к языковым моделям, но сейчас это сложно реализовать. Пока нам доступно лишь использование в асинхронном режиме — для решения очерченного круга задач.
Что это за задачи?
Во-первых, Zero-Shot разметка или предразметка данных. Мультимодальные модели могут полностью создать разметку, если контекст задачи позволяет, либо быть мощным ассистентом для асессора.
Во-вторых, фильтрация ложных срабатываний. Пусть предыдущая архитектура генерирует детекции, а мы для улучшения качества будем дополнительно их прогонять через языковую модель.
В-третьих, современные модели могут автоматически описывать инцидент. Фиксируем срабатывание, берём видеоклип и просим модель описать, что происходит.
Но не забываем об осторожности! Чтобы получать качественные ответы, нужно использовать целый набор техник и максимально сократить количество степеней свободы VLM:
детально объяснять контекст: что, где, когда, как;
использовать выходы других моделей как подсказку;
чётко сформулировать задачу, задать формат вывода;
давать Few-Shot примеры.
На самом деле — это тема для отдельного доклада. Дайте знать, если вам интересно!
Итак, универсальная архитектура
Построить универсальную архитектуру, которая будет устойчива к масштабированию, — возможно! Она будет выглядеть так:

Ещё раз пошагово. Берём сырой видеопоток, подаём его на вход единому Backbone. При этом Backbone обучается на том же сыром материале — мы собираем его без дополнительной разметки. Backbone генерирует низкоразмерные эмбеддинги, которые идут на специализрованные головы.
По срабатывании голов мы в асинхронном режиме прогоняем данные через мультимодальные модели и получаем качественную фильтрацию выходов. А также автоматически пополняем датасеты и завершаем их разметку для дообучения голов.
Какие преимущества даёт этот подход?
Заметное сокращение наших усилий на разметку. Часть задач мы можем разместить полностью автоматически. Для другой части появляется мощный ИИ-ассистент.
Сокращение независимых мощных моделей, которые сложно содержать для качественной работы всей системы. Теперь у нас одно или несколько универсальных ядер, куда мы навешиваем легковесные головы.
Упрощение внедрения новых классов и сценариев. Раньше для этого требовалось предразметить огромное количество данных, что создавало непомерно крупные датасеты. Сейчас подключение нового сценария может сводиться к изменению текстового промпта.
Итоги приключения по миру видеоаналитики
Какие выводы я сделал, пока разбирался с моделями?
Система должна быть гибкой, потому что она работает на больших данных, по разнообразным сценариям и в сложных условиях. Обеспечить гибкость помогает Self-Supervised Learning. Это направление располагает моделями, которые способны генерировать качественные эмбеддинги и представления.
Мультимодальные модели позволяют значительно сократить усилия на подключение новых сценариев и поддержку текущих за счёт автоматической обработки данных.
Комбинируя эти методы, можно создать крепкий универсальный пайплайн, который будет хорошо справляться со всеми вызовами и испытаниями в видеоаналитике.
Буду рад обсудить наши решения в комментариях. И желаю удачи в экспериментах с видеоаналитикой!
Разборы, новости, экспертиза наших разработчиков и вакансии — в телеграм-канале, подписывайтесь!