Simon Kozlov:
Читаю как работает современный face recognition -
там уже вовсю deep learning.
Simon Kozlov:
Вот ссылка на пейпер - http://arxiv.org/abs/1503.03832v3,
а вечером я коротенько расскажу, что там.

Ну так вот, face recognition и deep learning

Стоит задача - определить чье лицо на фотографии (в предположении, что лицо уже найдено и задано прямоугольным регионом)
(как лицо найти задача отдельная и, кстати, не обязательно про deep learning)
Хочется уметь решать следующие задачи - "эти два лица - это один человек или нет?", "кто на этой фотографии" и "найти одного и того же человека (или несколько человек) по нескольким фотографиям".
После сеанса обучения нам будут показывать новые фотографии новых людей, которых мы ни разу не видели, и их тоже надо будет найти. Что делать?

Обучение

Давайте попробуем выучить функцию, которая маппит голые пиксели в некое пространство, где близкие точки будут означать одно и то же лицо.
(в данном пейпере пространство 128-мерное)
Вот пары картинок разных людей в очень разном освещении.
После маппинга картинки справа и слева должны быть близко друг к другу, а картинки в разных строках - далеко.
И вот мы учим некий CNN, который получает на вход пиксели, выдает 128-мерный вектор, который дальше нормализуется (т.е. становится точкой на 128-мерной сфере), такой чтобы расстояния между лицами одного человека было маленьким.
Более конкретно эту CNN обучают так:
Инпуты - это тройки фотографий лиц, где две фотографии в тройки это один человек, а третья - другой.
Т.е. в тройке есть A, B, и С, где A и B - один человек, а C - другой.
Loss function, условно, хочет чтобы |f(A) - f(B)|^2 < |f(A) - f(C)|^2 - margin.
И вот CNN учит такую функцию.
Основная проблема в том, что таких троек _очень_ много и учить на всех их неэфективно, поэтому у них есть некий алгоритм выбора троек в батче, чтобы они были достаточно сложными чтобы функция двигалась куда надо, но не были совсем низкокачественными фотографиями (которые самые сложные, но по ним не научишься)

Использование

После того как такое пространство есть, все описанные выше задачи становятся очень простыми:
"эти два лица - это один человек или нет?" - это просто сравнение расстояния с неким threshold.
"найти одного и того же человека (или несколько человек) по нескольким фотографиям" - это k-nearest neighbor classifier.
итд.
В качестве архитектуры CNN они используют GoogLeNet, потому что статья из Гугла.
Чтобы это все работало нужно абсолютно дикое количество фотографий, поэтому пользоваться этим методом может буквально 5 компаний в мире.
The models are initialized from random, similar to [16], and trained on a CPU cluster for 1,000 to 2,000 hours. If not mentioned otherwise we use between 100M-200M training face thumbnails consisting of about 8M different identities.
Михаил Окунев:
Вот это ценное наблюдение, да.
Часто упускаемое из виду :)
Спасибо за рассказ. Ничего, вроде, радикально нового.
Simon Kozlov:
Ну да, скорее показывает как проблему можно сформулировать в контексте deep learning.
Вот кстати Зак появился на NIPS и сказал, что у них мол самый крутой face detector в мире.
Михаил Окунев:
Не хочешь разобраться со статьей про Deep Face?
http://www.cs.toronto.edu/~ranzato/publications/taigman_cvpr14.pdf
Simon Kozlov:
Я кстати прочитал и сколько-то понял про DeepFace.

Давайте вкратце обрисую

Это более классический подход к применению deep learning для face recongnition, т.е. чуть более старый, чем Гугловский FaceNet.
Их идея в том, чтобы натренировать DNN на наборе лиц в стандартной задаче классификации, где класс - это человек.
Для этого они берут лица 4K человек и тренируют сетку классифицировать именно их.
А потом отрезают последний леер и атупут предыдущего используют как face signature (это стандартный подход). И вот потом эти face signatures используются для recognition новых лиц.
Чтобы это хорошо работало, они делают face frontalization (т.е. разворот чтобы лицо смотрело прямо на камеру) средствами классического vision.
Т.е. выделить ключевые точки, замапить на образец лица, зафитить камеру, чтобы понять текущий поворот, срендерить заново с повернутой камерой итд.
И вот такое выпрямленное лицо дают на вход DNN.
В DNN у них все начинается с нескольких convolution layers, а потом в середине так называемый locally connected layer, который работает как CNN, только веса для каждого пикселя разные,
чтобы он мог по-разному экстрактить фичи где рот, глаза итд.
Simon Kozlov:
И так как у них классы это люди, то они тренируют на 8M картинок, где эти 4K людей встречаются.
А в Гугловом пейпере они не парятся с процессингом и поворотом лиц и используют гораздо больше данных, чтобы сетка сама всему научилась.