Python学习 | 2021-09-17 人脸识别程序

Posted 宣纸儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习 | 2021-09-17 人脸识别程序相关的知识,希望对你有一定的参考价值。

目录

一、人脸检测

1、OpenCV人脸检测

操作步骤:

完整代码:

运行结果: 

参数含义:

 2、Face-Recognition人脸检测

 ①HOG算法

 ②CNN算法(卷积神经网络)

③问题记录与总结

二、人脸特征点标定

操作步骤:

完整代码:

运行结果:


人脸识别流程:人脸检测+人脸对齐+特征点提取+人脸匹配 


一、人脸检测

1、OpenCV人脸检测

OpenCV自带训练好的人脸Haar特征分类器,存储在D:\\Python\\Lib\\site-packages\\cv2\\data\\文件夹下。其中几个.xml文件如下:

人脸检测器(默认):haarcascade_frontalface_default.xml

人脸检测器(快速Harr):haarcascade_frontalface_alt2.xml

人脸检测器(侧视):haarcascade_profileface.xml

眼部检测器(左眼):haarcascade_lefteye_2splits.xml

眼部检测器(右眼):haarcascade_righteye_2splits.xml

身体检测器:haarcascade_fullbody.xml

微笑检测器:haarcascade_smile.xml

操作步骤:

  1. cv2.CascadeClassifier()加载Haar特征检测分类器
  2. cv2.imread()载入图像(读取结果为BGR格式,颜色区别于RGB格式),并转换为灰度图片
  3. 识别图像中的人脸,返回所有人脸的矩形框向量组
  4. 在图像中画上矩形框,显示识别结果

完整代码:

import cv2
import matplotlib.pyplot as plt

def detect(filename):
    face_cascade=cv2.CascadeClassifier('D:\\Python\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml')    #定义级联分类器
    img=cv2.imread(filename)
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)    #将BGR格式转换成灰度图片
    faces=face_cascade.detectMultiScale(gray, 1.3, 5)    #识别图像中的人脸,返回所有人脸的矩形框向量组
    num=0
    for (x, y, w, h) in faces:
        img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)    #在图像中画上矩形框
        num+=1
    print('人脸数量:',num)
    plt.imshow(img) 
    plt.axis('off')  
    plt.show()
    
detect('calorie.jpg')

运行结果: 

(可以看出,图片中共有11人,只识别出来10人,有所偏差)

参数含义:

学习方式——查文档 Python Module Docs,其中‘[’表示可选项

 cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst 

src        需要转换的图片

code        转换成何种格式

cv2.COLOR_BGR2GRAY         将BGR格式转换成灰度图片

detectMultiScale(image[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]]) -> objects

image        被检测的图片,需要转换为灰度图

scaleFactor         为了检测到不同大小的目标,通过该参数把图像长宽同时按照一定比例(默认为1.1)逐步缩小后检测(该参数设置越大,计算速度越快,但可能会错过了某个大小的人脸)

minNeighbors         只有检测目标被识别出来的次数大于等于这个值(默认为3),才被认为是正确的结果

cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img

pt1        Vertex of the rectangle

pt2        Vertex of the rectangle opposite to pt1 

color        Rectangle color 

thickness        Thickness of lines that make up the rectangle

 2、Face-Recognition人脸检测

 ①HOG算法

“HOG” is less accurate but faster on CPUs.The default is “HOG”.

操作步骤:

  1. face_recognition.load_image_file() 加载图像
  2. 调用face_recognition.face_locations(image),定位所有图像中识别出的人脸位置信息(返回值是列表形式,每个人脸是一个tuple存储,包括[top, right, bottom, left])
  3. 循环找到的所有人脸,打印每张脸的位置信息
  4. 在图像中画上矩形框,显示识别结果

完整代码:

import face_recognition
import cv2
import matplotlib.pyplot as plt

image = face_recognition.load_image_file("calorie.JPG")
face_locations=face_recognition.face_locations(image)
face_num=len(face_locations)
print('人脸数量:',face_num)       
org = cv2.imread("calorie.JPG")

