Изходният код е наличен на адрес https://github.com/sumantrajoshi/Face-recognition-using-deep-learning

Дълбокото обучение революционизира областта на разпознаването на лица от последните няколко години. Благодарение на непрекъснато нарастващата изчислителна ефективност на GPU, през 2015 г. изследователите на Google публикуваха документ за нова система за дълбоко обучение, наречена FaceNet, която постигна почти 100-процентова точност на популярен набор от данни за разпознаване на лица, наречен „Labeled Faces in the Wild“ (LFW)”. Този документ проправи пътя за създаването на следващото поколение системи за лицево разпознаване, използващи машинно обучение.

Разлика между лицева проверка и лицево разпознаване

Техниката за проверка на лицето се използва, за да се провери дали въведеното изображение е на легитимния ищец (съпоставяне 1 към 1). Разпознаването на лица обаче се използва, за да се разпознае дали въведеното изображение на лицето е от набор от упълномощена група лица (съпоставяне от 1 до M).

Разлика между разпознаване на лице и разпознаване на измама на лице

Както е показано в горната снимка на екрана на приложението, аз демонстрирах само основно разпознаване на лица, което може да разпознае лица от цифрови снимки, видеоклипове и 3D моделирани лица. Предотвратяването на нападателите да използват неживи лица за достъп до привилегированата система се нарича откриване на измамни лица, което е извън обхвата на това приложение. Разпознаването на измамни лица може да бъде постигнато чрез различни техники като откриване на живост, контекстна информация, взаимодействие с потребителя и анализ на текстурата.

Обучението на нова невронна мрежа с дълбока конволюция (CNN) за разпознаване на лица е изключително трудно поради сложността на набора от данни и огромните изисквания за изчислителна мощност. Следователно ще създам основно приложение за лицево разпознаване, като използвам предварително обучен модел, който е с отворен код.

Използване на предварително обучена невронна мрежа за разпознаване на лица

Ще използвам OpenFace, който е модел за дълбоко обучение с отворено лице за лицево разпознаване. Базиран е на статията: „FaceNet: Унифицирано вграждане за разпознаване на лица и групиране“ от Флориан Шроф, Дмитрий Калениченко и Джеймс Филбин от Google. OpenFace се реализира с помощта на Python и Torch, което позволява мрежата да се изпълнява на CPU или с CUDA.

Исках да внедря приложението в Keras(използвайки бекенда на Tensorflow) и за да направя това използвах предварително обучен модел, известен като Keras-OpenFace от Виктор Си Wangwhich е реализация на Keras с отворен код на OpenFace.

По-долу е малко видео за разпознаване на лица в реално време с помощта на уеб камера на лаптоп, което е направено с помощта на модела Keras-OpenFace и някои елементарни концепции на OpenFace и FaceNet архитектурата.

Демо на приложението за разпознаване на лица

Сега нека разберем какво е направено, за да създадем горното приложение за разпознаване на лица.

По принцип използвах предварително обучен модел на Keras-OpenFace за захранване на изображенията на лицето, за да генерирам вектор за вграждане на 128 измерения.Предполагам, че читателите имат познания за дълбокото обучение и как работи конволюционната невронна мрежа (CNN).

Предизвикателство при използването на CNN като класификатор за разпознаване на лица

Прилагането на CNN класификатор за разпознаване на лица не е страхотна идея, защото, когато група от хора (като служители на компания) се увеличава или намалява, човек трябва да промени функцията на класификатора Softmax. Има много различни начини, по които можем да създадем система за разпознаване на лица и в това приложение използвах разпознаване на лица, използвайки еднократно обучение от дълбока невронна мрежа.

Какво е обучението с един удар?

При обучение с един изстрел само едно изображение на човек се съхранява в базата данни, което се предава през невронната мрежа за генериране на вектор за вграждане. Този вектор за вграждане се сравнява с вектора, генериран за лицето, което трябва да бъде разпознато. Ако има прилики между двата вектора, тогава системата разпознава това лице, в противен случай това лице не е там в базата данни. Това може да се разбере от снимката по-долу.

