Mediapipe人脸关键点检测

这篇具有很好参考价值的文章主要介绍了Mediapipe人脸关键点检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mediapipe介绍

MediaPipe是由google制作的开源的、跨平台的机器学习框架,可以将一些模型部署到不同的平台和设备上使用的同时,也能保住检测速度。

Mediapipe人脸关键点检测
从图中可以发现,能在Python上实现的功能包括人脸检测(Face Detection)、人脸关键点(Face Mesh),手部关键点(Hands)等。利用C++能实现更丰富的功能,我们可以后续探索。

环境部署

  1. Python环境:建议3.6版本以上
  2. Python主要模块:opencv-contrib-python;numpy; pandas; matplotlib
  3. MediaPipe模块:mediapipe

安装方法:使用以下pip命令安装

pip install mediapipe

测试环境:导入如下库,如果不报错说明导入成功

import cv2
import mediapipe as mp
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt

人脸关键点检测

模型调用与配置

# 调用关键点检测模型
mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(static_image_mode=True,  
                                  max_num_faces=3,         
                                  refine_landmarks=True,  
                                  min_detection_confidence=0.5, 
                                  min_tracking_confidence=0.5) 

FaceMesh参数说明

  • static_image_mode=True, 检测静态图片设置为False,检测视频设置为True,默认为False
  • max_num_faces=3, 能检测的最大人脸数,默认为1
  • refine_landmarks=True, 定位嘴唇、眼睛、瞳孔的关键点,设置为True,否则设置为False
  • min_detection_confidence=0.5, 人脸检测的置信度
  • min_tracking_confidence=0.5) 人脸追踪的置信度(检测图像时可以忽略)

输出结果解析

# 读取图像
img1 = cv2.imread("./images/img1.jpg")
# 将BGR图像转为RGB图像
_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
# 使用模型获取关键点
results = face_mesh.process(_img1)
  • 利用opencv读取图像的颜色通道为BGR,需要利用cv2.cvtColor方法将颜色通道转换为RGB
  • 使用FaceMesh模型的process方法检测图像中的关键点
# 输出关键点
landmarks = results.multi_face_landmarks
print(landmarks)
# 提取关键点坐标
print(landmarks[0].landmark)

landmarks中以类似列表的结构(可迭代对象)存储了关键点,结构中每个“landmark”关键字段存储了关键点的坐标,包含x,y,z,xy分别通过图像宽度和高度归一化为[0.0,1.0].z表示关键点深度,以头部中心的深度为原点,该值越小,关键点距离相机越近.

# 获取每个人脸的关键点的数量
print(len(landmarks[0].landmark))

当模型配置refine_landmarks=True,获得478个人脸关键点;当模型配置refine_landmarks=False,获得468个人脸关键点,缺少瞳孔的关键点。
关键点位置可以查看该图像:https://github.com/google/mediapipe/blob/master/mediapipe/modules/face_geometry/data/canonical_face_model_uv_visualization.png

绘制面网

利用mediapipe提供的绘制模块直接绘制

# mediapipe提供的绘制模块
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
# 利用mp_drawing绘制面网
annotated_image = img1.copy()
# 循环获取每一个人脸的关键点
for face_landmarks in results.multi_face_landmarks:
    mp_drawing.draw_landmarks(image=annotated_image, landmark_list=face_landmarks,
                              # 选取关键点
                              connections=mp_face_mesh.FACEMESH_TESSELATION,
                              # 绘制关键点,若为None,表示不绘制关键点,也可以指定点的颜色、粗细、半径
                              landmark_drawing_spec=mp_drawing.DrawingSpec(color=(0,0,255),thickness=2,circle_radius=2),
                              # 绘制连接线的格式
                              connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())
    
# # 利用opencv显示图像,在jupyter中显示效果一般
# cv2.imshow("image",annotated_image)
# if cv2.waitKey(0) == ord("q"):
#     cv2.destroyAllWindows()

# 利用matplotlib展示
plt.figure(figsize=(50, 20))
plt.imshow(annotated_image[:, :, ::-1])

下图中关键点包括瞳孔关键点
Mediapipe人脸关键点检测使用mp_face_mesh.FACEMESH_TESSELATION可以选取所需关键点位置,将这些点进行连接,绘制面网。 使用 mp_drawing_styles.get_default_face_mesh_tesselation_style()可以设置连接线的格式
使用mp_face_mesh.FACEMESH_CONTOURS可以选取轮廓点,将其连接成线,使用mp_drawing_styles.get_default_face_mesh_contours_style()可以设置连接线的格式

视频演示

调用摄像头画面进行人脸关键点检测

import time
# 获取摄像头,0/1为摄像头编号
cap = cv2.VideoCapture(0)
# 循环读取视频每一帧
while True:
    success,frame = cap.read()
    if success:
        start = time.time()
        results = face_mesh.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
        # 复制图像
        annotated_image = frame.copy()
        # 解封此行代码,可以将关键点绘制在黑色图像上,该代码能生成一张黑色图像
        # annotated_image = np.zeros(annotated_image.shape, dtype='uint8')
        # 如果检测到关键点
        if results.multi_face_landmarks:
            for face_landmarks in results.multi_face_landmarks:
                # 利用mp_drawing绘制图像
                mp_drawing.draw_landmarks(image=annotated_image, landmark_list=face_landmarks,
                                          connections=mp_face_mesh.FACEMESH_TESSELATION,
                                          landmark_drawing_spec=None,
                                          connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style())

                mp_drawing.draw_landmarks(image=annotated_image, landmark_list=face_landmarks,
                                          connections=mp_face_mesh.FACEMESH_IRISES,
                                          landmark_drawing_spec=None,
                                          connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_iris_connections_style())

                mp_drawing.draw_landmarks(image=annotated_image, landmark_list=face_landmarks,
                                          connections=mp_face_mesh.FACEMESH_CONTOURS,
                                          landmark_drawing_spec=None,
                                          connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_contours_style())
            end = time.time()
            fps = 1/(end-start)
        
            annotated_image = cv2.putText(annotated_image,str(int(fps)),(30,50),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,255),1)
        # 如果没有检测到关键点,在黑色背景上显示“NO FACE TO DETECT”
        else:
            annotated_image = np.zeros(annotated_image.shape, dtype='uint8')
            annotated_image = cv2.putText(annotated_image,str("NO FACE TO DETECT"),(300,400),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,255),1)
        
        cv2.imshow("image",annotated_image)
        if cv2.waitKey(30) == ord("q"):
            cv2.destroyAllWindows()
            break
