Руководство по быстрой предварительной обработке видеоданных для машинного обучения
Делиться

Это введение в подготовку видео для машинного/глубокого обучения. Из-за размера и вычислительной стоимости видеоданных крайне важно, чтобы их обработка была максимально эффективной для вашего варианта использования. Это включает в себя такие вещи, как анализ метаданных, стандартизация, аугментация, обнаружение кадров и объектов, а также загрузка тензоров. В этой статье рассматриваются некоторые способы реализации этих задач и причины их применения. Я также создал пакет Python с открытым исходным кодом под названием vid-prepper. Я создал этот пакет с целью предоставить быстрый и эффективный способ применения различных методов предварительной обработки к вашим видеоданным. Пакет основан на некоторых гигантах в мире машинного и глубокого обучения, поэтому, хотя этот пакет полезен для объединения их в общую и простую в использовании структуру, основная работа, безусловно, лежит на них!
Видео стало важной частью моей карьеры. Я начал свою карьеру в сфере данных в компании NPAW, которая разработала SaaS-платформу для видеоаналитики для крупных видеокомпаний, а сейчас работаю на BBC. Видео в настоящее время доминирует в веб-пространстве, но с использованием искусственного интеллекта (ИИ) оно пока довольно ограничено, хотя и развивается невероятно быстро. Я хотел создать что-то, что поможет людям быстрее освоить новые технологии и внести свой вклад в эту поистине интересную область. В этой статье я расскажу о функциях различных модулей пакета и о том, как их использовать, начиная с анализа метаданных.
Анализ метаданных
из импорта метаданных vid_prepper
На BBC мне очень повезло работать в профессиональной организации с невероятно талантливыми людьми, создающими видео вещательного качества. Однако я знаю, что большинство видеоданных не соответствуют этому требованию. Зачастую файлы имеют смешанный формат, цвет, размер, могут быть повреждены или в них могут отсутствовать некоторые части, а также могут содержать особенности, характерные для старых видео, например, чересстрочную развертку. Важно учитывать это перед обработкой видео для машинного обучения.
Мы будем обучать наши модели на графических процессорах, которые отлично подходят для масштабных тензорных вычислений, но требуют больших затрат. При обучении больших моделей на графических процессорах мы стремимся к максимальной эффективности, чтобы избежать высоких затрат. Повреждённые видео или видео в неожиданных или неподдерживаемых форматах приведут к потере времени и ресурсов, могут снизить точность ваших моделей или даже привести к сбою процесса обучения. Поэтому предварительная проверка и фильтрация файлов крайне важны.

Я создал модуль анализа метаданных на основе библиотеки ffprobe, входящей в состав библиотеки FFmpeg, написанной на C и ассемблере. Это чрезвычайно мощная и эффективная библиотека, широко используемая в профессиональной сфере. Модуль можно использовать для анализа как одного видеофайла, так и группы видеофайлов, как показано в коде ниже.
# Извлечь метаданные video_path = [“sample.mp4”] video_info = metadata.Metadata.validate_videos(video_path) # Извлечь пакет метаданных video_paths = [“sample1.mp4”, “sample2.mp4”, “sample3.mp4”] video_info = metadata.Metadata.validate_videos(video_paths)
Это обеспечивает вывод словаря метаданных видео, включая кодеки, размеры, частоту кадров, длительность, форматы пикселей, аудиометаданные и многое другое. Это очень полезно как для поиска проблемных видеоданных или видеоданных со странностями, так и для выбора конкретных видеоданных или выбора форматов и кодеков для стандартизации на основе наиболее распространённых.
Фильтрация на основе проблем с метаданными
Учитывая, что это, казалось бы, довольно распространённый случай использования, я добавил возможность фильтровать список видео на основе набора проверок. Например, если в видео отсутствует видео или аудио, используются не те кодеки или форматы, либо частота кадров или длительность отличаются от указанных, то такие видео можно идентифицировать, установив параметры filter и only_errors, как показано ниже.
# Запуск тестов на видео videos = [«video1.mp4», «video2.mkv», «video3.mov»] all_filters_with_params = { «filter_missing_video»: {}, «filter_missing_audio»: {}, «filter_variable_framerate»: {}, «filter_resolution»: {«min_width»: 1280, «min_height»: 720}, «filter_duration»: {«min_seconds»: 5.0}, «filter_pixel_format»: {«allowed»: [«yuv420p», «yuv422p»]}, «filter_codecs»: {«allowed»: [«h264», «hevc», «vp9», «prores»]} } ошибки = Metadata.validate_videos( videos, filters=all_filters_with_params, only_errors=True )
Устраняя или выявляя проблемы с данными до того, как мы приступим к действительно интенсивной работе по обучению модели, мы избегаем напрасной траты времени и денег, что делает это жизненно важным первым шагом.
Стандартизация
из vid_prepper импорт стандартизирован
Стандартизация обычно очень важна на этапе предварительной обработки видеоданных для машинного обучения. Она может значительно повысить эффективность и согласованность процесса, а модели глубокого обучения часто требуют определённых размеров (например, 224 x 224). При наличии большого объёма видеоданных время, затраченное на этом этапе, часто многократно окупается на этапе последующего обучения.

