当前位置: 首页 > news >正文

动作识别13——实时动作识别之yolo26s-pose+PoseC3D

目录

一、前言

二、实时动作识别代码

三、允许输入路径是文件夹路径

三、总结


一、前言

        yolo26的代码仓库:

https://github.com/ultralytics/ultralytics

        mmaction2的代码仓库:

https://github.com/open-mmlab/mmaction2/tree/main

        关于实时动作识别的效果,我这边跑通了之后,在本机RTX-A2000显存16G的GPU显卡上FPS平均有20多,这个速度还是能接受的。后续有空我会上传到GitCode。

        这个代码主要是集成算法进行训练,没有在算法层面做优化,后续我会考虑从底层算法进行优化,思路已经有了,但是优化难道比较大,我会在后面的文章提到优化思路并且尝试优化算法。

二、实时动作识别代码

        我们简要说一下这个方案,就是yolo26s-pose提取人体骨骼点,然后用yolo跟踪每个人的轨迹,然后得到每个人的骨架序列,有了骨架序列之后就能输入到PoseC3D算法进行动作分类。

        那么既然PoseC3D算法是输入一段骨架序列,输出一个动作分类结果。在实时的视频流里面怎么去实时的识别动作呢?方法就是每输入48帧进行一次动作识别,然后搞个队列,设置每新进24帧(可更改)到队列里面,就丢弃前面的帧,保持整个队列是48帧进行一次动作识别,相当于用队列的方式实现滑动窗口。这里有个小的缺陷,就是我们显示的时候,是输入了48帧之后才去识别动作的,这导致在下一个48帧里面才会显示上一个48帧的动作识别结果,也就是说显示上会有一点点滞后,但实际上48帧触发的动作分类是正确的,而且这种滞后实际上不会有太明显的感受(在我们实测视频显示结果里面,没有过大的延迟感)

        yolo26pose_PoseC3D.py

# Copyright (c) OpenMMLab. All rights reserved. import time import argparse import queue import tempfile import cv2 import mmcv import mmengine import numpy as np import torch import os from mmengine import DictAction from mmengine.utils import track_iter_progress from mmaction.apis import inference_skeleton, init_recognizer from mmaction.registry import VISUALIZERS from mmaction.utils import frame_extract try: from ultralytics import YOLO except ImportError: raise ImportError('Please install ultralytics to use YOLOv26 pose model') FONTSCALE = 1.2 # 从 0.75 增大到 1.2(1.6倍) THICKNESS = 2 # 从 1 增大到 2 # 新增 FPS 专用大字体参数 FPS_FONTSCALE = 1.5 # FPS 更大 FPS_THICKNESS = 3 # FPS 更粗 FPS_COLOR = (0, 255, 0) # 亮绿色 # 添加字体相关常量定义 FONTFACE = cv2.FONT_HERSHEY_SIMPLEX # 字体类型 FONTCOLOR = (255, 255, 255) # 白色文字 LINETYPE = cv2.LINE_AA # 抗锯齿线型,更平滑 # COCO 关键点连接关系(用于绘制骨架) SKELETON = [ [15, 13], [13, 11], [16, 14], [14, 12], [11, 12], # 下肢 [5, 11], [6, 12], [5, 6], [5, 7], [6, 8], [7, 9], [8, 10], # 躯干和上肢 [1, 2], [2, 3], [3, 4], [1, 0], [0, 4] # 头部和面部 ] # 关键点颜色(可选) POSE_COLOR = (0, 255, 0) # 绿色 LINK_COLOR = (255, 0, 0) # 蓝色 def parse_args(): parser = argparse.ArgumentParser(description='MMAction2 real-time demo') input_dir= r"D:\zero_track\mmaction2\my_code\input" input_video_name = "fisheye_back_2026-01-29-14-13-15_30fps.mp4" input_video_path = input_dir + os.sep + input_video_name output_video_path = input_dir + os.sep + "output_" + input_video_name parser.add_argument('--video', help='video file/url or camera index (e.g. 0)', default=input_video_path) parser.add_argument('--out-filename', help='output filename (optional)', default=output_video_path) parser.add_argument('--no-action', action='store_true', default=False, help='disable action recognition, only run pose estimation') parser.add_argument('--no-skeleton', action='store_true', help='disable drawing skeleton', default=True,) parser.add_argument('--no-bbox', action='store_true', help='disable drawing bounding boxes', default=False,) parser.add_argument('--inference-interval',type=int,default=24,help='每累积多少帧进行一次动作识别推理 (默认: 24)') parser.add_argument( '--config', default=('configs/skeleton/posec3d/' 'slowonly_r50_8xb16-u48-240e_ntu60-xsub-keypoint_my.py'), help='skeleton model config file path') parser.add_argument( '--checkpoint', default=r"D:\zero_track\mmaction2\work_dirs\slowonly_r50_8xb16-u48-240e_ntu60-xsub-keypoint\20260202_173400_best\best_acc_top1_epoch_13.pth", help='skeleton model checkpoint file/url') parser.add_argument( '--yolo-model', default='checkpoints/yolo26s-pose.pt', help='YOLOv26 pose model file path (default: yolov26s-pose.pt)') parser.add_argument( '--label-map', default='tools/data/skeleton/label_map_ntu60.txt', help='label map file') parser.add_argument( '--device', type=str, default='cuda:0', help='CPU/CUDA device option') parser.add_argument( '--short-side', type=int, default=480, help='resize the short side of the frame to this value') parser.add_argument( '--cfg-options', nargs='+', action=DictAction, default={}, help='override some settings in the used config, the key-value pair ' 'in xxx=yyy format will be merged into config file.') args = parser.parse_args() return args def convert_yolo_to_mmaction(results, img_shape): """ 将 YOLOv26 姿态估计结果转换为 MMAction2 可接受的格式。 Args: results: YOLOv26 预测结果对象 img_shape: (h, w) 原始图像尺寸 Returns: pose_results: 字典列表,每个字典包含 keypoints 和 keypoint_scores """ pose_results = [] # 检查是否有检测到的人体关键点 if (results[0].keypoints is not None and results[0].keypoints.data is not None and len(results[0].keypoints.data) > 0): # 取置信度最高的人(或所有人,这里简化取第一个) kpts_data = results[0].keypoints.data[0].cpu().numpy() # shape (17, 3) keypoints = kpts_data[:, :2] # (17, 2) scores = kpts_data[:, 2] # (17,) # 归一化坐标(如果需要,模型可能要求绝对坐标,这里保持绝对坐标) keypoints = keypoints.astype(np.float32) scores = scores.astype(np.float32) # 构造与 mmpose 输出类似的字典 pose_results.append({ 'keypoints': keypoints[np.newaxis, ...], # (1, 17, 2) 'keypoint_scores': scores[np.newaxis, ...] # (1, 17) }) else: # 没有检测到人,返回空关键点(全零) keypoints = np.zeros((1, 17, 2), dtype=np.float32) scores = np.zeros((1, 17), dtype=np.float32) pose_results.append({ 'keypoints': keypoints, 'keypoint_scores': scores }) return pose_results def main(): args = parse_args() # 加载动作识别模型 config = mmengine.Config.fromfile(args.config) config.merge_from_dict(args.cfg_options) model = init_recognizer(config, args.checkpoint, args.device) # 加载 YOLOv26 姿态模型 yolo_model = YOLO(args.yolo_model) # 打开视频 cap = cv2.VideoCapture(args.video if not args.video.isdigit() else int(args.video)) if not cap.isOpened(): raise RuntimeError(f'Failed to open video source: {args.video}') ret, frame = cap.read() if not ret:
http://www.jsqmd.com/news/490819/

