现在需要识别人物的肢体(姿态/骨骼关键点),即所谓的「姿态估计(pose estimation)」,以下是一些主流、训练好可直接使用的开源模型推荐,支持多人识别与骨骼关键点检测,适合你后续用于游戏人物识别、交互、动作捕捉等场景:

✅ 推荐姿态识别模型(已训练好)

模型名称框架支持多人关键点数量优势预训练模型
OpenPoseCaffe / PyTorch✅ 是COCO:18个开源先驱,稳定
MediaPipe PoseGoogle❌ 单人33个极快、跨平台、轻量
YOLOv8-PoseUltralytics✅ 是COCO:17个YOLO框架下最简单、集成好
MMPosePyTorch✅ 是自定义精度高、支持多种后端

✅ 最推荐:YOLOv8-Pose(Ultralytics 出品)

之前已经使用 YOLOv8 检测人物,所以最推荐你用它的姿态版本 yolov8n-pose.pt上手最快,兼容性最好。

🔧 安装

pip install ultralytics

📦 下载模型

Ultralytics 官方已训练好模型,可以使用以下模型之一:

# 模型文件将自动下载,无需手动操作
yolov8n-pose.pt     # 最快(轻量)
yolov8s-pose.pt     # 较准
yolov8m-pose.pt     # 精度更高
yolov8l-pose.pt     # 更大模型

✅ 示例代码:YOLOv8-Pose 实时检测人物骨骼

from ultralytics import YOLO
import cv2# 加载模型
model = YOLO('yolov8n-pose.pt')  # 或 yolov8m-pose.pt 等# 打开视频(可用手机视频流)
cap = cv2.VideoCapture('/path/to/your/video.mp4')while cap.isOpened():ret, frame = cap.read()if not ret:breakresults = model(frame)annotated_frame = results[0].plot()  # 画出骨骼关键点cv2.imshow("Pose Estimation", annotated_frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

这段代码使用了 yolov8n-pose.pt(YOLOv8 的轻量级姿态识别模型),但在播放视频过程中卡顿,很可能是由于以下原因造成的:

✅ 卡顿可能原因分析

原因类别说明
模型性能瓶颈yolov8n-pose.pt 虽然是最小模型,但仍可能对低配 CPU 压力大
显示速度瓶颈cv2.imshow() 是同步操作,每帧都等待窗口刷新(受屏幕刷新率、OpenCV渲染影响)
视频分辨率过高如果视频是 1080P 或更高,会加重解码和模型推理的负担
无硬件加速YOLOv8 默认使用 CPU 推理,若没有启用 GPU,会慢很多

 

✅ 优化方案

✅ 1. 设置模型为半精度模式(加速推理)

model.half() # 仅在 CUDA/GPU 可用时有效(需确保模型也支持) 

✅ 2. 降低输入图像尺寸

results = model(frame, imgsz=416) # 默认是 640,可改为 416 提高速度 

✅ 3. 使用线程预读取视频帧(避免显示阻塞)

可以用 cv2.VideoCapture 配合线程读取帧(如需我提供代码也可说)。


✅ 4. 保存视频结果,避免实时显示卡顿

如果你主要是处理分析而不是观看,可以改为保存视频(显示太慢):

out = cv2.VideoWriter("pose_output.mp4", cv2.VideoWriter_fourcc(*'mp4v'), 20, (frame.shape[1], frame.shape[0])) while cap.isOpened(): ret, frame = cap.read() if not ret: break results = model(frame, imgsz=416) annotated_frame = results[0].plot() out.write(annotated_frame) out.release() cap.release() 

✅ 5. 确认是否使用 GPU

如果你安装的是 ultralytics 的默认版本,它会自动调用 CUDA(如果有 GPU),否则使用 CPU:

 

import torch print("CUDA:", torch.cuda.is_available()) 

如果你没有用 GPU,但机器上有显卡,建议配置 PyTorch 的 CUDA 支持版本(我可以帮你装)。


✅ 6. 使用 TensorRT / OpenVINO 加速模型(高级优化)

适用于部署阶段,你可以将 YOLOv8 模型导出为:

yolo export model=yolov8n-pose.pt format=onnx 
yolo export model=yolov8n-pose.pt format=tensorrt 

 

✅ 总结推荐

方案推荐程度说明
降低 imgsz=416⭐⭐⭐⭐简单直接,提升明显
保存视频而非显示⭐⭐⭐⭐避免实时显示阻塞
使用 GPU 加速⭐⭐⭐⭐⭐最大性能提升
导出为 TensorRT 加速⭐⭐⭐部署时推荐,高性能

 🧪【优化版代码】(使用小模型、降分辨率、GPU、帧跳过)

