随着健身行业的发展,越来越多的智能应用涌现,用于帮助健身者更好地记录和分析运动情况。特别是在体能训练中,俯卧撑和引体向上是两个非常常见的动作,它们通常用来锻炼上半身力量和耐力。为了使训练更加科学和高效,实时监控和自动计数这些动作变得尤为重要。

在这篇博客中,我们将介绍如何基于 YOLO-Pose 模型来监控俯卧撑和引体向上的执行情况,并结合计算机视觉技术实现动作计数。我们将探索 YOLO-Pose 如何与人体姿势估计结合,通过检测人体关键点来判断动作的完成度,并最终实现运动计数功能。

1. YOLO-Pose 模型概述

YOLO(You Only Look Once)是一种高效的目标检测算法,以其在实时检测中的高性能而广受欢迎。随着 YOLO 系列的更新,尤其是 YOLOv8、YOLOv9、YOLOv10 和 YOLOv12,YOLO 已经不再仅仅局限于传统的目标检测任务,它还扩展到了包括人体姿势估计、实例分割、语义分割等任务。在姿势估计方面,YOLO-Pose 正是结合 YOLO 的强大检测能力,通过提取人体的关键点坐标来分析人体的运动状态。

YOLO-Pose 模型基于 YOLO 系列架构,专注于人体姿势估计,能够在视频流中实时检测人体的关键点并分析其运动。通过检测这些关键点的相对位置,我们可以判断出用户是否正在进行俯卧撑、引体向上等动作,并基于这些信息进行自动计数。

2. YOLO-Pose 在运动监控中的应用

在运动监控中,尤其是像俯卧撑和引体向上这样依赖肢体动作的训练项目中,我们通常需要对以下几个关节的姿势进行跟踪:

  • 俯卧撑监控:我们需要监控肩膀、肘部和腕部的相对位置,尤其是肘部的弯曲角度。

  • 引体向上监控:我们需要跟踪肩膀、肘部和手腕的运动,特别是手臂是否完全伸直或完全弯曲。

YOLO-Pose 提供的关节坐标(如肩膀、肘部、膝盖等)能够帮助我们精确地计算出这些动作的完成度。通过计算关键点之间的角度变化,我们可以准确判断是否完成了动作的一个循环。

2.1 俯卧撑监控

俯卧撑是一项主要锻炼上肢和胸部肌肉的动作,其标准动作包括双手撑地并弯曲肘部,直到胸部接近地面,然后恢复到初始姿势。在这种运动中,肘部角度的变化是判断动作是否完成的关键。

  • 当肘部角度小于某个阈值时,表示身体处于下压状态;

  • 当肘部角度大于阈值时,表示动作恢复到起始位置。

2.2 引体向上监控

引体向上是一项主要锻炼背部和上肢力量的运动。其标准动作是通过双手抓住横杆,弯曲肘部将身体拉起,直到下巴超过横杆位置,然后恢复到起始姿势。引体向上的关键监控点是肘部和肩膀。

  • 当肘部接近伸直时,表示动作结束;

  • 当肘部弯曲并拉升身体时,表示进入上升状态。

3. AIGym 类的实现:基于 YOLO-Pose 的实时运动监控

AIGym 类的实现中,我们使用了 YOLO-Pose 来处理实时视频流中的姿势估计。该类能够实时监控并统计不同类型的运动(如俯卧撑、引体向上等)。下面是 AIGym 类的核心代码,它实现了基于 YOLO-Pose 模型的运动监控和计数功能。

3.1 AIGym 类初始化
from ultralytics.utils.checks import check_imshow
from ultralytics.utils.plotting import Annotatorclass AIGym:"""A class to manage the gym steps of people in a real-time video stream based on their poses."""def __init__(self,kpts_to_check=None,line_thickness=2,pose_up_angle=145.0,pose_down_angle=90.0,pose_type="pullup",):"""Initializes the AIGym class with the specified parameters.Args:kpts_to_check (list, optional): Indices of keypoints to check. Defaults to [6, 8, 10].line_thickness (int, optional): Thickness of the lines drawn. Defaults to 2.pose_up_angle (float, optional): Angle threshold for the 'up' pose. Defaults to 145.0.pose_down_angle (float, optional): Angle threshold for the 'down' pose. Defaults to 90.0.pose_type (str, optional): Type of pose to detect ('pullup', 'pushup', 'abworkout', 'squat'). Defaults to "pullup"."""self.kpts_to_check = kpts_to_check or [6, 8, 10]  # Default keypointsself.tf = line_thicknessself.poseup_angle = pose_up_angleself.posedown_angle = pose_down_angleself.pose_type = pose_type# Initialize attributesself.im0 = Noneself.keypoints = Noneself.annotator = Noneself.env_check = check_imshow(warn=True)self.count = []self.angle = []self.stage = []

