手把手教你如何用yolo算法进行运动监测

部署运行你感兴趣的模型镜像

视频演示

https://www.bilibili.com/video/BV1wnHyzPEvM

 

大家好,我是Coding茶水间。

今天分享一个基于YOLO算法的运动监测项目,通过识别人体关键关节节点,实现对俯卧撑、深蹲、压腿和高抬腿等动作的自动计数。

视频演示中,我们可以看到实时标注关节点、计算弯曲角度,并统计动作次数。这是一个简单实用的AI应用,适合计算机视觉和体育健康领域的爱好者。

项目效果演示

在视频开头,我们看到一个俯卧撑监测的示例:程序用红色圆圈标注肩膀、肘部和手腕,并显示弯曲角度。随着角度变化,动作次数实时更新,最终计数为4次。

图2

核心原理:人体关键关节节点识别

YOLO算法将人体关节分为17个关键节点,包括眼睛、鼻子、耳朵、肩膀、肘部、手腕、髋关节、膝盖和脚踝等。通过识别这些节点的位置,分析关节间的弯曲角度,来判断动作姿态和计数。

keypoints-order-ultralytics-yolov8-pose

对于俯卧撑,我们重点识别左臂的肩膀(节点5)、肘部(节点7)和手腕(节点9)。

弯曲角度如152度时,表示伸展状态;

角度变化用于计数。

类似地,其他动作选择相应节点:

  • 深蹲:肩膀(6)、髋关节(12)、膝盖(14)
  • 压腿:髋关节(11)、膝盖(13)、脚踝(15)
  • 高抬腿:髋关节(12)、膝盖(14)、脚踝(16)

原理是通过三个核心节点的弯曲情况,监测伸展(up)和收缩(down)状态。

一旦完成一个周期,计数加1。

代码实现

我们使用Python、OpenCV和Ultralytics的solutions包。核心是AIGym类,用于运动监测。以下是完整代码(以俯卧撑为例):

/* by 01022.hk - online tools website : 01022.hk/zh/htmlmarkdown.html */
import cv2

from ultralytics import solutions

# 读取视频
cap = cv2.VideoCapture("Pushups.demo.video.mp4")
# 判断视频是否读取成功
assert cap.isOpened(), "Error reading video file"

# 初始化AIGym
gym = solutions.AIGym(
    show=True,  # 展示效果
    kpts=[5, 7, 9],  # 处理的关键点
    model="yolo11x-pose.pt",  # 模型路径
    # up_angle = 145,
    down_angle = 100
)

# 处理视频
while cap.isOpened():
    # 读取视频帧数
    success, im0 = cap.read()

    # 判断是否读取成功
    if not success:
        print("Video frame is empty or processing is complete.")
        break
    
    # 处理视频帧数
    results = gym(im0)

cap.release()
cv2.waitKey(0)
cv2.destroyAllWindows()  # destroy all opened windows

整个代码是用Python实现的YOLO运动监测程序,主要用于处理视频帧,识别人体关键点,并计数动作(如俯卧撑)。

它依赖OpenCV(cv2)和Ultralytics的solutions模块。

导入模块
/* by 01022.hk - online tools website : 01022.hk/zh/htmlmarkdown.html */
import cv2

from ultralytics import solutions
  • 解释
    • import cv2:导入OpenCV库,用于视频读取、处理和显示。
    • from ultralytics import solutions:从Ultralytics库导入solutions模块,其中包含AIGym类,用于AI运动监测(基于YOLO姿态估计)。 这部分是代码的基础,确保所需工具可用。
读取视频并检查
#读取视频
cap = cv2.VideoCapture("Pushups.demo.video.mp4")
#判断视频是否读取成功
assert cap.isOpened(), "Error reading video file"
  • 解释
    • cap = cv2.VideoCapture("Pushups.demo.video.mp4"):打开指定视频文件(这里是俯卧撑演示视频)。cap是一个视频捕获对象,用于逐帧读取。
    • assert cap.isOpened(), "Error reading video file":检查视频是否成功打开。如果失败,抛出错误信息并停止程序。这是一个简单的错误处理,确保视频文件存在且可读。
初始化AIGym对象
# 初始化AIGym
gym = solutions.AIGym(
    show=True,  # 展示效果
    kpts=[5, 7, 9],  # 处理的关键点
    model="yolo11x-pose.pt",  # 模型路径
    # up_angle = 145,
    down_angle = 100
)
  • 解释
    • 创建AIGym实例,用于运动监测。
    • show=True:启用实时显示处理后的视频帧(包括标注关键点和角度)。
    • kpts=[5, 7, 9]:指定人体关键点(基于YOLO的17个姿态节点)。这里是左侧肩膀(5)、肘部(7)、手腕(9),适合俯卧撑监测。
    • model="yolo11x-pose.pt":加载YOLOv11x姿态模型(x版精度高,但计算密集;可换成n/m版以加速)。模型文件需提前下载或通过Ultralytics自动获取。
    • up_angle = 145:伸展角度阈值(默认145度,表示动作伸展状态)。
    • down_angle = 100:设置收缩角度阈值(小于此值视为收缩状态)。用于判断动作周期(up到down再回up计数一次)。这里调整为100度,可能适应特定动作如压腿。 这部分是核心配置,定义了监测的关节和阈值。
