⏳ 2021–10–08 обновить
- Обновлена версия GitHub с последними версиями библиотеки + Python 3.7 → 3.9
👋 Здравствуйте!
В этой статье вы увидите следующее:
- как отслеживать объекты, присутствующие в видео,
- с автоматизированным конвейером обработки,
- менее чем в 300 строках кода Python.
Вот пример автоматически созданного резюме объекта для видео ‹ animals.mp4 ›:
🛠️ Инструменты
Подойдут несколько инструментов:
- Место для хранения видео и результатов
- Бессерверное решение для запуска кода
- Модель машинного обучения для анализа видео
- Библиотека для извлечения кадров из видео
- Библиотека для рендеринга объектов
🧱 Архитектура
Вот возможная архитектура с использованием 3 облачных сервисов Google (Облачное хранилище, Облачные функции и Video Intelligence API):
Конвейер обработки выполняет следующие шаги:
- Вы загружаете видео
- Событие загрузки автоматически запускает функцию отслеживания.
- Функция отправляет запрос в Video Intelligence API.
- Video Intelligence API анализирует видео и выгружает результаты (аннотации).
- Событие загрузки запускает функцию рендеринга
- Функция загружает как аннотации, так и видео файлы.
- Функция отображает и выгружает объекты
- Вы знаете, какие объекты присутствуют в вашем видео!
🐍 Библиотеки Python
Video Intelligence API
- Анализировать видео
- Https://pypi.org/project/google-cloud-videointelligence
Облачное хранилище
- Для управления загрузками и выгрузками
- Https://pypi.org/project/google-cloud-storage
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 ›:
- Бабочка (легко?):
- Насекомое в личиночной стадии, взбирающееся на движущуюся ветку:
- Обезьяна на дереве далеко (тяжело?):
- Обезьяна прыгает с вершины дерева (сложнее?):
- А теперь ловушка! Если нас можно обмануть, современное состояние машинного обучения тоже может:
🚀 Исходный код и развертывание
Исходный код
- Исходный код Python составляет менее 300 строк кода.
- Смотрите исходники на GitHub.
Развертывание
- Вы можете развернуть эту архитектуру менее чем за 8 минут.
- См. Развертывание с нуля ».
🖖 Увидимся
Вы хотите большего, у вас есть вопросы? Я бы с удовольствием прочитал ваши отзывы. Вы также можете подписаться на меня в Twitter.
⏳ Обновления
- 2021–10–08: обновлена версия GitHub с последними версиями библиотек + Python 3.7 → 3.9
📜 Также в этой серии
- Обобщение видео
- Слежение за видеообъектами
- Обнаружение и обработка лиц