OpenCV / JavaCV распознавание лиц - очень похожие значения доверия

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

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

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

Итак, проблема в том, что после того, как я, скажем, 5 идентифицированные фотографии, которые я получил от смарт-карт, я попытался сделать распознавание лица, используя в качестве учебного набора 150 кадров, которые камера захватила мое лицо. При попытке распознать значения доверия для каждого из 5 тестовых граней чрезвычайно похожи, что делает всю программу бесполезной, потому что я не могу точно распознать кого-либо. Часто, используя различные снимки камеры в качестве тренировки, я получаю более высокие значения уверенности от изображений случайных людей, чем изображение себя.

I буду признателен за любую помощь, которую вы можете мне оказать, потому что я в растерянности.

спасибо.

Примечание: я использую оболочку JavaCV для OpenCV, чтобы сделать мою программу, и haarcascades, которые входят в пакет. Eigenfaces быть использован алгоритм.

2 ответов


Распознавание Лиц

интро

Я хочу добавить это. libfacerec был включен в официальный OpenCV 2.4.2 см.:

это означает, что если вы используете OpenCV 2.4.2, то у вас есть новый cv:: FaceRecognizer на contrib модуль. Я знаю, что оболочка Python была добавлена в последнее время (Спасибо за это!), вероятно, Java также обернута во время написания этого.

cv:: FaceRecognizer поставляется с обширной документацией, которая покажет вам, как сделать распознавание лиц с много примеров полного исходного кода:

если вы хотите знать, как доступные алгоритмы распознавания лиц (собственные лица, Fisherfaces, Local Бинарные Шаблоны гистограмм) работают, то особенно читайте руководство по распознаванию лиц с OpenCV. Там я объясняю, как работают алгоритмы, и упоминаю их недостатки:

распознавание лиц с несколькими изображениями

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

на самом деле собственные лица и Fisherfaces не должны использоваться, когда у вас очень мало образцов на человека в вашем наборе данных. вам нужны данные для работы этих моделей, я не могу подчеркнуть, что достаточно. Чем больше, тем лучше. Эти методы основаны на оценке дисперсии ваших данных, поэтому дайте им некоторые данные для оценки вашей модели! Некоторое время назад я провел небольшой тест на AT&T Facedatabase (с facerec framework), который показывает эффективность этих методов с различным количеством изображений в лицо:

enter image description here

Я не пишу здесь публикацию, и я не буду поддерживать эти цифры подробным математическим анализом. Это было сделано раньше, поэтому я рекомендую всем сомневающимся в этих цифрах заглянуть в (2), чтобы увидеть очень подробный анализ PCA (собственных лиц) и LDA (Fisherfaces) для небольших данных обучения наборы.

Итак, я предлагаю использовать локальные гистограммы двоичных шаблонов (3) для распознавания лиц в сценарии малого образца. Они также включены в OpenCV FaceRecognizer и были доказаны, что выполняют очень хорошо на небольших наборах данных тренировки. Если вы объедините это с предварительной обработкой TanTriggs (4), у вас должна быть действительно надежная модель распознавания лиц. Предварительная обработка TanTriggs - это 8-лайнер (или около того) в Python, см. https://github.com/bytefish/facerec/blob/master/py/facerec/preprocessing.py#L41 для реализации. Это должно быть легко адаптироваться к Java (или я могу реализовать его с помощью OpenCV, если люди попросят его).

литература

  • (1) Belhumeur, П. Н., Hespanha, J., и Kriegman, Д. собственные лица против Fisherfaces:распознавание с использованием линейной проекции класса. транзакции IEEE по анализу шаблонов и машинному интеллекту 19, 7 (1997), 711-720.
  • (2) Мартинес, а и как, А. PCA против LDA IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 23, № 2, с. 228-233 2001,.
  • (3) Ахонен, т., Хадид, А. и Пиетикайнен, М. распознавание лиц с локальными двоичными шаблонами. компьютерное зрение - ECCV 2004 (2004), 469-481.
  • (4) Tan, X., И Triggs, B. расширенные локальные наборы текстур для распознавания лиц в сложных условиях условия освещения. транзакции IEEE по обработке изображений 19 (2010), 1635-650.

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

50+ учебные изображения, безусловно, не нужны. Для базового распознавания лиц вам нужно около 50 граней, чтобы вычислить пространство лица (собственные лица). Возможно, вы с этим что-то перепутали. Смотрите, что у вас есть много вариантов в этом лица (цвет кожи, очки, форма ...) Ты можешь взять эти лица. из любой базы данных face вам нравится. http://www.face-rec.org/ перечисляет несколько баз данных и объясняет различные алгоритмы.

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

Если вы получите слишком много ложных классификаций, я бы посмотрел на гибридные методы. Гибридные методы объединяют алгоритм сопоставления шаблонов (eigenfaces, fisherfaces) с характеристикой одного. В этом случае вы берете вывод своего первого алгоритма и сопоставляете глаза, нос, брови, форму подбородка и т. д. с тестовым лицо.

короче:

  1. извлеките лица из каждого изображения с помощью haarcascades
  2. вычислить пространство лица
  3. поезд для каждого лица
  4. попросите классификацию лица
  5. возьмите наиболее вероятные классификации и проверьте для функций лица

в случае, если вы не нашли его, OpenCV также имеет библиотеку распознавания лиц: https://github.com/bytefish/libfacerec

изменить: Я бы не использовал более 10-15 компонентов (собственные лица).