处理视频帧的循环
# 处理视频
while cap.isOpened():
    # 读取视频帧数
    success, im0 = cap.read()

    # 判断是否读取成功
    if not success:
        print("Video frame is empty or processing is complete.")
        break
    
    # 处理视频帧数
    results = gym(im0)
  • 解释
    • while cap.isOpened():循环处理视频,直到结束或关闭。
    • success, im0 = cap.read():读取一帧视频。success是布尔值(True表示读取成功),im0是当前帧图像。
    • if not success: ... break:如果读取失败(视频结束),打印消息并退出循环。
    • results = gym(im0):将当前帧传入AIGym处理。它会使用YOLO检测关键点、计算角度、更新计数,并返回结果(可能包括标注后的图像)。由于show=True,会自动显示处理效果。 这是一个主循环,实现实时视频处理。
 释放资源和等待
cap.release()
cv2.waitKey(0)
cv2.destroyAllWindows()  # destroy all opened windows
  • 解释
    • cap.release():释放视频捕获对象,关闭视频文件。
    • cv2.waitKey(0):等待按键输入(0表示无限等待),防止窗口立即关闭。用户可按任意键退出。
    • cv2.destroyAllWindows():关闭所有OpenCV窗口。 这部分是清理操作,确保程序优雅结束。

整体运行逻辑

  • 程序读取视频,初始化YOLO监测对象,逐帧处理(检测关键点、计算角度、计数),实时显示结果。
  • 适用于俯卧撑(通过肘部弯曲计数),可修改kpts、model和角度阈值扩展到其他动作(如深蹲)。
  • 注意:需确保YOLO模型文件存在;如果电脑配置低,大模型如x版可能卡顿。

不同动作示例

深蹲监测

更换kpts=[6,12,14],视频为深蹲文件。效果:完美识别角度变化,计数4次。

图3

压腿监测

kpts=[11,13,15],初始用"yolo11n-pose.pt"可能识别不准,换"yolo11x-pose.pt"。调整down_angle=100

图4

高抬腿监测

kpts=[12,14,16],用"yolo11m-pose.pt"。视频中动作9次,程序准确计数。

图1

注意:根据动作实际情况,动态调整节点、模型和角度阈值。

电脑配置低时,用小模型;精度不足时,用大模型。

 

有问题随时交流。更多AI教程,关注Coding茶水间。

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

### YOLO v8 完整学习与实现指南 #### 一、环境准备 为了顺利运行YOLO v8模型,需先准备好开发环境。推荐使用Anaconda创建虚拟环境来管理依赖包[^2]。 ```bash conda create -n yolov8 python=3.9 conda activate yolov8 pip install ultralytics ``` #### 二、数据集获取 训练目标检测模型离不开高质量的数据支持。可以从公开平台下载适合的任务场景下的标注数据集,比如COCO、VOC等标准测试集合;也可以自行收集并按照特定格式整理成自定义数据集用于个性化需求[^1]。 #### 三、模型配置文件解读 熟悉YOLO系列算法的核心在于理解其网络结构设计原理以及参数调整方式。对于初学者来说,建议仔细阅读官方文档中的`yolov8.yaml`样例文件说明部分,掌握各字段含义及其作用范围,这有助于后续调参优化过程。 #### 四、训练流程概览 启动训练之前要确认所有准备工作均已就绪,包括但不限于:指定GPU设备编号(若有)、设置随机种子保证实验可重复性、加载预处理后的输入样本批次等等。接着就可以执行如下命令开启正式训练阶段: ```python from ultralytics import YOLO model = YOLO('yolov8.yaml').load('path/to/pretrained/weights') # 加载权重 results = model.train(data='data.yaml', epochs=100, batch=-1) # 开始训练 ``` #### 五、评估与预测功能应用 完成一轮或多轮迭代之后,可通过内置方法快速检验当前版本性能表现如何。同时也能利用已训好的实例对象来进行实时物体识别操作,只需简单几行代码即可实现图像或视频流上的边界框绘制效果展示。 ```python successes = results.val() # 验证模式下计算mAP指标得分 predictions = model.predict(source='image.jpg', save=True) # 对单张静态图做推断分析并将结果保存至本地磁盘 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值