Распознавание лиц с небольшим количеством образцов

Может кто-нибудь посоветовать мне способ создать эффективный классификатор лиц, который может классифицировать много разных лиц (~1000)?

И у меня есть только 1-5 примеров каждого лица

Я знаю о классификаторе лиц opencv, но он плохо работает для моей задачи (много классов, несколько примеров). Это работает хорошо для одной классификации лица с небольшим количеством образцов. Но я думаю, что 1K отдельный классификатор не очень хорошая идея

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

PS Извините за ошибки в написании. Английский не на моем родном языке.

3 ответа

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

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

Если у вас нет каких-либо существенных изменений, то для небольшого тренировочного набора рекомендуется выбрать один из дискретных ортогональных моментов в качестве метода выделения признаков. Они имеют очень сильную способность извлекать функции без избыточности. Некоторые из них (моменты Хана, Рака) также могут работать в двух режимах - локальном и глобальном извлечении объектов. Эта тема относительно новая, и о ней еще мало статей. Хотя считается, что они стали очень мощным инструментом в распознавании изображений. Они могут быть вычислены в режиме реального времени с использованием рекуррентных отношений. Для получения дополнительной информации, посмотрите здесь и здесь.

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

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

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

Я считаю, что ни одно из вышеперечисленного не реализовано в OpenCV, но для некоторых из них вы можете найти реализацию MATLAB.

Я тоже не носитель языка, так что извините за грамматику

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

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

Трансферное обучение - это метод, при котором мы обучаем сеть на наших собственных классах, и эта сеть уже предварительно обучена на тысячах классов. Поскольку наших данных здесь очень мало, я бы предпочел только трансферное обучение. Я написал блог о том, как вы можете подойти к этому, используя трансферное обучение после того, как у вас будет необходимый объем данных. Это связано здесь. Распознавание лиц также является задачей классификации, где каждый человек представляет собой отдельный класс. Итак, следуйте инструкциям, приведенным в блоге, возможно, это поможет вам создать свой собственный мощный классификатор.

  • Другим предложением было бы, после создания набора данных, правильно их кодировать. Эта кодировка поможет вам сохранить функции в изображении и поможет вам улучшить сеть. VLAD, Fisher, Bag of Words - это несколько методов кодирования. Вы можете найти несколько репозиториев онлайн, которые уже реализовали их в базе данных ORL. Как только вы закодируете, обучите сеть кодировкам, вы, очевидно, увидите лучшую производительность.
  • Даже проверьте, сиамская сеть здесь, которая предназначена для этой цели, я чувствую. Здесь они сравнивают два изображения с одинаковыми характеристиками в разных сетях и добиваются более высокой точности классификации. Git репозиторий здесь.
  • Другой стандартный подход будет использовать SVM, Случайные леса, так как данных меньше. Если вы по-прежнему предпочитаете нейронные сети, вышеупомянутые методы будут служить вам цели. Если вы собираетесь использовать кодировки, я бы предложил случайные леса, так как они очень предпочтительны в обучении и гибки.

Надеюсь, этот ответ поможет вам двигаться в правильном направлении достижения целей.

Возможно, вы захотите взглянуть на OpenFace, реализацию распознавания лиц в Python и Torch с глубокими нейронными сетями: https://cmusatyalab.github.io/openface/

Другие вопросы по тегам