Обработка видео для распознавания лиц при помощи Go и Python

автор

Если у вас много видео-контента, но вы не знаете, что за люди на этих видео, вы можете быстренько создать инструмент, который автоматически будет обнаруживать и узнавать людей при помощи Go, Python и Facebox.

Требования

  • Языка программирования Go
  • Python 2 и OpenCV
  • Facebox machinebox.io

Внедряем видеопоток

Один из вопросов, который может возникнуть – можем ли мы поддерживать видео в боксах, например – при распознавании лиц в Facebox.

Поддержка видео присутствует в Machine Box, но проблема в том, что работа видеопотока может быть очень сложной, кроме того, у разных людей разные требования. Так что вместо поддержки видео сейчас, мы решили составить базовые примеры, чтобы показать, как внедрить video pipeline и интегрировать их с боксами, предоставленными Machine Box.

Извлечение кадров видео в Python и OpenCV

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

Давайте взглянем на код Python:

Суть данного скрипта в том, чтобы открыть видео, и при помощи настраиваемой частоте кадров получить информацию об одном из них, а также сам кадр. Его мы получаем в кодировке base64 как JSON и выводим в стандартную выдачу.

Создаем видеопоток при помощи и обработчиков Go и HTTP

Так как мы можем извлекать кадры и направлять их в стандартную выдачу, мы можем использовать Go для управления выполнением команд Python, отправки кадров в Facebox для определения, и получать отчет снова в браузере, при помощи API браузера EventSource. Это нужно нам для трансляции процесса обработки видео в реальном времени.

Выполняем Python скрипт при помощи Go

Мы используем Go для управления жизненным циклом скрипта Python, чтобы извлечь видео. Для этого мы можем использовать exec.CommandContext, где мы можем передать параметры, а используя context.Context из http.Request, мы можем отменить выполнение в любое время.

После выполнения мы можем прочесть stdout и декодировать JSON из команды. Давайте взглянем на фрагмент кода Go:

Вызов Facebox для распознавания лиц

После того, как мы добавили кадр в память, мы можем проводить любую работу. В данном случае, мы отправляем кадр в Facebox для выполнения распознавания лиц.

Это делается очень просто при помощи SDK Go, при работе в других языках вы можете просто использовать простой вызов HTTP в боксе.

После того, как вы поместили кадр в память, вы легко можете отправить его в несколько боксов Machine Box и выполнить проверку на адалт контент при помощи nudebox. Так вам не придется проводить проверку видео дважды.

Полезный совет. Сохраните ответ JSON из Facebox, наряду с кадром и данными видео базе данных или поисковике (например, Elastic Search). Так вы можете выполнять запросы и поиск своих видео.

Используем Server Sent Events для отправления отчетов обратно в браузер

Нам нужно работать в реальном режиме в браузере, и Server Sent Events позволяет нам это делать. В Go это происходит прямолинейно, нам нужно только указать правильные заголовки, вот так:

Теперь каждый раз, когда нам нужно отправить что-то в браузер, нам нужно только выслать сообщение с «data:» префикс с двойным окончанием \n\n, чтобы указать, что вы закончили с данным событием, например:

Таким образом, при помощи небольшой функции Go мы можем отправить столько событий, сколько сами захотим:

В браузере мы можем обработать все события даже при помощи нескольких строк Javascript.

Вот полный код http.Handler:

Вывод

Вы можете использовать Go и Python для внедрения действительно мощных инструментов распознавания лиц и многих других возможностей.

Создайте аккаунт в machinebox.io чтобы воспользоваться Facebox.

Полный код

Github: https://github.com/machinebox/videoanalysis

Вам может быть интересно