【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法

这篇具有很好参考价值的文章主要介绍了【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mediapipe介绍

MediaPipe是个基于图形的跨平台框架,用于构建多模式应用的机器学习管道。

MediaPipe可在移动设备,工作站和服务器上跨平台运行,并支持移动GPU加速。使用MediaPipe,可以将应用的机器学习管道构建为模块化组件的图形。

MediaPipe专为机器学习从业者而设计包括研究人员,学生,和软件开发人员,他们实施生产就绪的ML应用程序,发布伴随研究工作的代码,以及构建技术原型。MediaPipe的主要用例上使用推理模型和其他可重用组件对应用机器学习管道进行快速原型设计。MediaPipe还有助于机器学习技术部署到各种不用硬件平台上的演示和应用程序中。
MediaPipe Solutions是基于特定的预训练TensorFlow或TFLite模型的开源预构建示例,他提供了多个Solutions,如下图所示。
【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法
本篇主要对手势识别,人体姿态估计,面部识别的方法进行演示,带领入门者入门。

1. 手势识别

通过MediaPipe,可以获取手部关节的21个点(如下图),以及每个点对应的坐标,那么我们就可以用坐标点来做一下项目的实际应用了, 比如手语的翻译,手势指令之类的。
【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法
首先导入包

import mediapipe as mp
import cv2
import numpy as np
import time

手势检测代码如下,再次我们只是展示了大拇指与食指之间的距离,然后进行了可视化展示。
获取了20个点的坐标,可以实现自己想要手势手语识别。

# 定义一个函数,计算两个点的距离
def findDis(pts1,pts2):
    return ((pts2[0]-pts1[0])**2 + (pts2[1]-pts1[1])**2)**0.5
# 创建手势检测模型
mpHands = mp.solutions.hands  # 检测人的手
hand_mode = mpHands.Hands(max_num_hands=2,min_detection_confidence=0.5,
                        min_tracking_confidence=0.5) 
# static_image_mode:默认为False,如果设置为false, 就是把输入看作一个视频流,在检测到手之后对手加了一个目标跟踪(目标检测+跟踪),
# 无需调用另一次检测,直到失去对任何手的跟踪为止。如果设置为True,则手部检测将在每个输入图像上运行(目标检测),非常适合处理一批静态的,
# 可能不相关的图像。(如果检测的是图片就要设置成True)
# 检测手的模式参数设置,max_num_hands:可以检测到的手的数量最大值,默认是2
# min_detection_confidence: 手部检测的最小置信度值,大于这个数值被认为是成功的检测,
# min_tracking_confidence:目标踪模型的最小置信度值,大于这个数值将被视为已成功跟踪的手部,如果static_image_mode设置为true,则忽略此操作。
mpDraw = mp.solutions.drawing_utils  # 绘图

cap = cv2.VideoCapture(0)

while True:
    success,img = cap.read()
    img = cv2.flip(img,1)
    results = hand_mode.process(img)# 将图片导入模型,获取20个点的坐标进行分析
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            point4_8 = []
            for id,lm in enumerate(handLms.landmark):
                h,w,c = img.shape
                cx,cy = int(lm.x*w),int(lm.y*h)
                cv2.circle(img,(cx,cy),10,(255,0,0),-1)
                if id in [4,8]:# 获取点4,8的坐标
                    point4_8.append([cx,cy])
            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
            # 求点4,8的坐标,进行可视化展示
            cv2.line(img,(point4_8[0][0],point4_8[0][1]),(point4_8[1][0],point4_8[1][1]),(0,0,255),5)
            distance = round(findDis((point4_8[0][0],point4_8[0][1]),(point4_8[1][0],point4_8[1][1])),2)
            cv2.putText(img,"distance:{}".format(distance),(50,50),cv2.FONT_HERSHEY_PLAIN, 3,(0,0,255),3)
            cv2.rectangle(img,(20,250),(20+10,250-int(distance)),(255,0,255),20)
    cv2.imshow("img",img)
    if cv2.waitKey(1)&0xFF == ord("q"):
        break
cap.release()
cv2.destroyAllWindows()

结果如下:
【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法

2. 人体姿势识别

人体姿势识别即是识别人体身上的32个点,本部分通过识别点23,25的位置来识别是否进行抬腿动作。通过这部分,大家可以去制作像深蹲计数、跳绳计数、摆臂等这样的功能。
【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法
代码如下:

mpPose = mp.solutions.pose  # 检测人的手
pose_mode = mpPose.Pose(min_detection_confidence=0.5,min_tracking_confidence=0.5)  # 模式参数设置

mpDraw = mp.solutions.drawing_utils  # 绘图

