在 Python 中使用机器学习进行人体姿势估计
姿态检测是计算机视觉领域的一个活跃研究领域。你可以从字面上找到数百篇研究论文和几个试图解决姿势检测问题的模型。
之所以有如此多的机器学习爱好者被姿势估计所吸引,是因为它的应用范围很广,而且实用性很强。
在本文中,我们将介绍一种使用机器学习和 Python 中一些非常有用的库进行姿势检测和估计的应用。
什么是姿态估计?
姿态估计是一种跟踪人或物体运动的计算机视觉技术。这通常通过查找给定对象的关键点位置来执行。基于这些关键点,我们可以比较各种动作和姿势并得出见解。姿态估计在增强现实、动画、游戏和机器人领域得到了积极的应用。
目前有几种模型可以执行姿态估计。下面给出了一些姿势估计的方法:
Open pose
Pose net
Blaze pose
Deep Pose
Dense pose
Deep cut
选择任何一种模型而不是另一种可能完全取决于应用程序。此外,运行时间、模型大小和易于实现等因素也可能是选择特定模型的各种原因。因此,最好从一开始就了解你的要求并相应地选择模型。
在本文中,我们将使用 Blaze pose检测人体姿势并提取关键点。该模型可以通过一个非常有用的库轻松实现,即众所周知的Media Pipe。
Media Pipe——Media Pipe是一个开源的跨平台框架,用于构建多模型机器学习管道。它可用于实现人脸检测、多手跟踪、头发分割、对象检测和跟踪等前沿模型。
Blaze Pose Detector ——大部分姿态检测依赖于由 17 个关键点组成的 COCO 拓扑结构,而Blaze姿态检测器预测 33 个人体关键点,包括躯干、手臂、腿部和面部。包含更多关键点对于特定领域姿势估计模型的成功应用是必要的,例如手、脸和脚。每个关键点都使用三个自由度以及可见性分数进行预测。Blaze Pose是亚毫秒模型,可用于实时应用,其精度优于大多数现有模型。该模型有两个版本:Blazepose lite 和 Blazepose full,以提供速度和准确性之间的平衡。
Blaze 姿势提供多种应用程序,包括健身和瑜伽追踪器。这些应用程序可以通过使用一个额外的分类器来实现,比如我们将在本文中构建的分类器。
你可以在此处了解有关Blaze Pose Detector的更多信息: https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html
2D 与 3D 姿态估计
姿势估计可以在 2D 或 3D 中完成。2D 姿态估计通过像素值预测图像中的关键点。而3D姿态估计是指预测关键点的三维空间排列作为其输出。
为姿态估计准备数据集
我们在上一节中了解到,人体姿势的关键点可以用来比较不同的姿势。在本节中,我们将使用Media Pipe库本身来准备数据集。我们将拍摄两个瑜伽姿势的图像,从中提取关键点并将它们存储在一个 CSV 文件中。
你可以通过此链接从 Kaggle 下载数据集:https://www.kaggle.com/niharika41298/yoga-poses-dataset
该数据集包含 5 个瑜伽姿势,但是,在本文中,我只采用了两个姿势。如果需要,你可以使用所有这些,程序将保持不变。
import mediapipe as mp
import cv2
import time
import numpy as np
import pandas as pd
import os
mpPose = mp.solutions.pose
pose = mpPose.Pose()
mpDraw = mp.solutions.drawing_utils # For drawing keypoints
points = mpPose.PoseLandmark # Landmarks
path = "DATASET/TRAIN/plank" # enter dataset path
data = []
for p in points:x = str(p)[13:]data.append(x + "_x")data.append(x + "_y")data.append(x + "_z")data.append(x + "_vis")
data = pd.DataFrame(columns = data) # Empty dataset
在上面的代码片段中,我们首先导入了有助于创建数据集的必要库。然后在接下来的四行中,我们将导入提取关键点所需的模块及其绘制工具。
接下来,我们创建一个空的 Pandas 数据框并输入列。这里的列包括由Blaze姿态检测器检测到的 33 个关键点。每个关键点包含四个属性,即关键点的 x 和 y 坐标(从 0 到 1 归一化),z 坐标表示以臀部为原点且与 x 的比例相同的地标深度,最后是可见度分数。可见性分数表示地标在图像中可见或不可见的概率。
count = 0for img in os.listdir(path):temp = []img = cv2.imread(path + "/" + img)imageWidth, imageHeight = img.shape[:2]imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)blackie = np.zeros(img.shape) # Blank imageresults = pose.process(imgRGB)if results.pose_landmarks:# mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS) #draw landmarks on imagempDraw.draw_landmarks(blackie, results.pose_landmarks, mpPose.POSE_CONNECTIONS) # draw landmarks on blackielandmarks = results.pose_landmarks.landmarkfor i,j in zip(points,landmarks):temp = temp + [j.x, j.y, j.z, j.visibility]data.loc[count] = tempcount +=1cv2.imshow("Image", img)cv2.imshow("blackie",blackie)cv2.waitKey(100)data.to_csv("dataset3.csv") # save the data as a csv file
在上面的代码中,我们单独遍历姿势图像,使用Blaze姿势模型提取关键点并将它们存储在临时数组“temp”中。
迭代完成后,我们将这个临时数组作为新记录添加到我们的数据集中。你还可以使用Media Pipe本身中的绘图实用程序来查看这些地标。
在上面的代码中,我在图像以及空白图像“blackie”上绘制了这些地标,以仅关注Blaze姿势模型的结果。空白图像“blackie”的形状与给定图像的形状相同。
应该注意的一件事是,Blaze姿态模型采用 RGB 图像而不是 BGR(由 OpenCV 读取)。
获得所有图像的关键点后,我们必须添加一个目标值,作为机器学习模型的标签。你可以将第一个姿势的目标值设为 0,将另一个设为 1。之后,我们可以将这些数据保存到 CSV 文件中,我们将在后续步骤中使用该文件创建机器学习模型。
你可以从上图中观察数据集的外观。
创建姿势估计模型
现在我们已经创建了我们的数据集,我们只需要选择一种机器学习算法来对姿势进行分类。在这一步中,我们将拍摄一张图像,运行 blaze 姿势模型(我们之前用于创建数据集)以获取该图像中人物的关键点,然后在该测试用例上运行我们的模型。
该模型有望以高置信度给出正确的结果。在本文中,我将使用 sklearn 库中的 SVC(支持向量分类器)来执行分类任务。
from sklearn.svm import SVC
data = pd.read_csv("dataset3.csv")
X,Y = data.iloc[:,:132],data['target']
model = SVC(kernel = 'poly')
model.fit(X,Y)
mpPose = mp.solutions.pose
pose = mpPose.Pose()
mpDraw = mp.solutions.drawing_utils
path = "enter image path"
img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = pose.process(imgRGB)
if results.pose_landmarks:landmarks = results.pose_landmarks.landmarkfor j in landmarks:temp = temp + [j.x, j.y, j.z, j.visibility]y = model.predict([temp])if y == 0:asan = "plank"else:asan = "goddess"print(asan)cv2.putText(img, asan, (50,50), cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,0),3)cv2.imshow("image",img)
在上面的代码行中,我们首先从 sklearn 库中导入了 SVC(支持向量分类器)。我们已经用目标变量作为 Y 标签训练了我们之前在 SVC 上构建的数据集。
然后我们读取输入图像并提取关键点,就像我们在创建数据集时所做的那样。
最后,我们输入临时变量并使用模型进行预测。现在可以使用简单的 if-else 条件检测姿势。
模型结果
从上面的图像中,你可以观察到模型已经正确地对姿势进行了分类。你还可以在右侧看到Blaze姿势模型检测到的姿势。
在第一张图片中,如果你仔细观察,一些关键点是不可见的,但姿势分类是正确的。由于Blaze姿态模型给出的关键点属性的可见性,这是可能的。
结论
姿势检测是机器学习领域的一个活跃研究领域,并提供了多种实际应用。在本文中,我们尝试开发一个这样的应用程序,并通过姿势检测来解决问题。
我们了解了姿势检测和几个可用于姿势检测的模型。出于我们的目的选择了 blaze 姿势模型,并了解了它相对于其他模型的优缺点。
最后,我们使用 sklearn 库中的支持向量分类器构建了一个分类器来对瑜伽姿势进行分类。为此,我们还构建了自己的数据集,可以使用更多图像进一步扩展。
你也可以尝试其他机器学习算法而不是 SVM,并相应地比较结果。
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓
在 Python 中使用机器学习进行人体姿势估计相关推荐
- 有了TensorFlow.js,浏览器中也可以实时人体姿势估计
翻译文章,内容有删减.原文地址:https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-te ...
- 无需3D运动数据训练,最新人体姿势估计方法达到SOTA | CVPR 2020
作者 | Muhammed Kocabas 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 人体的运动对于理解人的行为是非常重要的.尽管目前已经在单图像3D姿势和动作估计方面取得 ...
- CVPR2020|无需3D运动数据训练,最新SOTA人体姿势估计方法
点击我爱计算机视觉标星,更快获取CVML新技术 作者 | Muhammed Kocabas 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 人体的运动对于理解人的行为是非常重要的 ...
- python绘制图形沙漏_pytorch-pose一个用于二维人体姿势估计的PyTorch工具包。 - pytorch中文网...
pytorch-pose PyTorch-Pose是2D单人姿态估计的一般流水线的PyTorch实现.其目的是为最流行的人体姿态数据库(如MPII人体姿态,LSP和FLIC)提供训练/推理/评估的接口 ...
- 如何在 Python 中开始机器学习?(小白必看)
其实学习机器学习的最好方法是设计和完成小项目. Python 是一种流行且功能强大的解释型语言.与 R 不同,Python 是一种完整的语言和平台,可用于研究和开发以及开发生产系统. 还有很多模块和库 ...
- 从DeepNet到HRNet,这有一份深度学习“人体姿势估计”全指南
大数据文摘出品 来源:blog.nanonets 作者:栾红叶.熊琰.周家乐.钱天培 从DeepNet到HRNet,这有一份深度学习"人体姿势估计"全指南 几十年来,人体姿态估计( ...
- 利用深度学习进行人体姿势估计--概述
本文转载于原文链接 什么是姿势估计? 人体姿势估计和跟踪是一项计算机视觉任务,包括检测.关联和跟踪语义关键点.语义关键点的例子是 "右肩"."左膝 "或 &qu ...
- 论文笔记--3D Human Pose Estimation with Spatial and Temporal Transformers(用空间和时间变换器进行三维人体姿势估计)
用空间和时间变换器进行三维人体姿势估计 摘要 Transformer架构已经成为自然语言处理中的首选模型,现在正被引入计算机视觉任务中,如图像分类.物体检测和语义分割.然而,在人类姿势估计领域,卷 ...
- 基于 OpenCV 和 OpenPose 的棒球挥杆人体姿势估计
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 介绍 人体姿态估计是一个非常有趣的领域,如果我们能够将诸如棒球摆动 ...
- 基于人体姿势估计的舞蹈检测(AI Dance based on Human Pose Estimation)
人体姿势骨架以图形格式表示人的方向.本质上,它是一组坐标,可以连接起来描述人的姿势.骨架中的每个坐标都被称为一个部分(或一个关节,或一个关键点).两个部分之间的有效连接称为一对(或分支).下面是一个人 ...
最新文章
- 用jquery ajax做的select菜单,选中的效果
- Altium Designer-Net has no driving source解决办法
- Abbreviation
- 爱立信物联网加速器让各行业玩转数据
- cf1512F. Education
- 微软双机双柜方案讨论
- 修改Linux窗口大小
- 使用DOM4J解析大容量XML文件
- Slate轨道工具使用(一)—Track,Clip
- 2022.10月面具输入LSPosed框架以及隐藏root
- 什么是serialVersionUID?serialVersionUID详解
- python-普通pdf的添加水印
- PySpark基础入门(3):RDD持久化
- android wifi 框架图,android wifi框架
- 前端基础 HTML 第九章 使用框架结构 ----暑假学习第五天
- yara 源码学习(二) 规则编译部分
- 如何使用Sass Mixins
- 理解查全率(precision)与查准率(recall)
- 三方线上美食城|基于Springboot的三方线上美食商城系统
- 怎么把Excel转换成Word文档?一分钟就能教会你
热门文章
- nat64 dns64 linux 内核支持,NAT64与DNS64
- 服务器运维 考什么证书,腾讯云服务器运维高级工程师认证(TCP)证书有效期、考试内容、费用...
- (17)全民小视频引流脚本模块化开发11-关注用户的粉丝By飞云脚本学院
- MySQL视图创建与管理(实验五)
- 网站CDN加速是什么? 看完这篇你就明白了!
- 一种适用于FDD+TDD基站天线阵列的多天线共存方式
- 计算机硕士学位论文要求,2020年计算机硕士论文格式有哪些要求?
- win10远程桌面连接
- 可能是求质数最高效的算法
- 01_基于蒲公英R300A的异地组网PLC调试实现