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

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

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

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

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

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


person Dark_Daiver    schedule 15.01.2014    source источник
comment
Это довольно большой вопрос для такого формата вопросов и ответов.   -  person hatchet - done with SOverflow    schedule 16.01.2014


Ответы (3)


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

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

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

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

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

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

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

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

person electrodrel    schedule 16.01.2014
comment
Спасибо за ответ. У меня нет значительных вариаций данных. Большинство моих образцов анфас без эмоций (или с улыбкой) и с небольшой временной задержкой (1-1,5 года). Но подсветка может быть разной. (Я добавил некоторые из них для публикации) - person Dark_Daiver; 16.01.2014
comment
Я бы порекомендовал вам попробовать моменты Чебышева (как глобальный дескриптор) или Кравчука (локальный) как экстракторы признаков. Таким образом, вы можете компенсировать небольшое количество обучающих изображений, имея два типа дескрипторов. Кроме того, вы должны выполнить выравнивание гистограммы, чтобы избежать изменений освещенности. И вообще, я не думаю, что вы можете публиковать изображения из базы данных лиц в Интернете. Обычно это нарушает одно из этих правил конфиденциальности. - person electrodrel; 16.01.2014
comment
А как насчет времени вычисления в дискретных ортогональных моментах? Могу ли я вычислить это почти в реальном времени? Также этот подход очень интересен. Также я новичок в резюме, извините за глупые вопросы) - person Dark_Daiver; 16.01.2014
comment
Да, можно, если вычислить их с помощью формул повторения. Я отредактирую ответ, обновив две ссылки, где приведены рекуррентные отношения для полиномов Чебышева и Кравчука. - person electrodrel; 17.01.2014
comment
@electrodrell извините за глупый вопрос. я действительно плохо разбираюсь в математике. такое скалярное значение Qnm (из статьи о моментах Кравчука)? - person Dark_Daiver; 21.01.2014

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

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

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

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

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

person sameerg07    schedule 13.07.2018

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

person Employee    schedule 13.07.2018