Кодеки
Видео часто структурируются для эффективного хранения и распространения через интернет, чтобы их можно было быстро и недорого транслировать. Обычно это предполагает сильное сжатие, чтобы сделать видео максимально компактными. К сожалению, это практически диаметрально противоположно тому, что полезно для глубокого обучения.
Узким местом для глубокого обучения почти всегда является декодирование видео и загрузка их в тензоры, поэтому чем сильнее сжат видеофайл, тем больше времени это занимает. Обычно это означает отказ от кодеков с высокой степенью сжатия, таких как H265 и VVC, и переход на более лёгкие варианты сжатия с аппаратным ускорением, такие как H264 или VP9, или, если это позволяет избежать узких мест ввода-вывода, использование чего-то вроде несжатого MJPEG, который обычно используется в продакшене, поскольку это самый быстрый способ загрузки кадров в тензоры.
Частота кадров
Стандартная частота кадров (FPS) для видео составляет 24 для кино, 30 для телевидения и онлайн-контента и 60 для динамичного контента. Эта частота кадров определяется количеством изображений, которые необходимо отображать в секунду, чтобы наши глаза могли увидеть одно плавное движение. Однако моделям глубокого обучения не обязательно нужна такая высокая частота кадров в обучающих видео для создания числовых представлений движения и создания плавных видео. Поскольку каждый кадр — это дополнительный тензор для вычисления, мы хотим минимизировать частоту кадров до минимально возможного значения.
Различные типы видео и варианты использования наших моделей будут определять, насколько низкими мы можем их сделать. Чем меньше движения в видео, тем ниже можно установить входную частоту кадров без ущерба для качества результатов. Например, для входного набора данных, состоящего из новостных роликов или ток-шоу, потребуется более низкая частота кадров, чем для набора данных, состоящего из хоккейных матчей. Кроме того, если мы работаем над моделью понимания видео или преобразования видео в текст, а не создаём видео для просмотра человеком, возможно, можно установить ещё более низкую частоту кадров.
Расчет минимальной частоты кадров
На самом деле, математически можно определить достаточно точную минимальную частоту кадров для вашего набора видеоданных на основе статистики движения. Используя алгоритм RAFT или Farneback на выборке вашего набора данных, можно рассчитать оптический поток на пиксель для каждого изменения кадра. Это позволяет получить горизонтальное и вертикальное смещение для каждого пикселя, чтобы рассчитать величину изменения (квадратный корень из суммы квадратов значений).
Усреднение этого значения по кадру дает импульс кадра, а взятие медианы и 95-го процентиля всех кадров дает значения, которые можно подставить в уравнение ниже, чтобы получить диапазон вероятных оптимальных минимальных частот кадров для ваших тренировочных данных.
Оптимальный FPS (нижний) = Текущий FPS x Максимальная скорость интерполяции модели / Средний импульс Оптимальный FPS (выше) = Текущий FPS x Максимальная скорость интерполяции модели / 95-й процентиль импульса
Где максимальная интерполяция модели — это максимальный импульс за кадр, который может обработать модель; обычно он указывается в карточке модели.

