☰
YOLOv11姿态检测实战:从关键点提取到AI健身动作计数
2026/10/17 13:30:57 网站建设 项目流程

姿态检测这几年在AI健身赛道里算是被验证过的落地场景了。我用YOLOv11做了一套人体姿态检测的Demo,搭配关节角度计算与动作计数,可以在实时视频里分析深蹲、俯卧撑、卷腹这类基础动作,判断每个动作做没做到位,并统计有效次数。这篇文章从选型、跑通推理,到实现健身分析逻辑的完整过程都梳理了一遍,重点讲清楚每个环节背后的取舍,以及实际踩到过的坑。适合准备做AI健身分析、动作识别或者想了解YOLOv11姿态能力的开发者参考。

1. 为什么选YOLOv11做姿态检测:从需求到选型

1.1 健身姿态检测的需求本质

先明确应用场景。AI健身分析这个需求的核心,不是"识别出画面里有人",而是"把人的骨架关键点精确地定位出来",再基于这些关键点去计算关节角度、判断动作是否达标、统计重复次数。

以深蹲为例,系统需要知道髋、膝、踝三个点的位置,才能算出膝关节弯曲角度;以俯卧撑为例,需要肩膀、肘、腕三个点构成的角度来判断身体是否下降到标准位置。关键点检测的稳定性直接影响后续所有分析逻辑——如果模型在某个体位下让肘关节坐标跳变了两三帧,角度计算就会出现毛刺,计数也可能错乱。

做过传统姿态估计的朋友应该清楚,过去这类需求通常走"先检测人体区域,再做单人关键点回归"的两段式流程。精度没问题,但部署和串联比较繁琐,模型体积也不小。而YOLOv11把目标检测和姿态估计放在同一个框架里,一次前向推理同时输出人体边界框和17个关键点。对实时视频流场景来说,这在工程上会省掉很多事。

1.2 为什么是YOLOv11而不是其他方案

我选择YOLOv11的姿态模式,是经过几轮对比之后的决定。列一下我实际评估过的方向:

第一是MediaPipe的Pose方案。它轻量、CPU上也能跑得不错,但关键点数量更偏向手部和面部,人体这部分是33个点,其中不少点在健身场景里用不上。而且在快速动作、地面动作里,某些关键点容易出现漂移。

第二是成熟的开源姿态估计方案(自底向上思路的代表)。精度和COCO 17点规范都很合适,但模型大、部署链路复杂,在边缘设备上做实时推理对显存和算力要求很高。

第三是YOLO系列自身的姿态能力。YOLOv8时代已经提供姿态模型,到了YOLOv11,结构上做了进一步优化,推理速度和精度之间的平衡更好。我在自己的测试集上对比过同一段俯卧撑视频,上一代姿态模型在手腕快速移动时偶发丢关键点,YOLOv11在这个场景下的稳定性明显更好。

所以最终选型是:YOLOv11n-pose作为轻量级方案跑实时视频,YOLOv11m-pose用于离线的高精度分析。两者输出格式完全一致,切换成本很低。

2. 姿态检测的核心原理:关键点回归与推理流程

2.1 姿态头输出什么

很多刚接触的朋友会把"YOLOv11姿态估计"理解为"在YOLOv11里加了一个关键点检测模块",这个方向没错,但实现细节值得展开。

YOLOv11的姿态模式本质是在检测头后面并联一个关键点回归分支。检测头输出人体边界框坐标、置信度和类别信息;姿态分支输出每个人体目标对应的17个关键点坐标,以及每个关键点的置信度。关键点定义遵循COCO数据集的标注规范:鼻子、左右眼、左右耳、左右肩、左右肘、左右腕、左右髋、左右膝、左右踝,共17个点。

相比更早版本,YOLOv11在特征提取阶段加强了多尺度特征融合。带来的直接收益是:小尺寸目标,以及被部分遮挡的目标,关键点检出的成功率更高。对健身场景来说,这意味着用户离摄像头较远、或者身体局部被器械挡住时,骨架依然能保持相对完整。

2.2 从模型输出到可视化坐标的转换

模型输出的坐标不能直接拿来画图。YOLOv11输出的关键点坐标经过归一化处理,需要转换一次才能映射到原始图像尺寸,这也是新手踩坑最多的地方。

推理过程通常分三步:预处理、前向传播、后处理。

预处理阶段,把输入图像缩放到模型要求的尺寸,一般设成640×640,同时做letterbox填充保持原始宽高比,再把像素值归一化到0到1之间。这里有个容易忽略的细节:letterbox的填充区域需要在后处理时精确扣除,否则关键点坐标会整体偏移。我第一次跑通时漏了letterbox校正,骨架叠回原图总是整体往右下角偏,排查了很久才发现是pad偏移没减掉。

前向传播没什么特别的,加载模型权重后把预处理好的Tensor送进去,得到推理结果。

后处理阶段要把输出从特征图坐标系映射回原图:先按缩放比例对坐标放大,再减去之前pad的偏移量。做完这一步,关键点才能准确落到原图上。