import cv2
import numpy as np
from ultralytics import YOLO
from filterpy.kalman import KalmanFilter
import torch# 加载 YOLOv8 Nano Pose 模型
model = YOLO("yolov8n-pose.pt")
if torch.cuda.is_available():model.to('cuda')# 打开视频流
cap = cv2.VideoCapture('/Users/lianying/Desktop/yolo/和平精英/hpjy3.mp4')# 输出视频保存(可选)
out = cv2.VideoWriter("pose_output3.mp4", cv2.VideoWriter_fourcc(*'mp4v'), 25,(int(cap.get(3)), int(cap.get(4))))# 初始化卡尔曼滤波器
kf = KalmanFilter(dim_x=4, dim_z=2)
kf.x = np.array([0, 0, 0, 0])
kf.F = np.array([[1, 0, 1, 0],[0, 1, 0, 1],[0, 0, 1, 0],[0, 0, 0, 1]])
kf.H = np.array([[1, 0, 0, 0],[0, 1, 0, 0]])
kf.P *= 1000.0
kf.R = 5
kf.Q = np.eye(4)skeleton = [(5, 7), (7, 9), (6, 8), (8, 10), (11, 13), (13, 15),(12, 14), (14, 16), (5, 6), (11, 12), (0, 1), (1, 2),(2, 3), (3, 4)]frame_id = 0
skip_rate = 1  # 每隔几帧识别一次while True:ret, frame = cap.read()if not ret:breakframe_id += 1display_frame = frame.copy()# 降低分辨率处理resized = cv2.resize(frame, (416, 416))if frame_id % skip_rate == 0:results = model(resized, imgsz=416)[0]for pose in results.keypoints:keypoints = pose.xy[0].cpu().numpy()# 坐标映射回原图scale_x = frame.shape[1] / 416scale_y = frame.shape[0] / 416keypoints *= [scale_x, scale_y]cx, cy = keypoints[5:7].mean(axis=0)kf.predict()kf.update(np.array([cx, cy]))cx_kf, cy_kf = int(kf.x[0]), int(kf.x[1])cv2.circle(display_frame, (cx_kf, cy_kf), 5, (255, 0, 0), -1)for x, y in keypoints:cv2.circle(display_frame, (int(x), int(y)), 3, (0, 255, 0), -1)for i, j in skeleton:if keypoints[i][0] > 0 and keypoints[j][0] > 0:pt1 = tuple(np.int32(keypoints[i]))pt2 = tuple(np.int32(keypoints[j]))cv2.line(display_frame, pt1, pt2, (0, 255, 255), 2)cv2.imshow("Pose Tracking", display_frame)out.write(display_frame)  # 如果需要保存if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
out.release()
cv2.destroyAllWindows()

yolo8模型训练+实时识别目标+骨骼关键点识别(和平精英敌人)

 🎯添加动作识别(比如:蹲下、跳跃、开枪)

✅ 第一步:用关键点判断动作(规则法)

我们先用一种 简单有效的规则法,通过人体关键点的位置和角度判断动作。

🎯 支持识别的动作

动作判定逻辑
蹲下膝盖高度接近或低于髋部
跳跃脚部 Y 坐标明显上升
开枪手部(腕)前伸、肩膀抬高

✅ 第二步:代码示例(集成到 YOLOv8 Pose 结果中)

以下是 在你现有代码基础上添加动作识别逻辑 的修改版:

def detect_action(keypoints):"""简单规则:根据关键点判断人物动作关键点索引说明(COCO格式):0:鼻 1:左眼 2:右眼 3:左耳 4:右耳5:左肩 6:右肩 7:左肘 8:右肘9:左腕 10:右腕 11:左髋 12:右髋13:左膝 14:右膝 15:左脚踝 16:右脚踝"""def y(i):  # 返回某关键点y坐标return keypoints[i][1]def distance(p1, p2):return np.linalg.norm(keypoints[p1] - keypoints[p2])# 获取关键点存在性(某些关键点可能检测失败)valid = lambda i: keypoints[i][0] > 0 and keypoints[i][1] > 0if all(valid(i) for i in [11, 12, 13, 14]):hip_y = (y(11) + y(12)) / 2knee_y = (y(13) + y(14)) / 2if knee_y < hip_y - 20:  # 蹲下,膝盖高于髋return "蹲下"if all(valid(i) for i in [15, 16]):ankle_avg_y = (y(15) + y(16)) / 2if ankle_avg_y < 300:  # 跳跃(需要根据视频画面高度调整)return "跳跃"if all(valid(i) for i in [5, 6, 9, 10]):arm_len = (distance(5, 9) + distance(6, 10)) / 2if arm_len > 120:  # 手臂伸直的距离(根据画面缩放调整)return "开枪"return None

