www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Распознавание лиц с использованием глубокого обучения

Дата публикации Mar 22, 2017

Сверточные нейронные сети позволяют извлекать из изображений широкий спектр функций. Оказывается, мы можем использовать эту идею извлечения признаков и для распознавания лиц! Это то, что мы собираемся исследовать в этом уроке, используя глубокие возможности для распознавания лиц.Примечание: это лицопризнание(то есть фактически говоря, чье это лицо),непросто обнаружение (то есть идентификация лиц на картинке).

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

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

К счастью, нам не нужно проходить обучение или создавать собственную нейронную сеть. У нас есть доступ к обученной модели черезdlibчто мы можем использовать. Он делает именно то, что нам нужно - выводит кучу чисел (кодировки лиц), когда мы передаем изображение чьего-либо лица; Сравнение кодировок лиц с разных изображений покажет нам, совпадает ли чье-то лицо с кем-то, с кем у нас есть изображения. Вот шаги, которые мы предпримем:

  1. детектировать/ идентифицировать лица на изображении (используя модель распознавания лиц) - для простоты в этом руководстве будут использоваться только изображения с одним лицом / человеком, не более / менее
  2. Прогнозировать позы лица /достопримечательности(для лиц, определенных на шаге 1)
  3. Используя данные из шага 2 и фактическое изображение, рассчитайте лицокодировок(цифры, которые описывают лицо)
  4. сравнитькодировки лиц известных лиц с лицами из тестовых изображений, чтобы сказать, кто на картинке

Надеюсь, вы получите базовое представление о том, как это будет работать (конечно, приведенное выше описание является очень упрощенным). Теперь пришло время начать строительство!

Подготовка изображений

Во-первых, создайте папку проекта (просто папку, в которой мы будем хранить наш код и изображения). Для меня это называетсяface_recognitionно ты можешь называть это как хочешь. Внутри этой папки создайте другую папку с именемimages, Это папка, в которой будут храниться изображения разных людей, на которых вы хотите запустить распознавание лиц. Загрузите несколько фотографий своих друзей (по одной фотографии на человека) с Facebook, переименуйте изображение в имя вашего друга (например,taus.jpgилиjohn.jpg) и хранить их все в этомimagesпапка, которую вы только что создали. Помните одну важную вещь: убедитесь, что все эти изображения имеют только ОДНО лицо (то есть они не могут быть групповыми изображениями), и все они в формате JPEG с именами файлов, заканчивающимися на.jpg,

Затем создайте другую папку в папке вашего проекта (face_recognitionпапка для меня) и назовите егоtest, Эта папка будет содержатьдругойизображения тех же людей, чьи фотографии вы сохранили вimagesпапки. Опять же, убедитесь, что на каждой картинке только один человек. вtestпапку, вы можете называть файлы изображений, как вам нравится, и вы можете иметь несколько изображений каждого человека (потому что мы будем запускать распознавание лиц на всех изображенияхtestпапка).

Установка зависимостей

Наиболее важные зависимости для этого проекта - это Python 2.7 и pip. Вы можете установить оба (если у вас их еще нет), используя Anaconda 2 (это просто дистрибутив Python, который поставляется в комплекте с pip), выполнив следующие действия:эта ссылка,Примечание: пожалуйстаудостоверитьсячто анаконда 2являетсядобавлен в вашПУТЬи что он зарегистрирован как ваш системный Python 2.7 (в процессе установки должно появиться сообщение об этом; просто нажмите Да или установите флажок).

Если вы закончили настройку Anaconda 2 или если у вас на компьютере предварительно установлен Python 2.7 и pip, вы можете продолжить и установитьdlib(библиотека машинного обучения, которую мы будем использовать) и другие зависимости Для этого введите следующую команду в Терминале (Mac OS или Linux) или Командная строка (Windows):

pip install --user numpy scipy dlib

Если вы пользователь Mac или Linux и у вас возникли проблемы с командой, указанной выше, попробуйте эту команду:

sudo pip install --user numpy scipy dlib

Если описанный выше процесс не работает для вас, вам, возможно, придется вручную загрузить, скомпилировать и установить dlib с его Python API. Чтобы сделать это, вы должны прочитатьhttp://dlib.net/, К сожалению, это выходит за рамки этого сообщения в блоге, и поэтому я не буду освещать это здесь.