cap = cv2.VideoCapture(0)
biaoji = 0
i = 0

while True:
    success,img = cap.read()
    img = cv2.flip(img,1)
    results = pose_mode.process(img)
    if results.pose_landmarks:
        point23_25 = []
        for id,lm in enumerate(results.pose_landmarks.landmark):
            h,w,c = img.shape
            cx,cy = int(lm.x*w),int(lm.y*h)
            cv2.circle(img,(cx,cy),10,(255,0,0),-1)
            if id in [23,25]:
                point23_25.append([cx,cy])
        mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)
        cv2.line(img,(point23_25[0][0],point23_25[0][1]),(point23_25[1][0],point23_25[1][1]),(0,0,255),5)
        if point23_25[0][1]>point23_25[1][1]:
            if biaoji == 1:
                i += 1
                biaoji = 0
                cv2.putText(img,"Leg up--{}".format(i),(10,50),cv2.FONT_HERSHEY_PLAIN, 3,(0,0,255),3)
        else:
            biaoji = 1
            cv2.putText(img,"Leg down--{}".format(i),(10,450),cv2.FONT_HERSHEY_PLAIN, 3,(0,0,255),3)
    cv2.imshow("img",img)
    if cv2.waitKey(1)&0xFF == ord("q"):
        break
cap.release()
cv2.destroyAllWindows()

结果可视化展示:
【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法

3. 面部动作识别

mediapip的人脸关键点一共有468个我在图中只看到467最大值,但是实际代码输出的478的关键点,从输出结果索引468-472存储的是人眼左边5个关键点,473-477存储的是人眼右边5个关键点。关键点图在网上还有点难找因此放这里,图片需要放大才能开清楚位置数字。【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法
本文选取左眼【130,240,23,159】四个点和嘴巴【62,292,12,15】四个点,通过计算四个点之间的关系,来判断眼睛和嘴巴是否处于张开状态。这对于疲劳检测具有一定的借鉴意义。代码如下:

def findDis(pts1,pts2):
    return ((pts2[0]-pts1[0])**2 + (pts2[1]-pts1[1])**2)**0.5

cap = cv2.VideoCapture(0)
pTime = 0

id_list = [23, 159, 130, 243, 62, 292, 12, 15]

mpDraw = mp.solutions.drawing_utils
mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh(max_num_faces=2)
drawSpec = mpDraw.DrawingSpec(thickness=1, circle_radius=2)

while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = faceMesh.process(imgRGB)
    if results.multi_face_landmarks:
        for faceLms in results.multi_face_landmarks:
            mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACEMESH_CONTOURS,
                                  drawSpec,drawSpec)
            mp_data = []
            for id,lm in enumerate(faceLms.landmark):
                ih, iw, ic = img.shape
                x,y = int(lm.x*iw), int(lm.y*ih)
                if id in id_list:           #左眼[22, 23, 24, 26, 110, 157, 158, 159, 160, 161, 130, 243]:
                    mp_data.append([x,y])
                    cv2.circle(img,(x,y),2,(255,0,0),-1)
            eye_length_1 = findDis(mp_data[0],mp_data[1])
            eye_length_2 = findDis(mp_data[2],mp_data[3])
            mouth_length_2 = findDis(mp_data[4],mp_data[5])
            mouth_length_1 = findDis(mp_data[6],mp_data[7])
#             print(eye_length_1,eye_length_2)
            if ((mouth_length_1/mouth_length_2)<(98/18)):
                cv2.putText(img,"mouth close",(400,50),cv2.FONT_HERSHEY_PLAIN, 2,(0,0,255),3)
                    
            else:
                cv2.putText(img,"mouth open",(400,50),cv2.FONT_HERSHEY_PLAIN, 2,(0,0,255),3)
            if (eye_length_2/eye_length_1)>18:
                cv2.putText(img,"eye open",(400,100),cv2.FONT_HERSHEY_PLAIN, 2,(0,0,255),3)  
            else:                 
                cv2.putText(img,"eye close",(400,100),cv2.FONT_HERSHEY_PLAIN, 2,(0,0,255),3)  

    cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime
    cv2.putText(img, f'FPS: {int(fps)}', (20, 70), cv2.FONT_HERSHEY_PLAIN,
                3, (255, 0, 0), 3)
    cv2.imshow("Image", img)
    if cv2.waitKey(1)&0xFF == ord("q"):
        cv2.imwrite("6.jpg",img)
        break
cap.release()
cv2.destroyAllWindows()

结果展示:
【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法

总结

