OpenCv高阶(十九)——dlib关键点定位
文章目录
- 一、什么是人脸关键点定位?
- 二、关键点模型的下载及关键信息的理解
- 三、dlib关键点定位的简单实现
- (1)导入必要的库
- (2)从指定路径读取图像文件
- (3)创建dlib的正面人脸检测器对象
- (4)使用检测器在图像上检测人脸
- (5)加载dlib预训练的人脸关键点定位模型
- (6)遍历检测到的每个人脸区域
- (7)显示处理后的图像(包含人脸关键点标记)
- 四、人脸关键点定位的主要作用和应用
- 五、主要技术方法
- 总结
一、什么是人脸关键点定位?
人脸关键点定位(Facial Landmark Detection),也称为人脸特征点检测或人脸对齐,是计算机视觉领域的一项基础任务。它的核心目标是在一张包含人脸的图像中,自动地、精确地定位出人脸上一系列预定义的关键解剖点的位置坐标(通常是二维像素坐标)。
二、关键点模型的下载及关键信息的理解
关键点模型下载:
官网下载:http://dlib.net/files/
关键点: 这些点是经过精心选择的,代表了人脸的重要结构和特征。常见的点包括:
眉毛的轮廓点(例如,左右眉峰、眉梢)眼睛的轮廓点(例如,眼角、眼睑)鼻子的轮廓点(例如,鼻尖、鼻翼)嘴巴的轮廓点(例如,嘴角、唇峰、唇谷)脸部的轮廓点(例如,下巴尖、脸颊边缘)有时还包括瞳孔中心、脸颊点等。
定位: 算法需要输出每个关键点的精确坐标 (x, y),这些坐标对应于它们在输入图像中的像素位置。
预定义模型: 关键点的数量和位置通常是预先定义好的标准模型。最常见的模型有:
68点模型: 这是最经典和广泛使用的模型,包括眉毛(每边5点)、眼睛(每边6点)、鼻子(9点)、嘴巴(20点)和脸部轮廓(17点)。5点模型: 更简单,通常定位两个眼睛中心、鼻尖和两个嘴角。常用于快速粗略对齐。106点模型 / 稠密关键点模型: 包含更多点(如脸颊、额头),能更精细地描述人脸形状,常用于高级特效和3D重建。
三、dlib关键点定位的简单实现
(1)导入必要的库
import cv2 # OpenCV库,用于图像处理和计算机视觉任务
import numpy as np # NumPy库,用于数值计算和数组操作
import dlib # dlib库,提供强大的机器学习工具,特别擅长人脸检测和特征点定位
(2)从指定路径读取图像文件
img = cv2.imread('../data/man.png')
(3)创建dlib的正面人脸检测器对象
# get_frontal_face_detector()使用HOG特征+SVM分类器检测人脸
detector = dlib.get_frontal_face_detector()
(4)使用检测器在图像上检测人脸
# 参数0表示不进行上采样(原始图像大小检测)
# 返回值faces是一个包含所有检测到的人脸区域的矩形对象列表
faces = detector(img, 0)
(5)加载dlib预训练的人脸关键点定位模型
# 该模型可以定位人脸上的68个关键点(shape_predictor_68_face_landmarks.dat)
predictor = dlib.shape_predictor("../data/shape_predictor_68_face_landmarks.dat")
(6)遍历检测到的每个人脸区域
for face in faces:# 使用关键点定位模型预测当前人脸的68个关键点# shape是一个包含68个关键点坐标的对象shape = predictor(img, face)# 将关键点转换为NumPy数组格式,便于处理# 每个关键点表示为[x, y]坐标landmarks = np.array([[p.x, p.y] for p in shape.parts()])# 遍历所有68个关键点及其索引for idx, point in enumerate(landmarks):# 获取当前关键点的坐标pos = [point[0], point[1]]# 在图像上绘制关键点(绿色实心圆)# 参数说明:# img: 目标图像# pos: 圆心坐标# 2: 圆的半径(像素)# (0,255,0): 颜色(BGR格式,绿色)# thickness=-1: 实心圆cv2.circle(img, pos, 2, color=(0, 255, 0), thickness=-1)# 在关键点旁边绘制其索引编号(白色文本)# 参数说明:# img: 目标图像# str(idx): 要绘制的文本(当前点的索引)# pos: 文本左下角位置# cv2.FONT_HERSHEY_SIMPLEX: 字体类型# 0.45: 字体缩放比例# (255,255,255): 文本颜色(白色)# 1: 文本线宽# cv2.LINE_AA: 抗锯齿线型cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX, 0.45, (255, 255, 255), 1, cv2.LINE_AA)
(7)显示处理后的图像(包含人脸关键点标记)
cv2.imshow('img', img)# 等待键盘输入(0表示无限等待)
cv2.waitKey(0)#)销毁所有OpenCV创建的窗口
cv2.destroyAllWindows()
效果展示
同样此处依然可以引入摄像头,实时对人脸进行关键点定位。
四、人脸关键点定位的主要作用和应用
人脸对齐: 这是最基础也是最重要的应用。通过定位关键点,可以将不同姿态、尺度、位置的人脸图像“矫正”到一个标准姿态(通常是正面朝前),极大地提高后续人脸识别、表情识别等任务的准确性和鲁棒性。
人脸识别/验证: 对齐后的人脸特征更容易进行比较和匹配。
表情识别: 关键点位置的变化(如嘴角上扬、眉毛皱起)是分析面部表情的关键线索。
人脸姿态估计: 根据关键点的分布和相对位置,可以估计人脸在三维空间中的朝向(偏航角、俯仰角、翻滚角)。
人脸美化/美颜: 瘦脸、大眼、美妆等滤镜效果需要精确知道眼睛、嘴巴、脸型的位置才能精准施加效果。
虚拟化妆/试妆: 在嘴唇、眼睑等部位叠加虚拟妆容需要精确定位。
增强现实: 在脸上叠加虚拟面具、眼镜、贴纸或特效(如动物鼻子、胡子)需要关键点作为锚点。
人机交互: 通过跟踪关键点的运动(如眨眼、张嘴)实现非接触式控制。
3D人脸重建: 稠密的关键点是构建高精度3D人脸模型的重要输入。
医学分析: 辅助分析某些面部特征或表情(如某些疾病的早期面部表征)。
疲劳驾驶检测: 通过检测眼睛开合程度、打哈欠(嘴部动作)等关键点状态判断驾驶员状态。
动画与游戏: 驱动虚拟角色的面部表情。
五、主要技术方法
传统方法:
主动形状模型: 通过迭代调整一个初始的平均人脸形状模型来拟合图像特征。主动外观模型: 在ASM基础上,不仅考虑形状,还考虑纹理(外观)信息。约束局部模型: 为每个关键点训练独立的局部检测器,并利用形状约束来优化整体结果。
深度学习方法 (主流):
使用卷积神经网络直接学习从输入图像到关键点坐标的映射,通常视为一个回归问题。常见网络架构:各种定制的CNN、Hourglass网络、HRNet等。通常输出一个包含所有关键点坐标的向量,或者一个关键点位置的热力图。训练需要大量标注好关键点位置的人脸图像数据集。
总结
人脸关键点定位是让计算机“看懂”人脸结构的基础技术。它通过精确定位一系列预定义的面部特征点,为众多上层应用(人脸识别、表情分析、美颜滤镜、AR特效等)提供了至关重要的几何结构信息。虽然深度学习方法极大地提升了定位的精度和鲁棒性,但在处理极端姿态、严重遮挡和复杂光照等场景时仍存在挑战,是计算机视觉领域持续研究的重要方向。