Как една невронна мрежа се учи (функция за загуба на триплет) на разпознаване на лица?

Тук използваме предварително обучен модел на OpenFace за лицево разпознаване. Без да навлизаме в много подробности за това как тази невронна мрежа идентифицира две еднакви лица, да кажем, че моделът е обучен върху голям набор от данни за лица с функция за загуба, която групира идентични изображения заедно и отделя неидентични лица едно от друго. Известна е също като функция за триплетни загуби.

Обучението на невронната мрежа за разпознаване на лица не е задача за „еднократно обучение“.

Също така е важно да знаете, че докато обучаваме невронната мрежа, ние изискваме множество изображения на едно и също лице за оптимизиране на функцията за загуба на триплети. Следователно обучението на невронна мрежа за разпознаване на лица не е задача за еднократно обучение.

Разбиране на основния дизайн

Нека визуализираме как да създадем основно приложение за лицево разпознаване с помощта на предварително обучена дълбока невронна мрежа. Обучението на мрежата вече е извършено, както е показано на диаграмата по-долу.

Използвам тази предварително обучена мрежа, за да сравня векторите за вграждане на изображенията, съхранени във файловата система, с вектора за вграждане на изображението, заснето от уеб камерата. Това може да се обясни с диаграмата по-долу.

Съгласно горната диаграма, ако лицето, заснето от уеб камерата, има подобен 128-битов вектор за вграждане, съхранен в базата данни, то може да разпознае лицето. Всички изображения, съхранени във файловата система, се преобразуват в речник с имена като ключ и вградени вектори като стойност.

Когато обработвате изображение, разпознаването на лица се извършва, за да се намерят ограничителни полета около лицата. Използвал съм Каскадните класификатори на Haar, базирани на функции на OpenCV за извличане на областта на лицето. Преди предаване на изображението към невронната мрежа, то се преоразмерява до 96x96 пиксела, тъй като дълбоката невронна мрежа очаква фиксирания (96x96) размер на входното изображение.

Изчисляване на приликата между две изображения

За да сравним две изображения за сходство, ние изчисляваме разстоянието между техните вграждания. Това може да стане чрез изчисляване на евклидово (L2) разстояние или косинусово разстояние между 128-мерните вектори. Ако разстоянието е по-малко от праг (което е хиперпараметър), тогава лицата в двете снимки са на едно и също лице, ако не, това са две различни лица.

Получих доста прилични резултати, като просто сравнях евклидовото разстояние за разпознаване на лице. Ако обаче искате да мащабирате приложението към производствена система, тогава трябва да обмислите прилагането на афинни трансформации също преди да подадете изображението към невронната мрежа.

Какво е афинна трансформация?

Позата и осветлението са дългогодишно предизвикателство при разпознаването на лица. Потенциално тясно място в системата за разпознаване на лица е, че лицата могат да гледат в различни посоки, което може да доведе до генериране на различен вектор за вграждане всеки път. Можем да се справим с този проблем, като приложим афинна трансформация към изображението, както е показано на диаграмата по-долу.

Афинната трансформация завърта лицето и прави позицията на очите, носа и устата за всяко лице последователна. Извършването на афинна трансформация гарантира фиксиране на позицията на очите, устата и носа, което помага при намирането на приликата между две изображения, като същевременно прилага еднократно обучение за разпознаване на лица.

Наздраве и вижте простото, но мащабируемо приложение на моята страница GitHub. Ще се радвам да получа някои предложения, подобрения и оптимизации в и около приложението.

Референции:

  1. FaceNet: Унифицирано вграждане за разпознаване на лица и групиране (https://arxiv.org/pdf/1503.03832.pdf)
  2. DeepFace: Премахване на разликата в производителността на човешко ниво при лицева проверка (https://www.cs.toronto.edu/~ranzato/publications/taigman_cvpr14.pdf)
  3. OpenFace, безплатно разпознаване на лица с отворен код с дълбоки невронни мрежи (https://cmusatyalab.github.io/openface/)
  4. Предварително обучен OpenFace режим от Keras-OpenFace (https://github.com/iwantooxxoox/Keras-OpenFace)