✅ 整合到主循环中

你只需在你的 YOLOv8 主循环中这样调用:

for pose in results.keypoints:keypoints = pose.xy[0].cpu().numpy()# 调用动作识别函数action = detect_action(keypoints)if action:cv2.putText(frame, f"动作: {action}", (30, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

 

✅ 显示完整融合效果

你运行时将能看到:

  • 骨架识别 ✅

  • 人物动作识别并显示到屏幕 ✅

📌 提升建议(如需更准)

  1. 基于时序特征:

    • 使用 LSTMTransformer 模型,对连续帧的关键点数据进行训练。

    • 比如:开枪=“手臂突然向前伸+ recoil 反弹动作”。

  2. 自定义动作数据集:

    • keypoints 序列做样本,结合标签训练自己的动作分类模型。

 

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

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

相关文章

MyBatis动态SQL全解析:五大核心标签实战指南

MyBatis动态SQL全解析&#xff1a;五大核心标签实战指南 一、动态SQL的价值&#xff1a;告别硬编码时代 传统SQL拼接的痛点 // 传统方式需要手动拼接SQL字符串 StringBuilder sql new StringBuilder("SELECT * FROM orders WHERE 11"); if (status ! null) {sql.app…

线上 CPU 过高怎么排查

通过以下几个命令解决1、top命令&#xff0c;找到 CPU 过高的pid(进程); ​编辑 2、根据pid(进程)找到CPU过高的线程id;top -H -p pid(进程)3、把线程id转换16 进制的printf 0x%x\n 线程id4、导致CPU 飙升的线程异常信息&#xff0c;-A 30表示打印 30 行记录jstack pid(进程id)…

Letter Combination of a Phone Number

IntroduceProblem Analysis (Using “258” as example) //2 a b c //5 j k l //8 t u vPossible letter combinations: a, j, t (no further options, this is one combination)a, j, u (no further options, another combination)a, j, v (another c…

【问题解决】npm包下载速度慢

问题描述&#xff1a; npm包下载速度慢 问题原因&#xff1a; 为什么下载 npm 包速度慢&#xff1f; 在使用npm下包的时候&#xff0c;默认从国外的https://regitry.npmjs.org/服务器进行下载。此时&#xff0c;网络数据的传输需要经过漫长的海底光缆&#xff0c;因此下包速度…

Apache DolphinScheduler介绍与部署

目录 一、软件介绍 1、软件概述 2、发展历史 3、名词解释 4、模块介绍 软件部署 1、下载发布包 2、上传与解压 3、启动 4、浏览器验证 一、软件介绍 1、软件概述 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&…

Selenium 启动的浏览器自动退出问题分析

当 Selenium 启动的浏览器自动关闭时&#xff0c;通常是由于以下原因导致的&#xff1a;1. 脚本执行完毕原因&#xff1a;Selenium 脚本执行到末尾时&#xff0c;如果没有保持浏览器打开的代码&#xff08;如time.sleep()或循环&#xff09;&#xff0c;浏览器会自动关闭。解决…

rust实现的快捷补全到剪贴板的实用工具

最近在兼职项目中老是遇到这样的场景&#xff1a; 在云服务器之间通过scp命令传输文件&#xff0c;密码太长记不住(客户服务器不方便ssh-copy-id)在服务器上使用mysql命令登录修改数据&#xff0c;数据库密码太长记不住&#xff08;客户设置的密码&#xff0c;直接改掉哈&#…

信息系统风险的安全技术防范思路

针对信息系统风险的安全技术防范思路 降低风险&#xff0c;即提升了安全能力和水平 保护资产 加强信息系统软硬件及数据安全保护&#xff1b;减少脆弱性 通过研发、部署、应用各环节来尽量减少或避免脆弱性&#xff1b;应对威胁 采取防御措施&#xff0c;实施攻防对抗。

Java项目:基于SSM框架实现的网盘管理系统【ssm+B/S架构+源码+数据库+毕业论文】

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此文件信息的管理…

Echart 地图放大缩小

文章目录 常用方法 1. **开启 `roam` 属性** 2. **通过鼠标滚轮或手势缩放** 3. **设置初始缩放比例** 4. **通过按钮控制缩放** 5. **限制缩放范围** 6. **监听缩放和平移事件** 7. **结合 `dataZoom` 实现数据缩放** 总结 相关文章 在 ECharts 中,可以通过设置地图的 roam …