无论是手势,人体姿态,还是人脸检测,都是对于点位的检测,通过点位坐标实现一系列功能。对于手势点位检测,我们可以实现手语识别,对于人体姿势点位检测,可以实现人体动作,当下有那些跳绳计数、深蹲计数的App也是这么个原理;对于人脸检测,通过点位坐标检测,可以实现疲劳检测。这里不做多述,有兴趣者可以做各种有趣的事情。文章来源地址https://www.toymoban.com/news/detail-429911.html

到了这里,关于【姿态估计】MediaPipe部分solution(手势,人体姿态,面部动作)的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • WinUI(WASDK)使用MediaPipe检查人体姿态关键点

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

    2024年02月15日
    浏览(35)
  • 人体姿态估计和手部姿态估计任务中神经网络的选择

    一、 人体姿态估计 任务适合使用 卷积神经网络(CNN) 来解决。         人体姿态估计任务的目标是从给定的图像或视频中推断出人体的关节位置和姿势。这是一个具有挑战性的计算机视觉任务,而CNN在处理图像数据方面表现出色。         使用CNN进行人体姿态估计

    2024年02月05日
    浏览(31)
  • 3D人体姿态估计

    3D人体姿态估计是指通过算法对输入的图像或视频进行分析,推断出人体的三维姿态信息。该技术可以应用于许多领域,如虚拟现实、运动分析、人机交互等。 1. 算法原理: 3D人体姿态估计利用深度学习模型作为算法的核心,通过网络学习人体姿态的表示和映射关系。该算法

    2024年02月03日
    浏览(31)
  • CVPR2023新作:3D人体姿态估计

    Title: 3D Human Pose Estimation via Intuitive Physics Affiliation: Max Planck Institute for Intelligent Systems, Tübingen, Germany Authors: Shashank Tripathi, Lea Müller, Chun-Hao P. Huang, Omid Taheri, Michael J. Black, Dimitrios Tzionas Keywords: 3D human pose estimation, physics engine, intuitive-physics terms, pressure heatmap, stable configuration. Su

    2024年02月16日
    浏览(27)
  • Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)

    1、人体姿态估计简介 2、人体姿态估计数据集 3、OpenPose库 4、实现原理 5、实现神经网络 6、实现代码 人体姿态估计(Human Posture Estimation),是通过将图片中已检测到的人体关键点正确的联系起来,从而估计人体姿态。 人体关键点通常对应人体上有一定自由度的关节,比如颈、

    2024年02月04日
    浏览(36)
  • MMPose姿态估计+人体关键点识别效果演示

    1.1 背景 首先姿态估计属于计算机视觉领域的一个基础研究方向。MMPose是基于Pytorch的姿态估计开源算法库,功能全,涵盖的算法多。 1.2 姿态估计的任务分类 维度 :预测的是2D还是3D姿态。 输入格式 :图片 or 视频 姿态的表示形式 :关键点 or 形状等 目标类型 :全身 or 人脸

    2024年01月20日
    浏览(37)
  • 人体姿态估计技术的理解(Human Pose Estimination)

    本人毕设题目是人体姿态估计技术的相关课题,本人按照自己对人体姿态估计技术的学习和理解进行论述,如有不足,请大家指正!!! “姿势估计?……姿势这个词对不同的人可能有不同的含义,但我们不是在讨论阿诺德的经典作品、奥林匹亚或选美表演。那么,姿势估计

    2024年02月11日
    浏览(35)
  • 基于 pytorch-openpose 实现 “多目标” 人体姿态估计

    还记得上次通过 MediaPipe 估计人体姿态关键点驱动 3D 角色模型,虽然节省了动作 K 帧时间,但是网上还有一种似乎更方便的方法。MagicAnimate 就是其一,说是只要提供一张人物图片和一段动作视频 (舞蹈武术等),就可以完成图片人物转视频。 于是我就去官网体验了一下,发现

    2024年01月25日
    浏览(29)
  • YOLOv5姿态估计:HRnet实时检测人体关键点

    前言: Hello大家好,我是Dream。 今天来学习一下 利用YOLOv5进行姿态估计,HRnet与SimDR检测图片、视频以及摄像头中的人体关键点 ,欢迎大家一起前来探讨学习~ 首先需要我们利用Pycharm直接克隆github中的姿态估计原工程文件,如果不知道怎样在本地克隆Pycharm,可以接着往下看,

    2024年01月17日
    浏览(51)
  • 全网首发,人体姿态估计算法在OK3588上部署应用(十三)

    采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 主机环境搭建可以参考上一篇 《OK3588板卡实现人像抠图(十二)》 生成onnx文件 转换成RKNN模型 把PP_TinyPose_256x192_infer文件夹打包放到OK3588板卡上 进入虚拟环境 conda activate ok3588 cd F

    2024年02月10日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包