>백엔드 개발 >파이썬 튜토리얼 >팁 | 간단하고 사용하기 쉬운 Python 얼굴 인식 알고리즘 요약

팁 | 간단하고 사용하기 쉬운 Python 얼굴 인식 알고리즘 요약

Python当打之年
Python当打之年앞으로
2023-08-09 17:21:03930검색


오늘은 간단하고 사용하기 쉬운 얼굴 인식 알고리즘을 요약해 보겠습니다. 얼굴 인식은 컴퓨터 비전에서 비교적 일반적인 기술입니다. 생활에서 우리가 가장 많이 노출되는 얼굴 인식 시나리오는 얼굴 출석입니다. 관심 있는 분들을 위해 이전에도 얼굴 출석 프로젝트에 대한 특별 기사를 쓴 적이 있습니다. 살펴볼 수 있습니다.

얼굴 인식 알고리즘의 핵심 작업은 사진에서 얼굴의 위치를 ​​식별하는 것입니다. 인식 알고리즘은 매우 다양하며, 아래에서 하나씩 소개하겠습니다.

팁 | 간단하고 사용하기 쉬운 Python 얼굴 인식 알고리즘 요약

1. HoG 얼굴 감지

이 알고리즘은 전통적인 기계 학습 알고리즘을 사용하여 얼굴을 식별합니다. 기존 기계 학습 알고리즘의 특징은 수동으로 기능을 구성한 다음 구성한 기능을 모델 교육에 보내는 것입니다.

이 알고리즘은 HoG사진 속 인물 추출 얼굴 특징의 경우 SVM 분류 알고리즘 . HoG提取图片中人脸特征,用SVM算法进行分类。

HoG(Histogram of Oriented Gradient, 方向梯度直方图)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子,通过计算和统计图像局部区域的梯度方向直方图来构成特征。

dlib库中有该算法的实现,下面我们看看核心代码

import dlib
# 加载预训练的 HoG 人脸检测器
hog_face_detector = dlib.get_frontal_face_detector()

# 对图片进行人脸检测
results = hog_face_detector(imgRGB, 0)

for bbox in results:
  x1 = bbox.left()  # 人脸左上角x坐标
  y1 = bbox.top()  # 人脸左上角y坐标
  x2 = bbox.right()  # 人脸右下角x坐标
  y2 = bbox.bottom()  # 人脸右下角y坐标

results 存放一张图中检测出来的多个人脸, 遍历results