Затем вы можете провести мелкомасштабные тесты вашего конвейера обучения, чтобы определить самую низкую частоту кадров, которую можно достичь для оптимальной производительности.
Видео-преппер
Модуль стандартизации в vid-prepper может стандартизировать размер, кодек, цветовой формат и частоту кадров отдельного видео или пакета видео.
Опять же, он построен на FFmpeg и может ускорять работу на GPU, если это доступно. Чтобы стандартизировать видео, просто запустите код ниже.
# Стандартизировать пакет видео video_file_paths = [“sample1.mp4”, “sample2.mp4”, “sample3.mp4”] standardizer = standardize.VideoStandardizer( size=»224×224″, fps=16, codec=»h264″, color=»rgb», use_gpu=False # Установите True, если у вас есть CUDA ) standardizer.batch_standardize(videos=video_file_paths, output_dir=»videos/»)
Для повышения эффективности, особенно если вы используете дорогие видеокарты и не хотите создавать узкие места в системе ввода-вывода при загрузке видео, модуль также принимает веб-наборы данных. Их можно загрузить аналогично следующему коду:
# Стандартизировать набор веб-данных standardizer = standardize.VideoStandardizer( size=»224×224″, fps=16, codec=»h264″, color=»rgb», use_gpu=False # Установите значение True, если у вас есть CUDA ) standardizer.standardize_wds(«dataset.tar», key=»mp4″, label=»cls»)
Тензорный загрузчик
из загрузчика импорта vid_prepper
Видеотензор обычно имеет 4 или 5 измерений, включая цвет пикселя (обычно RGB), высоту и ширину кадра, а также время и пакет (необязательно). Как упоминалось выше, декодирование видео в тензоры часто является самым узким местом в конвейере предварительной обработки, поэтому шаги, предпринятые до этого момента, существенно влияют на эффективность загрузки наших тензоров.
Этот модуль преобразует видео в тензоры PyTorch, используя FFmpeg для дискретизации кадров и NVDec для ускорения на GPU. Вы можете изменить размер тензоров в соответствии с вашей моделью, а также выбрать количество кадров для дискретизации на клип и шаг между кадрами (интервал между кадрами). Как и в случае стандартизации, также доступна возможность использования веб-наборов данных. Пример кода ниже демонстрирует, как это сделать.
# Загрузка клипов в тензоры loader = VideoLoader(num_frames=16, frame_stride=2, size=(224,224), device=»cuda») video_paths = [«video1.mp4», «video2.mp4», «video3.mp4»] batch_tensor = loader.load_files(video_paths) # Загрузка набора веб-данных в тензоры wds_path = «data/shards/{00000..00009}.tar» dataset = loader.load_wds(wds_path, key=»mp4″, label=»cls»)
Детектор
из детектора импорта vid_prepper
Часто необходимой частью предварительной обработки видео является обнаружение отдельных объектов, кадров или переходов. Этот модуль объединяет мощные процессы и модели PySceneDetector, HuggingFace, Idea Research и PyTorch для эффективного обнаружения.

