Найти в Дзене

Face Recognition в Машинном обучении простыми словами

Фото: Brian McGowan / Unsplash
Фото: Brian McGowan / Unsplash

Распознавание лиц – классическая задача Компьютерного зрения (CV), выделение лиц на изображении. С примером нам поможет OpenCV — самая популярная библиотека в этой сфере. Первоначально написанная на C/C++, теперь она предоставляет коннектор и на Python.

OpenCV использует алгоритмы Машинного обучения (ML) для поиска лиц на изображении. Поскольку лица весьма разнообразны, не существует одного простого теста, который скажет вам, нашла ли библиотека лицо или нет. Однако алгоритмы разбивают задачу идентификации лица на тысячи более мелких задач, каждую из которых легко решить.

Для чего-то вроде лица у вас может быть 6000 или более классификаторов, и все они должны распознать части лица, чтобы оно было обнаружено. Но в этом и заключается проблема: для распознавания лиц алгоритм начинает с верхнего левого угла изображения и перемещается вниз по небольшим блокам данных, просматривая каждый блок, постоянно спрашивая: «Это лицо? … Это лицо? … Это лицо?» Поскольку в каждом блоке содержится 6000 или более тестов, вам могут потребоваться миллионы вычислений, которые повесят компьютер.

Чтобы обойти это, OpenCV использует каскады, своеобразный «ряд водопадов». Подобно серии водопадов, каскад OpenCV разбивает проблему обнаружения лиц на несколько этапов. Для каждого блока выполняется очень грубый и быстрый тест. Если это проходит, он выполняет немного более подробный тест и так далее. Алгоритм может иметь от 30 до 50 таких этапов или каскадов, и он обнаружит лицо только в том случае, если все этапы пройдены.

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

Хотя теория может показаться сложной, на практике все довольно просто. Сами каскады — это просто набор файлов XML, содержащих данные OpenCV, используемые для обнаружения объектов. Мы инициализируем свой код желаемым каскадом, а затем он выполняет всю работу за нас.

Поскольку обнаружение лиц является таким распространенным случаем, OpenCV поставляется с рядом встроенных каскадов для обнаружения всего, от лиц и глаз до рук и ног. Есть даже каскады для других вещей, не имеющих отношения к человеческому телу. Например, если вы управляете магазином бананов и хотите отслеживать людей, крадущих бананы, для этого есть специальная конфигурация!

Давайте изучим код. Для начала импортируем необходимые библиотеки:

import cv2
import numpy as np
import pandas as pd
import sys
import urllib.request
from google.colab.patches import cv2_imshow

Сначала мы подгрузим каскадный файл и инициализируем каскадную конфигурацию:

cascPath = "/content/haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)

Затем – изображение. После вычитки картинки мы обесцветим ее для сокращения требуемых вычислительных мощностей:

req = urllib.request.urlopen('https://www.dropbox.com/s/wbi8ubchu1qodtl/abba.png?dl=1')
arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
image = cv2.imdecode(arr, -1) # 'Load it as it is'
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Функция detectMultiScale фактически определяет лицо и является ключевой частью нашего кода, поэтому давайте пройдемся по параметрам:

faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags = cv2.CASCADE_SCALE_IMAGE
)

print("Найдено {0} лиц(-а).".format(len(faces)))

for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2_imshow(image)
cv2.waitKey(0)

Первый аргумент gray – изображение в градациях серого.

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

Алгоритм обнаружения использует движущееся окно для обнаружения объектов. minNeighbors определяет, сколько объектов будет обнаружено рядом с текущим, прежде чем он объявит найденное лицо. minSize тем временем определяет размер каждого окна.

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

Функция возвращает список прямоугольников, в которых, по его мнению, найдено лицо. Далее мы ограничим прямоугольниками те места, где по мнению OpenCV, есть лицо.

Функция faces возвращает 4 значения (x, y, w, h): расположение прямоугольника по осям x и y, а также ширину и высоту прямоугольника (w, h).

Мы используем эти значения для рисования прямоугольника с помощью встроенной функции rectangle().

-2

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь. Предварительно скачайте и загрузите файл.xml в Colab отсюда.

Автор оригинальной статьи: Shantnu Tiwari