基于人体姿势估计的舞蹈检测(AI Dance based on Human Pose Estimation)

news2024/11/25 23:01:45

人体姿势骨架以图形格式表示人的方向。本质上,它是一组坐标,可以连接起来描述人的姿势。骨架中的每个坐标都被称为一个部分(或一个关节,或一个关键点)。两个部分之间的有效连接称为一对(或分支)。下面是一个人体姿势骨架样本。
因此,在本文中,我们将研究如何使用深度神经网络模型在OpenCV中执行人体姿态估计。

AI Dance based on Human Pose Estimation

  • 1、数据集
  • 2、模型架构
  • 3、实验和结果
      • 加载网络结构
      • 读取图像和准备输入到网络
      • 做出预测并分析关键点
      • 画出骨架

1、数据集

由于缺乏高质量的数据集,人体姿态估计一直是一个具有挑战性的问题。如今,每一个AI挑战都是需要一个好的数据集来完成的。在过去的几年里,有挑战性的数据集已经发布,这使得研究人员更容易有效地解决这个问题。
以下是常用的数据集:

  • COCO Key-points 数据集
  • MPII 人体姿态估计数据集
  • VGG姿态数据集
  • SURREAL(实际任务下的人体姿态数据集)
  • UP-3D数据集
    本文中我们采用的是COCO数据集进行人体姿态估计任务。

2、模型架构

OpenPose首先检测属于图像中每个人的部分(关键点),然后将部分分配给不同的个体。下图是OpenPose模型的架构。
在这里插入图片描述
该模型将尺寸为w × h的彩色图像作为输入,并生成图像中每个人关键点的二维位置作为输出。检测分三个阶段进行:

  1. 阶段一:VGGNet的前10层用于为输入图像创建特征映射。
  2. 阶段二:使用2分支多级CNN,其中第一个分支预测身体部位位置(例如肘部,膝盖等)的一组2D置信度图(S)。下面给出了关键点的置信度图和亲和度图。第二个分支预测部分亲和度的一组二维向量场(L),它编码了部分之间的关联程度。
  3. 阶段三:通过贪婪推理对置信度图和亲和度图进行解析,生成图像中所有人的二维关键点。
    在这里插入图片描述

3、实验和结果

在本节中,为了简单起见,我们将加载用于理解单个人的人体姿态估计的训练模型。步骤如下:

下载模型的权重: 权重下载

加载网络结构

我们正在使用在Caffe深度学习框架上训练的模型。Caffe模型有2个文件:

  • Prototxt文件,它指定了神经网络的体系结构
  • Caffemodel文件,存储训练模型的权重

读取图像和准备输入到网络

我们使用OpenCV读取的输入帧应该转换为输入blob(如Caffe),以便它可以馈送到网络。这是使用blobFromImage函数完成的,该函数将图像从OpenCV格式转换为Caffe blob格式。首先,我们将像素值归一化为(0,1)。然后我们指定图像的尺寸。接下来,要减去的平均值,即(0,0,0)。

做出预测并分析关键点

一旦将图像传递给模型,就可以进行预测。输出为4D矩阵:

  1. 第一个维度是图像ID(如果向网络传递多个图像)。
  2. 第二个维度表示关键点的索引。该模型生成的置信度图和部件关联图都是连接在一起的。对于COCO模型,它由57部分组成- 18关键点置信度图+ 1背景+ 19*2部分亲和图。
  3. 第三个维度是输出映射的高度。
  4. 第四个维度是输出映射的宽度。

画出骨架

当我们有关键点的时候我们就可以画骨架了只要把它们对连接起来。

# 2.Load the network
# Specify the paths for the 2 files
protoFile = "pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"
weightsFile = "pose/mpi/pose_iter_160000.caffemodel"
# Read the network into Memory
net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)

#3.Read Image and Prepare Input to the Network

# Read image
frame = cv2.imread("single.jpg")

# Specify the input image dimensions
inWidth = 368
inHeight = 368

# Prepare the frame to be fed to the network
inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False)

