Если вы являетесь постоянным пользователем Google Фото, возможно, вы заметили, как приложение автоматически извлекает и группирует лица людей из фотографий, которые вы резервируете в облаке.
Распознавание лиц в
Распознавание лиц в
Приложение для работы с фотографиями, такое как Google, достигает этого путем обнаружения лиц людей (и домашних животных!) на ваших фотографиях, а затем группирует похожие лица вместе. Обнаружение, а затем классификация лиц на изображениях — обычная задача глубокого обучения с помощью нейронных сетей.
На первом этапе этого руководства мы будем использовать предварительно обученную модель MTCNN в Keras для обнаружения лиц на изображениях. После того, как мы извлекли лица из изображения, мы вычислим показатель сходства между этими лицами, чтобы определить, принадлежат ли они одному и тому же человеку.
Предпосылки
Прежде чем приступить к обнаружению и распознаванию лиц, необходимо настроить среду разработки.
pip3 install matplotlib
Чтобы использовать любую реализацию алгоритма CNN, вам необходимо установить keras. Загрузите и установите последнюю версию, используя команду ниже:
pip3 install keras
Алгоритм, который мы будем использовать для обнаружения лиц, — это MTCNN (многозадачные сверточные нейронные сети), основанный на статье «Совместное обнаружение и выравнивание лиц с использованием многозадачных каскадных сверточных сетей «(Zhang et al., 2016). Реализация алгоритма MTCNN для TensorFlow в Python3.4 доступна в виде пакета. Выполните следующую команду, чтобы установить пакет через pip:
pip3 install mtcnn
Чтобы сравнить лица после извлечения их из изображений, мы будем использовать алгоритм VGGFace2, разработанный группой Visual Geometry в Оксфордском университете. Реализация Keras алгоритма VGG на основе TensorFlow доступна в виде пакета, который вы можете установить:
pip3 install keras_vggface
Хотя вы можете почувствовать необходимость построить и обучить свою собственную модель, вам потребуется огромный набор обучающих данных и мощная вычислительная мощность. Поскольку в этом руководстве основное внимание уделяется полезности этих моделей, в нем используются существующие модели, обученные экспертами в этой области.
Теперь, когда вы успешно установили необходимые компоненты, давайте сразу приступим к обучению!
Шаг 1: Обнаружение лиц с помощью модели MTCNN
Цели на этом этапе следующие:
получить изображения, размещенные снаружи, на локальный сервер
читать изображения matplotlibчерез imread () функцию
обнаруживать и исследовать лица с помощью алгоритма MTCNN
извлекать лица из изображения
1.1 Сохранение внешних изображений
Вы часто можете выполнять анализ изображений, размещенных на внешних серверах. В этом примере мы будем использовать два изображения Ли Якокки, отца «Мустанга», размещенные на сайтах BBC и The Detroit News.
Чтобы временно сохранить изображения локально для нашего анализа, мы извлечем каждое из его
import urllib.request
def store_image (url, local_file_name):
with urllib.request.urlopen (url) as resource:
with open (local_file_name, 'wb’) as f:
f.write (resource.read ())
Теперь вы можете просто вызвать функцию с
store_image ('https: //ichef.bbci.co.uk/news/320/cpsprodpb/5944/production/_107725822_
'iacocca_1.jpg’)
store_image ('https: //www.
'iacocca_2.jpg’)
После успешного извлечения изображений давайте обнаружим на них лица.
1.2 Обнаружение лиц на изображении
Для этого сделаем два импорта — matplotlibдля чтения изображений и mtcnnдля обнаружения лиц на изображениях:
from matplotlib import pyplot as plt
from mtcnn.mtcnn import MTCNN
Используйте imread () функцию для чтения изображения:
image = plt.imread ('iacocca_1.jpg’)
Затем инициализируйте MTCNN () объект в detectorпеременной и используйте.detect_faces () метод для обнаружения лиц на изображении. Посмотрим, что он возвращает:
detector = MTCNN ()
faces = detector.detect_faces (image)
for face in faces:
print (face)
Для каждого лица возвращается словарь Python, содержащий три ключа. Ключ boxсодержит границу лица на изображении. Он имеет четыре значения: x- и
{'box’: [160, 40, 35, 44], 'confidence’: 0.9999798536300659, 'keypoints’: {'left_eye’: (172, 57), 'right_eye’: (188, 57), 'nose’: (182, 64), 'mouth_left’: (173, 73), 'mouth_right’: (187, 73) }}
1.3 Выделение лиц на изображении
Теперь, когда мы успешно обнаружили лицо, давайте нарисуем над ним прямоугольник, чтобы выделить лицо на изображении, чтобы проверить правильность обнаружения.
Чтобы нарисовать прямоугольник, импортируйте Rectangleобъект из matplotlib.patches:
from matplotlib.patches import Rectangle
Давайте определим функцию highlight_faces, которая сначала отображает изображение, а затем рисует прямоугольники поверх обнаруженных лиц. Сначала прочитайте изображение imread () и начертите его imshow (). Для каждого обнаруженного лица нарисуйте прямоугольник с помощью Rectangle () класса.
Наконец, отобразите изображение и прямоугольники, используя.show () метод. Если вы используете блокноты Jupyter, вы можете использовать%matplotlib inlineволшебную команду для отображения встроенных графиков:
def highlight_faces (image_path, faces):
# display image
image = plt.imread (image_path)
plt.imshow (image)
ax = plt.gca ()
# for each face, draw a rectangle based on coordinates
for face in faces:
x, y, width, height = face['box’]
face_border = Rectangle ((x, y), width, height,
fill=False, color='red’)
ax.add_patch (face_border)
plt.show ()
Давайте теперь отобразим изображение и обнаруженное лицо, используя highlight_faces () функцию:
highlight_faces ('iacocca_1.jpg’, faces)
Обнаружено лицо на изображении Ли Якокки
Обнаружено лицо на изображении Ли Якокки. Источник: Би -
Отобразим второе изображение и обнаруженные на нем лица:
image = plt.imread ('iacocca_2.jpg’)
faces = detector.detect_faces (image)
highlight_faces ('iacocca_2.jpg’, faces)
Новости Детройта
Новости Детройта
На этих двух изображениях видно, что алгоритм MTCNN правильно определяет лица. Давайте теперь извлечем это лицо из изображения, чтобы выполнить его дальнейший анализ.
1.4 Извлечение лица для дальнейшего анализа
На данный момент вы знаете координаты лиц от детектора. Извлечение лиц — довольно простая задача с использованием списковых индексов. Однако используемый нами алгоритм VGGFace2 требует изменения размера лиц до 224×224 пикселей. Мы будем использовать библиотеку PIL для изменения размера изображений.
Функция extract_face_from_image () извлекает все лица из изображения:
from numpy import asarray
from PIL import Image
def extract_face_from_image (image_path, required_size= (224, 224)):
# load image and detect faces
image = plt.imread (image_path)
detector = MTCNN ()
faces = detector.detect_faces (image)
face_images = []
for face in faces:
# extract the bounding box from the requested face
x1, y1, width, height = face['box’]
x2, y2 = x1 + width, y1 + height
# extract the face
face_boundary = image[y1: y2, x1: x2]
# resize pixels to the model size
face_image = Image.fromarray (face_boundary)
face_image = face_image.resize (required_size)
face_array = asarray (face_image)
face_images.append (face_array)
return face_images
extracted_face = extract_face_from_image ('iacocca_1.jpg’)
# Display the first face from the extracted faces
plt.imshow (extracted_face[0])
plt.show ()
Вот как выглядит извлеченное лицо из первого изображения.
Извлечено и изменено лицо с первого изображения
Извлечено и изменено лицо с первого изображения
Шаг 2: Распознавание лиц с помощью модели VGGFace2
В этом разделе давайте сначала проверим модель на двух изображениях Ли Якокки, которые мы получили. Затем мы перейдем к сравнению лиц на изображениях стартовых одиннадцати игроков футбольной команды «Челси» в 2018 и 2019 годах. Затем вы сможете оценить, идентифицирует ли алгоритм лица обычных игроков на изображениях.
2.1 Сравните два лица
В этом разделе вам нужно импортировать три модуля: VGGFaceдля подготовки извлеченных лиц для использования в моделях распознавания лиц и cosineфункцию из SciPy для вычисления расстояния между двумя лицами:
from keras_vggface.utils import preprocess_input
from keras_vggface.vggface import VGGFace
from scipy.spatial.distance import cosine
Давайте определим функцию, которая принимает извлеченные лица в качестве входных данных и возвращает вычисленные оценки модели. Модель возвращает вектор, представляющий черты лица:
def get_model_scores (faces):
samples = asarray (faces, 'float32')
# prepare the data for the model
samples = preprocess_input (samples, version=2)
# create a vggface model object
model = VGGFace (model='resnet50',
include_top=False,
input_shape= (224, 224, 3),
pooling='avg’)
# perform prediction
return model.predict (samples)
faces = [extract_face_from_image (image_path)
for image_path in ['iacocca_1.jpg’, 'iacocca_2.jpg’]]
model_scores = get_model_scores (faces)
Поскольку оценки модели для каждого лица являются векторами, нам нужно найти сходство между оценками двух граней. Обычно мы можем использовать функцию Евклида или косинуса для вычисления сходства.
Векторное представление лиц соответствует косинусному подобию. Вот подробное сравнение косинусного и евклидова расстояний на примере.
Функция cosine () вычисляет косинусное расстояние между двумя векторами. Чем ниже это число, тем лучше совпадают ваши лица. В нашем случае мы поместим порог на расстоянии 0.4. Этот порог является спорным и будет варьироваться в зависимости от вашего варианта использования. Вы должны установить этот порог на основе тематических исследований вашего набора данных:
if cosine (model_scores[0], model_scores[1]) ≤ 0.4:
print («Faces Matched»)
В данном случае два лица Ли Якокки совпадают:
Faces Matched
2.2 Сравнение нескольких лиц на двух изображениях
Давайте найдем хорошее применение модели в этом разделе руководства. Мы сравним лица на двух изображениях стартовых одиннадцати футбольного клуба «Челси» в матче Лиги Европы против «Славии Прага «в сезоне 2018–19 и в матче за Суперкубок УЕФА против «Ливерпуля» в сезоне 2019–20. Хотя многие игроки участвуют в обеих командах дня матча, давайте посмотрим, сможет ли алгоритм обнаружить всех обычных игроков.
store_image ('https: //cdn.
'chelsea_1.jpg’)
image = plt.imread ('chelsea_1.jpg’)
faces_staring_xi = detector.detect_faces (image)
highlight_faces ('chelsea_1.jpg’, faces_staring_xi)
store_image ('https: //cdn.
'chelsea_2.jpg’)
image = plt.imread ('chelsea_2.jpg’)
faces = detector.detect_faces (image)
highlight_faces ('chelsea_2.jpg’, faces)
Сравнение лиц
SBNation
Прежде чем мы продолжим, вот стартовые одиннадцать из обоих матчей:
Славия Прага Матч Старт XI: Кепа, Аспиликуэта, Луис, Кристенсен, Эмерсон, Канте, Баркли, Ковачич, Азар, Педро, Жиру
Славия Прага Матч Старт XI: Кепа, Аспиликуэта, Кристенсен, Зума, Эмерсон, Канте, Жоржиньо, Ковачич, Педро, Жиру, Пулишич
У нас есть восемь игроков, которые являются общими для обоих стартовых XI и которые в идеале должны соответствовать алгоритму.
Давайте сначала посчитаем баллы:
slavia_faces = extract_face_from_image ('chelsea_1.jpg’)
liverpool_faces = extract_face_from_image ('chelsea_2.jpg’)
model_scores_starting_xi_slavia = get_model_scores (slavia_faces)
model_scores_starting_xi_liverpool = get_model_scores (liverpool_faces)
``
for idx, face_score_1 in enumerate (model_scores_starting_xi_slavia):
for idy, face_score_2 in enumerate (model_scores_starting_xi_liverpool):
score = cosine (face_score_1, face_score_2)
if score ≤ 0.4:
# Printing the IDs of faces and score
print (idx, idy, score)
# Displaying each matched pair of faces
plt.imshow (slavia_faces[idx])
plt.show ()
plt.imshow (liverpool_faces[idy])
plt.show ()
Вот список пар лиц, которым соответствует алгоритм. Обратите внимание, что он смог сопоставить все восемь пар граней.
Восемь правильно распознанных лиц
Восемь правильно распознанных лиц (Кепа, Аспиликуэта, Эмерсон, Жиру, Канте, Педро, Кристенсен, Ковачич)
Хотя нам удалось сопоставить каждое лицо на наших изображениях, я хотел бы сделать шаг назад, чтобы обсудить последствия оценок. Как обсуждалось ранее, не существует универсального порога, который бы сопоставлял два изображения вместе. Возможно, вам придется переопределить эти пороговые значения с учетом новых данных, поступающих в анализ. Например, даже Google Фото принимает ваши данные, когда не может программно определить наилучший порог для пары.
Google Фото принимает пользовательские данные для сопоставления лиц
Google Фото принимает пользовательские данные для сопоставления лиц
Лучший путь вперед — тщательно оценить случаи при сопоставлении разных типов лиц. Эмоции лиц и их ракурсы также играют роль в определении точности. Обратите внимание, что в нашем случае использования я намеренно использовал фотографии стартовых одиннадцати, поскольку игроки смотрят прямо в камеру! Вы можете попробовать сопоставить начальные одиннадцать лиц с лицами празднования трофея, и я почти уверен, что точность упадет.
Заключение
В этом руководстве мы сначала обнаружили лица на изображениях с помощью модели MTCNN и выделили их на изображениях, чтобы определить, правильно ли работает модель. Затем мы использовали алгоритм VGGFace2 для извлечения признаков лиц в виде вектора и сопоставили разные лица, чтобы сгруппировать их вместе.