news 2026/10/16 1:07:21

YOLOv8人体姿态估计预训练模型:图片视频关键点提取与实战避坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv8人体姿态估计预训练模型:图片视频关键点提取与实战避坑

简介:一份面向计算机视觉初学者、算法工程师及需要快速集成人体姿态识别能力的开发者的YOLOv8预训练模型资源,可直接用于图片或视频中的人体姿势识别,也可作为基础模型进行二次训练。压缩包共4个文件,包含PyTorch格式的模型权重、可直接运行的Python推理脚本,以及两张用于展示识别效果的示例图片,整体约31.33MB,结构精简,无需复杂环境配置即可快速运行。已有559人学习下载,适合在运动动作分析、康复训练监测、虚拟现实交互等场景中快速验证姿态识别效果。借助该资源,读者能够获得开箱即用的推理代码和预训练权重,直观看到对站姿、坐姿、肢体关键点等常见姿态的检测结果;示例图片还可帮助判断模型精度,为后续的模型微调或项目集成提供清晰的参考基础。

1. 人体姿势识别用 YOLOv8 预训练模型:图片视频都能开箱即跑

这类“人体姿势识别yolo8预训练模型,内附完整Python运行代码”的项目包,最大价值不是模型结构多新,而是把姿态估计的门槛拉到了零:不需要标注骨骼关键点、不用写训练脚本、也不用理解姿态估计的损失函数,装好环境跑一行命令就能看到带骨架连线的结果图。我之前在一家公司做行为分析预研时,拿到一批监控截图和一段健身视频,第一个下午就用这套预训练权重输出了20多张带骨架标注的结果图,顺利说服项目组继续投入这个方向。这篇笔记就是把这套流程完整拆开:怎么安装依赖,怎么用 YOLOv8 的 pose 预训练权重跑通图片和视频,怎么从输出里取关键点坐标,以及实际跑起来最容易出问题的几个环节。适合有 Python 基础、想在行为分析、健身动作计数或康复姿态评估里快速拿到可演示结果的工程师;如果只是想看算法论文原理,那这篇文章并不合适。

2. 先把环境跑通:最小安装、首次推理和视频处理

2.1 安装 ultralytics:一个包解决几乎所有依赖

接触姿态估计时有一个常见误区:去源码仓库单独找 OpenPose 或 AlphaPose 的代码,还要配 caffe、编译、下载一堆模型文件,Windows 上经常折腾两天还卡在环境里。YOLOv8 走的不是这条路,官方把模型结构、预训练权重下载、推理、可视化和结果导出都收敛到了一个 Python 包里,对于“先看到结果”这个目标来说是最省事的做法。

# 建议先建虚拟环境,避免污染全局 Python python -m venv pose_env # Windows CMD 进入环境 pose_env\Scripts\activate.bat # macOS / Linux 进入环境 source pose_env/bin/activate # 安装核心包,Ultralytics 会自动带出 torch、opencv-python、numpy 等依赖 pip install -U ultralytics

代码说明:python -m venv 创建的是隔离环境,之后所有依赖都装在这个目录里,多个项目之间互不干扰。进入虚拟环境的命令在不同操作系统上不一样,Windows CMD 用 activate.bat,PowerShell 如果遇到执行策略限制,直接切到 CMD 或放开策略即可。pip install -U ultralytics 这行安装的是当前最新版,安装过程中会自动拉取 torch 和 opencv,不需要手动一条条装,这也是这个方案适合快速落地的原因之一。

版本兼容这块有一个经验:如果本机 Python 版本是 3.12 或更高,偶尔会遇到某个依赖找不到对应预编译包的情况,原因不是代码问题,而是 python 官方 wheel 还没跟上。我一般会退回 Python 3.8 到 3.11 之间再建虚拟环境,后面基本不会再因为基础依赖报错。装好后可以用一条命令验证:python -c "from ultralytics import YOLO; print('ok')",控制台打印出 ok 再继续往下走。

2.2 跑通第一张图片:验证整个推理链路

环境验证最好的方式就是跑一次真实推理,而不是反复看版本信息。下面这段代码是这套项目包里的最小可运行版本,也是我每次收到新机器时最先执行的验收脚本。