Последнее, что вам нужно сделать, это загрузить предварительно обученные модели для распознавания лиц. Есть две модели, которые вам нужны. Одна модель предсказывает форму / позу лица (в основном дает цифры о том, как форма расположена на изображении). Другая модель принимает лица и дает вам кодировки лица (в основном числа, которые описывают лицо этого конкретного человека). Вот инструкции о том, как скачать, извлечь и подготовить их для наших целей:

  1. Скачатьdlib_face_recognition_resnet_model_v1.dat.bz2отэта ссылкаа такжеshape_predictor_68_face_landmarks.dat.bz2отэта ссылка
  2. Как только вы загрузите оба этих файла, вам нужно извлечь их (они сжаты в формате bz2). В Windows вы можете использоватьEasy 7-zipсделать это. На Mac или Linux вы сможете дважды щелкнуть файлы и извлечь их. Если это не работает, просто введите это в свой терминал для обоих этих файлов:bzip2 {PATH_TO_FILE} --decompress(заменить{PATH_TO_FILE}с фактическим путем к файлу, который вы пытаетесь извлечь; для меня команды будутbzip2 ~/Downloads/dlib_face_recognition_resnet_model_v1.dat.bz2 --decompressа такжеbzip2 ~/Downloads/shape_predictor_68_face_landmarks.dat.bz2 --decompress).
  3. После того, как вы извлечете их, у вас должно быть два файла с именемdlib_face_recognition_resnet_model_v1.datа такжеshape_predictor_68_face_landmarks.dat, Скопируйте эти два файла в папку вашего проекта (для меня это было быface_recognitionпапка, которую я создал для этого проекта).

Код!

Теперь, когда у вас все настроено, откройте папку вашего проекта (называетсяface_recognitionдля меня) в текстовом редакторе (желательноАтомилиВозвышенный текст). Создайте новый файл в этой папке с именемrecognize.py, Здесь мы добавим код, который будет соответствовать лицам ваших друзей. Обратите внимание, что есть две основные части этого процесса: во-первых, загрузите кодировки граней известных граней вimagesпапки; как только это будет сделано, получите кодировки лиц из лиц / изображений, хранящихся вtestпапку и сопоставьте их со всеми нашими известными лицами по одному. Мы сделаем эту часть шаг за шагом. Если вы хотите, чтобы он работал, вы можете скопировать и вставить весь код в этом разделе в ваш файл один за другим (т.е. объединить все отдельные разделы кода в том же порядке, в котором они перечислены ниже). Внимательно прочитайте комментарии в каждом блоке кода, чтобы понять, что он делает.

Часть 1. Инициализация и настройка -Здесь мы импортируем необходимую библиотеку и устанавливаем объекты / параметры, необходимые для распознавания лиц.

import dlib
import scipy.misc
import numpy as np
import os# Get Face Detector from dlib
# This allows us to detect faces in images
face_detector = dlib.get_frontal_face_detector()# Get Pose Predictor from dlib
# This allows us to detect landmark points in faces and understand the pose/angle of the face
shape_predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# Get the face recognition model
# This is what gives us the face encodings (numbers that identify the face of a particular person)
face_recognition_model = dlib.face_recognition_model_v1('dlib_face_recognition_resnet_model_v1.dat')# This is the tolerance for face comparisons
# The lower the number - the stricter the comparison
# To avoid false matches, use lower value
# To avoid false negatives (i.e. faces of the same person doesn't match), use higher value
# 0.5-0.6 works well
TOLERANCE = 0.6

Часть 2: Получить кодировки лица из изображения -Здесь мы пишем функцию, которая берет имя файла изображения и дает нам кодировки лица для этого изображения.

# This function will take an image and return its face encodings using the neural network
def get_face_encodings(path_to_image):
# Load image using scipy
image = scipy.misc.imread(path_to_image) # Detect faces using the face detector
detected_faces = face_detector(image, 1) # Get pose/landmarks of those faces
# Will be used as an input to the function that computes face encodings
# This allows the neural network to be able to produce similar numbers for faces of the same people, regardless of camera angle and/or face positioning in the image
shapes_faces = [shape_predictor(image, face) for face in detected_faces] # For every face detected, compute the face encodings
return [np.array(face_recognition_model.compute_face_descriptor(image, face_pose, 1)) for face_pose in shapes_faces]

Часть 3а: Сравни лица -Здесь мы пишем функцию, которая будет сравнивать заданную кодировку лица со списком известных кодировок лица. Он вернет массив логических (True / False) значений, которые указывают, было ли совпадение.

# This function takes a list of known faces
def compare_face_encodings(known_faces, face):
# Finds the difference between each known face and the given face (that we are comparing)
# Calculate norm for the differences with each known face
# Return an array with True/Face values based on whether or not a known face matched with the given face
# A match occurs when the (norm) difference between a known face and the given face is less than or equal to the TOLERANCE value
return (np.linalg.norm(known_faces - face, axis=1) <= TOLERANCE)

