参考: 在 Python 中使用机器学习进行人体姿势估计姿态检测是计算机视觉领域的一个活跃研究领域。https://mp.weixin.qq.com/s/D_sTpTp_pkLeO2nrcjgpaA

什么是姿态估计?

姿态估计是一种跟踪人或物体运动的计算机视觉技术。这通常通过查找给定对象的关键点位置来执行。基于这些关键点,我们可以比较各种动作和姿势并得出见解。姿态估计在增强现实、动画、游戏和机器人领域得到了积极的应用。

目前有几种模型可以执行姿态估计。下面给出了一些姿势估计的方法:

  1. Open pose

  2. Pose net

  3. Blaze pose

  4. Deep Pose

  5. Dense pose

  6. 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 = 0

for 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 image

results = pose.process(imgRGB)

if results.pose_landmarks:

# mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS) #draw landmarks on image

mpDraw.draw_landmarks(blackie, results.pose_landmarks, mpPose.POSE_CONNECTIONS) # draw landmarks on blackie

landmarks = results.pose_landmarks.landmark

for i,j in zip(points,landmarks):

temp = temp + [j.x, j.y, j.z, j.visibility]

data.loc[count] = temp

count +=1

cv2.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.landmark
        for 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,并相应地比较结果

计算机视觉--Python实现人体姿态估计相关推荐

  1. 用OpenPose进行单个或多个人体姿态估计

    在计算机视觉中,人体姿态估计(关键点检测)是一个很常见的问题,在体育健身.动作采集.3D试衣.舆情监测等领域具有广阔的应用前景,本文要使用的检测方法就是基于OpenPose的人体姿态估计方法. 一.O ...

  2. Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)

    目录 1.人体姿态估计简介 2.人体姿态估计数据集 3.OpenPose库 4.实现原理 5.实现神经网络 6.实现代码 1.人体姿态估计简介 人体姿态估计(Human Posture Estimat ...

  3. 基于深度学习和传统算法的人体姿态估计,技术细节都讲清楚了

    作者 | 站长 pursueYfuture 来源 | AI专栏(ID: pursue-Y-future) 计算机视觉的一大研究热点是人体姿态估计,还有很多问题急需解决,比如遮挡,交互等等.在最近的CV ...

  4. 基于3D深度视觉的人体姿态估计算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|新机器视觉 人体姿态估计是当前计算机视觉领域的热点研究问 ...

  5. “看墙之外” ——遮挡下的人体姿态估计

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在过去的许多科幻电影中,能够看到墙外的东西被认为是超能力.2011 ...

  6. 看完这篇AI算法和笔记,跟面试官扯皮没问题了 | 基于深度学习和传统算法的人体姿态估计

    点击蓝色"AI专栏"关注我哟 重磅干货,第一时间送达 这是站长的第 41 篇原创优质长文 前几天站长写的一篇的文章[基于深度学习算法和传统立体匹配算法的双目立体视觉]大受好评.这次 ...

  7. 人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码

    人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码 目录 人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码 1.人体姿态估计2D Pose方法 2.人体姿 ...

  8. 看完这篇AI算法和笔记,跟面试官扯皮没问题了 | 基于深度学习和传统算法的人体姿态估计...

    点击蓝色"AI专栏"关注我哟 重磅干货,第一时间送达 这是站长的第 41 篇原创优质长文 前几天站长写的一篇的文章[基于深度学习算法和传统立体匹配算法的双目立体视觉]大受好评.这次 ...

  9. 看完这篇AI算法和笔记,让面试官刮目相看没问题了 | 基于深度学习和传统算法的人体姿态估计...

    点击蓝色"AI专栏"关注我哟 重磅干货,第一时间送达 这是站长的第 41 篇原创优质长文 前几天站长写的一篇的文章[基于深度学习算法和传统立体匹配算法的双目立体视觉]大受好评.这次 ...

最新文章

  1. 测中策---我的Web自动化测试思路
  2. linux启动tomcat不停的触发gc,tomcat的rmi触发的full gc的时间过长的优化
  3. python+requests接口自动化测试框架实例详解教程(米兔888)
  4. 基于FPGA的波速形成系统的实现
  5. 大数据量生成工具源代码(Delphi)
  6. 对美的拥有-读阿兰德波顿《旅行的艺术》(zz)
  7. lnmp一键安装包删除添加的域名
  8. 电动汽车告急?特斯拉、蔚来之后 一辆比亚迪新能源车突然自燃...
  9. AIX操作系统版本小知识(转载)
  10. 区块链 hyperledger fabric的系统链码有哪些类型 LSCC ESCC VSCC CSCC是什么
  11. html 响应式 meta,HTML - 移动端 meta viewport
  12. eclipse中tomcat能正常启动,但是访问不了tomcat首页(问题解决)
  13. 使用NFC读卡器ACR122u读取银行卡信息
  14. 黑科技VNET——最好用的Android抓包神器
  15. 【矩阵论】广义特征值问题
  16. 【无标题】CCSRP是网络与信息安全应急人员认证(现更名为CCSC)
  17. unix_timestamp、from_unixtime时间戳函数的使用
  18. JAVAFX控件——TableView数据的导入和插入(数据库)
  19. Suzy找到实习了吗 Day 21 | 二叉树进行中:530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先
  20. 抱抱脸(hugging face)教程-中文翻译-模型概要

热门文章

  1. 2018华为软件精英挑战赛总结
  2. BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)
  3. 归并排序执行次数_肯定能懂的常见算法讲解(1)——排序算法
  4. bugly怎么读_高级功能
  5. [SDOI2010]外星千足虫 题解 高斯消元+bitset简介
  6. 新玩法,CentOS7中LVM通过扩展逻辑卷扩展swap空间
  7. global cache cr request
  8. QualityCenter的备份
  9. (转)Virtual PC 2007虚拟网络设置
  10. 设计模式--组合模式