Обнаружение выстрела
Во многих случаях использования машинного обучения видео (например, для семантического поиска, создания трейлеров seq2seq и многих других) разделение видео на отдельные кадры является важным этапом. Существует несколько способов сделать это, но PySceneDetect — один из наиболее точных и надёжных. Эта библиотека предоставляет оболочку для метода обнаружения контента PySceneDetect, вызывая следующий метод. Он выводит начальный и конечный кадры для каждого кадра.
# Обнаружение кадров в видео video_path = «video.mp4″ detector = VideoDetector(device=»cuda») shot_frames = detector.detect_shots(video_path)
Обнаружение перехода
Хотя PySceneDetect — мощный инструмент для разделения видео на отдельные сцены, он не всегда обеспечивает стопроцентную точность. Иногда можно воспользоваться повторяющимся контентом (например, переходами), разбивая кадры. Например, в BBC News используется переход с красно-белым смещением вверх между сегментами, который легко обнаружить с помощью инструмента вроде PyTorch.
Обнаружение переходов работает непосредственно с тензорами, выявляя изменения пикселей в блоках пикселей, превышающие заданный вами порог. Пример кода ниже демонстрирует, как это работает.
# Обнаружение постепенных переходов/стираний video_path = «video.mp4″ video_loader = loader.VideoLoader(num_frames=16, frame_stride=2, size=(224, 224), device=»cpu», use_nvdec=False # Использовать «cuda», если доступно) video_tensor = loader.load_file(video_path) detector = VideoDetector(device=»cpu» # или cuda) wipe_frames = detector.detect_wipes(video_tensor, block_grid=(8,8), threshold=0.3)
Обнаружение объектов
Обнаружение объектов часто требуется для поиска нужных клипов в видеоданных. Например, вам могут понадобиться клипы с людьми или животными. Этот метод использует модель Dino с открытым исходным кодом и небольшой набор объектов из стандартных меток набора данных COCO для обнаружения объектов. Выбор модели и список объектов полностью настраиваются и могут быть заданы вами. Загрузчиком моделей является пакет HuggingFace transformers, поэтому используемая вами модель должна быть доступна в нём. Для пользовательских меток модель по умолчанию принимает строку со следующей структурой в параметре text_queries: «собака. кошка. скорая помощь».
# Обнаружение объектов в видео video_path = «video.mp4″ video_loader = loader.VideoLoader(num_frames=16, frame_stride=2, size=(224, 224), device=»cpu», use_nvdec=False # Используйте «cuda», если доступно) video_tensor = loader.load_file(video_path) detector = VideoDetector(device=»cpu» # или cuda) results = detector.detect_objects(video, text_queries=text_queries # если None, то по умолчанию будет использоваться список COCO, text_threshold=0.3, model_id=»IDEA-Research/grounding-dino-tiny»)
Дополнение данных
Такие инструменты, как Video Transformers, невероятно эффективны и могут использоваться для создания новых отличных моделей. Однако они часто требуют огромных объёмов данных, которые не всегда легко получить, например, с помощью видео. В таких случаях нам нужен способ генерировать разнообразные данные, чтобы избежать переобучения наших моделей. Дополнение данных — одно из таких решений, помогающих повысить доступность ограниченных данных.
Для видео существует ряд стандартных методов аугментации данных, большинство из которых поддерживаются основными фреймворками. Vid-prepper объединяет два лучших из них — Kornia и Torchvision. С помощью vid-prepper вы можете выполнять отдельные аугментации, такие как кадрирование, переворот, зеркальное отображение, заполнение, размытие по Гауссу, регулировку яркости, цвета, насыщенности и контрастности, а также грубое исключение (маскирование частей видеокадра). Вы также можете объединять их в цепочку для повышения эффективности.
Все аугментации работают с видеотензорами, а не непосредственно с видео, и поддерживают ускорение на GPU (при его наличии). В примере кода ниже показано, как вызывать методы по отдельности и как объединять их в цепочку.
# Пример индивидуального дополнения video_path = «video.mp4″ video_loader = loader.VideoLoader(num_frames=16, frame_stride=2, size=(224, 224), device=»cpu»,use_nvdec=False # Используйте «cuda», если доступно) video_tensor = loader.load_file(video_path) video_augmentor = augmentor.VideoAugmentor(device=»cpu», use_gpu=False) cropped = augmentor.crop(video_tensor, type=»center», size=(200, 200)) flipped = augmentor.flip(video_tensor, type=»horizontal») brightened = augmentor.brightness(video_tensor, amount=0.2) # Связанные дополнения augmentations = [ ('crop', {'type': 'random', 'size': (180, 180)}), ('flip', {'type': 'horizontal'}), ('brightness', {'amount': 0.1}), ('contrast', {'amount': 0.1}) ] chained_result = augmentor.chain(video_tensor, augmentations)
Подведение итогов
Предварительная обработка видео чрезвычайно важна в глубоком обучении из-за относительно большого объёма данных по сравнению с текстом. Требования модели Transformer к огромным объёмам данных ещё больше усугубляют ситуацию. Процесс глубокого обучения состоит из трёх ключевых элементов: времени, денег и производительности. Оптимизируя входные видеоданные, мы можем минимизировать количество первых двух элементов, необходимых для достижения наилучших результатов в конечном результате.
Для машинного обучения на основе видео существует множество потрясающих инструментов с открытым исходным кодом, и их число постоянно растет. Vid-prepper опирается на лучшие и наиболее широко используемые инструменты, стремясь объединить их в простой в использовании пакет. Надеюсь, он окажется для вас полезным и поможет в создании видеомоделей нового поколения, что невероятно интересно!
Источник: towardsdatascience.com



