在初始化方法中,我们定义了以下参数:

  • kpts_to_check:关键点索引,指示需要监测的关节位置(例如,肩膀、肘部、腕部等)。

  • pose_up_anglepose_down_angle:这两个角度阈值用于判断动作的上下阶段,适用于不同的运动类型(如俯卧撑、引体向上)。

  • pose_type:指定需要监测的运动类型,如“pullup”(引体向上)、“pushup”(俯卧撑)等。

3.2 obj_exe 方法:实时处理视频帧
def obj_exe(self, im0, results):"""Function used to count the gym steps.Args:im0 (ndarray): Current frame from the video stream.results (list): Pose estimation data."""self.im0 = im0if not len(results[0]):return self.im0# Initialize annotator objectself.annotator = Annotator(self.im0, line_width=self.tf)# If there are more humans in the current frame, extend the count, angle, and stage listsif len(results[0]) > len(self.count):new_human = len(results[0]) - len(self.count)self.count.extend([0] * new_human)self.angle.extend([0] * new_human)self.stage.extend(["-"] * new_human)# Get keypoints from the pose estimation resultself.keypoints = results[0].keypoints.data# Iterate over each detected personfor ind, k in enumerate(self.keypoints):if self.pose_type in {"pushup", "pullup", "abworkout", "squat"}:# Calculate the angle between keypointsself.angle[ind] = self.annotator.estimate_pose_angle(k[int(self.kpts_to_check[0])].cpu(),k[int(self.kpts_to_check[1])].cpu(),k[int(self.kpts_to_check[2])].cpu(),)# Draw keypoints (no need to pass 'shape' argument)self.im0 = self.annotator.draw_specific_points(k, self.kpts_to_check, radius=10)# Determine the exercise stage and countif self.pose_type in {"abworkout", "pullup"}:if self.angle[ind] > self.poseup_angle:self.stage[ind] = "down"if self.angle[ind] < self.posedown_angle and self.stage[ind] == "down":self.stage[ind] = "up"self.count[ind] += 1elif self.pose_type in {"pushup", "squat"}:if self.angle[ind] > self.poseup_angle:self.stage[ind] = "up"if self.angle[ind] < self.posedown_angle and self.stage[ind] == "up":self.stage[ind] = "down"self.count[ind] += 1# Annotate the angle, count, and stage on the imageself.annotator.plot_angle_and_count_and_stage(angle_text=self.angle[ind],count_text=self.count[ind],stage_text=self.stage[ind],center_kpt=k[int(self.kpts_to_check[1])],)# Draw keypoint linesself.annotator.kpts(k, radius=1, kpt_line=True)return self.im0

obj_exe 方法中,YOLO-Pose 模型的输出结果被传递给 AIGym 类,我们利用关键点的角度变化来判断用户的动作是否完成,并更新计数。根据运动类型(如“俯卧撑”或“引体向上”),代码会判断当前动作是否已经完成一个周期(上升和下压)。

4. 总结与未来展望

基于 YOLO-Pose 模型的实时运动监控系统能够为用户提供精准的动作计数和实时反馈。无论是在家庭健身、健身房还是专业训练中,这样的智能系统都可以帮助用户更好地掌握自己的训练效果。通过跟踪关键点和计算角度,YOLO-Pose 可以实时检测各种运动姿势,帮助用户提高运动质量,防止错误动作。

随着 YOLO-Pose 技术的不断进步和计算机视觉领域的创新,未来这些技术将在更广泛的应用场景中发挥更大的作用,包括康复训练、运动科学研究等领域。通过不断优化算法,增加更多的运动姿势监测功能,未来的智能健身系统将更加精准、智能和高效。

