自学内容网 自学内容网

【进阶OpenCV】 (18)-- Dlib库 --人脸关键点定位

人脸关键点定位

在dlib库中,有shape_predictor_68_face_landmarks.dat预测器,这是一个用于人脸关键点检测的预训练模型,它能够在人脸图像中定位和识别68个关键点。

一、作用

  1. 人脸关键点定位shape_predictor_68_face_landmarks.dat预测器能够准确地定位人脸的68个关键点,这些关键点涵盖了眼睛、眉毛、鼻子、嘴巴等面部特征。
  2. 辅助其他应用:通过定位这些关键点,该预测器可以为后续的人脸识别、人脸对齐、表情识别、面部动作捕捉等应用提供基础数据支持。

二、原理

  1. 基于机器学习shape_predictor_68_face_landmarks.dat预测器是基于机器学习算法构建的,它通过对大量标注了人脸关键点的图像进行训练,学习人脸关键点的特征。
  2. 模型内部结构
    • 层次化的神经网络:预测器内部包含了多个层次的神经网络,这些网络用于逐步细化面部特征的定位
    • 卷积神经网络(CNN)层:这些层包括卷积层、池化层、全连接层等,它们共同作用于输入图像,提取特征并预测关键点坐标。
  3. 工作流程
    • 加载模型:使用dlib库提供的函数加载shape_predictor_68_face_landmarks.dat预测器模型。
    • 人脸检测:首先使用dlib库的人脸检测器检测图像中的人脸区域。
    • 关键点预测:将检测到的人脸区域作为输入,调用预测器的predict函数,得到68个面部关键点的坐标。
    • 结果可视化:可以将这些关键点在原始图像上标出来,以直观展示面部特征的定位结果。
  4. 训练过程
    • 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. 获取关键点

  1. 遍历每张脸的关键点,获取关键点
  2. 将关键点转化为坐标形式
  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库自带的预测器,来进行人脸的关键点定位,并将它显示出来。得到关键点定位后,我们就可以通过点位的距离变换,简单的判断人脸表情变换情况。


原文地址:https://blog.csdn.net/m0_74896766/article/details/143029290

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!