在Python中通过机器学习实现人体姿势估计

目录
  • 什么是姿态估计?
  • 2D 与 3D 姿态估计
  • 为姿态估计准备数据集
  • 创建姿势估计模型
  • 模型结果
  • 结论

姿态检测是计算机视觉领域的一个活跃研究领域。你可以从字面上找到数百篇研究论文和几个试图解决姿势检测问题的模型。

之所以有如此多的机器学习爱好者被姿势估计所吸引,是因为它的应用范围很广,而且实用性很强。

在本文中,我们将介绍一种使用机器学习和 Python 中一些非常有用的库进行姿势检测和估计的应用。

什么是姿态估计?

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

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

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 下载数据集

该数据集包含 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中通过机器学习实现人体姿势估计的文章就介绍到这了,更多相关Python机器学习 人体姿势估计内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 机器学习python实战之手写数字识别

    看了上一篇内容之后,相信对K近邻算法有了一个清晰的认识,今天的内容--手写数字识别是对上一篇内容的延续,这里也是为了自己能更熟练的掌握k-NN算法. 我们有大约2000个训练样本和1000个左右测试样本,训练样本所在的文件夹是trainingDigits,测试样本所在的文件夹是testDigits.文本文件中是0~9的数字,但是是用二值图表示出来的,如图.我们要做的就是使用训练样本训练模型,并用测试样本来检测模型的性能. 首先,我们需要将文本文件中的内容转化为向量,因为图片大小是32*32,所以

  • Python机器学习之手写KNN算法预测城市空气质量

    目录 一.KNN算法简介 二.KNN算法实现思路 三.KNN算法预测城市空气质量 1. 获取数据 2. 生成测试集和训练集 3. 实现KNN算法 一.KNN算法简介 KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类(classification)技术中常用算法之一,其指导思想是"近朱者赤,近墨者黑",即由你的邻居来推断出你的类别. KNN最邻近分类算法的实现原理:为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与

  • Python机器学习之实现模糊照片人脸恢复清晰

    目录 前言 环境安装 验证模型 总结 前言 最近看到一个有意思的机器学习项目--GFPGAN,他可以将模糊的人脸照片恢复清晰.开源项目的Github地址:https://github.com/TencentARC/GFPGAN 我们看一看作者给出的对比图. 最右侧的就是GFPGAN的效果,看一下最左层的输入图片,可以发现GFPGAN将图片恢复的非常清晰.这个效果非常惊艳. 按照以前的惯例,我还是先把这个项目安装使用一下,看看能不能对代码重新封装,变成可以工程化的项目. 环境安装 我们先看一下项目

  • Python机器学习实战之k-近邻算法的实现

    目录 K-近邻算法概述 工作原理 实施KNN算法 示例:手写识别系统 K-近邻算法概述 简单地说, k-近邻算法采用测量不同特征值之间的距离方法进行分类. k-近邻算法 优点:精度高.对异常值不敏感.无数据输入假定. 缺点: 计算复杂度高.空间复杂度高. 适用数据范围: 数值型和标称型. 工作原理 存在一个样本数据集合, 也称作训练样本集, 并且样本集中每个数据都存在标签, 知道样本集中每一数据与所属分类的对应关系. 输入没有标签的新数据后, 将新数据的每个特征与样本集中数据对应的特征进行比较,

  • Python利用机器学习算法实现垃圾邮件的识别

    开发工具 **Python版本:**3.6.4 相关模块: scikit-learn模块: jieba模块: numpy模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 逐步实现 (1)划分数据集 网上用于垃圾邮件识别的数据集大多是英文邮件,所以为了表示诚意,我花了点时间找了一份中文邮件的数据集.数据集划分如下: 训练数据集: 7063封正常邮件(data/normal文件夹下): 7775封垃圾邮件(data/spam文件夹下

  • 在Python中通过机器学习实现人体姿势估计

    目录 什么是姿态估计? 2D 与 3D 姿态估计 为姿态估计准备数据集 创建姿势估计模型 模型结果 结论 姿态检测是计算机视觉领域的一个活跃研究领域.你可以从字面上找到数百篇研究论文和几个试图解决姿势检测问题的模型. 之所以有如此多的机器学习爱好者被姿势估计所吸引,是因为它的应用范围很广,而且实用性很强. 在本文中,我们将介绍一种使用机器学习和 Python 中一些非常有用的库进行姿势检测和估计的应用. 什么是姿态估计? 姿态估计是一种跟踪人或物体运动的计算机视觉技术.这通常通过查找给定对象的关

  • Python中最快的循环姿势实例详解

    目录 各种姿势 比较快的姿势 最后 各种姿势 比如说有一个简单的任务,就是从 1 累加到 1 亿,我们至少可以有 7 种方法来实现,列举如下: 1.while 循环 def while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return s 2.for 循环 def for_loop(n=100_000_000): s = 0 for i in range(n): s += i return s 3.sum ran

  • Python中人脸图像特征提取方法(HOG、Dlib、CNN)简述

    目录 人脸图像特征提取方法 (一)HOG特征提取 (二)Dlib库 (三)卷积神经网络特征提取(CNN) 人脸图像特征提取方法 (一)HOG特征提取 1.HOG简介 Histogram of Oriented Gridients,缩写为HOG,是目前计算机视觉.模式识别领域很常用的一种描述图像局部纹理的特征.它的主要思想是在一副图像中,局部目标的表象和形状能够被梯度或边缘的方向密度分布很好地描述.其本质为:梯度的统计信息,而梯度主要存在于边缘的地方. 2.实现方法 首先将图像分成小的连通区域,这

  • 深入浅出Python中三个图像增强库的使用

    目录 介绍 Imgaug Albumentations SOLT 结论 介绍 本文中探索三个流行的 Python 图像增强库. 图像分类器通常在训练更多的图像时表现得更好.在图像分类模型中,一个常见的问题是,模型不能正确地对图像进行分类,只是因为它没有针对同一图像的不同方向进行训练.这可以通过向模型提供多种可能的图像方向和转换来克服. 然而,在现实中,收集这些不同的数据可能需要更多的时间.资源和专业知识,而且对公司来说成本可能很高.在这种情况下,图像数据增强是一个流行的选择,通过使用一个或多个增

  • 浅谈python中copy和deepcopy中的区别

    在下是个编程爱好者,最近将魔爪伸向了Python编程.....遇到copy和deepcopy感到很困惑,现在针对这两个方法进行区分,一种是浅复制(copy),一种是深度复制(deepcopy). 首先说一下deepcopy,所谓的深度复制,在这里我理解的是完全复制然后变成一个新的对象,复制的对象和被复制的对象没有任何关系,彼此之间无论怎么改变都相互不影响. 然后说一下copy,在这里我分为两类来说,一种是字典数据类型的copy函数,一种是copy包的copy函数. 一.字典数据类型的copy函数

  • python中urllib.unquote乱码的原因与解决方法

    发现问题 Python中的urllib模块用来处理url相关的操作,unquote方法对应javascript中的urldecode方法,它对url进行解码,把类似"%xx"的字符替换成单个字符,例如:"%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92"解码后会转换成"法国红酒",但是使用过程中,如果姿势不对,最终转换出来的字符会是乱码"法国红é-". 笔者在一个真实的Tornado应用中就

  • Python中shape计算矩阵的方法示例

    本文实例讲述了Python中shape计算矩阵的方法.分享给大家供大家参考,具体如下: 看到机器学习算法时,注意到了shape计算矩阵的方法接下来就讲讲我的理解吧 >>> from numpy import * >>> import operator >>> a =mat([[1,2,3],[5,6,9]]) >>> a matrix([[1, 2, 3], [5, 6, 9]]) >>> shape(a) (2,

  • Python语言实现机器学习的K-近邻算法

    写在前面 额...最近开始学习机器学习嘛,网上找到一本关于机器学习的书籍,名字叫做<机器学习实战>.很巧的是,这本书里的算法是用Python语言实现的,刚好之前我学过一些Python基础知识,所以这本书对于我来说,无疑是雪中送炭啊.接下来,我还是给大家讲讲实际的东西吧. 什么是K-近邻算法? 简单的说,K-近邻算法就是采用测量不同特征值之间的距离方法来进行分类.它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系

  • 给你选择Python语言实现机器学习算法的三大理由

    基于以下三个原因,我们选择Python作为实现机器学习算法的编程语言:(1) Python的语法清晰:(2) 易于操作纯文本文件:(3) 使用广泛,存在大量的开发文档. 可执行伪代码 Python具有清晰的语法结构,大家也把它称作可执行伪代码(executable pseudo-code).默认安装的Python开发环境已经附带了很多高级数据类型,如列表.元组.字典.集合.队列等,无需进一步编程就可以使用这些数据类型的操作.使用这些数据类型使得实现抽象的数学概念非常简单.此外,读者还可以使用自己

  • 详解Python中的Numpy、SciPy、MatPlotLib安装与配置

    用Python来编写机器学习方面的代码是相当简单的,因为Python下有很多关于机器学习的库.其中下面三个库numpy,scipy,matplotlib,scikit-learn是常用组合,分别是科学计算包,科学工具集,画图工具包,机器学习工具集. numpy :主要用来做一些科学运算,主要是矩阵的运算.NumPy为Python带来了真正的多维数组功能,并且提供了丰富的函数库处理这些数组.它将常用的数学函数都进行数组化,使得这些数学函数能够直接对数组进行操作,将本来需要在Python级别进行的循

随机推荐