Как научить свой собственный FaceID ConvNet с помощью выполнения TensorFlow Eager

kak nauchit svoj sobstvennyj faceid convnet s pomoshhyu vypolneniya tensorflow

от Талеса Сильвы

Лицо есть везде – от фотографий и видео на веб-сайтах социальных сетей до приложений безопасности потребителей, таких как iPhone Xs FaceID.

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

В этой публикации подробно показано, как создать и научить собственную сверточную нейронную сеть (CNN) для идентификации лица. Здесь мы предлагаем реализацию сиамских DenseNets Tensorflow Eager.

Вы можете найти полный код здесь.

Сиамские DenseNets

Сиамская CNN – это класс нейронных сетей (NN), содержащий два или более идентичных экземпляров сети. Термин «идентичен» относится к тому факту, что две NN имеют одинаковую конфигурацию конструкции и, что самое важное, их вес.

Чтобы понять DenseNets, нужно сосредоточиться на двух основных компонентах его архитектуры. Это такие плотный блок и переходный слой.

1*lRttFe4ivoW_WurP1m6NZw

Короче говоря, DenseNet – это набор плотных блоков, за которыми следуют переходные слои. Блок состоит из ряда единиц. Каждый блок состоит из двух сверток. Каждой свертке предшествует пакетная нормализация (BN) и выпрямленные линейные блоки (ReLU) активации.

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

Аналогично переходные слои являются простыми компонентами. Они предназначены для уменьшения выборки векторов признаков, проходящих через сеть. Каждый переходный слой состоит из операции BN, за которой следует a 1×1 свертка плюс а 2×2средний пул.

Большое отличие от других обычных CNN состоит в том, что каждый блок в плотном блоке соединен с каждым другим блоком перед ним. В пределах блока n-й Устройство получает как входные векторы признаков, усвоенные п-1, n-2, …вплоть до первого блока в трубопроводе. Иными словами, дизайн DenseNets позволяет распределять функции на высоком уровне между своими блоками.

1*PrxZAYQ75OXX7KQfrR-d8w
Обзор DenseBlock. Каждый блок выводит K векторов признаков. Следующие блоки получают векторы признаков предыдущих единиц путем конкатенации.

По сравнению с ResNets, DenseNets имеют повторное использование функций путем конкатенации вместо суммирования. Как следствие, DenseNets, как правило, более компактны по количеству параметров, чем ResNets. Интуитивно каждый вектор признаков, усвоенный любым данным блоком DenseNet, повторно используется всеми следующими единицами в блоке. Это минимизирует возможность изучения лишних функций разных уровней сети.

И ResNets и DenseNets используют популярный дизайн слоев узкого места. Он состоит из 2 компонентов:

  • а 1×1 свертка для уменьшения пространственных размеров объектов
  • более широкая свертка, в данном случае a 3×3 операция по изучению признаков

Что касается эффективности параметров и операций с плавающей запятой в секунду (FLOP), то DenseNets значительно превосходит ResNets. DenseNets не только добиваются меньшего уровня ошибок в ImageNets, но также требуют меньше параметров и меньше FLOP, чем ResNets.

1*N4mWDkd_lW6xQE_em6TSUQ

Еще один прием, улучшающий компактность модели, – это коэффициент сжатия. Эта процедура выполняется на переходных слоях и имеет целью уменьшить количество векторов признаков, входящих в следующий плотный блок. DenseNets реализует этот механизм, устанавливая коэффициент, θ, от 0 до 1. θ контролирует, сколько из текущих функций можно передать в следующий блок. Эта техника позволяет DenseNets еще больше снизить количество векторов признаков и быть очень эффективной по параметрам.

Обучение сталкивается с сходством

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

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

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

  • Если два изображения (X1 и X2) подобные, мы хотим, чтобы расстояние между двумя выходными векторами было как можно меньше
  • Если X1 и X2 есть нет аналогично, мы хотим, чтобы это расстояние было столь большим, насколько мы сможем его преодолеть

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

1*0YI4GLo6hy2d-9R0lGYFHw

Контрастная потеря

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

Возьмем два изображения выше примера. В определенный момент мы предоставляем пару (X1, X2) к системе со следующими свойствами:

  • если X1 считается подобным X2 мы даем ему метку 0
  • иначе X1 получает отметку 1

Теперь давайте определимся Gw как параметрическая функция – нейронная сеть. Его роль очень проста, Gw отображает вход с высоким разрешением в выходной сигнал с низким разрешением.

