Подтвердить что ты не робот

Открытое распознавание OpenCV/JavaCV - очень похожие значения доверия

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

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

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

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

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

Спасибо.

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

4b9b3361

Ответ 1

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

Введение

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

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

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

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

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

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

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

enter image description here

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

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

Литература

  • (1) Belhumeur, P. N., Hespanha, J., and Kriegman, D. Собственные функции против Fisherfaces: распознавание с использованием линейной проекции класса. IEEE Transactions на анализ шаблонов и машинный интеллект 19, 7 (1997), 711-720.
  • (2) Мартинес, А и Как, А. PCA против LDA IEEE Транзакции по анализу образцов и машинной разведке, т. 23, № 2, стр. 228-233, 2001.
  • (3) Ахонен, Т., Хадид, А. и Петикайнен, М. Распознавание лиц с локальными двоичными узорами. Computer Vision - ECCV 2004 (2004), 469-481.
  • (4) Tan, X. и Triggs, B. Усовершенствованные локальные функции текстур для распознавания лиц в сложных условиях освещения. IEEE Transactions по обработке изображений 19 (2010), 1635-650.

Ответ 2

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

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

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

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

Короче:

  • извлекать лица из каждого изображения с haarcascades
  • вычислить пространство лица
  • поезд для каждого лица
  • запросите классификацию лица
  • возьмите наиболее вероятные классификации и проверьте функции лица.

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

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