PiscTrace深蹲计数功能实现:基于 YOLO-Pose 和人体关键点分析

发布于:2025-07-10 ⋅ 阅读:(21) ⋅ 点赞:(0)

在健身应用中,自动化的动作识别和计数是一个非常重要的功能,尤其是在健身房或家庭健身中,准确的运动追踪可以帮助用户更好地掌握自己的运动情况。深蹲作为常见的力量训练动作,准确判断深蹲的完成度至关重要。YOLO(You Only Look Once)系列目标检测模型与姿势估计相结合,通过 YOLO-Pose 模型,可以实现对深蹲动作的精准检测和计数。

YOLO-Pose 模型通过对人体关键点的实时监测,能够非常高效地判断用户是否完成了某一动作,并自动统计动作次数。在本篇文章中,我们将详细介绍如何使用 YOLOv8 至 YOLOv12 模型,通过人体关键点(膝盖、髋部、踝部)的角度计算来实现深蹲计数功能。我们还将探讨如何将 YOLO 的目标检测能力与姿势估计结合,实时进行深蹲的自动化计数。

1. YOLO-Pose:从 YOLOv8 到 YOLOv12 的演变

YOLO(You Only Look Once)模型最初主要应用于目标检测领域,其高效的检测能力使得 YOLO 很快成为实时图像处理的首选模型。随着版本的更新,YOLO系列逐渐扩展到了更多领域,包括实例分割、姿势估计等。YOLOv8 和之后的 YOLOv9、YOLOv10、YOLOv11、YOLOv12 等版本,逐步加强了对人体姿势检测的支持,特别是在姿势估计任务中,YOLO-Pose 的表现尤为出色。

1.1 YOLOv8 到 YOLOv12 的发展
  • YOLOv8:推出了更高效的网络架构,提升了目标检测和姿势估计的精度。该版本对人体姿势的估计已经取得了较为显著的进展,能够准确地预测出人体的关节点位置。

  • YOLOv9 - YOLOv12:进一步优化了小目标检测的能力,同时通过改进网络结构和引入新的训练数据,YOLOv9 及后续版本的姿势估计功能得到了显著提升。YOLOv11 和 YOLOv12 特别加强了对人体动作的判断和分析,在深蹲等运动姿势的识别方面更加精准。

YOLO-Pose 模型正是基于这些 YOLO 版本的优化,结合人体关键点的预测,实现了实时姿势估计,特别是在需要精确计算人体姿势的运动识别任务中,表现出了强大的应用潜力。

1.2 YOLO-Pose 模型概述

YOLO-Pose 是 YOLO 系列的扩展,结合了目标检测和姿势估计。它通过对人体关键点的识别,能够非常精准地判断运动中的每一个阶段。YOLO-Pose 输出的是人体的关键点坐标,这些坐标包括头部、肩膀、肘部、膝盖、踝部等位置,基于这些关键点的相对角度,可以判断出一个动作的完成度,例如俯卧撑、深蹲等。

2. 姿势估计与深蹲动作识别

深蹲是一项要求膝盖、髋部和踝部等多个部位共同协作的运动,因此,准确地检测这些部位的角度变化对于判断深蹲是否完成至关重要。通过计算膝盖、髋部和踝部的角度,可以有效地判断深蹲的上升和下蹲阶段。

在深蹲动作中,我们主要关注以下几个关键点:

  • 踝部(Ankle):这是判断膝盖和髋部之间角度变化的关键部位之一。

  • 膝盖(Knee):膝盖的弯曲程度决定了深蹲是否到达下蹲阶段。

  • 髋部(Hip):髋部的位置和角度是判断深蹲深度的重要依据。

通过 YOLO-Pose 模型提供的关键点坐标,我们可以根据这些部位的相对角度来判断用户是处于“下蹲”状态还是“站立”状态,并据此统计深蹲次数。

3. 深蹲计数实现:基于 YOLO-Pose 的方法

下面我们将介绍如何利用 YOLO-Pose 模型,在实时视频流中进行深蹲计数。我们将参考现有的 AIGym 类实现,通过对膝盖、髋部和踝部的角度计算,来判断深蹲的完成情况,并自动统计次数。

3.1 类的初始化与参数配置