如果同时检测到多个人,还需要根据边界框做目标区分。YOLOv11的姿态输出已经天然按目标分组,每个人体对应一组17个关键点,不需要自己再做人-关键点匹配,这也是选它省事的原因之一。

3. 环境准备与模型加载实操

3.1 环境依赖清单

我从零搭建这套系统,环境上没什么玄学。YOLOv11的官方实现基于PyTorch,我实际使用的环境如下:

  • Python 3.10
  • PyTorch 2.x,CUDA 11.8,GPU加速推理
  • 官方YOLO工具库,用于加载模型和推理封装
  • OpenCV,用于视频帧读取、图像缩放和可视化

没有GPU也能跑。我在一台无独显的笔记本上跑过YOLOv11n-pose,摄像头画面大约能维持在十几帧每秒,做离线视频分析完全够用,实时交互就比较吃力。如果你手头的硬件是老一些的CPU,建议优先考虑n版本加模型量化。

3.2 预训练模型选择

YOLOv11的姿态模型提供了不同体积的版本,从n到x一共五档。我的选择原则很简单:能离线分析就选大模型,追求实时性就选小模型。

我实测对比过n和m两个版本在同一段30秒深蹲视频上的表现:

模型平均推理耗时(CPU)遮挡帧漏检关键点漂移程度
YOLOv11n-pose约80ms/帧个别遮挡帧有轻微
YOLOv11m-pose约450ms/帧基本无更稳定

这两个数据说明模型体积带来的精度收益是实打实的,但也提醒我们要根据部署硬件做取舍。如果目标是手机端或嵌入式设备,可能还得在n版本基础上做INT8量化压缩,精度会有小幅损失,但速度提升明显。

3.3 第一行推理代码

这里给出最简可跑的推理流程,后续所有健身分析逻辑都在这段代码上扩展。

