Учебник о том, как создать базовый алгоритм распознавания лиц на Python с использованием OpenCV и каскадов Хаара.

Иногда простейшие коды Python могут дать впечатляющие результаты, и если вашей целью было реализовать скромный алгоритм распознавания лиц, этот учебник был бы идеальным местом для начала.

Одним из нескольких ключевых вариантов использования, которые решает Computer Vision, является задача обнаружения и распознавания лиц. Научить машины видеть мир так, как мы, — это цель Computer Vision, и именно на это нацелен модуль распознавания лиц. Лицо можно охарактеризовать набором ключевых точек, которые при объединении образуют «лицо», которое машина может обнаружить в кадре.

Эти ключевые точки чаще всего составляют глаза, нос, губы и другие контуры лица, которые несут важную информацию и могут конкретно подтвердить, является ли объект в кадре кадром или нет. Модуль Каскад Хаара — это модуль обнаружения объектов, основанный на алгоритме Виолы-Джонса, который использует метод ключевых точек лиц для идентификации лиц в кадре. Более сложная и надежная версия таких алгоритмов обнаружения лиц используется в камерах видеонаблюдения, прямых спутниковых каналах и т. д.

Мы будем использовать каскадный модуль Хаара в сочетании с OpenCV, библиотекой компьютерного зрения с открытым исходным кодом, позволяющей нам выполнять задачи обработки изображений в Python. Этот учебник предполагает некоторые базовые знания об OpenCV в Python, особенно о работе с видеопотоком и изображениями.

Для начала нам нужно получить видеопоток с нашей основной камеры ПК или любое видео, где можно обнаружить человеческое лицо. Вместе с этим нам потребуется загрузить модуль Haar Cascades, в частности Haar Cascade Frontal faceDetector, один из многих модулей, определяющих переднюю часть лица в видеокадре.

import cv2
import matplotlib.pyplot as plt
import numpy as np
face_cascade = cv2.CascadeClassifier(
 'cascades/data/haarcascade_frontalface_alt2.xml')
cap = cv2.VideoCapture(0)

Здесь переменная 'cap' загружается в основную камеру с моей машины, на что указывает функция VideoCapture(0) из cv2, которая либо получает изображение с устройства, подключенного к ПК, либо воспроизводит любой видеофайл на основе дорожка подана.

Видео — это не что иное, как непрерывная подача изображений, воспроизводимых в цикле. Таким образом, чтобы получить доступ к каждому кадру, нам нужно будет просмотреть видео, снятое камерой. Первая строка кода в цикле предназначена для загрузки первого кадра с камеры, чтобы выполнить необходимые вычисления для получения вывода. Кадр должен быть преобразован в оттенки серого, поскольку каскадный классификатор принимает только входные данные в оттенках серого.

while True:
 ret, frame = cap.read()
 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Теперь, когда кадр в градациях серого готов, мы передадим этот кадр в экземпляр классификатора каскада Хаара, чтобы получить количество лиц в кадре. Возвращаемые лица представляют собой массив, каждое значение которого содержит пространственную информацию о каждом лице, обнаруженном в кадре.

Конкретная область в кадре, которая окружает это лицо, называется ROI — область интереса. ROI поможет наметить прямоугольник вокруг обнаруженного лица с учетом пространственной информации из переменной «faces».

faces = face_cascade.detectMultiScale(gray_frame, scaleFactor=1.5, minNeighbors=5)
for (x, y, w, h) in faces:
 width = x + w
 height = y + h
 roi_frame = frame[x:x+h, y:y+h]
 cv2.rectangle(frame, (x, y), (width, height), (0, 0, 255), thickness=3)
cv2.imshow("main frame", frame)
if cv2.waitKey(0) & 0xFF == 27:
 break

Теперь, чтобы показать весь код Python сразу, полный скрипт для реализации детектора лиц Haar Cascade в Python.

import cv2
import matplotlib.pyplot as plt
import numpy as np
face_cascade = cv2.CascadeClassifier(
 'cascades/data/haarcascade_frontalface_alt2.xml')
cap = cv2.VideoCapture(0)
while True:
 ret, frame = cap.read()
 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
 gray_frame, scaleFactor=1.5, minNeighbors=5)
for (x, y, w, h) in faces:
 width = x + w
 height = y + h
 
 roi_frame = frame[x:x+h, y:y+h]

 cv2.rectangle(frame, (x, y), (width, height), (0, 0, 255), thickness=3)
cv2.imshow("main frame", frame)
if cv2.waitKey(0) & 0xFF == 27:
 break
cap.release()
cv2.destroyAllWindows()

Учитывая, что никто из вас не столкнулся со многими проблемами при написании этого кода, вы успешно создали алгоритм распознавания лиц, используя всего несколько строк кода Python! Хотя это одна из наиболее любительских форм реальных сценариев, которые используются для запуска алгоритмов обнаружения/распознавания лиц в отрасли, это все еще начало и может помочь вам работать с более сложными реализациями этого позже.

До встречи!

Дополнительные материалы на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.