1*7FUfHPZRVr5j6j6pE8Kscg
Уменьшение высокоразмерного ввода в представление с низким размером (D

Мы хотим изучить параметризированную функцию расстояния Dwмежду входами X1 и X2. Это евклидовое расстояние между выходами Gw.

1*bDWgZhvgdl-dhev_D7x1zA

Заметьте, что м есть моржа. Он определяет радиус вокруг Gw. Он контролирует, как разные изображения способствуют полной функции утрат. То есть пара изображений (X1, X2) от разных людей (класса) только способствуют ущербу, если расстояние между ними находится в пределах границы — если (m -Dw) > 0

Другими словами, мы хотим оптимизировать систему таким образом, чтобы:

  • Если пара изображений подобна (метка 0), мы минимизируем функцию расстояния Dw.
  • Если пара изображений есть нет аналогично (метка 1), мы увеличиваем функцию расстояния Dw.

Конечная функция потерь и ее реализация в Tensorflow определяются следующим образом:

1*ucBtqLbzlKIyoGr4aaAxyw

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

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

0*UlSeGcvopHIuWKNb
При w=0 производное от sqrt() ope приведет к делению на 0. Это нарушит ваш код или приведет к NaN в python.

Однако, если содержание равно 0 и мы вычисляем градиенты, производная квадратного корня имела бы операцию деления на 0. Это плохо.

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

Кроме того, при минимизации контрастных потерь с помощью стохастического градиентного спуска (SGD) есть два возможных сценария.

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

1*G4rPbxG5N4dCF2Hh08-p2Q
Контрастная потеря объединяет подобные грани (внутри заданной области) и раздвигает непохожие образцы.

Во втором случае, если входная пара (X1, X2) не из одного класса (метка 1), первая часть уравнения упраздняется. Тогда, во втором слагаемом суммирования, могут возникнуть две ситуации.

Во-первых, если расстояние между двумя парами изображений X1 и X2 больше чем м, ничего не происходит. Обратите внимание, что если Dw >; м, то разница между ними также будет отрицательной. В результате оставшаяся производная функции будет 0 — отсутствие градиента означает отсутствие обучения.

Однако если расстояние Dw между входной парой X1 и X2 меньше чем м, возникает обратная ситуация. Теперь градиентный сигнал будет действовать как сила отталкивания. На практике это отодвигает два представления дальше друг от друга.

Набор данных

Чтобы научить сиамскую CNN на сходство лиц, мы использовали популярный набор данных Large-scale CelebFaces Attributes (CelebA). Он содержит более 200 тысяч изображений знаменитостей из 10 177 разных имен. Для упрощения предварительной обработки данных мы выбрали часть набора данных с выровненными и обрезанными гранями. На следующем рисунке показаны некоторые образцы набора данных.

1*Mu0B8Pvygp6B5d5ER7oG8A
Образцы изображений CelebA.

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

Проще говоря, предоставлено входное изображение Xi нам нужно найти набор образцов S = {X1, X2,…,Xj} такой, что Xi и Xj принадлежат к одному классу. Другими словами, Xi и Xj являются изображениями лица одного и того же человека.

Таким же образом нам нужно найти набор картинок. D = {S1, S2,…,Sj} такой, что Sj НЕ принадлежит к тому же классу, что и Xi.

Наконец, мы объединяем входное изображение Xi с образцами как из схожих, так и разнородных наборов. Для каждой пары (Xi, Xj) если Xj принадлежит к множеству подобных образцов Смы назначаем паре метку 0, иначе она получает метку 1.

Детали обучения

Мы использовали дизайн DenseNet-121, как описано в оригинальной статье. Параметр скорости роста (k) установлен на 32. Вместо полностью соединенного слоя 1000D на конце мы изучаем встраивание векторов размера 32.

1*1Lcn_gfoA1sZFBvvivCHhQ

Для оптимизации параметров модели использовали оптимизатор Адама с циклическим графиком скорости обучения. Вдохновленные суперконвергенцией fast.ai мы исправили бета2 Параметр Адама равен 0,99 и применил политику цикла к бета1.

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

1*MQvSXVeQ9j896fTRBPvoqw

Результаты

Результаты очень хорошие.

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

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

1*Ki0Hmvi9HrnCaSY2HOtHeA

Спасибо, что прочли!

Чтобы узнать больше о глубоком обучении, просмотрите

Погрузитесь с головой в расширенные GAN: изучение самовнимания и спектральной нормы
В последнее время большое внимание привлекают генеративные модели. Большая часть этого поступает от генеративных соревновательных сетей…medium.freecodecamp.orgПогружение в сети глубокой сверточной семантической сегментации и Deelab_V3
Глубокие сверточные нейронные сети (DCNN) добились чрезвычайного успеха в различных программах компьютерного зрения.medium.freecodecamp.org

1*RzOHqzrJEIrB5ZY0nJAcvg

Добавить комментарий

Ваш адрес email не будет опубликован.