Распознавание лиц Python + OpenCV - PullRequest
1 голос
/ 19 марта 2019

У меня есть один test1.jpg - это исходное изображение и содержит лица, которые нам нужно будет найти.

My test2.jpg - это изображение для проверки. Нам понадобится проверить грани из test1.jpg в нашем test2.jpg , и если в test2.jpg * существуют некоторые грани из test1.jpg 1014 * вывод true .

У меня нет опыта работы с OpenCV, и это новая технология для меня.

Мой очень простой код:

# faces which we need find
known_image = cv2.imread('test1.jpg')
# some random image
unknown_image = cv2.imread('test2.jpg')

gray_known = cv2.cvtColor(known_image, cv2.COLOR_BGR2GRAY)
gray_unknown = cv2.cvtColor(unknown_image, cv2.COLOR_BGR2GRAY)
faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

known_faces = faceCascade.detectMultiScale(
    gray_known,
    scaleFactor=1.27,
    minNeighbors=5,
    minSize=(10, 10),
    flags = cv2.CASCADE_SCALE_IMAGE
)

print("Found known {0} faces!".format(len(known_faces)))

unknown_faces = faceCascade.detectMultiScale(
    gray_unknown,
    scaleFactor=1.27,
    minNeighbors=5,
    minSize=(10, 10),
    flags = cv2.CASCADE_SCALE_IMAGE
)

print("Found unknown {0} faces!".format(len(unknown_faces)))

# BELLOW NOT CORRECT CODE. I DONT KNOW HOW I CAN DO LIKE THIS:
for face in known_faces:
   if face in unknown_faces:
      print(TRUE)
      break

1 Ответ

0 голосов
/ 19 марта 2019

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

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

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

Этап 1: ЛицоОбнаружение

Это проблема фактического нахождения лиц на изображениях.Ваш код должен справляться с этим довольно хорошо - каскадный классификатор из OpenCV является одним из наиболее распространенных способов сделать это (альтернативой является выровненный детектор лица в DLib ).

Этап 2: Распознавание лиц

Это более сложная часть.Методы распознавания лиц могут сильно различаться, и многое зависит от ситуации.Наиболее точный из них использует модуль глубокого обучения , поэтому, если ваше оборудование соответствует задаче, я бы порекомендовал это.Кажется, что код на самом деле является реализацией OpenFace - я использовал его раньше, и можно получить точное распознавание на очень немногих тренировочных изображениях.Я бы порекомендовал прочитать связанный пост и примеры DNN, поскольку код, вероятно, слишком глубокий, чтобы вдаваться в них.

Основные шаги следующие:

  • Обнаружение и обнаружениелица на изображении 1, как указано выше
  • Используйте предварительно обученное DNN для преобразования лица в линейно разделяемый вектор элементов (известный как вложение).
  • Обнаружение и определение местоположения лиц на изображении 2, как указано выше
  • Опять же, преобразуйте грани в вектор объектов, используя DNN.
  • Сравните векторы объектов, а не необработанные изображения, и выберите те, для которых евклидово расстояние достаточно мало.

Шаг внедрения DNN - это медленная часть, но она все равно должна быть достаточно эффективной, если у вас есть доступный графический процессор.

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

Этап 2 (а): Распознавание лиц без глубокого изучения

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

В документации OpenCV есть действительно хорошее руководство по .Опять же, код слишком длинный, чтобы поместить его непосредственно в сообщение, но эта ссылка описывает 3 метода обнаружения лиц. Fisherfaces и Eigenfaces оба полагаются на несколько примеров одного и того же лица и моделируют их в пространстве меньшего размера, где их можно сравнивать по основным свойствам, а не по необработанному пикселюdata.

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

Использование гистограмм Local Binary Pattern (LBP) будетскорее всего, даст вам лучшую отправную точку.LBP - это способ описания текстурных деталей изображения - в уроке, который я привел выше, есть больше информации.Я снова приведу несколько основных шагов, чтобы начать работу:

  • Для каждого обнаруженного лица извлеките маленькое вспомогательное изображение (интересующую область), используя ограничивающую рамку для этого лица.
  • Разбейте это изображение на более мелкие «заплатки» - по существу, разбейте изображение на однородную сетку (например, область интереса размером 100x100 пикселей может быть разбита на участки размером 10x10 размером 10x10 пикселей).
  • Для каждого патча рассчитать гистограмму LBP (по сути, список чисел)
  • Объедините эти гистограммы вместе, чтобы получить представление о лице. Эта сцепленная гистограмма становится вашим вектором объектов для представления этого конкретного лица.
  • Затем вы можете сделать то же самое для изображения 2.
  • Для всех ваших характерных векторов из изображения 2 сравните их с изображениями из изображения 1 и попытайтесь выделить те, которые находятся на меньших расстояниях.

Примечания:

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

...