from ultralytics import YOLO # 指定 pose 预训练权重;如果本地没有,第一次运行会自动下载 model = YOLO("yolov8n-pose.pt") # 对单张图片推理,save=True 会把带骨架标注的结果写到磁盘 results = model.predict( source="demo.jpg", save=True, project="runs", name="first_pose" ) # results 是列表,每个元素对应一张输入图或一帧 print("输出目录:", results[0].save_dir)

逻辑和参数说明:YOLO("yolov8n-pose.pt") 会先在当前目录找同名文件,找不到就按官方权重地址下载。文件名里的 n 表示 nano 尺寸,权重最小,适合 CPU 和显存紧张的机器;后续可以换成 yolov8s-pose.pt 或 yolov8m-pose.pt,精度更高但推理更慢。source 指向图片路径,save=True 是落盘开关,project 和 name 共同决定输出目录,上面这段代码会写到 runs/first_pose 下。第一次跑会看到权重下载进度条,下载完成后再次执行就直接复用本地权重。

运行完成后打开输出目录检查两件事:一是图片里有没有人体检测框,二是框里有没有 17 个关键点和连线。如果两个都有,说明权重加载、预处理、推理、后处理四条链路都正常,可以继续跑视频。如果只有检测框没有骨架线,大概率是权重文件下错成了普通检测模型,这个坑后面避坑章节详细展开。

2.3 视频推理:把图片逻辑平移到视频

图片跑通之后,视频推理就是换一个输入源。predict 内部会按帧读取、逐帧推理、逐帧画骨架,最后统一编码输出为视频文件,对外暴露的代码几乎没有变化。