Часть 3b: Найти совпадение -Здесь мы пишем функцию, которая будет принимать список известных кодировок лиц, список имен людей (соответствующих списку известных кодировок лиц) и лицо, для которого нужно найти соответствие. Он вызовет функцию в 3a и вернет имя человека, которому соответствует данное лицо.

# This function returns the name of the person whose image matches with the given face (or 'Not Found')
# known_faces is a list of face encodings
# names is a list of the names of people (in the same order as the face encodings - to match the name with an encoding)
# face is the face we are looking for
def find_match(known_faces, names, face):
# Call compare_face_encodings to get a list of True/False values indicating whether or not there's a match
matches = compare_face_encodings(known_faces, face) # Return the name of the first match
count = 0
for match in matches:
if match:
return names[count]
count += 1 # Return not found if no match found
return 'Not Found'

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

Часть 4а. Получение кодировок лиц для всех лиц вimagesпапка

# Get path to all the known images
# Filtering on .jpg extension - so this will only work with JPEG images ending with .jpg
image_filenames = filter(lambda x: x.endswith('.jpg'), os.listdir('images/'))# Sort in alphabetical order
image_filenames = sorted(image_filenames)# Get full paths to images
paths_to_images = ['images/' + x for x in image_filenames]# List of face encodings we have
face_encodings = []# Loop over images to get the encoding one by one
for path_to_image in paths_to_images:
# Get face encodings from the image
face_encodings_in_image = get_face_encodings(path_to_image) # Make sure there's exactly one face in the image
if len(face_encodings_in_image) != 1:
print("Please change image: " + path_to_image + " - it has " + str(len(face_encodings_in_image)) + " faces; it can only have one")
exit() # Append the face encoding found in that image to the list of face encodings we have
face_encodings.append(get_face_encodings(path_to_image)[0])

Часть 4b: Соответствие каждого изображения вtestпапка с известными лицами (по одному)

# Get path to all the test images
# Filtering on .jpg extension - so this will only work with JPEG images ending with .jpg
test_filenames = filter(lambda x: x.endswith('.jpg'), os.listdir('test/'))# Get full paths to test images
paths_to_test_images = ['test/' + x for x in test_filenames]# Get list of names of people by eliminating the .JPG extension from image filenames
names = [x[:-4] for x in image_filenames]# Iterate over test images to find match one by one
for path_to_image in paths_to_test_images:
# Get face encodings from the test image
face_encodings_in_image = get_face_encodings(path_to_image) # Make sure there's exactly one face in the image
if len(face_encodings_in_image) != 1:
print("Please change image: " + path_to_image + " - it has " + str(len(face_encodings_in_image)) + " faces; it can only have one")
exit() # Find match for the face encoding found in this test image
match = find_match(face_encodings, names, face_encodings_in_image[0]) # Print the path of test image and the corresponding match
print(path_to_image, match)

Это оно! После копирования вставьте весь код из частей с 1 по 4b (один за другим - в том же порядке, в котором я их написал) вrecognize.pyфайл, вы должны иметь возможность запустить его с помощью терминала (Mac OS или Linux) или командной строки (Windows), введя эти команды (заменить{PROJECT_FOLDER_PATH}с полным путем к папке вашего проекта; для меня это/Users/taus/face_recognition):

cd {PROJECT_FOLDER_PATH}
python recognize.py

Это должно дать вам вывод, похожий на этот:

('test/1.jpg', 'Shihab')
('test/2.jpg', 'Not Found')
('test/3.jpg', 'Taus')
('test/4.jpg', 'Mifrah')
('test/5.jpg', 'Mubin')

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

Этот пост был вдохновленАдам ГейтджиОсобая благодарность ему за егоСообщение блогаа такжеGithub репопо распознаванию лиц. Также мы используемdlibи некоторые предварительно обученные модели, доступные на веб-сайте dlib, так что им следует сделать их общедоступными Моей главной целью было представить и объяснить базовое решение для глубокого обучения распознаванию лиц. Конечно, есть более простые способы сделать то же самое, но я подумал, что я должен сделать эту часть по частям (и подробно), используяdlibтак что вы на самом деле понимаете различные движущиеся части. Есть и другие способы распознавания лиц (не глубокое обучение), не стесняйтесь смотреть на них. Крутая вещь в этом подходе состоит в том, что вы можете запустить его только с одним или двумя изображениями на человека / субъект (учитывая, что модель делает довольно хорошую работу, фактически разводя два лица друг от друга).

Несмотря на это, я надеюсь, вам понравился этот пост. Не стесняйтесь обращаться с комментариями.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map