对 PiscTrace or PiscCode感兴趣?更多精彩内容请移步官网看看~🔗 PiscTrace

引体向上效果在这里使用 YOLO 姿态模型进行动作判定和监测:如何在 PiscTrace 中实现引体向上检测_yolo 姿态监控-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【unity】webCanvas.enabled = false;和webCanvas.gameObject.SetActive(false);的优缺点比较

在 Unity 中&#xff0c;webCanvas.gameObject.SetActive(false) 和 webCanvas.enabled false 是两种不同的隐藏 UI 的方式&#xff0c;它们的核心区别在于作用范围和对组件状态的影响。理解这些差异能帮助你避免初始化失败、性能问题和逻辑错误。 1核心区别 gameObject.SetAc…

深入探索 pnpm:高效磁盘利用与灵活的包管理解决方案

引言 在现代 JavaScript 开发中&#xff0c;依赖管理效率直接影响开发体验。传统工具如 npm 和 yarn 在大型项目中常面临磁盘冗余和性能瓶颈。pnpm&#xff08;Performant npm&#xff09;通过创新的硬链接和符号链接机制&#xff0c;解决了这些痛点。本文将深入解析 pnpm 的核…

Hive MetaStore的实现和优化

在大数据领域&#xff0c;数据管理与存储至关重要&#xff0c;Hive MetaStore&#xff08;HMS&#xff09;作为 Hive 数据仓库的核心组件&#xff0c;承担着元数据管理的关键职责。随着数据规模不断膨胀&#xff0c;其性能与稳定性面临挑战。本文将深入剖析 HMS 的实现机制&…

一文读懂动态规划:多种经典问题和思路

一、动态规划算法的思想与核心概念框架 1. 动态规划的基本思想 动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种通过将复杂问题分解为重叠子问题&#xff0c;并利用子问题的解来高效解决原问题的方法。其核心思想是避免重复计算&#xff0c;通过存储中间结果&a…

阿幸课堂随机点名

代码功能 这个是一个HTML网页端&#xff0c;简单来说就是可以双击之后运行进行点名。 当然&#xff0c;不局限于课堂点名 代码功能 Excel 导入增强&#xff1a; 增加了列选择器&#xff0c;可以指定从哪一列读取学生姓名 增加了起始行选择器&#xff0c;可以跳过标题行或其…

LeetCode 560: 和为K的子数组

题目描述给定一个整数数组 nums 和一个整数 k&#xff0c;请统计并返回该数组中和为 k 的连续子数组的个数。示例 1&#xff1a;输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a;输入&#xff1a;nums [1,2,3], k 3 输出&#xff1a;2提示&#xff…

微软官方C++构建工具:历史演变、核心组件与现代实践指南

引言&#xff1a;C构建工具的战略意义 在Windows生态系统中&#xff0c;​​微软C构建工具​​&#xff08;Microsoft C Build Tools&#xff09;构成了数百万开发者和应用程序的技术基石。从早期的MS-DOS命令行工具到如今支持​​跨平台开发​​的现代化工具链&#xff0c;微…

探索Cocos_CoilTheRope:一款创新的游戏引擎扩展项目

探索Cocos_CoilTheRope&#xff1a;一款创新的游戏引擎扩展项目 去发现同类优质开源项目:https://gitcode.com/ 是一个基于Cocos2d-x游戏引擎的扩展库&#xff0c;旨在为开发者提供一种简便的方法来实现绳子缠绕和物理交互效果。该项目由DreamLXW开发并维护&#xff0c;为游戏…

爬虫-正则表达式

在线正则表达式测试OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具&#xff0c;提供jsbin在线 CSS、JS 调试&#xff0c;在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器&#xff0c;MarkDown编译器等其他在线工具https://tool.oschina.net/…

【BTC】数据结构

目录 那比特币区块链的组织形式到底是以链表的形式&#xff0c;还是树的形式呢&#xff1f; 区块头和区块体与默克尔树的关系 默克尔证明详解 区块链和链表最大的区别就是区块链用哈希指针代替了普通指针。 链表的指针就是指向一个结构体在内存中的地址&#xff0c;而哈希指…

飞算 JavaAI:让 Java 开发效率飙升的智能助手,日常开发全场景应用指南