针对VMware虚拟化环境迁移的复杂场景,我将从技术架构、迁移方案、代码实现、可视化流程四个维度进行专业解析,并提供完整的解决方案框架。

针对VMware虚拟化环境迁移的复杂场景&#xff0c;我将从技术架构、迁移方案、代码实现、可视化流程四个维度进行专业解析&#xff0c;并提供完整的解决方案框架。一、技术架构分析&#xff08;架构图表格对比&#xff09;graph TDA[源环境] -->|vMotion| B[目标环境]A -->…

揭秘 AIGC 背后的技术:GPT、BERT 与 Transformer 模型的工作原理

一、引言AIGC 的崛起与重要性人工智能生成内容&#xff08;AIGC&#xff09;已经不再是未来的技术&#xff0c;它正以惊人的速度渗透到各行各业&#xff0c;重新定义了内容创作、媒体生产、甚至人类认知的边界。从深度学习到大规模自然语言处理&#xff0c;AIGC 的崛起代表着一…

Compose笔记(三十五)--ModalBottomSheetLayout

这一节主要了解一下Compose中的ModalBottomSheetLayout&#xff0c;在Jetpack Compose开发中&#xff0c;ModalBottomSheetLayout是Material Design组件库中用于实现模态底部面板的核心组件&#xff0c;其核心作用是通过声明式API管理底部面板的显示、隐藏及交互逻辑。API Moda…

AWS Partner: Accreditation (Technical)

AWS Partner: Accreditation &#xff08;Technical&#xff09;AWS 核心技术简介云计算的优势AWS 全球基础设施核心技术&#xff1a;计算 Amazon Elastic Compute Cloud (Amazon EC2)存储数据库联网安全性从服务到解决方案解决方案设计简介迁移策略架构最佳实践AWS Well-Archi…

【52】MFC入门到精通——(CComboBox)下拉框选项顺序与初始化不一致,默认显示项也不一致

文章目录1 问题描述2 问题分析与解决上一讲&#xff0c;我们实现了MFC串口助手初级版。 MFC入门到精通——MFC串口助手(一)—初级版&#xff08;串口设置、初始化、打开/关闭、状态显示&#xff09;,附源码1 问题描述 程序运行后串口默认参数&#xff0c;与我们预期不完全一致…

Astro:前端性能革命!从原生 HTML 到 Astro + React 的升级指南

为什么程序员必须关注 Astro在网站性能和 SEO 日益关键的今天&#xff0c;静态站点生成&#xff08;SSG&#xff09;再次成为焦点。Astro 作为一款专为内容驱动网站设计的现代前端框架&#xff0c;正引领一场轻盈革命。它强调服务器优先渲染&#xff0c;将页面预先转为纯 HTML&…

格式转换Total Excel Converter:20 种格式XLS XLSX 批量转 PDFWord

各位办公小能手们&#xff01;今天给大家介绍一款超厉害的软件&#xff0c;叫Total Excel Converter&#xff0c;软件下载地址安装包 它可是专业的Excel文件格式转换工具。你知道吗&#xff0c;它能把Excel工作簿&#xff0c;像XLS、XLSX、XLSM这些格式&#xff0c;批量转换成…

Thread,ThreadLocal,ThreadLocalMap 三者的关系, 以及在实际开发中的应用【AI记录用】

在 Java 多线程编程中&#xff0c;Thread、ThreadLocal 和 ThreadLocalMap 是三个紧密相关的类&#xff0c;它们共同构成了 Java 中**线程本地变量&#xff08;Thread-Local Storage&#xff09;**机制的基础。下面我将从 三者的关系、实现原理 以及 实际开发中的应用 三个方面…

[故障诊断方向]SNNs:针对小样本轴承故障诊断的孪生神经网络模型

目录 1. ​引言与背景总结​ 2. ​方法框架总结​ 3. ​训练策略总结​ 4. ​实验验证总结​ 核心代码实现&#xff08;PyTorch框架&#xff09; ​1. SNN特征提取器&#xff08;多尺度卷积模块&#xff09; ​结论与未来工作总结​ 1. ​引言与背景总结​ ​问题陈述​…

Java中缓存的使用浅讲

Java中缓存的使用浅讲在Java中&#xff0c;缓存系统的使用对于提升应用性能至关重要。缓存的作用主要是减少访问慢速存储&#xff08;如数据库或文件系统&#xff09;的频率&#xff0c;从而提高应用的响应速度。以下是对Java中缓存系统的全面讲解&#xff0c;包括缓存的类型、…