文章目录
- 人脸关键点定位
- 一、作用
- 二、原理
- 三、代码实现
- 1. 构造人脸检测器
- 2. 载入模型(加载预测器)
- 3. 获取关键点
- 4. 显示图像
- 5. 完整代码
- 总结
人脸关键点定位
在dlib库中,有shape_predictor_68_face_landmarks.dat预测器,这是一个用于人脸关键点检测的预训练模型,它能够在人脸图像中定位和识别68个关键点。
一、作用
- 人脸关键点定位:shape_predictor_68_face_landmarks.dat预测器能够准确地定位人脸的68个关键点,这些关键点涵盖了眼睛、眉毛、鼻子、嘴巴等面部特征。
- 辅助其他应用:通过定位这些关键点,该预测器可以为后续的人脸识别、人脸对齐、表情识别、面部动作捕捉等应用提供基础数据支持。
二、原理
- 基于机器学习:shape_predictor_68_face_landmarks.dat预测器是基于机器学习算法构建的,它通过对大量标注了人脸关键点的图像进行训练,学习人脸关键点的特征。
- 模型内部结构:
- 层次化的神经网络:预测器内部包含了多个层次的神经网络,这些网络用于逐步细化面部特征的定位。
- 卷积神经网络(CNN)层:这些层包括卷积层、池化层、全连接层等,它们共同作用于输入图像,提取特征并预测关键点坐标。
- 工作流程:
- 加载模型:使用dlib库提供的函数加载shape_predictor_68_face_landmarks.dat预测器模型。
- 人脸检测:首先使用dlib库的人脸检测器检测图像中的人脸区域。
- 关键点预测:将检测到的人脸区域作为输入,调用预测器的predict函数,得到68个面部关键点的坐标。
- 结果可视化:可以将这些关键点在原始图像上标出来,以直观展示面部特征的定位结果。
- 训练过程:
- shape_predictor_68_face_landmarks.dat预测器是在大量标注了人脸关键点的图像数据集上训练得到的。
- 训练过程中,模型会不断调整其参数,以最小化预测关键点位置与实际标注位置之间的误差。
三、代码实现
- 人脸图像:
1. 构造人脸检测器
import numpy as np
import cv2
import dlib
img = cv2.imread('renlian.jpg')
detector = dlib.get_frontal_face_detector()# 构造人脸检测器
faces = detector(img,0)# 检测人脸
2. 载入模型(加载预测器)
- 函数方法:
dlib.shape_predictor()载入模型
- 代码:
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
3. 获取关键点
- 遍历每张脸的关键点,获取关键点
- 将关键点转化为坐标形式
- 将关键点通过enumerate()函数方法同时获得每个点对应的索引,用于编号
for face in faces: # 获取每一张脸的关键点
shape = predictor(img,face) # 获取关键点
# 将关键点转换为坐标(x,y)的形式
landmarks = np.array([[p.x,p.y] for p in shape.parts()])
# 绘制每一张脸的关键点
for idx,point in enumerate(landmarks):
pos = (point[0],point[1])# 当前关键点坐标
# 针对当前关键点,绘制一个实心圆
cv2.circle(img,pos,2,(0,255,0),thickness=-1)
cv2.putText(img,str(idx),pos,cv2.FONT_HERSHEY_SIMPLEX,
0.4,(255,255,255),1,cv2.LINE_AA)
4. 显示图像
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
5. 完整代码
"""-----关键点定位:定位到人脸的眼睛、鼻子、眉毛、轮廓等-----"""
import numpy as np
import cv2
import dlib
img = cv2.imread('renlian.jpg')
detector = dlib.get_frontal_face_detector()# 构造人脸检测器
faces = detector(img,0)# 检测人脸
# dlib.shape_predictor载入模型(加载预测器)
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
for face in faces: # 获取每一张脸的关键点
shape = predictor(img,face) # 获取关键点
# 将关键点转换为坐标(x,y)的形式
landmarks = np.array([[p.x,p.y] for p in shape.parts()])
# 绘制每一张脸的关键点
for idx,point in enumerate(landmarks):
pos = (point[0],point[1])# 当前关键点坐标
# 针对当前关键点,绘制一个实心圆
cv2.circle(img,pos,2,(0,255,0),thickness=-1)
cv2.putText(img,str(idx),pos,cv2.FONT_HERSHEY_SIMPLEX,
0.4,(255,255,255),1,cv2.LINE_AA)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
总结
本篇介绍了如何通过Dlib库自带的预测器,来进行人脸的关键点定位,并将它显示出来。得到关键点定位后,我们就可以通过点位的距离变换,简单的判断人脸表情变换情况。