当前位置: 首页 > article >正文

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

文章目录

  • 人脸关键点定位
    • 一、作用
    • 二、原理
    • 三、代码实现
      • 1. 构造人脸检测器
      • 2. 载入模型(加载预测器)
      • 3. 获取关键点
      • 4. 显示图像
      • 5. 完整代码
  • 总结

人脸关键点定位

在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库自带的预测器,来进行人脸的关键点定位,并将它显示出来。得到关键点定位后,我们就可以通过点位的距离变换,简单的判断人脸表情变换情况。


http://www.kler.cn/news/353744.html

相关文章:

  • 如何高效解锁业务数据价值:多云时代应该怎么构建新一代数据平台架构
  • Allegro 小技巧
  • 二叉树与堆讲解
  • unity动态批处理
  • Spring Boot知识管理系统:安全与合规性
  • linux红帽基础命令
  • 【力扣热题100】3194. 最小元素和最大元素的最小平均值【Java】
  • mysql--数据表的操作
  • AI Weekly#1:过去一周重要的AI资讯汇总
  • 基于知识图谱的宁夏非遗问答系统
  • URL路径以及Tomcat本身引入的jar包会导致的 SpringMVC项目 404问题、Tomcat调试日志的开启及总结
  • Spring Boot: 构建高效中小型医院网站
  • C++初阶学习第七弹——string的模拟实现
  • 基于STM32的节能家庭管家系统设计
  • Spring AI Java程序员的AI之Spring AI(一)
  • 看《米小圈日记魔法》突破写作困境一点也不难!
  • 小红的行列式构造
  • Java微信支付接入(10)API V3 申请退款API
  • 深度学习500问——Chapter17:模型压缩及移动端部署(4)
  • 【环境搭建】远程服务器搭建ElasticSearch