大家好。今天就为大家总结几个简单易用的人脸识别算法。人脸识别是计算机视觉中比较常见的技术。在生活中,我们接触最多的人脸识别场景就是人脸考勤。之前写过一篇刷脸考勤的文章。感兴趣的朋友可以看看。人脸识别算法的核心工作是从一张图片中识别人脸的位置。识别算法可以说是五花八门,下面我会一一介绍。1.HoG人脸检测该算法使用传统的机器学习算法来识别人脸。传统机器学习算法的特点是人工构建特征,然后将构建的特征送入模型训练。该算法使用HoG提取图片中的人脸特征,并使用SVM算法进行分类。HoG(HistogramofOrientedGradient,定向梯度直方图)特征是计算机视觉和图像处理中用于物体检测的特征描述符。特征是通过计算统计图像局部区域的梯度方向直方图。dlib库中有这个算法的实现,我们来看看核心代码importdlib#加载预训练的HoG人脸检测器hog_face_detector=dlib.get_frontal_face_detector()#对图片进行人脸检测results=hog_face_detector(imgRGB,0)forbboxinresults:x1=bbox.left()#人脸左上角的x坐标y1=bbox.top()#人脸左上角的y坐标x2=bbox.right()#人脸右下角的x坐标y2=bbox.bottom()#人脸结果右下角y坐标存储一张图片中检测到的多张人脸,遍历结果可以得到每张人脸的矩形框。检测示例如下:绿框为算法检测到的人脸。因为HoG人脸检测采用传统的机器学习算法,所以性能比较高,在CPU上可以跑得更快。但是不能检测小于80*80的人脸,对于旋转人脸和非正面人脸识别效果不是很好。2.深度学习人脸检测虽然传统的机器学习算法检测速度较快,但精度有待提高。基于深度学习的人脸检测算法往往更准确。这里介绍的是利用残差网络ResNet-10通过网络(模型)检测图像单通道(SingleShotDetector,SSD)中的多张人脸。它被称为SSD算法。首先需要对原图进行blob预处理,然后直接送入模型??进行检测。cv2库提供了算法的实现。核心代码如下:importcv2#加载预训练的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(100),4.mean,117.0,123.0),swapRB=False,crop=False)#将blob图像发送到模型中opencv_dnn_model.setInput(preprocessed_image)#模型推理,人脸检测results=opencv_dnn_model.forward()#traversingfacesforfaceinresults[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]中存储了多张检测到的人脸,每张人脸用一个数组表示,数组的第三个Reliability放到位,untrustwor你的脸可以通过阈值过滤。数组的第4~7位存储检测到的人脸矩形的左上角和右下角的坐标。与HoG人脸检测相比,SSD算法还可以检测遮挡和非正面人脸。3.卷积神经网络人脸检测卷积就不多说了,懂计算机视觉的都知道。dlib库提供了卷积神经网络人脸检测算法的实现,用法和前面的importdlib类似#记录预训练模型cnn_face_detector=dlib.cnn_face_detection_model_v1("models/mmod_human_face_detector.dat")#人脸检测结果=cnn_face_detector(imgRGB,0)#遍历每个人脸forfaceinresults:#人脸边框bbox=face.rect#人脸边框左上角和右下角的坐标点x1=int(bbox.left()*(宽度/new_width))y1=int(bbox.top()*(height/new_height))x2=int(bbox.right()*(width/new_width))y2=int(bbox.bottom()*(height/new_height))results分析同上,这里不再赘述。使用卷积神经网络的人脸检测算法具有明显的优势。它比前两者更准确和鲁棒,它也可以检测遮挡下的人脸。即使是非正面和暗的图片也能很好的检测出来,但是相应的算法的缺点也很明显。检测过程耗时很长,无法在CPU上实时运行。4.BlazeFace上的算法要么精度高但速度慢,要么速度快但精度低。有没有一种兼具高精度和高性能的检测算法?答案是肯定的,BlazeFace是一款非常轻巧且精度高的人脸检测器,号称亚毫秒级人脸检测器。它的灵感来自SingleShotMultiBoxDetector(SSD)和MobileNetv2。Mediapipe库提供了该算法的实现。核心代码如下:importmediapipeasmp#绘图工具mp_drawing=mp.solutions.drawing_utils#初始化人脸检测模型mp_face_detection=mp.solutions.face_detectionmp_face_detector=mp_face_detection.FaceDetection(min_detection_confidence=0.4)results=mp_face_detector.process(imgRGB)ifresults.detections:#face_no,faceinenumerate(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_boxx1=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)效果如下:可以be看到BlazeFace算法不仅可以检测人脸,还可以识别6个人脸关键点(眼睛眼睛、鼻子、耳朵、嘴巴)以上就是今天分享的4种人脸识别算法。识别完人脸之后,我们要做人脸考勤就很简单了。将人脸嵌入到向量中并计算向量之间的距离。
