рекомендации

вторник, 28 апреля 2020 г.

Простое введение в распознавание лиц (с кодом Python)


Введение

Знаете ли вы, что каждый раз, когда вы загружаете фотографию в Facebook, платформа использует алгоритмы распознавания лиц для идентификации людей на этом изображении? Или что определенные правительства во всем мире используют технологию распознавания лиц для выявления и поимки преступников? Мне не нужно говорить, что теперь вы можете разблокировать смартфоны своим лицом!

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



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

Понимание того, как работает распознавание лиц

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

Каждый алгоритм машинного обучения принимает набор данных в качестве входных данных и учится на этих данных. Алгоритм просматривает данные и выявляет закономерности. Например, предположим, что мы хотим определить, чье лицо присутствует на данном изображении, есть несколько вещей, которые мы можем рассматривать как паттерн:
  • Высота/ширина лица.
  • Высота и ширина могут быть ненадежными, поскольку изображение может быть масштабировано по разному. Однако даже после изменения масштаба неизменными остаются отношения - отношение высоты лица к ширине лица не изменится.
  • Цвет лица.
  • Ширина других частей лица, таких как губы, нос и т. д.

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

В качестве простого примера мы можем отобразить «лицо» в вектор объектов, который может включать в себя различные признаки, такие как:
  • Высота лица (см)
  • Ширина лица (см)
  • Средний цвет лица (R, G, B)
  • Ширина губ (см)
  • Высота носа (см)

По сути, учитывая изображение, мы можем отобразить различные объекты и преобразовать их в вектор объектов, например:

Высота лица (см) - 23.1
Ширина лица (см) - 15.8
Средний цвет лица (RGB) - (255, 224, 189)
Ширина губ (см) - 5.2
Высота носа (см) - 4.4
Итак, наше изображение теперь представляет собой вектор, который можно представить в виде (23.1, 15.8, 255, 224, 189, 5.2, 4.4). Конечно, на изображении может быть множество других черт (например, цвет волос, волосы на лице, очки и т. l.). Однако, для примера, давайте рассмотрим только эти 5 простых признаков.

Теперь, когда мы закодировали каждое изображение в вектор признаков, проблема стала намного проще. Ясно, что когда у нас есть 2 лица (изображения), которые представляют одного и того же человека, полученные векторы признаков будут очень похожи. Иными словами, «расстояние» между двумя векторами признаков будет довольно маленьким.

Машинное обучение может помочь нам с двумя вещами:
  1. Получение вектора объекта: трудно вручную перечислить все признаки, потому что их очень много. Алгоритм машинного обучения может разумно обозначить многие из таких признаков. Например, сложными характеристиками могут быть: соотношение высоты носа и ширины лба. Человеку будет довольно сложно перечислить все такие функции «второго порядка».
  2. Алгоритмы согласования: после того, как векторы признаков получены, алгоритм машинного обучения должен сопоставить новое изображение с набором векторов признаков, присутствующих в выборке.

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

Пример

Нам дают несколько лиц - возможно, таких знаменитостей, как Марк Цукерберг, Уоррен Баффет, Билл Гейтс, Шахрукх Кхан и т. д. Назовите эту группу лиц нашей совокупностью. Теперь нам дают изображение еще одной знаменитости («новая знаменитость»). Задача проста - определить, входит ли эта «новая знаменитость» в число присутствующих в совокупности.

Вот некоторые из изображений в совокупности:


Как видите, у нас есть такие знаменитости, как Барак Обама, Билл Гейтс, Джефф Безос, Марк Цукерберг, Рэй Далио и Шахрукх Кхан.

Теперь вот «новая знаменитость»:


Примечание: все вышеперечисленные изображения были взяты из изображений Google.

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

Существует удивительно простая библиотека Python, которая инкапсулирует все, что мы рассматривали выше - создание векторов признаков из лиц и умение различать лица. Эта библиотека Python называется face_recognition и в глубине использует dlib - современный фреймворк C ++, который содержит несколько алгоритмов машинного обучения, которые помогают в написании сложных приложений на C ++.

Библиотека face_recognition в Python может выполнять большое количество задач:

- найти все лица на заданном изображении;
- найти и управлять чертами лица в изображении;
- идентифицировать лица на изображениях;
- распознавать лица в реальном времени.

Здесь мы поговорим о 3-м случае использования - идентификации лиц на изображениях.

Вы можете найти исходный код библиотеки face_recognition здесь, на Github: https://github.com/ageitgey/face_recognition

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

Перед установкой face_recognition вам также необходимо установить dlib. Вы можете найти инструкции по установке dlib здесь:

Реализация в Python

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


# импорт библиотек
import os
import face_recognition

# составляем список всех доступных изображений
images = os.listdir('images')

# загружаем ваше изображение
image_to_be_matched = face_recognition.load_image_file('my_image.jpg')

# преобразуем загруженное изображение в вектор признаков
image_to_be_matched_encoded = face_recognition.face_encodings(
    image_to_be_matched)[0]

