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

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

相关推荐
武子康7 小时前
GPT-5.6 Luna 降价 80%:Agent 真正该重算的是单次成功成本
人工智能·chatgpt·llm
Gu Gu Study7 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
HyperAI超神经8 小时前
15亿参数挑战机器人控制,MiniCPM-RobotManip正式开源;覆盖文本/图/视频/动作序列,英伟达发布全模态模型Cosmos3-Edge
人工智能·深度学习·机器人·多模态·图像生成·具身智能·智能体
搞科研的小刘选手8 小时前
【国际生态学协会主办】2026年生态环境与人工智能国际学术会议(ICAIEE 2026)
人工智能·生态环境·学术会议·会议推荐
笨鸟先飞,勤能补拙8 小时前
AI 赋能网络安全领域深度剖析
网络·人工智能·windows·安全·web安全·网络安全·github
小鸟你好啊8 小时前
搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼
人工智能·阿里云·云计算
Summer-Bright8 小时前
深度 | Agent框架大洗牌:AutoGen退场后的新秩序
人工智能·ai·语言模型·ai软件
ThsPool8 小时前
【遥感学习整理 02】ENVI遥感图像处理基础:从数据读取到遥感信息产品
图像处理·人工智能·学习
非凸科技8 小时前
非凸智能APP
人工智能
土星云SaturnCloud8 小时前
抽水蓄能设备智慧运营:基于土星云边缘计算实现机组全生命周期预测性维护
服务器·人工智能·ai·边缘计算