# Set the prepared object as the input blob of the network
net.setInput(inpBlob)


# 4. Make Predictions and Parse Keypoints
output = net.forward()
H = out.shape[2]
W = out.shape[3]
# Empty list to store the detected keypoints
points = []
for i in range(len()):
    # confidence map of corresponding body's part.
    probMap = output[0, i, :, :]

    # Find global maxima of the probMap.
    minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)

    # Scale the point to fit on the original image
    x = (frameWidth * point[0]) / W
    y = (frameHeight * point[1]) / H

    if prob > threshold :
        cv2.circle(frame, (int(x), int(y)), 15, (0, 255, 255), thickness=-1, lineType=cv.FILLED)
        cv2.putText(frame, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, lineType=cv2.LINE_AA)

        # Add the point to the list if the probability is greater than the threshold
        points.append((int(x), int(y)))
    else :
        points.append(None)

cv2.imshow("Output-Keypoints",frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 5. Draw Skeleton
for pair in POSE_PAIRS:
    partA = pair[0]
    partB = pair[1]

    if points[partA] and points[partB]:
        cv2.line(frameCopy, points[partA], points[partB], (0, 255, 0), 3)
Human Pose Estimation.py hosted with  by GitHub

输出结果如下:
在这里插入图片描述
视频结果如下:Youtobe:Human-Pose-Estimation

上述源码开源,已经上传☞此链接: 代码传送门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql基础3——数据备份与恢复、破解数据库密码

文章目录 一、备份方案二、备份工具mysqldump2.1 备份整张表数据2.2 备份整个库数据 三、全量备份四、差异备份五、数据库密码破解 一、备份方案 备份方案概念特点全量备份对某一个时间点上的所有数据或应用进行完全拷贝。数据恢复快,备份时间长。增量备份在一次全…

抓住重点,谋定而后动

一、我们平常项目有哪几种 有两种常规项目、大项目 1.常规项目 技术团队的重心是把执行做到位,你要更关注过程管控,确保系统交付 2.大项目: 什么是大项目,他有什么特点 大项目时间投入大、人员规模大、系统更大,复…

ResourceBundle读取properties文件

ResourceBundle 常用API 方法签名方法描述public Locale getLocale()获取本地国际化环境ppublic Enumeration getKeys()获取属性文件中所有keypublic final String getString(String key)获取属性文件中key对应的value, 返回值为String, 如果不存在, 则抛出异常public final O…

STM32文档

一、寄存器缩写 二、存储器和总线构架 DMA,全称为:Direct Memory Access,即直接存储器访问 简而言之,DMA就是将一个内存里的数据搬运到另一个内存里,此过程无需CPU直接控制输出 系统架构存储器组织存储器映射&#xf…

解密:Prompt、Token、和completions是什么?

Prompt、Token、和completions 本文是科普向,大家放心阅读 在ChatGPT越来越火的时候,很多开发者都想大展拳脚,但在这之前,我们需要了解一些基础知识,比如你知道什么是token、什么是prompt、什么是Complemention Pro…

vue下基于elementui自定义表单-后端数据设计篇

vue下基于elementui自定义表单-后端篇 自定义表单目前数据表单设计是基于数据量不大的信息单据场景,因为不考虑数据量带来的影响。 数据表有: 1.表单模版表,2.表单实例表,3.表单实例项明细表,4表单审批设计绑定表 以FormJson存…

chatgpt赋能python:关于Python的常见问题及解决方法

关于Python的常见问题及解决方法 在编程领域中,Python已经成为了最流行的编程语言之一。然而,在使用Python编写代码时,难免会遇到一些问题。在本文中,我们将介绍一些常见的Python问题以及如何解决它们。 编码问题 在Python中&a…

idea项目名旁边还有一个项目名——idea笔记

问题描述 我们常常因为想改项目名但是没有改完全从而出现了项目名旁边还有一个项目名 例如: 解决方案: 打开File->project structure 修改前: 修改后:

【数据挖掘】时间序列教程【一】

第一章 说明 对于时间序列的研究,可以追溯到19世纪末和20世纪初。当时,许多学者开始对时间相关的经济和社会现象进行研究,尝试发现其规律和趋势。其中最早的时间序列研究可以追溯到法国经济学家易贝尔(Maurice Allais)…

微服务04 分布式搜索引擎 elasticsearch DSL数据聚合 自动补全 数据同步 集群 Sentinel

微服务03 分布式搜索引擎 elasticsearch ELK kibana RestAPI 索引库 DSL查询 RestClient 黑马旅游 分布式搜索引擎03 1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎&#x…

ℰ悟透Qt—Http网络编程

目录 概述实践理论QNetworkAccessManager进行Http编程的基本步骤代码实战(重点片段) 概述 网络访问 API 建立在一个 QNetworkAccessManager 对象之上,该对象保存了发送请求所需的公共配置和设置。它包含代理和缓存配置,以及与此类问题相关的信号和可用于…

【计算机网络】数据链路层之随机接入-CSMA/CD协议(总线局域网)

1.概念 2.信号碰撞(冲突) 3.解决方案 CSMA/CD 4.争用期(端到端往返时延) 5.最小帧长 6.最大帧长 7.指数退避算法 8.信道利用率 9.帧发送流程 10.帧接受流程 12.题目1 13.题目2 14.题目3 15 小结

无线蓝耳机哪些牌子好?十大真无线耳机排名品牌

随着TWS技术在应用层面的日益完善,真无线蓝牙耳机就越来越受欢迎了,完全摒弃了线材的束缚,做到了真正的无线耳机,这简直是无法忍受耳机线的强迫症的福音,而且现在不仅是佩戴时会格外的舒适,随着无线技术的不…

Redhawk: 为什么STA CHECK中switch cell覆盖率为0?

如题,做dynamic analysis时,不需要switch cell的timing window信息,但是做low power analysis需要做上电分析时switch cell的timing window就是必须的了,本文对switch cell control pin没有timing window (STA CHECK覆盖率为零)的…

ChatGPT:给教育创新带来风险与挑战

在教育界,当前对ChatGPT的关注固然有一部分原因是它所能带来的教育创新,但更多的原因是ChatGPT同时也在冲击着教师的角色定位,推动着人才培养目标的转型,逼迫着学生和教师走出舒适区。况且,ChatGPT还不断诱发教育中的技…

【算法之贪心算法IV】leetcode56. 合并区间

452. 用最少数量的箭引爆气球 力扣题目链接 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴…

cisp 记录(第一,二章节)

第一章信息安全保障 1.信息安全保障基础 1.1信息安全的概念 1.2信息安全属性 1.3信息安全视角 1.4信息安全发展阶段 1.5信息安全保障新领域 2安全保障体系框架 2.1基于时间的PDR和PPDR模型 2.2信息安全保障技术框架 2.3信息系统安全保障评估框架 2.4企业安全架构 1.1信息安全…

mysql基础4——单机多实例部署

文章目录 一、手动部署二、脚本部署 前提了解: 适用于服务器不够,但需要把业务区分开的情况下,可以部署此方式。比如多个业务平台使用的数据库不同,不能只创建一个数据库,这时候就需要部署多实例。实际情况中能避免此方…

BOSHIDA 检测DC电源模块的稳定性能的几个步骤

BOSHIDA 检测DC电源模块的稳定性能的几个步骤 检测DC电源模块的稳定性能需要进行以下几个步骤: 1. 确认测试设备:需要准备一台多功能电源和一台数字万用表,可以根据需要选用不同型号和规格的测试设备。 2.设置电源参数:根据DC电…

DEM获取地形和计算点是否在矩形面积内的算法

1准备一个DEM地形&#xff0c;打开GlobalMap,如下选择 选择否&#xff0c;生成边界 将边界导出为shp文件&#xff0c;打开QGIS&#xff0c;安装get wkt插件&#xff0c;选择对应坐标系&#xff0c;获取wkt,如图 , 附判断点是否在此坐标范围内代码 /// <summary>/// 判断点…