Открытое распознавание OpenCV/JavaCV - очень похожие значения доверия
Я объясню, что я пытаюсь сделать, поскольку это кажется актуальным, чтобы понять мой вопрос.
В настоящее время я пытаюсь распознать людей, которые находятся перед камерой, на основе известных изображений в базе данных.
Эти известные снимки собираются с идентифицирующей смарт-карты (которая содержит только одно изображение фронтального лица) или изображение профиля лицевой поверхности из социальной сети. Из того, что я читал до сих пор, кажется, что для хорошего распознавания лица требуется хорошее количество учебных изображений (50+). Таким образом, поскольку моих собранных изображений очень мало, чтобы создать надежный набор для обучения, я вместо этого попытался использовать мои снимки камеры в реальном времени (в настоящее время используя 150) в качестве набора для обучения и идентифицированные снимки, ранее собранные в качестве набора тестов. Я не уверен, что то, что я пытаюсь с этим, правильно, поэтому, пожалуйста, дайте мне знать, если я напугаю.
Итак, проблема в том, что после того, как я сказал, 5 идентифицированных изображений, которые я получил от смарт-карт, я попытался распознать лицо, используя в качестве обучающего набора 150 кадров, которые камера захватила на моем лице. При попытке распознать значения доверия для каждого из 5 тестовых граней EXTREMELY похожи, делая всю программу бесполезной, потому что я не могу точно узнать кого-либо. Часто, используя различные захваты камеры в качестве тренировки, я получаю более высокие доверительные значения от изображений случайных людей, чем сама картина.
Буду признателен за любую помощь, которую вы можете мне дать, потому что я в затруднении.
Спасибо.
Примечание. Я использую оболочку JavaCV для OpenCV для создания моей программы и haarcascades, которые входят в пакет. Используемые алгоритмы.
Ответы
Ответ 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 компонентов (собственных).