• YOLOv8-pose针对视频实时提取打印对应关节点序号及坐标


    因为我在找如何提取YOLOv8-pose的关键点的时候,大多都是针对静态图像,视频直接套用不太行,因此就改进了一下,如下:

    初步代码:

    1. import torch # 导入PyTorch库
    2. import cv2 as cv # 导入OpenCV库并重命名为cv
    3. import numpy as np # 导入NumPy库并重命名为np
    4. from ultralytics.data.augment import LetterBox # 从ultralytics.data.augment中导入LetterBox类
    5. from ultralytics.utils import ops # 从ultralytics.utils中导入ops模块
    6. from ultralytics.engine.results import Results # 从ultralytics.engine.results中导入Results类
    7. import copy # 导入copy模块
    8. # 视频路径
    9. video_path = 'D:/cs/yolov8_2/ultralytics/ceshi1.mp4' # 将此处路径改为你的视频文件路径
    10. device = 'cuda:0' # 设备类型,此处使用CUDA
    11. conf = 0.25 # 置信度阈值
    12. iou = 0.7 # IoU(交并比)阈值
    13. # 加载视频
    14. cap = cv.VideoCapture(video_path)
    15. # 检查视频是否成功打开
    16. if not cap.isOpened():
    17. print("Error: Could not open video.") # 打印错误消息
    18. exit() # 退出程序
    19. # 加载模型
    20. ckpt = torch.load('yolov8n-pose.pt', map_location='cpu') # 加载模型参数
    21. model = ckpt['model'].to(device).float() # 将模型加载到指定设备(CPU或GPU)并转换为浮点数类型
    22. model.eval() # 将模型设置为评估模式
    23. results = [] # 存储结果的列表
    24. while True:
    25. ret, frame = cap.read() # 读取视频帧
    26. # 如果没有读取到帧或者视频结束,则退出循环
    27. if not ret:
    28. break
    29. orig_img = frame # 原始图像
    30. # 预处理
    31. im = [orig_img] # 图像列表
    32. im = [LetterBox([640, 640], auto=True, stride=32)(image=x) for x in im] # 对图像进行LetterBox缩放
    33. im = im[0][None] # 转换为数组形式
    34. im = im[..., ::-1].transpose((0, 3, 1, 2)) # BGR转RGB,BHWC转BCHW
    35. im = np.ascontiguousarray(im) # 转换为连续的内存布局
    36. im = torch.from_numpy(im) # 将数组转换为PyTorch张量
    37. img = im.to(device) # 将张量移动到指定设备
    38. img = img.float() # 转换为浮点数类型
    39. img /= 255 # 归一化
    40. # 推理
    41. preds = model(img) # 模型推理
    42. prediction = ops.non_max_suppression(preds, conf, iou, agnostic=False, max_det=300, classes=None, nc=len(model.names)) # 非最大抑制得到预测结果
    43. for i, pred in enumerate(prediction):
    44. shape = orig_img.shape # 图像形状
    45. pred[:, :4] = ops.scale_boxes(img.shape[2:], pred[:, :4], shape).round() # 缩放边界框坐标
    46. pred_kpts = pred[:, 6:].view(len(pred), *model.kpt_shape) if len(pred) else pred[:, 6:] # 获取关键点坐标
    47. pred_kpts = ops.scale_coords(img.shape[2:], pred_kpts, shape) # 缩放关键点坐标
    48. results.append(
    49. Results(orig_img=orig_img, # 原始图像
    50. path=video_path, # 视频路径
    51. names=model.names, # 类别名称
    52. boxes=pred[:, :6], # 边界框
    53. keypoints=pred_kpts)) # 关键点
    54. # 获取关键点坐标及其对应的序号
    55. for j, kpts in enumerate(pred_kpts):
    56. keypoints = kpts.cpu().numpy() # 将关键点转换为NumPy数组
    57. # keypoints 包含了所有关键点的坐标,每一行是一个关键点的坐标
    58. # 根据模型的结构,关键点序号可能是从0到N-1,N是关键点的总数
    59. # 您可以在这里使用 keypoints 获取关键点的坐标和对应的序号
    60. for k, keypoint in enumerate(keypoints):
    61. x, y = keypoint[:2] # 关键点的坐标
    62. keypoint_index = k # 关键点的序号
    63. # 这里可以对每个关键点的坐标和序号执行您需要的操作
    64. print("关键点序号:", keypoint_index, "关键点坐标:", (x, y))
    65. # 显示帧
    66. plot_args = {'line_width': None, 'boxes': True, 'conf': True, 'labels': True} # 绘图参数
    67. plot_args['im_gpu'] = img[0] # 图像张量
    68. plotted_img = results[-1].plot(**plot_args) # 显示处理后的最后一帧结果
    69. cv.imshow('plotted_img', plotted_img) # 显示图像
    70. # 按 'q' 键退出
    71. if cv.waitKey(1) & 0xFF == ord('q'):
    72. break
    73. # 释放视频捕获并关闭所有窗口
    74. cap.release()
    75. cv.destroyAllWindows()

    效果:

  • 相关阅读:
    如何有效进行回顾会议(上)?
    基于Ubuntu Kylin系统在Hadoop的环境下调用MapReduce对单词WordCount计数
    【postgresql】 ERROR: multiple assignments to same column “XXX“
    常见的Web前端开发框架推荐
    vue-slot插槽
    [应用推荐]Web Scraper——轻量数据爬取利器
    对话杨传辉:国产数据库新战绩背后,OceanBase坚持自研的初心与决心
    手动与使用骨架创建Maven工程idea版及tomcat插件安装与web工程启动
    jupyter notebook的markdown语法不起作用
    UE4 Niagara 关卡3.1官方案例解析二
  • 原文地址:https://blog.csdn.net/m0_70694811/article/details/138176171