Задача: взять видео, выполнить распознавание лица, записать видеофайл с рамкой вокруг лица обратно на диск. А чтобы сделать это быстрее, запустим процесс в нескольких потоках.
Установка необходимых библиотек
Для работы понадобится установить следующие пакеты:
OpenCV – cамая популярная библиотека компьютерного зрения – её мы будем использовать для
чтения и записи видеофайлов. Пример использования недавно публиковался в Библиотеке программиста. Чтобы установить OpenCV, используйте pip:
FFmpeg – кроссплатформенное ПО для записи, конвертации и стриминга аудио и видео. Мы будем использовать FFmpeg для объединения нескольких видеофайлов. Страница загрузки.
Импорт библиотек в Python
Давайте импортируем
необходимые библиотеки:
Подробная информация об
используемых библиотеках:
cv2: библиотека OpenCV, чтобы читать и писать видеофайлы;
time: получаем текущее время для расчета времени выполнения кода;
subprocess: запускаем новые процессы, подключаемся к их каналам input/output/error и забираем их коды возврата.
multiprocessing: распараллеливаем выполнение функции для нескольких входных значений и распределяем входные данные между процессами;
xailient: библиотека для распознавания лиц. Вы можете использовать для этой цели любую библиотеку, например face_recognition, но в нашем примере используется эта.
Конвейер обработки видео в одном процессе
Начнем с метода
обработки видео в одном процессе. Именно так мы обычно читаем
видеофайл, обрабатываем каждый кадр и записываем выходные кадры обратно на
диск.
Давайте создадим еще
одну функцию, которая вызывает видеопроцессор, фиксирует время начала и
конца, вычисляет время, необходимое для выполнения обработки и количество обработанных
кадров в секунду.
Обработка видео с
использованием нескольких процессов
Теперь определим другую
функцию, использующую многопроцессорную обработку:
В приведенной функции
описана обработка, которая обычно выполняется с помощью одного процесса, но теперь
она делится поровну между общим количеством процессоров, доступных на
исполняющем устройстве.
Если существует 4
процесса, а общее количество кадров в обрабатываемом видео равно 1000, то
каждый процесс получает 250 кадров для обработки, которые выполняются параллельно.
В итоге каждый процесс создаст отдельный выходной файл с видео. Чтобы
объединить эти файлики мы будем использовать ffmpeg.
Теперь создаем конвейер
для запуска многопроцессорной обработки видео, расчета времени выполнения и
кадров, обрабатываемых в секунду.
Результаты
Эксперимент проводился
на Lenovo Yoga 920 с Ubuntu18.04. Количество доступных на устройстве логических процессоров – 8шт.
Из этого эксперимента
мы можем сделать вывод, что при использовании всех ядер обрабатывается в 2 раза
больше кадров в секунду. Чем больше процессоров на тестовой машине, тем больше можно реализовать процессов, и тем быстрее пройдет процесс обработки.