首先,我们初始化 AIGym 类,该类封装了深蹲检测和计数的功能。关键的参数包括关键点的索引、上蹲和下蹲的角度阈值等。

class AIGym:

    """A class to monitor squat counts using ankle-knee-hip pose angles in real-time video."""

    def __init__(
        self,
        kpts_to_check=None,
        line_thickness=6,
        pose_up_angle=170.0,
        pose_down_angle=90.0,
        pose_type="squat",
    ):
        """
        Initializes the AIGym class with specific parameters for squats.
        """
        # 默认用右腿 ankle(16) - knee(14) - hip(12)
        self.kpts_to_check = kpts_to_check or [16, 14, 12]  # 关键点索引,表示右腿的踝、膝盖、髋部
        self.tf = line_thickness  # 绘制关键点的线宽
        self.poseup_angle = pose_up_angle  # 完成深蹲动作时的角度上限
        self.posedown_angle = pose_down_angle  # 完成深蹲动作时的角度下限
        self.pose_type = pose_type  # 动作类型,此处为 "squat"(深蹲)

        self.im0 = None
        self.keypoints = None
        self.annotator = None
        self.env_check = check_imshow(warn=True)  # 检查是否能够显示图像
        self.count = []  # 记录每个人的深蹲计数
        self.angle = []  # 记录每个人的角度
        self.stage = []  # 记录每个人的阶段("up" 或 "down")

在这个初始化方法中,我们可以设置哪些关键点需要检测,默认情况下我们选择了右腿的踝部、膝盖和髋部(关键点索引分别为16、14、12)。同时,我们也设置了判断深蹲上下阶段的角度阈值:pose_up_anglepose_down_angle

3.2 obj_exe 方法:实时检测深蹲

obj_exe 方法是 AIGym 类的核心功能,它会处理每一帧图像,并通过 YOLO-Pose 模型检测出人体的关键点。接下来,根据关键点的角度变化,判断深蹲的阶段并进行计数。

def obj_exe(self, im0, results):
    """
    Processes a video frame to detect squats and count reps.
    """
    self.im0 = im0

    if not len(results[0]):
        return self.im0

    self.annotator = Annotator(self.im0, line_width=self.tf)

    if 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)

    self.keypoints = results[0].keypoints.data

    for ind, k in enumerate(self.keypoints):
        # 计算角度
        self.angle[ind] = self.annotator.estimate_pose_angle(
            k[self.kpts_to_check[0]].cpu(),
            k[self.kpts_to_check[1]].cpu(),
            k[self.kpts_to_check[2]].cpu(),
        )

        # 绘制关键点
        self.im0 = self.annotator.draw_specific_points(k, self.kpts_to_check, radius=10)

        # 判断深蹲阶段(up/down)并计数
        if self.angle[ind] > self.poseup_angle:
            self.stage[ind] = "up"
        elif self.angle[ind] < self.posedown_angle and self.stage[ind] == "up":
            self.stage[ind] = "down"
            self.count[ind] += 1

        # 显示角度、计数和状态
        self.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[self.kpts_to_check[1]],  # 膝盖为中心显示位置
        )

        self.annotator.kpts(k, radius=1, kpt_line=True)

    return self.im0
  • 关键点计算:通过 estimate_pose_angle 方法,我们计算膝盖、髋部和踝部之间的角度。

  • 阶段判断:根据设定的角度阈值,判断是否处于“上蹲”或“下蹲”状态。

  • 计数与显示:在检测到下蹲动作后,增加计数并实时在图像中显示角度、计数和动作状态。

4. 总结与展望

YOLO-Pose 模型结合 YOLOv8 到 YOLOv12 的强大检测能力和精确的姿势估计功能,为实现深蹲等动作的自动计数提供了理想的解决方案。通过计算膝盖、髋部和踝部之间的角度变化,我们可以实时判断深蹲动作的完成情况,并准确统计每个深蹲的次数。

未来,随着 YOLO-Pose 和姿势估计技术的不断优化,预计将能够更准确地检测各种复杂运动动作,并为用户提供更加全面的运动数据分析。这些技术不仅能够应用于健身领域,还可以在康复治疗、运动科学等领域发挥重要作用。

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


网站公告

今日签到

点亮在社区的每一天
去签到