from ultralytics import YOLO model = YOLO("yolov8n-pose.pt") results = model.predict( source="run.mp4", # 输入视频路径 save=True, # 输出带标注的视频 project="runs", name="video_pose", imgsz=640, # 网络输入尺寸,画面长边会缩放到这个值 device="cpu" # 明确用 CPU 推理,避免没显卡时报错 ) print("视频结果已保存到:", results[0].save_dir)

参数说明:source 不只是文件路径,也可以填摄像头编号 0 或 1,还能填视频流地址,这点在后面的进阶用法里会用到。imgsz 控制推理时的输入分辨率,640 是通用取值,画面过大的视频会先按比例缩小再喂给网络,这个值对速度和显存影响非常直接。device 参数建议写清楚:有 Nvidia 显卡就写 device=0 用第一张卡,没有显卡就写 cpu,不要省掉这个参数,因为部分环境在自动选择设备时会提示找不到 CUDA 然后报错。

视频处理通常比图片慢得多,尤其是 CPU 上跑 1080p 视频。我的习惯是正式处理前先截取 50 帧做计时,确认单帧推理时间在可接受范围内,再跑完整视频,不然一个 10 分钟视频跑半小时才发现参数不合适,时间成本太高。第一次跑完用播放器看输出,注意骨架线和身体是否对齐,如果骨架乱跳或者明显飘到背景上,不要急着调模型,先检查原视频帧率、画面模糊度和人体遮挡情况。

2.4 批量图片处理:一个目录直接跑完

实际需求里经常要处理一批图片,而不是一张张手动运行。常见做法是把 source 直接指向目录,Ultralytics 会自动遍历目录里支持的图片格式,一次推理输出全部结果。

results = model.predict( source="samples/", # 目录下所有图片都会被处理 save=True, conf=0.35 # 关键点置信度阈值,低于这个值的关键点会被过滤 )

这个用法在验收数据集时很顺手。比如从业务视频里抽了 200 帧截图,放成一个目录,跑一次就能得到全部结果,再按输出文件名逐一检查。需要注意的坑后面避坑章节细说,但有一个要提前提醒:目录名和文件名千万别用中文,非 ASCII 路径在部分版本的 OpenCV 和视频解码库上会直接保存失败。

3. 读懂推理输出:关键点坐标结构、置信度与调参

3.1 从 Results 对象里取关键点坐标

很多人跑通了图片保存,但在“把关键点坐标取出来做业务计算”这一步卡住了。原因是 Ultralytics 的输出层级结构不太直观:predict 返回的是 Results 列表,每个元素对应一张图或一帧;每个 Results 又包含 boxes、keypoints、probs 等对象。姿态识别真正要用的是 keypoints。

from ultralytics import YOLO model = YOLO("yolov8n-pose.pt") results = model("demo.jpg") # 不写 predict 也能推理,默认返回结果列表 kp = results[0].keypoints # 取出第一张图的关键点对象 if kp is None or kp.data is None or kp.data.numel() == 0: print("这张图没有检测到人体关键点") else: # 像素坐标 shape: [人数, 17, 2] print("像素坐标 xy:", kp.xy) # 归一化坐标 shape: [人数, 17, 2],每个坐标除以了图片宽高 print("归一化坐标 xyn:", kp.xyn) # 关键点置信度 shape: [人数, 17] print("置信度 conf:", kp.conf) # 第一个人、5号关键点(左肩)的像素坐标取出来 shoulder_x, shoulder_y = kp.xy[0][5].tolist() print(f"第一个人左肩位置: ({shoulder_x:.1f}, {shoulder_y:.1f})")

代码说明:kp.xy 和 kp.xyn 都是 torch.Tensor,前者是原图像素坐标,单位是像素;后者是把坐标值除以图片宽高得到的 0 到 1 之间的比例,方便不同分辨率的画面做统一计算。kp.conf 的形状是 [人数, 17],对应每个人 17 个关键点的置信度。取单点坐标时一定要执行 .tolist(),否则拿到的是一个张量而不是普通浮点数,后面计算角度、判断范围时类型不匹配会冒出一堆莫名其妙的报错。

判空这段值得保留。如果跑的是没有人的空背景图,keypoints 对象可能是空数据,直接索引 kp.xy[0][5] 会抛异常。我一般会在写业务处理前先跑一张空背景图,确认空数据形态,再决定判空逻辑放在哪一层。

3.2 17 个关键点的顺序和骨架连接关系

COCO 姿态数据集的 17 个关键点顺序是固定的,YOLOv8 预训练权重沿用这个顺序。做业务计算前,把索引和身体部位对应关系放在手边非常有必要。

索引身体部位索引身体部位
0鼻子9左手腕
1左眼10右手腕
2右眼11左髋
3左耳12右髋
4右耳13左膝
5左肩14右膝
6右肩15左踝
7左肘16右踝
8右肘——

骨架连接关系也固定:头部内部是 0-1、0-2、1-3、2-4;躯干是 5-6、5-11、6-12;左臂是 5-7、7-9,右臂是 6-8、8-10;左腿是 11-13、13-15,右腿是 12-14、14-16。官方自带的 plot 可视化就是按这个顺序画的线,如果自己写业务逻辑需要画自定义骨架,直接照这个关系画即可。

需要特别提醒的是,索引对应的左右是以“被拍摄对象”为参照,不是你看屏幕时的左右。屏幕上左侧的人,他的左手在你的屏幕右侧,这个方向关系经常在做角度计算时把人绕晕。我自己的习惯是先把左右肩、左右手腕的索引在代码里注释清楚,再往下写逻辑,不然一到多人场景就会拿错坐标。

3.3 参数怎么调:conf、iou、imgsz、device 和业务场景的关系

预训练权重是模型的参数,真正影响业务效果的“调参”发生在 predict 调用里。几个关键参数直接决定漏检和误检比例。

results = model.predict( source="action.mp4", conf=0.35, # 关键点和检测框的共用置信度阈值 iou=0.45, # NMS 的交并比,多人靠近时影响明显 imgsz=640, # 输入尺寸 device="cpu", # 推理设备 max_det=5 # 单帧最多检测的人体数 )

逐个讲参数。conf 是筛选置信度的阈值:想漏检少,就调到 0.25 左右;想误检少,就调到 0.5 以上。健身、跑步这类动作幅度大的场景,身体遮挡导致关键点置信度偏低,我会先取 0.3 试跑一版,看骨架乱跳再往上回调。iou 是 NMS 阶段控制相邻框是否合并的参数,多人紧挨的场景里调低一点输出框更干净,调太高反而会把两个人的框合成一个。imgsz 影响速度与精度的取舍,CPU 上 480 能明显提速,但小尺寸人像的关键点容易丢。max_det 限制最大检测人数,车间监控这种人多的画面里加上它,能避免一帧几十个人的极端耗时。

实际调参的顺序我一般这样走:先用默认参数跑一批样本,统计漏检误检,再只改 conf 看变化,最后调整 iou。一次改多个参数,很难判断是哪一项引起的效果变化,这也是很多人调参调到后面像在试玄学的原因。每次只动一个变量,记录结果,再动下一个,参数组合才有参考价值。

3.4 可视化验证:把 plot 结果单独保存

除了依靠 save=True,也可以把某一帧的绘制结果单独拿出来,叠加到自己的分析流程里。这样可以在保存业务结果前,先确认关键点数据对应到画面上的哪个位置。

import cv2 from ultralytics import YOLO model = YOLO("yolov8n-pose.pt") res = model("demo.jpg")[0] # 使用内置 plot 方法得到带标注的 BGR 图像 frame = res.plot() cv2.imwrite("demo_pose_debug.jpg", frame)

代码说明:res.plot() 返回的是 BGR 格式的 ndarray,正好符合 OpenCV 的 imwrite 要求,不需要做颜色空间转换。这个做法的价值在于,当你从 keypoints 里取了一堆坐标做业务判定后,必须回到图上确认坐标是否真的落在正确的位置上,尤其是多人场景,坐标张量索引稍有偏差,画出来就是两根骨架叠在两个人身上。可视化并不是给用户看的,更多是给你自己排查用的。

4. 避坑与常见问题排查:5 个容易翻车的高频现场

4.1 权重下载卡住,模型始终跑不起来

现象:第一次执行 YOLO("yolov8n-pose.pt") 时,进度条长时间卡在某个百分比,或者直接提示下载超时。

原因:pt 权重文件体积不算小,放在外部服务器上,网络出现波动时下载线程容易中断;中断后本地只留下一个不完整的临时文件,再次运行又会触发重新下载。

解决:一种常见做法是手动下载权重文件,再把 .pt 文件放到当前工作目录,Ultralytics 校验到本地文件名匹配就直接加载,不走网络。另一种是给 pip 和资源下载配置更通畅的镜像源,让依赖和权重都稳定获取。下载中断后要注意删除本地残留的临时文件,否则可能一直加载失败。这一条如果在公司内网环境卡住,优先排查网络策略是否限制了对外访问,不要反复重试浪费时间。

4.2 下错权重:yolov8n.pt 和 yolov8n-pose.pt 混用

现象:代码运行时没有任何报错,但拿到结果后访问 keypoints 属性要么是 None,要么检测框里没有骨架线。

原因:yolov8n.pt 是普通目标检测权重,检测的是 80 类物体;yolov8n-pose.pt 才是人体姿态权重,两者文件名只差一个 -pose 后缀,特别容易从网盘或历史目录里拿错。

解决:下载后先确认文件名完整。更保险的做法是在代码里加一行断言,确认加载的模型确实是姿态模型:

model = YOLO("yolov8n-pose.pt") print(model.task) # 正常应打印 pose assert model.task == "pose", "加载的不是姿态模型,请检查权重文件名"

这个检查在项目里值得保留。不同版本的模型文件可能被工具自动重命名,但 task 属性是模型结构决定的,不会变。我之前就遇到过某同事把模型转成 ONNX 后命名带上了 pose 字样,实际训练任务却是检测,加了这行判断后问题当场暴露。

4.3 视频推理太慢,CPU 风扇拉到满转速

现象:720p 视频逐帧处理,实际速度不到 2 帧每秒,一段 5 分钟的视频要跑大半个小时。

原因:姿态识别比普通检测多了一个关键点头的计算成本,每个人体框都要回归 17 个关键点,多人场景下耗时成倍增加。另一个隐藏因素是原始视频分辨率太高,解码和缩放也占 CPU。

解决:先降低视频分辨率,把 1080p 转成 720p 再喂给模型。然后调 imgsz=480,绝大多数场景下关键点仍然可见。第三步是提高 conf,过滤掉低质量候选框,减少实际需要回归关键点的人数。如果还不能接受,就换 yolov8n-pose 的量化版本或直接上 GPU。在纯 CPU 环境里追求实时流畅,这套预训练方案通常做不到,得另想办法,比如每隔两帧处理一次或者只对检测框区域做关键点回归。

4.4 中文路径导致保存失败

现象:代码正常执行到 predict,输出目录没有生成,或者保存时报错说路径不存在。

原因:Ultralytics 底层依赖 OpenCV 做图像编码写入,而 OpenCV 在部分平台对非 ASCII 路径支持很差,中文目录名和中文文件名都容易触发。

解决:最省力的办法是统一把输入文件放到英文和数字组成的路径下,比如 D:\pose_data\samples\img01.jpg,输出目录也用英文。如果业务系统确实绕不开中文路径,在调用 predict 前先把文件复制到临时英文目录处理,处理完再拷回去。这个坑在 Windows 上出现概率最高,macOS 和 Linux 相对少,但为了保险我一律沿用全英文路径。

4.5 摄像头画面调用 show=True 时黑屏或程序闪退

现象:代码把 source 设为 0,show 设为 True,运行时弹窗全黑或者直接崩溃。

原因:一是在没有图形界面的服务器上调用 GUI 窗口,系统没有窗口环境;二是摄像头编号不对,0 不是实际用的那台设备。

解决:先确认当前环境有没有桌面。服务器环境不要用 show=True,改用 save=True 把结果存成视频文件再回放。摄像头编号方面,笔记本集成摄像头通常是 0,外接 USB 摄像头通常是 1 或 2;我一般会写个小脚本遍历 source=0、1、2 分别读一帧,能读到画面再继续往下跑,避免在推理代码里反复试。

5. 进阶:把关键点变成业务角度指标

预训练模型跑通只是起点。真正要用于健身动作计数、坐姿分析或康复评估,需要对关键点做后处理,最常用的是算关节角度。下面这段代码是我每个姿态项目都会保留的工具函数:

import math def calc_angle(a, b, c): """a b c 是三个关键点坐标,b 是角度的顶点""" v1 = (a[0] - b[0], a[1] - b[1]) v2 = (c[0] - b[0], c[1] - b[1]) dot = v1[0] * v2[0] + v1[1] * v2[1] cross = abs(v1[0] * v2[1] - v1[1] * v2[0]) return math.degrees(math.atan2(cross, dot))

调用时,先把关键点坐标从张量转成普通浮点数再传进来。比如肘关节角度用左肩、左肘、左手腕三个点,膝关节角度用左髋、左膝、左踝三个点,顶点分别是肘和膝。注意不要直接用置信度过低的关键点去算角度,否则上一帧 160 度、下一帧 30 度,角度曲线完全没法用。我会在取坐标前加一个 conf 判断,低于 0.3 的关键点直接跳过这一帧,或者用前后帧的数值做平滑。

我现在接到新的姿态识别任务时,会先拿预训练模型跑 200 张业务相关图片,生成一组基线数据,统计哪些动作被漏检、哪些关键点频繁丢失,再决定是调预处理还是去准备标注数据做微调。这种方式比一上来就调网络参数更高效,因为大部分业务问题根本不在模型结构上,而是画面角度、遮挡、分辨率这些数据问题。预训练权重解决的是通用场景,业务指标落地还是要靠后处理逻辑和少量针对性的数据修正,两条腿走路,项目后期才不会返工。这套流程我反复用下来,最深的体会是:先跑通再调准,比先研究论文再动手高效得多。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 1:06:58

手搭计算机基础门:XOR、Mux与DMux的实现与调试指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 1:06:13

双节锂电池主动均衡设计:MP2642GR-Z与PIC18F46K42实战方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 1:06:07

JOS bootloader详解:从实模式到保护模式的内核加载全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 1:05:58

RAPID:从人类示范生成可执行机器人程序的新范式

1. 项目概述:当机器人开始“看懂”人类动作并自动生成可执行程序RAPID——全称 Robot Agentic Programming from Demonstrations,不是某个新出的OCR工具,也不是云端文档扫描服务,更和“rapid ocr onnx是云端还是本地”这种纯视觉识…

作者头像 李华
网站建设 2026/10/16 1:05:28

51单片机按键与数码管协同实战:消抖、动态扫描与时间片轮询

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 1:05:25

易语言封装CreateThread线程API模块:句柄管理与参数传递实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华