# итерация для каждого изображения
for image in images:
    # загружаем изображение
    current_image = face_recognition.load_image_file("images/" + image)
    # преобразуем загруженное изображение в вектор признаков
    current_image_encoded = face_recognition.face_encodings(current_image)[0]
    # проверяем соответствие изображений
    result = face_recognition.compare_faces(
        [image_to_be_matched_encoded], current_image_encoded)
    # проверка совпадения
    if result[0] == True:
        print "Matched: " + image
    else:
        print "Not matched: " + image
Структура папок выглядит следующим образом:

facialrecognition:

    fr.py
    my_image.jpg
    images/
        barack_obama.jpg
        bill_gates.jpg
        jeff_bezos.jpg
        mark_zuckerberg.jpg
        ray_dalio.jpg
        shah_rukh_khan.jpg
        warren_buffett.jpg

Наш корневой каталог, facialrecognition, содержит:


  • Наш код распознавания лиц, приведенный выше, в виде fr.py.
  • my_image.jpg - изображение, которое нужно распознать («новая знаменитость»).
  • images/ - «совокупность».

Когда вы создаете структуру папок, как указано выше, и запускаете приведенный выше код, вот что вы получаете в качестве вывода:
Matched: shah_rukh_khan.jpg
Not matched: warren_buffett.jpg
Not matched: barack_obama.jpg
Not matched: ray_dalio.jpg
Not matched: bill_gates.jpg
Not matched: jeff_bezos.jpg
Not matched: mark_zuckerberg.jpg
Очевидно, что «новой знаменитостью» является Шахрукх Кхан, и наша система распознавания лиц способна это обнаружить!

Разбор кода Python

Теперь давайте рассмотрим код, чтобы понять, как он работает:
# импорт библиотек
import os
import face_recognition
Это просто импорт. Мы будем использовать встроенную библиотеку os для чтения всех изображений в нашей совокупности, и будем использовать face_recognition для написания алгоритма.
# составляем список всех доступных изображений
images = os.listdir('images')
Этот простой код помогает нам определить путь всех изображений в совокупности. Как только эта строка будет выполнена, у нас будет:
images = ['shah_rukh_khan.jpg', 'warren_buffett.jpg', 'barack_obama.jpg', 'ray_dalio.jpg', 'bill_gates.jpg', 'jeff_bezos.jpg', 'mark_zuckerberg.jpg']
Теперь код ниже загружает изображение новой знаменитости:
# загружаем ваше изображение
image_to_be_matched = face_recognition.load_image_file('my_image.jpg')
Чтобы убедиться, что алгоритмы способны интерпретировать изображение, мы конвертируем изображение в вектор признаков:
# преобразуем загруженное изображение в вектор признаков
image_to_be_matched_encoded = face_recognition.face_encodings(
    image_to_be_matched)[0]
Оставшаяся часть кода теперь довольно проста:
# итерация для каждого изображения
for image in images:
    # загружаем изображение
    current_image = face_recognition.load_image_file("images/" + image)
    # преобразуем загруженное изображение в вектор признаков
    current_image_encoded = face_recognition.face_encodings(current_image)[0]
    # проверяем соответствие изображений
    result = face_recognition.compare_faces(
        [image_to_be_matched_encoded], current_image_encoded)
    # проверка совпадения
    if result[0] == True:
        print "Matched: " + image
    else:
        print "Not matched: " + image
Здесь у нас:

- итерация цикла на каждом изображении;
- кодирование изображения в вектор признаков;
- сравнение загруженного изображения с изображением, которое нужно распознать;
- если это совпадение, мы печатаем это;
- если это несоответствие, мы также печатаем это.

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



При повторном запуске алгоритма вы увидите следующий вывод:
Not matched: shah_rukh_khan.jpg
Not matched: warren_buffett.jpg
Not matched: barack_obama.jpg
Not matched: ray_dalio.jpg
Not matched: bill_gates.jpg
Not matched: jeff_bezos.jpg
Not matched: mark_zuckerberg.jpg
Очевидно, что система не идентифицировала Джека Ма как кого-либо из вышеупомянутых знаменитостей. Это указывает на то, что наш алгоритм достаточно хорош в обоих случаях.

Применение распознавания лиц

Распознавание лиц является хорошо изученной проблемой и широко используется как в индустрии, так и в научных кругах. Например, в Китае  преступник был пойман, потому что система распознавания лиц в торговом центре обнаружила его и подняла тревогу. Очевидно, что распознавание лиц может быть использовано для снижения преступности. Есть много других интересных случаев использования распознавания лиц:

Аутентификация по лицу: Apple ввела Face ID для аутентификации лица в iPhone. Некоторые из ведущих банков пытаются использовать аутентификацию по лицу для банкоматов.
Обслуживание клиентов. В некоторых банках Малайзии установлены системы, которые используют Face Recognition для обнаружения ценных клиентов банка, чтобы банк мог предоставлять персонализированные услуги. Таким образом, банки могут получать больше доходов, удерживая таких клиентов.
Страхование: Многие страховые компании используют функцию распознавания лиц, чтобы сопоставить лицо человека с тем, которое указано в удостоверении личности с фотографией. Таким образом, процесс андеррайтинга становится намного быстрее.

Заключение

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

Комментариев нет:

Отправить комментарий