Python学习 | 2021-09-17 人脸识别程序
Posted 宣纸儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习 | 2021-09-17 人脸识别程序相关的知识,希望对你有一定的参考价值。
目录
人脸识别流程:人脸检测+人脸对齐+特征点提取+人脸匹配
一、人脸检测
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
操作步骤:
- cv2.CascadeClassifier()加载Haar特征检测分类器
- cv2.imread()载入图像(读取结果为BGR格式,颜色区别于RGB格式),并转换为灰度图片
- 识别图像中的人脸,返回所有人脸的矩形框向量组
- 在图像中画上矩形框,显示识别结果
完整代码:
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”.
操作步骤:
- face_recognition.load_image_file() 加载图像
- 调用face_recognition.face_locations(image),定位所有图像中识别出的人脸位置信息(返回值是列表形式,每个人脸是一个tuple存储,包括[top, right, bottom, left])
- 循环找到的所有人脸,打印每张脸的位置信息
- 在图像中画上矩形框,显示识别结果
完整代码:
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 dlib、pip 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 -U、pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
二、人脸特征点标定
操作步骤:
- 获取人脸框位置的检测器与人脸关键点检测器
- 读取图像,进行图像的灰度化
- 使用detector进行人脸检测,获得人脸框的位置信息
- 遍历检测到的框,寻找人脸的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端部分-附学习指导]