Skip to content

Поиск человеческого лица с помощью кода на Python

Notifications You must be signed in to change notification settings

Laiwer/Find-face-on-Python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Нахождение лица на видео с помощью Face-Recognition

Содержание

Исходные видео с лицами людей есть в репозитории в папке "video_with_face", а обработанные видео в форматах .mp4 и .gif есть в папке "result_video"

Идея

Одним воскрестным вечером, я как обычно изучал новую для себя python библиотеку с большим функционалом. На этот раз это была MoviePy. Мне понравилась функция размытия в этом модуле (в дальнейшем я буду использовать размытие из модуля opencv-python). И мне стало интересно поработать с алгоритмом нахождения лица на изображении и последуйщим его размытием. Конкретных туториалов на эту тему я не нашёл, поэтому делаем всё сами.

Сначала я писал код распознования лица с помощью opencv-python, но подумал что нужно более точное нахождение лица на изображении и поэтому решил использовать именно этот python модуль для дальнейшей работы.

Установка

В проекте используется три библиотеки:
import face_recognition
from moviepy.editor import VideoFileClip
import cv2
...

Face_Recognition используется для нахождения лица на видео (изображении). Pypi, Anaconda

Moviepy используется только для того, чтобы при создании нового видео передать такие же параметры FPS и размера картинки как в оригинальном видео. Pypi, Anaconda

OpenCV используется для обработки видео (изображения) и в данном случае для размытия найденого лица. Pypi, Anaconda

Кажется ничего сложного, ввёл в консоль pip и установил нужные пакеты, но на Windows у меня возникли проблемы. Проблема заключалась в том, что у меня никак не хотел устанавливаться модуль dlib, который использует Face-Recognition. Я, как нормальный программист, пошёл гуглить проблему и всё что я находил у меня не работало. Я дважды переустанавливал Visual Studio 2019 C++, устанавливал отдельный файл модуля (.whl) и даже, скачая CMake и добавив его в глобальные переменные компьютера, код никак не хотел работать. Но потом я нашёл следующий код:

conda install -c conda-forge dlib

Удивительно, но о существовании такой прекрасной вещи как Anaconda я и подумать не мог. Для этого понадобиться установить CMake и добавить его в переменные(туториал), установить Anaconda (туториал), а также добавить Anaconda в переменные окружения (туториал). Для скачивания модулей с помощью Anaconda используй сайт для их поиска (сайт).

Как работает?

Библиотека Face-Recognition работает на основе библиотеки dlib, которая написана на C++. Может скоро я поработаю с библиотекой dlib на Python и сделаю о ней репозиторий с каким-нибудь проектом. Кстати, с определением лиц можно работать напрямую с библиотекой dlib (пример кода), но с Face-Recognition более удобнее и меньше кода.

Dlib — это современный набор инструментов C++, содержащий алгоритмы машинного обучения и инструменты для создания сложного программного обеспечения на C++ для решения реальных задач. Он используется как в промышленности, так и в научных кругах в широком спектре областей, включая робототехнику, встраиваемые устройства, мобильные телефоны и большие высокопроизводительные вычислительные среды. Лицензия Dlib с открытым исходным кодом позволяет вам использовать его в любом приложении бесплатно. (источник)

Обработка видео работает достаточно просто. Библиотека Face-Recognition поддерживает обработку только изображений. Видео - это изображения, которые меняются с высокой скоростью, например 30 изображений в секунду. Значит чтобы обработать видео, нам нужно обработать каждое изображение, которое содержит видео. На этом и основана функция detect_face_on_video()

Разбор кода

Подключив все нужные модули, я приступил к программированию. По сути в самом коде у меня уже добавлены подробные комментарии, поэтому я только поверхностно пройду по функции.
def detect_face_on_video(
    name_videofile: str,
    with_sound: bool = False,
    quality_detect: int = 1,
    model: str = "hog",
    with_blur: bool = False,
    increase_area_blur: int = 0,
    degree_blur: int = 100
) -> None

name_videofile (required):
Обязательный. Требуется ввести только имя файла, путь к файлу не подойдёт. Видео должно находиться в том же каталоге, что и скрипт. Использует видео только с расшрирением MP4.
with_sound (optional):
Необязательный. Если этот параметр равен True, тогда видео будет обработано сохранив при этом звук, иначе видео обработается и на выходе вы получите видео без звука.
quality_detect (optional):
Необязательный. Это число, которое определяет рамки области поиска лица на видео, то есть он будет искать самые большие лица на видео, а мелкие пропускать. Чем больше это число, тем более мелкие лица программа будет нахожить на видео, но при этом увеличивается время обработки в несколько раз. Оптимальный диапазон значений: 1 - 5.
model (optional):
Необязательный. Лучше прочитай об этом в офицальной документации: https://face-recognition.readthedocs.io/en/latest/face_recognition.html#face_recognition.api.face_locations.
with_blur (optional):
Необязательный. Если для этого параметра установлено значение True, то при обнаружении лица на видео оно будет его размывать, иначе лицо будет просто выделено синим квадратом без размытия.
increase_area_blur (optional):
Необязательный. Работает только с включённым размытием. Этот параметр - это число, на которое будет увеличена область размытия найденного лица. Измеряется в пикселях.
degree_blur (optional):
Необязательный. Работает только с включённым размытием. Это параметр уровня размытия лица, то есть с какой силой будет размыто лицо, который измеряется в процентах (от 0% до 100%).

Примеры

На Гиф. 1 поиск лица и выделение его, на Гиф. 2 поиск лица и размытие его. Качество поиска лица (quality_detect из detect_face_on_video()) в данном примере равен 1 и обратывалось оно достаточно быстро.

Гиф. 1

Гиф. 2

Вот ещё примеры этого же видео, но с качеством поиска лица равным 2. Разница очень заметна.

Гиф. 3

Гиф. 4

Тут уровень качества поиска лица равен 3. Мой компьютер смог обработать его за ±20 минут.

Гиф. 5

Гиф. 6

Можете сравнить все эти видео и понять какой вариант наиболее оптимальный для вас. По моим наблюдениям, я делаю вывод о том, что Гиф. 3 и Гиф. 5 схожи и в данном случае Гиф. 3, то есть качество поиска лица равное 2, может хватить. На видео в момент когда люди сидят, можно увидеть что на обоих гифках примерно одинаково определены лица, а когда люди встают, то на Гиф. 5 определенно всего лишь на 1, 2 лица больше, чем на Гиф. 3, но времени на обработку Гиф. 5 уходит в два раза больше.

Вот ещё пример стокового видео с большим количеством людей, тут я уже оставлю комментарии, просто посмотрите и сами сделайте выводы.

Уровень качества поиска лица равен 1:

Уровень качества поиска лица равен 2:

Уровень качества поиска лица равен 3:

About

Поиск человеческого лица с помощью кода на Python

Topics

Resources

Stars

Watchers

Forks

Languages