⏳ 2021–10–08 обновить

  • Обновлена ​​версия GitHub с последними версиями библиотеки + Python 3.7 → 3.9

👋 Здравствуйте!

В этой статье вы увидите следующее:

  • как отслеживать объекты, присутствующие в видео,
  • с автоматизированным конвейером обработки,
  • менее чем в 300 строках кода Python.

Вот пример автоматически созданного резюме объекта для видео ‹ animals.mp4 ›:

🛠️ Инструменты

Подойдут несколько инструментов:

  • Место для хранения видео и результатов
  • Бессерверное решение для запуска кода
  • Модель машинного обучения для анализа видео
  • Библиотека для извлечения кадров из видео
  • Библиотека для рендеринга объектов

🧱 Архитектура

Вот возможная архитектура с использованием 3 облачных сервисов Google (Облачное хранилище, Облачные функции и Video Intelligence API):

Конвейер обработки выполняет следующие шаги:

  1. Вы загружаете видео
  2. Событие загрузки автоматически запускает функцию отслеживания.
  3. Функция отправляет запрос в Video Intelligence API.
  4. Video Intelligence API анализирует видео и выгружает результаты (аннотации).
  5. Событие загрузки запускает функцию рендеринга
  6. Функция загружает как аннотации, так и видео файлы.
  7. Функция отображает и выгружает объекты
  8. Вы знаете, какие объекты присутствуют в вашем видео!

🐍 Библиотеки Python

Video Intelligence API

Облачное хранилище

OpenCV

  • Для извлечения видеокадров
  • OpenCV предлагает безголовую версию (без функций графического интерфейса, идеально подходит для службы)
  • Https://pypi.org/project/opencv-python-headless

Подушка

  • Для визуализации и аннотирования изображений объектов
  • Pillow - очень популярная библиотека изображений, обширная и простая в использовании.
  • Https://pypi.org/project/Pillow

🧠 Анализ видео

Video Intelligence API

Video Intelligence API - это предварительно обученная модель машинного обучения, которая может анализировать видео. Одна из его многочисленных функций - обнаружение и отслеживание объектов. Для 1-й облачной функции, вот возможная основная функция, вызывающая annotate_video() с функцией OBJECT_TRACKING:

Точка входа в облачную функцию

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

🎨 Визуализация объектов

Структура кода

Интересно разделить код на 2 основных класса:

  • StorageHelper для управления локальными файлами и объектами облачного хранилища
  • VideoProcessor для всех графических обработок

Вот возможная основная функция для 2-й облачной функции:

Точка входа в облачную функцию

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

Рендеринг кадра

OpenCV и Pillow позволяют легко извлекать видеокадры и компоновать их:

Примечание. Вероятно, можно было бы использовать только OpenCV, но я считаю, что разработка с Pillow более продуктивна (код более читабелен и интуитивно понятен).

🔎 Результаты

Вот основные объекты из видео ‹ JaneGoodall.mp4 ›:

Примечания:
• Модель машинного обучения правильно определила различные виды диких животных: это «истинные положительные моменты». Он также неправильно определил нашу планету как «упакованные товары»: это «ложный результат». Модели машинного обучения продолжают обучение, обучаясь на новых образцах, поэтому со временем их точность продолжает расти (что приводит к меньшему количеству ложных срабатываний).
• Текущий код отфильтровывает обнаруженные объекты с достоверностью ниже 70% или менее чем 10 кадров. Понизьте пороги, чтобы получить больше результатов.

🍒 Вишня от Py 🐍

Теперь, глазурь на торте (или «вишенка на пироге», как мы говорим по-французски), вы можете обогатить архитектуру, добавив новые возможности:

  • Запуск обработки видео из любого сегмента (включая внешние общедоступные сегменты)
  • Создание анимации отдельных объектов (параллельно с обзором объектов)

Архитектура (v2)

  • A - Отслеживание видеообъекта также можно запустить вручную с помощью HTTP-запроса GET.
  • B - Один и тот же код рендеринга развернут в двух родственных функциях, различающихся переменной окружения.
  • C - сводки объектов и анимации генерируются параллельно

Точка входа HTTP облачной функции

Примечание. Это тот же код, что и gcf_track_objects() с параметром URI видео, указанным вызывающим абонентом в запросе GET.

🎉 Результаты

Вот несколько автоматически сгенерированных треков для видео ‹ animals.mp4 ›:

  • Левый слон (большой объект;) обнаружен:

  • Правый слон тоже отлично изолирован:

  • Правильно определен ветеринар:

  • Животное, которого он кормит тоже:

Движущиеся объекты или статические объекты в движущихся кадрах также отслеживаются, как в ‹yond-the-map-rio.mp4 ›:

  • Здание в движущемся кадре:

  • Также отслеживаются соседние постройки:

  • Лица в движущемся кадре:

  • Серфер пересекает кадр:

Вот еще несколько примеров из видео ‹ JaneGoodall.mp4 ›:

  • Бабочка (легко?):

  • Насекомое в личиночной стадии, взбирающееся на движущуюся ветку:

  • Обезьяна на дереве далеко (тяжело?):

  • Обезьяна прыгает с вершины дерева (сложнее?):

  • А теперь ловушка! Если нас можно обмануть, современное состояние машинного обучения тоже может:

🚀 Исходный код и развертывание

Исходный код

Развертывание

🖖 Увидимся

Вы хотите большего, у вас есть вопросы? Я бы с удовольствием прочитал ваши отзывы. Вы также можете подписаться на меня в Twitter.

⏳ Обновления

  • 2021–10–08: обновлена ​​версия GitHub с последними версиями библиотек + Python 3.7 → 3.9

📜 Также в этой серии

  1. Обобщение видео
  2. Слежение за видеообъектами
  3. Обнаружение и обработка лиц