HoG(지향 그라데이션 히스토그램, 방향성 기울기 히스토그램 특징은 컴퓨터 비전 및 영상 처리에서 객체 검출에 사용되는 특징 설명자로서, 영상의 국소 영역에 대한 기울기 방향 히스토그램을 계산하고 계수하여 특징을 형성합니다.

dlib 라이브러리에는 이 알고리즘이 있습니다. 구현, 핵심 코드를 살펴보겠습니다
import cv2

# 加载预训练的 SSD 模型
opencv_dnn_model = cv2.dnn.readNetFromCaffe(
      prototxt="models/deploy.prototxt"
      , caffeModel="models/res10_300x300_ssd_iter_140000_fp16.caffemodel")

# 原始图片 blob 处理
preprocessed_image = cv2.dnn.blobFromImage(image, scalefactor=1.0, size=(300, 300), mean=(104.0, 117.0, 123.0), swapRB=False, crop=False)
 
# blob 图片送入模型
opencv_dnn_model.setInput(preprocessed_image)

# 模型推理,进行人脸检测
results = opencv_dnn_model.forward()  

# 遍历人脸
for face in results[0][0]:
  # 置信度
  face_confidence = face[2]
  
  # 人脸边框的左上角和右下角坐标点
  x1 = int(bbox[0] * image_width)
  y1 = int(bbox[1] * image_height)
  x2 = int(bbox[2] * image_width)
  y2 = int(bbox[3] * image_height)
팁 | 간단하고 사용하기 쉬운 Python 얼굴 인식 알고리즘 요약결과 사진에서 감지된 여러 얼굴을 저장하고 traverse<code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px; background -color : rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">결과 각 얼굴의 직사각형 프레임을 얻을 수 있습니다.

감지 예는 다음과 같습니다.

🎜🎜🎜🎜녹색 프레임은 알고리즘이 감지한 얼굴입니다. 🎜

HoG 人脸检测由于采用传统机器学习算法,所以性能比较高,在CPU上运行也可以比较快。但它无法检测小于 80*80 的人脸,对旋转人脸、非正面人脸,识别效果也不太好。

2. 深度学习人脸检测

虽然传统机器学习算法检测更快,但准确度却有待提升。基于深度学习的人脸检测算法往往会更加准确。

这里介绍的是使用残差网络ResNet-10通过网络(模型)在图像的单通道( Single Shot Detector,SSD)中检测多个人脸。简称SSD算法。

首先,需要将原始图片进行blob预处理,然后直接送入模型,进行检测

cv2库提供了该算法的实现,核心代码如下:

import cv2

# 加载预训练的 SSD 模型
opencv_dnn_model = cv2.dnn.readNetFromCaffe(
      prototxt="models/deploy.prototxt"
      , caffeModel="models/res10_300x300_ssd_iter_140000_fp16.caffemodel")

# 原始图片 blob 处理
preprocessed_image = cv2.dnn.blobFromImage(image, scalefactor=1.0, size=(300, 300), mean=(104.0, 117.0, 123.0), swapRB=False, crop=False)
 
# blob 图片送入模型
opencv_dnn_model.setInput(preprocessed_image)

# 模型推理,进行人脸检测
results = opencv_dnn_model.forward()  

# 遍历人脸
for face in results[0][0]:
  # 置信度
  face_confidence = face[2]
  
  # 人脸边框的左上角和右下角坐标点
  x1 = int(bbox[0] * image_width)
  y1 = int(bbox[1] * image_height)
  x2 = int(bbox[2] * image_width)
  y2 = int(bbox[3] * image_height)

results[0][0]存放了检测出来的多张人脸,每张人脸用数组表达,数组的第3位存放置信度,可以通过阈值过滤不置信的人脸。数组的第4~7位存放检测出来的人脸矩形框左上角和右下角的坐标。

相比于 HoG 人脸检测,SSD 算法对遮挡、非正面人脸也能检测出来。

팁 | 간단하고 사용하기 쉬운 Python 얼굴 인식 알고리즘 요약

3. 卷积神经网络人脸检测

卷积就不多说了,了解计算机视觉的都知道。

dlib库提供了卷积神经网络人脸检测算法的实现,用法跟之前类似

import dlib

# 记载预训练模型
cnn_face_detector = dlib.cnn_face_detection_model_v1("models/mmod_human_face_detector.dat")

# 人脸检测
results = cnn_face_detector(imgRGB, 0)

# 遍历每张人脸
for face in results:
  # 人脸边框      
  bbox = face.rect
  
  # 人脸边框的左上角和右下角坐标点
  x1 = int(bbox.left() * (width/new_width))
  y1 = int(bbox.top() * (height/new_height))
  x2 = int(bbox.right() * (width/new_width))
  y2 = int(bbox.bottom() * (height/new_height))

results的解析跟上面类似,这里就不在赘述了。

采用卷积神经网络的人脸检测算法优势很明显,比前两个更准确和健壮,并且还能够检测遮挡下的人脸。

팁 | 간단하고 사용하기 쉬운 Python 얼굴 인식 알고리즘 요약

即便非正面、且光线暗的图片,也能很好检测出来

팁 | 간단하고 사용하기 쉬운 Python 얼굴 인식 알고리즘 요약

但该算法相应的缺点也很明显,检测过程所花费的时间非常长,无法在 CPU 上实时运行。

4. BlazeFace

上面的算法要么精度高、速度慢,要么速度快,精度低。那有没有一种检测算法,既有高准确率,又有高性能呢?

答案是肯定的,BlazeFace是一种非常轻量级且高度准确的人脸检测器,号称亚毫秒级的人脸检测器。其灵感来自 Single Shot MultiBox Detector (SSD)MobileNetv2

Mediapipe库提供了该算法的实现,核心代码如下:

import mediapipe as mp

# 画图工具
mp_drawing = mp.solutions.drawing_utils

# 初始化人脸检测模型
mp_face_detection = mp.solutions.face_detection
mp_face_detector = mp_face_detection.FaceDetection(min_detection_confidence=0.4)

results = mp_face_detector.process(imgRGB)

if results.detections:

  # 变脸检测出的人脸
  for face_no, face in enumerate(results.detections):

      # 画人脸关键点
      mp_drawing.draw_detection(image=output_image, detection=face, keypoint_drawing_spec=mp_drawing.DrawingSpec(color=(0,255,0),thickness=-1, circle_radius=image_width//115), bbox_drawing_spec=mp_drawing.DrawingSpec(color=(0,255,0),thickness=image_width//180))

      # 画人脸框
      face_bbox = face.location_data.relative_bounding_box
      x1 = int(face_bbox.xmin*image_width)
      y1 = int(face_bbox.ymin*image_height)

      cv2.rectangle(output_image, pt1=(x1, y1-image_width//20), pt2=(x1+image_width//16, y1), color=(0, 255, 0), thickness=-1)

效果如下:

팁 | 간단하고 사용하기 쉬운 Python 얼굴 인식 알고리즘 요약

BlazeFace 알고리즘은 얼굴을 감지할 뿐만 아니라 얼굴의 6가지 핵심 지점(눈, 코, 귀, 입)을 식별할 수 있습니다. BlazeFace算法不光能检测人脸,还能识别出人脸6个关键点(眼睛、鼻子、耳朵、嘴)。

上面就是今天分享的4个人脸识别的算法。

识别出人脸,我们再做人脸考勤就非常简单了,把人脸Embedding

위는 오늘 공유한 얼굴인식 알고리즘 4가지 입니다.
얼굴을 인식한 후 얼굴 출석을 하는 것은 매우 간단합니다.벡터에 삽입하고 벡터 사이의 거리를 계산하면 됩니다. 🎜🎜🎜

위 내용은 팁 | 간단하고 사용하기 쉬운 Python 얼굴 인식 알고리즘 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Python当打之年에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제