from ultralytics import YOLO model = YOLO("yolo11n-pose.pt") results = model.predict( source="demo_video.mp4", save=False, device=0, # 0表示GPU,CPU则改为"cpu" conf=0.25, verbose=False )

跑通之后,results里就包含每一帧的检测结果。每个结果对象里,keypoints属性是后处理完成的关键点坐标,boxes属性是人体边界框。

我给新手的建议是:先不要急着写健身分析,而是把17个关键点和骨架连线画到画面上,多换几个不同角度、不同体型的视频试一遍,确认模型输出稳定后再往下做。这一步看上去是"浪费时间",实际上是为后面调试省时间。

4. 从关键点到AI健身分析:角度计算与动作计数

4.1 计算关节角度

有了17个关键点坐标,最核心的一步是计算关节角度。这步用到的数学很简单:向量夹角公式。

以右膝角度为例,需要右髋、右膝、右踝三个点。先构造两个向量,一个从膝盖指向髋部,一个从膝盖指向脚踝,再求夹角。Python实现:

import math def calculate_angle(a, b, c): # a是关节起点,b是关节顶点,c是关节终点 ab = (a[0] - b[0], a[1] - b[1]) bc = (c[0] - b[0], c[1] - b[1]) dot = ab[0] * bc[0] + ab[1] * bc[1] norm_ab = math.sqrt(ab[0]**2 + ab[1]**2) norm_bc = math.sqrt(bc[0]**2 + bc[1]**2) cos_angle = dot / (norm_ab * norm_bc + 1e-6) angle = math.acos(max(-1.0, min(1.0, cos_angle))) return math.degrees(angle)

这里我加了一个1e-6的小值防止除零,同时把cos结果限制在[-1, 1]范围内,避免因为浮点误差导致math.acos报错。这些细节在实时视频流里非常容易触发,一个NaN就会污染后续所有逻辑。

在健身判断里,不同动作关注的角度不一样。深蹲主要看髋角和膝角,俯卧撑主要看肘角,侧平举主要看肩角。我习惯把每个动作定义成一套"角度规则集合",而不是写死一组阈值,这样后续扩展新动作会很方便。

4.2 动作计数与组次判断

动作计数是AI健身分析中最有实用价值、也最容易做错的部分。我的做法基于状态机思想:对每个动作定义"起始姿态"和"结束姿态",用角度阈值做状态迁移。

以俯卧撑为例。我定义伸展状态为肘角大于160度,屈曲状态为肘角小于100度。状态机这样工作:

  1. 初始状态为"伸展";
  2. 当检测到肘角小于100度,状态切换为"屈曲";
  3. 当状态为"屈曲"且肘角重新回到160度以上,计数加一,状态回到"伸展"。

这个状态机比"角度小于阈值就计数"可靠得多,后者会在动作半程的抖动中被重复触发。我在测试中发现,不加状态机的版本,同一段俯卧撑视频的计数值会直接翻倍,非常典型。

但状态机本身也有坑。关键点偶尔会跳变一到两帧,比如手腕被身体挡住时,模型可能短暂把肘关节预测偏移几十像素,导致角度连续几帧出现假性的"屈曲—伸展—屈曲"。我的对策是给状态切换加一个持续时间要求:角度必须连续多帧(比如4帧)满足条件,才真正执行切换。这个"防抖"机制在实战中非常关键。

4.3 姿态标准度评估

计数之外,AI健身分析还应该回答一个问题:用户这次动作做得标准吗?

我的做法是给每个动作定义两个参考指标:角度合格区间和偏差惩罚规则。以深蹲为例,理想状态下大腿与小腿夹角应接近90度,膝关节不应明显内扣。系统根据当前角度和目标角度的差值,输出"标准度分数",再结合动作速度给出一个综合完成度。

这里特别提醒一点:不同人的身体比例、柔韧性差异很大,用绝对数值判断"标准性"不一定适合所有人。我后来给系统加了"个性化校准"机制——先让用户做一次标准动作记录基线,再以基线作为后续判断的参考。这样一来,系统不会因为某个人天生柔韧性好而误判,也不会因为某个人腿特别长而认为动作幅度不足。

5. 实测中容易踩的坑与优化方向

5.1 单人vs多人场景的边界

YOLOv11天然支持多人检测,但做健身分析后我发现,"支持多人"和"正确处理多人"是两回事。

多人同时入镜时,每个人的骨骼关键点都能正确输出,但健身分析规则绑定在"某个人"身上。如果不做目标追踪,同一人物在画面里移动位置后,下一帧可能被分配新的目标序号,导致角度、计数等状态被重置或串到另一个人身上。

我的处理分两步。第一步,每帧里选出面积最大的人体框作为"主训练者",过滤掉路过的其他人;第二步,对主目标做简单的IoU跟踪,通过连续帧的位置重叠度维持身份一致。这个方法不复杂,但对单人健身场景完全够用。如果要支持多人同时训练,就得引入更正式的多目标追踪模块,复杂度会上升一个量级。

5.2 推理速度优化

实时性是我在这套系统上花时间最多的地方。初始版本在GPU上能跑二十多帧每秒,但加上可视化绘制和健身分析逻辑后,帧率掉得厉害。我做了三件有效的优化:

第一,把推理尺寸从默认的640调到416或480。姿态估计对分辨率有一定要求,但在摄像头画面下,416对常见动作依然够用,推理速度的提升却非常明显。

第二,减少可视化开销。不要每帧都对整幅图像做多种绘制操作,可以把绘制结果与推理逻辑分离,或者只画关键点和骨架连线,避免逐像素的特效处理。

第三,推理和绘制放不同线程。视频帧采集、模型推理、结果绘制各自独立线程,用队列做缓冲,能显著降低整体延迟。实时交互类项目里这基本是标配做法。

如果你是CPU推理,还可以考虑把浮点模型做FP16或INT8转换。YOLO系列生态自带转换工具,操作不复杂,CPU推理速度通常能提升一半以上,代价是精度略有下降。对健身分析这种对关键点精度有要求的场景,建议先做完整测试再决定是否启用。

5.3 常见误检与遮挡问题

最后说一下实测中反复遇到的"模型理解错误"。这几条不算模型bug,而是使用场景的固有难点。

第一,侧面视角下,身体一侧的关键点容易被另一侧挡住。比如做俯卧撑时,摄像头放在身体侧面,双臂交替支撑时远侧手臂和肩膀的关键点置信度会急剧下降。我的建议是摄像头尽量放在正面偏高的位置,保证躯干和四肢大部分可见。

第二,深色背景、反光地面、复杂纹理会在个别帧引发检测框抖动。我的经验是尽量让画面干净、视角固定,避免大幅运动背景。对背景噪声,增加输入图像的对比度预处理也有一定帮助。

第三,模型对"躺着的人"和"弯腰的人"的姿态理解有时候会出问题。预训练模型大多基于自然站立的姿态数据,健身场景里的仰卧起坐、平板支撑等地面动作容易出现关键点定位偏差。处理办法有两个方向:一是对这类动作专门采集样本做微调训练;二是退一步,在逻辑层面对低置信度的关键点做平滑插值,宁可角度计算时不用那个点,也不能用一个错误点去污染判断。

整套系统做下来,我最大的体会是:模型选型和推理代码只是整个项目的前半段,后半段的大量时间其实花在"如何让姿态信息变成可靠的健身指导信息"上。状态机防抖、目标身份保持、置信度过滤、个性化基线校准——每一个看起来不起眼的细节,都会在真实使用中暴露问题。

如果手头的目标是做一个能用的AI健身分析产品,建议先把单人、固定视角、有限动作集跑得足够稳,在此基础上再逐步加入多人、多动作和自动动作识别。每加一层,排查问题的难度都会上升一截,先把基础盘稳了,后面才走得快。

最后分享一个实用技巧:无论模型还是分析逻辑,每次改动之后,都保留一版固定的测试视频,用同一段素材反复回归。我实际开发中用了一段十秒的深蹲加俯卧撑混合视频作为标尺,每次改动后跑一遍,立刻能看出是变好了还是变坏了。这个习惯帮我省下了大量调参时间,强烈建议你也试试。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询