哈嘍,大家好。
今天要為大家總結幾個簡單、好用的人臉辨識演算法。人臉辨識是電腦視覺中比較常見的技術,生活中,我們接觸最多的人臉辨識場景是人臉考勤,我之前還專門寫過一篇人臉考勤的項目,有興趣的朋友可以看看。
人臉辨識的演算法最核心的工作是從一張圖片中辨識出人臉的位置。辨識的演算法可以說是多種多樣, 下面我就來為大家一一介紹下。
此演算法採用傳統的機器學習演算法來辨識人臉。傳統機器學習演算法的特點是人工構造特徵,然後將構造好的特徵送入模型訓練。
演算法以HoG擷取圖片中人臉特徵,以SVM演算法進行分類。
HoG(Histogram of Oriented Gradient, 方向梯度直方圖)特徵是一種在電腦視覺和影像處理中用來進行物體偵測的特徵描述子,透過計算和統計影像局部區域的梯度方向直方圖來構成特徵。
dlib庫中有該演算法的實現,下面我們看看核心程式碼
import dlib
# 加载预训练的 HoG 人脸检测器
hog_face_detector = dlib.get_frontal_face_detector()
# 对總結幾個簡單好用的Python人臉辨識演算法进行人脸检测
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 人臉偵測由於採用傳統機器學習演算法,所以效能比較高,在CPU上運作也可以比較快。但它無法偵測小於 80*80 的人臉,對旋轉人臉、非正面人臉,辨識效果也不太好。
雖然傳統機器學習演算法偵測更快,但準確度卻有待提升。基於深度學習的人臉偵測演算法往往會更加準確。
這裡介紹的是使用殘差網路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")
# 原始總結幾個簡單好用的Python人臉辨識演算法 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 總結幾個簡單好用的Python人臉辨識演算法送入模型
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 演算法對遮蔽、非正面人臉也能偵測出來。
卷積就不多說了,了解電腦視覺的都知道。
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的解析跟上面類似,這裡就不在贅述了。
採用卷積神經網路的人臉偵測演算法優勢很明顯,比前兩個更準確和健壯,也能夠偵測遮擋下的人臉。
即便非正面、且光線暗的圖片,也能很好地偵測出來
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人臉辨識演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!