РАСПОЗНАВАНИЕ ЛИЦ: как вести себя с людьми, не входившими в тренировочные данные

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

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

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

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

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

Цель проигрыша триплета - убедиться, что:

  • Два примера с одинаковой меткой имеют вложения близко друг к другу в пространстве вложения.
  • Два примера с разными метками имеют свои вложения далеко.

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

  1. Рассмотрим двух очень похожих людей: А - человека, которого нам нужно узнать, и В - человека, которого не узнают.
  2. Поскольку у нас есть A в нашем наборе людей, которые должны быть распознаны нашей системой, а B не должен распознаваться, мы можем иметь A в одном классе, а B может быть в любых других классах.
  3. Для приведенного выше сценария потеря триплетов будет различать между A и B, что приведет к изучению лучших функций для A (не говоря уже о B, поскольку для нас это не имеет значения).
  4. Поскольку B находится в другом классе, если B действительно войдет в камеру, он не будет распознан как A, как это было бы, если бы B не был в нашем наборе данных.

Следующая проблема будет заключаться в том, куда поместить это изображение B? Поскольку у нас не может быть нового класса для каждого B, который у нас есть для каждого A, мы можем создать новый класс, который будет содержать только лица, которые не нужно распознавать. Итак, у нас есть эксклюзивный класс, который содержит только B для всех As. Это все еще не решает нашу проблему. Как нам найти Б, человека, который выглядит одинаково, для каждого А?

Как было сказано ранее, вероятность обучения на похожих лицах увеличивается за счет увеличения общего количества людей в наборе данных. Один из способов получить изображения людей - это простой поиск в Google. Мы можем использовать расширение Chrome Fatkun Batch Download Image для загрузки всех изображений для этого результата поиска на этой конкретной странице. Это дает нам разнообразие лиц и помогает оптимизировать нашу модель, чтобы лучше изучить особенности. Более того, к этому классу будет отнесен каждый непризнанный человек.

ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ:

Используя вышеупомянутый подход, точность увеличилась с 96% до 99% с использованием того же набора данных (10 классов по 10 изображений в каждом), за исключением этого нового класса различных людей (559 изображений), помимо возможности различать людей, которые не предполагается узнавать. Фактическая точность любой модели машинного обучения зависит от данных, на которых она была обучена, поэтому фактические значения могут отличаться для каждого набора данных.

Код для этого можно найти на https://github.com/Chhitij07/face-recognition. Код все еще нужно очистить для повышения производительности, но на данный момент он все еще работает. Шаги:

  1. Создайте папку для каждого класса в папке изображений, включая класс для набора изображений из поиска Google. Если вы хотите захватить изображения для нового класса, это можно сделать, запустив add_training_data.py
  2. Зависимости для кода можно найти в файле requirements.txt.
  3. Выполните следующую команду:
python face_train.py

Вам нужно сделать это только один раз. Перед завершением он запустит веб-камеру для проверки результатов.

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

python face_recognize.py

Этот файл все еще нуждается в улучшении, поскольку для выполнения избыточного кода требуется некоторое время. Изображение, используемое для прогнозирования, сохраняется в test / random /

Мы будем благодарны за обратную связь.

Я работаю в Winkl и создаю классные вещи. Не стесняйтесь обращаться ко мне :)