ПРИМЕЧАНИЕ. Я перемещаю этот блог в подстак. Подпишитесь на новые сообщения или чтобы читать другие

О распознавании лиц и его роли в обществе написано много. Как и многие темы, касающиеся искусственного интеллекта, его часто обсуждают с мистической атмосферой, как будто все всевидящие машины теперь могут заглядывать в наши души. В зависимости от повествования произведения его точность пугающе точна или ужасающе недостаточна для использования. Amazon раскритиковали за то, что предложили свой сервис Reckognition правоохранительным органам, Сан-Франциско запретил эту технологию, и ее даже назвали расистской. Но технология, лежащая в основе распознавания лиц, не так уж сложна для понимания и довольно интересна.

Я планирую написать серию статей о технологии распознавания лиц. Этот пост в первую очередь будет посвящен распознаванию лиц.

Как работает распознавание лиц

Ниже приведены библиотеки, которые я буду использовать:

import cv2
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from skimage.feature import hog
from skimage import data, color, exposure

Неудивительно, что первым шагом к распознаванию лиц является распознавание лица. Как определить лицо? Ну, у лица обычно есть две брови, два глаза, нос, рот и линия подбородка. По сути, вот так:

Проблема в том, что на большинстве изображений происходит слишком много всего. Возьмем Бенедикта Камбербэтча.

Просто посмотрев на это, мы можем сделать обычное лицо похожим на Камбербэтча.

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

Мы действительно заботимся только о краях, а края определяются изменениями градиента. Мы можем использовать оператор Собеля для вычисления производных по вертикали и горизонтали. По сути, это любое резкое изменение окружающих пикселей, то есть края. Если один пиксель белый, а сосед - черный, то производная (величина изменения) между двумя ячейками будет высокой.

cumberbatch = Image.load("images/orig/cumberbatch.png")
gx = cv2.Sobel(cumberbatch, cv2.CV_32F, 1, 0, ksize=1)
gy = cv2.Sobel(cumberbatch, cv2.CV_32F, 0, 1, ksize=1)

gx и gy имеют ту же форму, что и исходное изображение, за исключением производной по отношению к своим вертикальным и горизонтальным соседям на их месте.

def normalize(a):
  return (a - np.min(a))/np.ptp(a)
fig, axes = plt.subplots(ncols=3)
fig.set_size_inches(15, 10)
axes[0].imshow(normalize(gx))
axes[0].set_title("gx")
axes[1].imshow(normalize(gy))
axes[1].set_title("gy")
axes[2].imshow(normalize(gx))
axes[2].imshow(normalize(gy))
axes[2].set_title("gx & gy")

Вы можете видеть, что gx обработал в основном вертикальные края (например, линию волос), в то время как gy обработал в основном горизонтальные края (например, рот).

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

mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)

Но использование полярных координат для каждого пикселя дает слишком детализированный вид, чтобы его можно было использовать для сравнения. Нам нужно объединить полярные координаты, как если бы мы выполняли обзор окружающих координат, чтобы получить общее представление о направлениях, указываемых каждой группой ячеек. Это называется гистограммой ориентированных градиентов (HOG).

Для визуализации мы можем нарисовать стрелки. Количество соседних ячеек, которые мы объединяем, даст нам разные уровни детализации.

Теперь у нас хорошее место, чтобы сравнить его с нашим упрощенным лицом.

Что ж, может быть, наше общее лицо далеко не идеально, но, к счастью, есть лучшие дистилляции, которые мы можем использовать. Мы можем просто использовать скользящее окно, чтобы увидеть, получим ли мы разумное совпадение.

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

В следующей части я расскажу о чертах лица и трансформациях.

ПРИМЕЧАНИЕ. Я перемещаю этот блог в подстак. Подпишитесь на новые сообщения или чтобы читать другие