# 释放摄像头
cap.release()

np.zeros(shape,dtype)可以创建一个给定维度(shape)的全零数组

  • shape:创建的新数组的(维度),如(4,7,3),表示创建一个三维数组,第一个维度有4个元素,第二个维度有7个元素,第三个维度有3个元素.annotated_image.shape可以获取图像的维度(height,width,channel)
  • dtype:创建新数组的数据类型,当dtype =unit8时为图像数据类型,其取值范围在0~255.

检测效果

面部关键点检测

可通过下方链接下载程序
源程序下载文章来源地址https://www.toymoban.com/news/detail-431974.html

到了这里,关于Mediapipe人脸关键点检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV中的人脸关键点检测和人脸特征提取如何实现?

    在OpenCV中,人脸关键点检测和人脸特征提取是常见的计算机视觉任务。OpenCV提供了一些用于实现这些任务的函数和算法。下面将介绍如何在OpenCV中实现人脸关键点检测和人脸特征提取。 1. 人脸关键点检测 人脸关键点检测是指识别和定位人脸上的关键点,如眼睛、鼻子、嘴巴

    2024年02月03日
    浏览(42)
  • OpenCV 入门教程:人脸检测和关键点定位

    人脸检测和关键点定位是计算机视觉中的重要任务,用于在图像或视频中自动检测人脸并定位人脸关键点,如眼睛、鼻子、嘴巴等。这项技术在人脸识别、表情分析、姿态估计等领

    2024年02月15日
    浏览(26)
  • 人脸与关键点检测:YOLO5Face实战

    Github:https://github.com/deepcam-cn/yolov5-face 导读:居然花了一天时间把该项目复现,主要是折腾在数据集格式上,作者居然在train2yolo中居然把Widerface训练集(12000+张图)重新一张一张保存,不这么还出bug,原因是无法读到数据缓存;在评估阶段,val2yolo也没用上。搬运工,一个字,

    2024年02月06日
    浏览(34)
  • pytorch实现AI小设计-1:Resnet50人脸68关键点检测

            本项目是AI入门的应用项目,后续可以补充内容完善作为满足个人需要。通过构建自己的人脸数据集,此项目训练集为4580张图片,测试集为2308张图片,使用resnet50网络进行训练,最后进行效果展示。本项目也提供了量化内容,便于在硬件上部署。         研究A

    2024年01月18日
    浏览(33)
  • 基于mediapipe的人体33个关键点坐标(BlazePose)

    BlazePose是一种轻量化的卷积神级网络架构,适用于单人的关键点检测,在人体身上标注33个关键点,在单个中层手机CPU上的执行速度要比OpenPose在20核桌面CPU[5]上快25-75倍。 33个关键点如下图所示 导入库 导入模型 读入图像 关键点检测结果 此时会输出关键点检测结果,如下图所

    2024年02月12日
    浏览(25)
  • WinUI(WASDK)使用MediaPipe检查人体姿态关键点

    之前有用这个MediaPipe.NET .NET包装库搞了手势识别,丰富了稚晖君的ElectronBot机器人的第三方上位机软件的功能,MediaPipe作为谷歌开源的机器视觉库,功能很丰富了,于是就开始整活了,来体验了一把人体姿态关键点检测。 这个框架是微软最新的应用开发框架,我是用来开发程

    2024年02月15日
    浏览(34)
  • 《数字图像处理》dlib人脸检测获取关键点,delaunay三角划分,实现人脸的几何变换warpping,接着实现两幅人脸图像之间的渐变合成morphing

           这学期在上《数字图像处理》这门课程,老师布置了几个大作业,自己和同学一起讨论完成后,感觉还挺有意思的,就想着把这个作业整理一下 :   目录 1.实验任务和要求 2.实验原理 3.实验代码 3.1利用人脸特征点检测工具dlib获取人脸关键点 目录 1.实验任务和要求

    2024年02月03日
    浏览(28)
  • 2D人脸关键点转3D人脸关键点的映射~头部姿态笔记

    对通过相机参数计算图像上的二维坐标到三维坐标的映射进行简单探讨。         学习的话直接看他们的就好,我仅是拾人牙慧,拿GPT写给自己看的,图也是直接搬运的别人画的,以下链接有很完善的理论研究和代码提供。 https://medium.com/@susanne.thierfelder/head-pose-estimation

    2024年02月04日
    浏览(31)
  • opencv-人脸关键点定位

    2024年02月12日
    浏览(35)
  • 人脸68、29、21、14、5关键点标注序号及对应关系

    最近需要用到solvePnP算法[1]通过人脸关键点求解人脸姿态,涉及到的数据集中关键点标注数量不统一,但网上使用solvePnP算法时人脸模型比较好找到的是68个关键点,因此需要找到模型的68个关键点中与其他几种数量关键点的对应关系。 目录 98关键点标注序号 68关键点标注序号

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包