【深度学习】dlib 人脸关键点检测

文章目录


完整代码一览

c 复制代码
import numpy as np
import cv2
import dlib

img = cv2.imread('pyy.png')
detector = dlib.get_frontal_face_detector()
faces = detector(img, 0)

predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

for face in faces:
    shape = predictor(img, face)
    landmark = np.array([[p.x, p.y] for p in shape.parts()])

    for idx, point in enumerate(landmark):
        pos = [point[0], point[1]]
        cv2.circle(img, pos, 2, (0, 255, 0), 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(0)
cv2.destroyAllWindows()

安装 dlib 与下载模型

安装 dlib

dlib各版本下载地址:

Links for dlib

进入下载文件的存放位置,比如D:\Edge\,在搜索栏输入cmd,输入命令:pip install dlib-19.6.0-cp36-cp36m-win_amd64.whl,下载完成。

cp36是python3.6版本的,cp35是python3.5版本的。

下载完成后调用运行命令: pip install dlib==19.6.1

下载 68 点关键点模型

代码需要加载 shape_predictor_68_face_landmarks.dat,这是 dlib 官方预训练好的模型。下载地址:

68 点关键点模型

下载后解压,将 .dat 文件放在与 Python 脚本相同的文件夹中。

导入库

c 复制代码
import numpy as np
import cv2
import dlib #提供人脸检测和关键点预测功能

读取图像

c 复制代码
img = cv2.imread('pyy.png')

创建人脸检测器

c 复制代码
detector = dlib.get_frontal_face_detector()

该函数返回一个基于 HOG(方向梯度直方图)和线性 SVM 的人脸检测器,它对正面和侧面人脸都有较好的检测效果,且速度较快。

执行人脸检测

c 复制代码
faces = detector(img, 0)

detector(img, 0) 对图像进行人脸检测。第二个参数 0 表示不进行图像上采样(upsample),即使用原始尺寸进行检测。如果你想检测更小的人脸,可以增加这个值(如 1 表示上采样一次),但会降低速度。

加载关键点预测器

c 复制代码
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

加载预训练模型,能够输出稳定、精准的 68 个关键点坐标。

遍历每个人脸并提取关键点

c 复制代码
for face in faces:
    shape = predictor(img, face)
    landmark = np.array([[p.x, p.y] for p in shape.parts()])

对于每个人脸,调用 predictor(img, face) 得到 shape 对象,它包含 parts() 方法,返回一个包含 68 个点的列表。

列表推导式 p.x, p.y for p in shape.parts() 将每个点转换为 (x, y) 元组,再转换成 NumPy 数组,便于后续遍历。

绘制关键点并标注序号

c 复制代码
    for idx, point in enumerate(landmark):
        pos = [point[0], point[1]]
        cv2.circle(img, pos, 2, (0, 255, 0), 1)
        cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 255), 1, cv2.LINE_AA)

enumerate 遍历每个点,idx 是索引(0~67),point 是坐标数组。

cv2.circle 在点位置画一个绿色小圆点((0,255,0)),半径 2,线宽 1。

cv2.putText 在点旁边显示索引数字,字体大小 0.4,白色,抗锯齿渲染。

显示结果

c 复制代码
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

显示标注后的图像,按任意键关闭窗口。

运行结果:

68 个关键点的编号与分布

了解每个编号对应的部位,能帮你更好地利用这些点:

编号 部位描述

0 ~ 16 下巴轮廓(从右到左环绕)

17 ~ 21 左眼眉毛

22 ~ 26 右眼眉毛

27 ~ 30 鼻梁(从眉心到鼻尖)

31 ~ 35 鼻翼和鼻孔

36 ~ 41 左眼(6 个点)

42 ~ 47 右眼(6 个点)

48 ~ 59 外嘴唇轮廓

60 ~ 67 内嘴唇(嘴巴张开时可见)

你可以根据这些编号提取特定部位,例如计算眼睛的宽高比(EAR)来判断眨眼,或计算嘴巴的张开程度。

后续可以通过计算眼睛的宽高比,对人脸进行疲劳检测。

相关推荐
五度易链-区域产业数字化管理平台18 小时前
WorkBuddy 实战:将带 MD5 签名的第三方 API 封装为 MCP 服务(企业模糊搜索接口案例)
大数据·人工智能·mcp
怪奇云呼军18 小时前
知识库也会注入指令?闪电智能VoiceAgent 如何防住 Prompt Injection
人工智能·python·算法·云计算·音视频
xushichang123_18 小时前
企业降本刚需下,云上模型蒸馏与轻量化部署怎么选?AWS“大模型教研+小模型推理” 路径
大数据·人工智能
EasyDSS19 小时前
开会不用装App:私有化音视频系统EasyDSS即时视频会议,浏览器点开就能聊,AI帮你写纪要
人工智能·音视频
阿里云大数据AI技术19 小时前
基于 EMR Serverless Ray 实现 Qwen 模型批量推理实践
人工智能·算法·agent
ZJU_统一阿萨姆19 小时前
【算子开发】环境搭建与第一个CUDA程序
开发语言·人工智能·系统架构
老登为啥喜欢吹AI19 小时前
继DSH之后!Codex Harness 也开源了!Rust 核心、三层架构、人机协作
人工智能
国商联19 小时前
科技引领健康,服务温暖人心——国商联在行动
人工智能·科技·百度·生活
高工智能汽车19 小时前
东土科技李平:神经系统是机器人灵魂的载体
人工智能