【深度学习】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)来判断眨眼,或计算嘴巴的张开程度。

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

相关推荐
happyprince1 小时前
2026年07月09日全球AI前沿动态
人工智能
ACP广源盛139246256731 小时前
IX8024 PCIe4.0 交换芯片@ACP# RK3588:嵌入式 AI PC 标准化扩展方案
大数据·人工智能·分布式·单片机·嵌入式硬件
研究员子楚1 小时前
GEO行业发展标准体系白皮书V2.0-第09卷 · 适配篇:硅基主权伦理宪章与行业适配宣言
数据库·人工智能·geo
明哥聊AI2 小时前
测试时计算与推理模型深度解析:从o1到o3到DeepSeek-R1的技术演进(2026最新)
人工智能
广州灵眸科技有限公司2 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
梦想三三2 小时前
Git与GitHub基础入门:从零开始掌握版本控制与代码托管(完整图文教程)
人工智能·git·elasticsearch·github
xd1855785552 小时前
敲门砖工坊-求职信定制的HarmonyOS开发实践
人工智能·华为·harmonyos·鸿蒙
逻辑君2 小时前
认知神经科学研究报告【20260112】
人工智能·深度学习·数学建模·量子计算