OpenCv高阶(十九)——dlib关键点定位

文章目录


一、什么是人脸关键点定位?

人脸关键点定位(Facial Landmark Detection),也称为人脸特征点检测或人脸对齐,是计算机视觉领域的一项基础任务。它的核心目标是在一张包含人脸的图像中,自动地、精确地定位出人脸上一系列预定义的关键解剖点的位置坐标(通常是二维像素坐标)。

二、关键点模型的下载及关键信息的理解

关键点模型下载:

官网下载:http://dlib.net/files/

关键点: 这些点是经过精心选择的,代表了人脸的重要结构和特征。常见的点包括:

复制代码
眉毛的轮廓点(例如,左右眉峰、眉梢)

眼睛的轮廓点(例如,眼角、眼睑)

鼻子的轮廓点(例如,鼻尖、鼻翼)

嘴巴的轮廓点(例如,嘴角、唇峰、唇谷)

脸部的轮廓点(例如,下巴尖、脸颊边缘)

有时还包括瞳孔中心、脸颊点等。

定位: 算法需要输出每个关键点的精确坐标 (x, y),这些坐标对应于它们在输入图像中的像素位置。

预定义模型: 关键点的数量和位置通常是预先定义好的标准模型。最常见的模型有:

复制代码
68点模型: 这是最经典和广泛使用的模型,包括眉毛(每边5点)、眼睛(每边6点)、鼻子(9点)、嘴巴(20点)和脸部轮廓(17点)。

5点模型: 更简单,通常定位两个眼睛中心、鼻尖和两个嘴角。常用于快速粗略对齐。

106点模型 / 稠密关键点模型: 包含更多点(如脸颊、额头),能更精细地描述人脸形状,常用于高级特效和3D重建。

三、dlib关键点定位的简单实现

(1)导入必要的库

python 复制代码
import cv2  # OpenCV库,用于图像处理和计算机视觉任务
import numpy as np  # NumPy库,用于数值计算和数组操作
import dlib  # dlib库,提供强大的机器学习工具,特别擅长人脸检测和特征点定位

(2)从指定路径读取图像文件

python 复制代码
img = cv2.imread('../data/man.png')

(3)创建dlib的正面人脸检测器对象

python 复制代码
# get_frontal_face_detector()使用HOG特征+SVM分类器检测人脸
detector = dlib.get_frontal_face_detector()

(4)使用检测器在图像上检测人脸

python 复制代码
# 参数0表示不进行上采样(原始图像大小检测)
# 返回值faces是一个包含所有检测到的人脸区域的矩形对象列表
faces = detector(img, 0)

(5)加载dlib预训练的人脸关键点定位模型

python 复制代码
# 该模型可以定位人脸上的68个关键点(shape_predictor_68_face_landmarks.dat)
predictor = dlib.shape_predictor("../data/shape_predictor_68_face_landmarks.dat")

(6)遍历检测到的每个人脸区域

python 复制代码
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)显示处理后的图像(包含人脸关键点标记)

python 复制代码
cv2.imshow('img', img)

# 等待键盘输入(0表示无限等待)
cv2.waitKey(0)

#)销毁所有OpenCV创建的窗口
cv2.destroyAllWindows()

效果展示

同样此处依然可以引入摄像头,实时对人脸进行关键点定位。

四、人脸关键点定位的主要作用和应用

人脸对齐: 这是最基础也是最重要的应用。通过定位关键点,可以将不同姿态、尺度、位置的人脸图像"矫正"到一个标准姿态(通常是正面朝前),极大地提高后续人脸识别、表情识别等任务的准确性和鲁棒性。

人脸识别/验证: 对齐后的人脸特征更容易进行比较和匹配。

表情识别: 关键点位置的变化(如嘴角上扬、眉毛皱起)是分析面部表情的关键线索。

人脸姿态估计: 根据关键点的分布和相对位置,可以估计人脸在三维空间中的朝向(偏航角、俯仰角、翻滚角)。

人脸美化/美颜: 瘦脸、大眼、美妆等滤镜效果需要精确知道眼睛、嘴巴、脸型的位置才能精准施加效果。

虚拟化妆/试妆: 在嘴唇、眼睑等部位叠加虚拟妆容需要精确定位。

增强现实: 在脸上叠加虚拟面具、眼镜、贴纸或特效(如动物鼻子、胡子)需要关键点作为锚点。

人机交互: 通过跟踪关键点的运动(如眨眼、张嘴)实现非接触式控制。

3D人脸重建: 稠密的关键点是构建高精度3D人脸模型的重要输入。

医学分析: 辅助分析某些面部特征或表情(如某些疾病的早期面部表征)。

疲劳驾驶检测: 通过检测眼睛开合程度、打哈欠(嘴部动作)等关键点状态判断驾驶员状态。

动画与游戏: 驱动虚拟角色的面部表情。

五、主要技术方法

传统方法:

复制代码
主动形状模型: 通过迭代调整一个初始的平均人脸形状模型来拟合图像特征。

主动外观模型: 在ASM基础上,不仅考虑形状,还考虑纹理(外观)信息。

约束局部模型: 为每个关键点训练独立的局部检测器,并利用形状约束来优化整体结果。

深度学习方法 (主流):

复制代码
使用卷积神经网络直接学习从输入图像到关键点坐标的映射,通常视为一个回归问题。

常见网络架构:各种定制的CNN、Hourglass网络、HRNet等。

通常输出一个包含所有关键点坐标的向量,或者一个关键点位置的热力图。

训练需要大量标注好关键点位置的人脸图像数据集。

总结

人脸关键点定位是让计算机"看懂"人脸结构的基础技术。它通过精确定位一系列预定义的面部特征点,为众多上层应用(人脸识别、表情分析、美颜滤镜、AR特效等)提供了至关重要的几何结构信息。虽然深度学习方法极大地提升了定位的精度和鲁棒性,但在处理极端姿态、严重遮挡和复杂光照等场景时仍存在挑战,是计算机视觉领域持续研究的重要方向。

相关推荐
MoShaoBBC17 分钟前
ChatGPT Plus/Pro 订阅教程(支持支付宝)
人工智能·chatgpt
奔跑吧邓邓子43 分钟前
DeepSeek 赋能文化遗产数字化修复:AI 重构千年文明密码
人工智能·应用·deepseek·文化遗产·数字化修复
kyle~1 小时前
计算机视觉---YOLOv3
人工智能·yolo·计算机视觉
s1ckrain1 小时前
【论文阅读】DanceGRPO: Unleashing GRPO on Visual Generation
论文阅读·人工智能
weixin_472339461 小时前
详解大模型幻觉
人工智能
Trent19851 小时前
影楼精修-AI追色算法解析
图像处理·人工智能·计算机视觉
小辣只因1 小时前
CFAR 恒虚警率简介
人工智能·opencv
m0_634448891 小时前
知识图谱增强的大型语言模型编辑
人工智能·语言模型·知识图谱
Leinwin1 小时前
行业案例 | OPPO借助Azure AI Speech国际服务实现音频文件智能转录
人工智能
m0_677904841 小时前
BERT***
人工智能·深度学习·bert