飞算 JavaAI&#xff1a;让 Java 开发效率飙升的智能助手 &#xff0c;日常开发全场景应用指南 在 Java 开发的日常工作中&#xff0c;开发者常常面临各类重复性劳动与逻辑复杂度挑战。飞算 JavaAI 作为专注于 Java 领域的智能开发助手&#xff0c;能够覆盖从代码生成到项目维护…

8.2 文档预处理模块(二)

一、从0开始&#xff1a;简易RAG实现 在构建更复杂的 RAG 架构之前&#xff0c;我们先从最基础的版本入手。整个流程可以分为以下几个关键步骤&#xff1a; 1.数据导入&#xff1a;加载并预处理原始文本数据&#xff0c;为后续处理做好准备。 2.文本分块&#xff1a;将长文本…

【系统与工具】Linux——Linux简介、安装、简单使用

计算机概论与Linux简介 计算机概论Linux介绍与版本 Linux的规划与安装 Linux与硬件平台密切相关规划硬件与Linux安装 主机规划与磁盘分区安装CentOS、多重引导 简单使用 帮助手册文本编辑器关机 0. Linux介绍与版本 操作系统&#xff08;Linux&#xff09;&#xff1a;高效…

从视频数据到数字孪生:如何构建虚拟与现实的桥梁?

概述 视频数据与三维场景融合渲染技术通过将动态视频与静态三维模型结合&#xff0c;利用GPU加速、WebGL渲染、数字孪生等技术&#xff0c;实现虚拟与现实的交互式融合。该技术广泛应用于智慧城市、工业监控、虚拟现实、游戏特效等领域&#xff0c;能够提升场景的直观性和用户沉…

【笔记】开源 AI Agent 项目 V1 版本 [新版] 部署 日志

kortix-ai/suna at v1 一、最新版本号 V1 二、部署截图 本地开发环境仍然依赖于 Poetry 环境&#xff1a; &#xff08;Python>3.11,<3.13&#xff09; 创建本地 Poetry 虚拟环境 Python 多版本环境治理理念驱动的系统架构设计&#xff1a;三维治理、四级隔离、五项自…

NumPy-梯度与导数计算详解

NumPy-梯度与导数计算详解一、梯度与导数的基本概念1. 导数的定义2. 梯度的定义二、NumPy中的梯度计算函数&#xff1a;np.gradient()1. 函数语法2. 一维数组的梯度计算3. 多维数组的梯度计算三、基于梯度的导数近似方法1. 前向差分2. 中心差分四、实际应用场景1. 函数优化2. 数…

Redis架构安全

先学习&#xff1a;Redis架构简介-CSDN博客 Redis压测 Redis一般应用于高并发的场景&#xff0c;所以一定要对Redis的性能做压测。 Redis提供了压测脚本redis-benchmark&#xff0c;可以对Redis进行快速的基准测试。 # 20个线程&#xff0c;100W个请求&#xff0c;测试redi…

自动化Trae Apollo参数解释的批量获取

自动化Trae Apollo参数解释的批量获取一、背景介绍二、设计思路三、操作步骤1. 环境准备2. 获取界面坐标3. 定位关键元素4. 执行自动化查询5. 获取结果四、完整代码五、扩展应用一、背景介绍 在自动驾驶开发中&#xff0c;百度Apollo平台提供了大量参数用于调整系统行为。Trae…

数学模型:十大距离

十大距离 文章目录十大距离定义1. 欧氏距离&#xff08;Euclidean Distance&#xff09;2. 曼哈顿距离&#xff08;Manhattan Distance&#xff09;3. 切比雪夫距离&#xff08;Chebyshev Distance&#xff09;4. 闵可夫斯基距离&#xff08;Minkowski Distance&#xff09;5. …

流水线(Jenkins)打包拉取依赖的时候提示无法拉取,需要登录私仓的解决办法

在日常工作中&#xff0c;遇到了Jenkins拉取部门内部组件库失败的情况&#xff0c;原因是组件库后面放到了阿里云私仓&#xff0c;并且是没有公开的&#xff0c;所以就会有如下提示的&#xff0c;一开始我实在.npmrc文件写死阿里云提供的接入token&#xff0c;后面发现可能是因…