相关文章:

  • C++记一次文件输入字符串解析成数字不正常的情况
  • Stable Yogi Leather-Dress-Collection实战入门:动漫风格皮衣生成全流程演示
  • 记录C++学习细节
  • 【学习记录】1.PS.2.如何给图片打马赛克?
  • Gemma-3-270m轻量部署:在2核4GB云服务器上稳定支撑20QPS并发
  • DeEAR语音情感识别效果验证:人工标注专家与DeEAR三维度评分相关性达0.83
  • OpenClaw 接入阿里云 Coding Plan 完整教程:支持 Qwen3.5/GLM-5/Kimi 多模型
  • c语言指针篇
  • 第八届信息科学、电气与自动化工程国际学术会议(ISEAE 2026)
  • FLUX.小红书极致真实V2惊艳效果:小红书风‘高级感’配色与留白美学呈现
  • Java签名防篡改:我用HMAC干翻“配置被改”资损事故!附保姆级避坑指南
  • YOLOv11改进策略【卷积层】| arXiv 2025 加权卷积Weighted Conv 密度函数提表征 + 零参扩展降负担,提升目标检测精度
  • C程序中隐藏的数据溢出陷阱
  • SmallThinker-3B-Preview效果惊艳:支持多跳推理的复杂因果关系分析实例
  • Gemini 3深度量化分析:Google的万亿参数巨兽到底有多强?
  • Tabularis:一款面向开发者的轻量级数据库管理工具
  • File的用法
  • LLM大规模数据的组织检索方法
  • 30款IDEA插件宝贝,开发效率yyds!
  • 基于博途V16的程序:传送带机械手工件搬运监控系统
  • HAC集群切换后断档问题处理
  • GPT-5.4 深夜上线!百万上下文+原生操作电脑,OpenClaw 天选模型来了!【附GPT升级教程】
  • Matplotlib绘制拆线图自定义曲线颜色显示
  • JAVA今日面经(一)
  • 发电机组并网技术研究
  • 工业物联网百科全书
  • 立创开源广场自动签到脚本V1.1
  • KMP算法之 next 数组的计算
  • 净水器行业的下一步:从卖设备到卖服务
  • 「OpenClaw 实战全攻略」:从打造 Second Brain 到服务器自愈,20+ 真实落地场景解析