for i in range(0,face_num):
    top = face_locations[i][0]
    right = face_locations[i][1]
    bottom = face_locations[i][2]
    left = face_locations[i][3]
    start = (left, top)
    end = (right, bottom)
    color = (255,0,0)
    thickness = 2
    img=cv2.rectangle(org, start, end, color, thickness)
    plt.imshow(img)
    plt.axis('off')  
plt.show()

运行结果:  

 

 ②CNN算法(卷积神经网络)

“CNN” is a more accurate deep-learning model which is GPU/CUDA accelerated (if available). 

完整代码:

import face_recognition
import cv2
import matplotlib.pyplot as plt

image = face_recognition.load_image_file("calorie.JPG")
face_locations_useCNN = face_recognition.face_locations(image,model='cnn')    #model默认为'hog'
face_num1=len(face_locations_useCNN)
print('人脸数量:',face_num1)     
org = cv2.imread("calorie.JPG")

for i in range(0,face_num1):
    top = face_locations_useCNN[i][0]
    right = face_locations_useCNN[i][1]
    bottom = face_locations_useCNN[i][2]
    left = face_locations_useCNN[i][3]
    start = (left, top)
    end = (right, bottom)
    color = (0,255,255)
    thickness = 2
    img=cv2.rectangle(org, start, end, color, thickness)  
    plt.imshow(img)
    plt.axis('off')  
plt.show()

运行结果:   

③问题记录与总结

dlib安装失败:

在安装dlib库时,采用pip install dlibpip install dlib-19.17.99-cp37-cp37m-win_amd64.whl两种方法均失败,部分报错信息如下:

You must use Visual Studio to build a python extension on windows. If you are getting this error it means you have not installed Visual C++. Note that there are many flavors of Visual Studio, like Visual Studio for C#  development. You need to install Visual Studio for C++.

最终,通过安装cmake、boost、Visual Studio 2019的方式解决问题

下载速度缓慢:

1、使用whl文件:通过网站https://pypi.org/project,下载whl第三方库安装文件(与Python版本一致),将其放置在Python安装目录下;在当前目录下,运行命令pip install xxx.whl

2、临时使用清华镜像源:运行命令pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xxx

3、永久配置清华镜像源:运行命令pip install pip -Upip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple


二、人脸特征点标定

操作步骤:

  1. 获取人脸框位置的检测器与人脸关键点检测器
  2. 读取图像,进行图像的灰度化
  3. 使用detector进行人脸检测,获得人脸框的位置信息
  4. 遍历检测到的框,寻找人脸的68个标定点;遍历所有点,打印出其坐标,并圈出来

完整代码:

import cv2
import dlib
import matplotlib.pyplot as plt

detector = dlib.get_frontal_face_detector()    #获取人脸分类器
predictor = dlib.shape_predictor(r"D:\\Python\\Lib\\site-packages\\face_recognition_models\\models\\shape_predictor_68_face_landmarks.dat")    #获取人脸检测器

path = "Martina.JPEG"
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

dets = detector(gray, 1)    #使用detector进行人脸检测,dets为返回的结果,(gray, 1)=(灰度图,1个通道)
for face in dets:
    shape = predictor(img, face)    #寻找人脸的68个标定点
    for pt in shape.parts():
        pt_pos = (pt.x, pt.y)
        img=cv2.circle(img, pt_pos, 2, (255, 0, 0), 1)        #遍历所有点,打印出其坐标,并圈出来

plt.imshow(img)
plt.axis('off')  
plt.show()

运行结果:

以上是关于Python学习 | 2021-09-17 人脸识别程序的主要内容,如果未能解决你的问题,请参考以下文章

Python基于人脸识别的考勤系统(Pyqt5+MySQL+Opencv) [PC端部分-附学习指导]

Python 人脸识别系统

使用Python搭建人脸识别考勤系统

人脸识别实战:使用Python OpenCV 和深度学习进行人脸识别

识别人脸face_recognition实现

通过opencv制作人脸识别的窗口,这也太疯狂了