Современное распознавание лиц в глубоком обучении (перевод)

искусственный интеллект

Нам было бы слишком легко узнать, как работает современное распознавание лиц, если это просто встреча с друзьями. Теперь мы можем довести эту технологию до предела, решая более важные проблемы -Уилл Феррелл (известный актер)иЧад Смит (известный рок-музыкант).

1_l7zNW_4-afEOfP_mXxs75w.jpeg

Одним из таких людей был Уилл Фаррелл. Другой - Чад Смит. Клянусь, это разные люди!


Как использовать машинное обучение для решения очень сложных задач

До сих пор в1,2и3В , мы используем машинное обучение для решения отдельных проблем всего за один шаг. Все эти проблемы можно решить, выбрав алгоритм машинного обучения, вводя данные и получая результаты.

Но распознавание лиц на самом деле представляет собой ряд связанных проблем:

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

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

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

1

Как может работать базовый конвейер для обнаружения лиц


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

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

1. Найдите все лица

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

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


В начале 2000-х Пол Виола и Майкл Джонс изобрелиМетод обнаружения лица, этот метод может работать достаточно быстро на дешевых камерах, чтобы стать основным в распознавании лиц. Однако теперь есть более надежное решение. Мы будем использовать метод, изобретенный в 2005 году, под названием «Ориентированная градиентная гистограмма», именуемый HOG.


Чтобы найти лица на изображении, нам нужно сделать изображение черно-белым, поэтому нам не нужны данные о цвете для поиска лиц:3

Затем мы рассмотрим каждый пиксель изображения за раз. Для каждого пикселя мы хотим посмотреть на пиксели, непосредственно окружающие его:4

Наша цель — выяснить, насколько темным является текущий элемент по сравнению с пикселями, непосредственно окружающими его. Затем мы рисуем стрелку, указывающую, в каком направлении изображение темнеет:

5

Просто взглянув на один пиксель и коснувшись его, изображение темнеет в правом верхнем углу.

Если изображение вна пиксельПовторите процесс, и в конце концов каждый пиксель будет заменен стрелкой. Эти стрелки называются渐变, они показывают переход от света к темноте по всему изображению:6

Это кажется случайностью, но есть действительно веские причины конвертировать пиксели в渐变. Если мы проанализируем пиксели напрямую, действительно темное изображение и действительно яркое изображение одной и той же фотографии будут иметь совершенно разные значения пикселей. Однако, учитывая только обратное изменение яркости между соседними пикселями, как темные, так и яркие изображения будут иметь одинаковое конкретное представление. Это облегчит решение проблемы.


Если как указано выше, сохраните для каждого элемента渐变дало бы нам слишком много деталей. На данный момент было бы здорово, если бы мы могли видеть основной поток света и тени на более высоком уровне, чтобы мы могли видеть основной узор изображения.

Для этого разобьем изображение на маленькие квадратики размером 16х16 пикселей каждый. В каждом маленьком квадрате мы подсчитаем, сколько точек градиента находится в каждом основном направлении (вверх, по вертикали, вправо и т. д.). Затем мы заменяем квадрат на изображении самой сильной стрелкой наоборот.

Конечным результатом является то, что мы преобразуем исходное изображение в очень простое представление, которое простым способом фиксирует базовую структуру лица:7

Необработанное изображение преобразуется в представление HOG, которое фиксирует основные характеристики изображения независимо от яркости изображения.

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

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


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

2. Позиционные и проекционные поверхности

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

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

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

Исходя из этого, мы будем использовать人脸界标估计алгоритм. Есть много способов сделать это, но мы воспользуемся методом, изобретенным в 2014 году Вахидом Каземи и Жозефиной Салливан.метод.

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

Найдите 68 ориентиров на каждой грани.

Вот результаты для 68 лицевых ориентиров, найденных на тестовом изображении:2-3.jpeg

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

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


Если вы хотите сами попробовать это с Python и dlib, поищите здесь лицевые ориентиры.кодможет помочь вам очень хорошо.

3. Кодировать лица

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

Самый надежный способ измерения лица

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

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

Процесс обучения продолжается просмотром 3 изображений одновременно:

  • Загрузите тренировочные изображения лиц известных людей.
  • Загрузите другое изображение того же известного человека.
  • Загружайте изображения совершенно разных людей.

Затем алгоритм просматривает измерения, генерируемые в настоящее время для каждого из трех изображений. Затем он немного настраивает нейронную сеть, чтобы убедиться, что измерения, которые он производит для № 1 и № 2, немного ближе, а измерения для № 2 и № 3 немного отличаются:3-1.png

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

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

кодирование изображений нашего лица

Процесс обучения сверточной нейронной сети для вывода вложений лиц требует большого количества данных и вычислительной мощности. В настоящее время даже с графическими картами NVidia Telsa для получения хорошей точности требуется около 24 часов непрерывного обучения.

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

На данный момент все, что нам нужно сделать, это пропустить изображения лиц через уже предварительно обученную нейронную сеть, чтобы получить 128 измерений для каждого лица. На данный момент размер тестового изображения:3-2.png

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


Если вы хотите попробовать выполнить этот шаг самостоятельно, OpenFace предоставляет соответствующийлуа-скрипт, скрипт создаст вставки всех изображений в папке и запишет их в CSV-файл.

Найти имена лиц из кодировки

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

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

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

На данный момент мы начали тест. Во-первых, я обучил классификатор с примерно 20 встроенными изображениями Уилла Феррелла, Чада Смита и Джимми Фэлона:3-3.jpeg

Тогда есть соответствующий тестовый эффект.3-4

Эффект очевиден, и нейросеть отлично распознает лица (даже стороны) в разных позах.


обзор

Мы рассмотрим следующие шаги выше:

  • Изображение кодируется с использованием алгоритма HOG для создания упрощенной версии изображения. Используя это упрощенное изображение, найдите часть изображения, которая больше всего похожа на обычное HOG-кодирование человеческого лица.
  • Узнайте позу лица, найдя основные ориентиры лица. Как только вы найдете эти ориентиры, вы можете использовать их для деформации изображения, чтобы центрировать глаза и рот.
  • Центральное изображение лица передается через нейронную сеть, которая умеет измерять черты лица. 128 измеренных значений сохраняются одновременно.
  • Посмотрите на все лица, которые мы измеряли в прошлом, чтобы увидеть, какие измерения человека ближе всего к размерам лица, которые нам нужно определить сейчас. Это наш окончательный результат.

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


Цитировать

GitHub.com/Ах, нажми/опубликуй…

medium.com/@ah дайте мне немного масла/нет…

GitHub.com/Завод Сатья Араб…