OpenCV реализует распознавание лиц

Идентификация изображения

предисловие

  Обнаружение и распознавание лиц — технология, которой уделяется большое внимание. В настоящее время существует множество реализаций алгоритмов для обнаружения и распознавания лиц.Обычно используемые алгоритмы обнаружения лиц включают Dilb, OpenCV, OpenFace, MTCNN и т.д. Распространенные алгоритмы распознавания лиц включают FaceNet, модель InsightFace и т. д.

  Эта статья представляет собой небольшую программу, основанную на блогах других людей, когда я работал над проектом распознавания лиц Полный текст относительно прост, поэтому я представлю его здесь.распознавание лицаПеред проектом представим простой OpenCVРаспознавание лиц.

1. Принцип распознавания лиц OpenCV

  OpenCV использует каскадный классификатор на основе Хаара.

  Каскадный классификатор, основанный на признаках Хаара, является эффективным методом обнаружения объектов, предложенным в статье «Быстрое обнаружение объектов с использованием усиленного каскада простых признаков», опубликованной Полом Виолой и Майклом Джоном в 2001 году. Это метод машинного обучения, который обучает каскадное уравнение на многих положительных и отрицательных примерах, а затем применяет его к другим изображениям.

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

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

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

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

   Окончательный классификатор представляет собой взвешенную сумму этих слабых классификаторов. Причина, по которой его называют слабым классификатором, заключается в том, что каждый классификатор не может классифицировать изображения по отдельности, но они объединяются для формирования сильного классификатора. В документе показано, что классификатор, который требует только 200 признаков, достигает точности обнаружения 95%. Окончательный классификатор имеет около 6000 признаков. (уменьшение более чем 160 000 функций до 6 000 — это огромное улучшение)

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

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

Детектор автора делит 6000+ признаков на 38 стадий, а первые пять стадий имеют 1, 10, 25, 25 и 50 признаков соответственно (две особенности, которые идентифицируют глаза и переносицу, упомянутые на предыдущем рисунке, на самом деле две лучшие функции, полученные в Adaboost). По словам авторов, в среднем только около 10 из 6000+ функций необходимо использовать для каждого подокна.

Во-вторых, OpenCV реализует распознавание лиц.

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

  OpenCV содержит множество обученных классификаторов, таких как лицо, глаз, улыбка и т. д. Эти файлы XML хранятся в папке opencv/data/haarcascades/ и могут вызываться напрямую при использовании.

import cv2

path = '【图片】' #图片地址
img = cv2.imread(path) #读取图片

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml') #获取人脸级联分类器,'.xml'文件里包含训练出来的人脸特征

faces = face_cascade.detectMultiScale(img,scaleFactor=【放大倍数】,minNeighbors=【重复识别次数】) #用分类器进行人脸识别,返回人脸坐标列表

for (x,y,w,h) in faces: #对每一张人脸进行操作
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) #画出人脸框,倒数两个参数分别为颜色和线条宽度,其中颜色采用BGR格式

cv2.imshow('img',img) #展示人脸框

Как насчет   , разве это не просто~

   В качестве примера возьмем плакат «Празднование более чем года», область лица обведена синей рамкой.

  В дополнение к классификаторам лиц существуют также классификаторы человеческого глаза

eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml')

   и классификатор улыбки

smile_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_smile.xml')

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

Образец кода:

for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    # 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源
    face_area = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(face_area)
    # 用人眼级联分类器引擎在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
    for (ex,ey,ew,eh) in eyes:
        #画出人眼框,绿色,画笔宽度为1
        cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)

3. Вызовите камеру для распознавания лиц в режиме реального времени.

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

import cv2

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')

# 调用摄像头摄像头
cap = cv2.VideoCapture(0) #opencv的函数,参数0代表调用电脑自带摄像,若改为1则调用外设摄像

while(True):
    # 获取摄像头拍摄到的画面
    ret, frame = cap.read()
    faces = face_cascade.detectMultiScale(frame, 1.3, 5)
    img = frame
    for (x,y,w,h) in faces:
        # 画出人脸框,蓝色,画笔宽度微
        img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        
    # 实时展示效果画面
    cv2.imshow('frame2',img)
    # 每5毫秒监听一次键盘动作
    if cv2.waitKey(5) & 0xFF == ord('q'):
        break

# 最后,关闭所有窗口
cap.release()
cv2.destroyAllWindows()

  Динамический мониторинг выглядит следующим образом:

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

   В следующем выпуске будет использовано глубокое обучение для реализации распознавания лиц (соответствующая информация о персонажах будет идентифицирована на основе обнаружения)

  эпилог:MTCNN+FaceNet создает подробное объяснение распознавания лиц

дефект

  1. Область лица не распознается, когда лицо наклонено
  2. 2D-распознавание, изображение можно распознать, не основываясь на 3D-моделировании лица

использованная литература

1.Распознавание лиц с помощью Haar Cascade

2.Десять строк кода на Python для распознавания лиц