使用预训练的 ONNX 格式的目标检测模型(基于 YOLOv8n-pose)姿态监测

news2024/9/20 19:43:49

具体步骤如下:

  1. 加载图像:

    • 从指定路径读取一张图像(这里假设图像名为bus.jpg)。
    • 将图像从 BGR 颜色空间转换为 RGB 颜色空间。
  2. 图像预处理:

    • 计算图像的高度、宽度,并确定其中的最大值作为新图像的边长。
    • 创建一个全零的新图像,大小为最长边的正方形,将原始图像复制到新图像中,确保图像的边长是最长边的长度。
    • 将新图像调整为640x640的大小,并进行转置和像素值归一化处理,最后添加一个维度以满足模型输入要求。
  3. 模型推理:

    • 使用onnxruntime加载预训练的 ONNX 模型。
    • 将预处理后的图像输入模型进行推理,得到模型的输出结果。
  4. 结果筛选:

    • 对模型输出结果进行转置操作,然后根据置信度阈值筛选出置信度大于 0.8 的检测结果。
    • 提取这些结果中的边界框信息和置信度,并使用 OpenCV 的非极大值抑制算法去除重叠的边界框,得到最终的检测结果。
  5. 绘制结果:

    • 遍历最终的检测结果,对于每个检测结果,计算边界框的四个顶点坐标,并在原始图像上绘制矩形框。
    • 将检测结果中除边界框和置信度之外的部分按照每三个元素一组进行分割,得到关键点信息。对于每个关键点,根据缩放比例计算其在原始图像中的坐标,并在图像上绘制一个红色的小圆点。
  6. 显示图像:

    • 显示绘制了检测结果的图像。
    • 等待用户按下任意键退出程序,并关闭所有窗口。
import cv2
import numpy as np
import onnxruntime as ort
from ultralytics import YOLO

导入了所需的库,包括 OpenCV(cv2)用于图像处理,numpy用于数值计算,onnxruntime用于加载和运行 ONNX 模型,以及ultralyticsYOLO类用于对象检测。

# model = YOLO('yolov8n-pose.pt')
# model.export(format='onnx')
img_path = ''
frame = cv2.imread('bus.jpg')

使用ultralyticsYOLO模型加载一个名为yolov8n-pose.pt的预训练模型,并将其导出为 ONNX 格式。随后,使用cv2.imread读取一张名为bus.jpg的图像,并将其存储在frame变量中。

rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, c = rgb_frame.shape
max_slide = max(h, w)
bg_img = np.zeros((max_slide, max_slide, 3), dtype=np.float32)
bg_img[:h, :w] = rgb_frame

将读取的图像从 BGR 颜色空间转换为 RGB 颜色空间。然后计算图像的高度、宽度和通道数,并找到高度和宽度中的较大值作为max_slide。创建一个全零的图像,大小为max_slide x max_slide x 3,然后将原始图像复制到这个新图像中,确保新图像的边长是图像最长边的长度。

image = cv2.resize(bg_img, dsize=(640, 640))
image = np.transpose(image, (2, 0, 1)) / 255
image = np.expand_dims(image, 0)
scale = max_slide / 640

将处理后的图像调整为640x640的大小。接着,对图像进行转置操作并将像素值归一化到[0, 1]范围,然后使用np.expand_dims在第一个维度上添加一个维度,以便符合模型输入的要求。同时,计算图像缩放比例。

session = ort.InferenceSession('yolov8n-pose.onnx', providers=['CPUExecutionProvider'])
input_name = session._inputs_meta[0].name
session_out = session.run(None, {input_name: image})[0][0]

使用onnxruntime加载名为yolov8n-pose.onnx的模型,并指定使用 CPU 进行推理。获取模型输入的名称,并将预处理后的图像输入模型进行推理,得到输出结果。

result = np.transpose(session_out, (1, 0))
result = result[result[:, 4] > 0.8]
bboxes = result[:, 0:4]
confs = result[:, 4]

对模型输出结果进行转置操作,然后筛选出置信度大于 0.8 的检测结果。提取出这些结果中的边界框信息和置信度。

idx = cv2.dnn.NMSBoxes(bboxes, confs, score_threshold=0.5, nms_threshold=0.3)
res = result[idx]

使用 OpenCV 的非极大值抑制(NMS)算法,对检测结果进行筛选,去除重叠的边界框。得到最终的检测结果。

for re in res:
    cx, cy, w, h = re[:4]
    x1 = (cx - w // 2) * scale
    y1 = (cy - h // 2) * scale
    x2 = (cx + w // 2) * scale
    y2 = (cy + h // 2) * scale
    x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
    conf = re[5]
    cv2.rectangle(frame, (x1, y1),( x2, y2), color=(0, 255, 1), thickness=3, lineType=cv2.LINE_AA)
    kpoints = np.split(re[5:], re[5:].shape[0] // 3)
    for kpoint in kpoints:
        x_, y_, visibility = kpoint
        x_ = int(x_ * scale)
        y_ = int(y_ * scale)
        cv2.circle(frame, center=(x_, y_), radius=2, color=(0, 0, 255), thickness=2)

遍历最终的检测结果,对于每个检测结果,计算边界框的四个顶点坐标,并在原始图像上绘制矩形框。然后,将检测结果中除边界框和置信度之外的部分按照每三个元素一组进行分割,得到关键点信息。对于每个关键点,根据缩放比例计算其在原始图像中的坐标,并在图像上绘制一个红色的小圆点。

cv2.imshow('win', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

最后,显示处理后的图像,并等待用户按下任意键退出程序,关闭所有窗口。

完整代码如下:

import cv2
import numpy as np
import onnxruntime as ort

from ultralytics import YOLO

# model=YOLO('yolov8n-pose.pt')
# model.export(format='onnx')
img_path=''
frame=cv2.imread('bus.jpg')
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
#
h, w, c = rgb_frame.shape
max_slide = max(h, w)
bg_img = np.zeros((max_slide, max_slide, 3), dtype=np.float32)
bg_img[:h, :w] = rgb_frame
# 640*640*3
image = cv2.resize(bg_img, dsize=(640, 640))
image = np.transpose(image, (2, 0, 1)) / 255
image = np.expand_dims(image, 0)
scale=max_slide/640
session=ort.InferenceSession('yolov8n-pose.onnx',providers=['CPUExecutionProvider'])
input_name=session._inputs_meta[0].name
session_out = session.run(None, {input_name:image})[0][0]
result=np.transpose(session_out,(1,0))
result=result[result[:,4]>0.8]
bboxes=result[:,0:4]
confs=result[:,4]
idx = cv2.dnn.NMSBoxes(bboxes, confs, score_threshold=0.5, nms_threshold=0.3)
res=result[idx]
for re in res:
    cx, cy, w, h = re[:4]
    x1 = (cx - w // 2) * scale
    y1 = (cy - h // 2) * scale
    x2 = (cx + w // 2) * scale
    y2 = (cy + h // 2) * scale
    x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
    conf=re[5]#置信度
    cv2.rectangle(frame,(x1,y1),(x2,y2),color=(0,255,1),thickness=3,lineType=cv2.LINE_AA)
    kpoints=np.split(re[5:],re[5:].shape[0]//3)
    for kpoint in kpoints:
        x_,y_,visibility=kpoint
        x_=int(x_*scale)
        y_=int(y_*scale)
        cv2.circle(frame, center=(x_, y_), radius=2, color=(0, 0, 255), thickness=2)
cv2.imshow('win',frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

 结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言新手小白详细教程:冒泡排序

🌏个人博客主页:意疏-CSDN博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 关注 收藏支持一下笔者吧~ 阅读指南: 开篇说明冒泡排序简介冒泡排序代码 开篇说明 本文我们来介绍冒…

编码器精度

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、影响因素二、编码器精度三、位置因素四、环境因素五、磁编码器 前言 送给大学毕业后找不到奋斗方向的你&…

《九界ol游戏源码》(游戏源码+客户端+服务端+工具+视频教程)百度云盘下载

游戏制作精美,和天龙八部用一样的游戏引擎,就是ogre。有兴趣的朋友,可以下载来收藏研究。 《九界ol游戏源码》(游戏源码客户端服务端工具视频教程) 下载地址: 链接: https://pan.baidu.com/s/1KIWSVYyAcSpY…

案例分享—医疗行业国外优秀界面设计案例

医疗行业UI网页设计需注重用户体验与可访问性,确保页面布局清晰、导航简洁明了,以便用户快速找到所需信息。同时,设计应符合医疗行业规范,传递出专业、可信的形象。 在医疗行业UI网页设计中,色彩搭配与视觉元素的选择至…

【大模型从入门到精通35】开源库框架LangChain 利用LangChain构建聊天机器人2

这里写目录标题 利用LangChain构建具备记忆功能的对话检索链设置对话历史记忆构建对话检索链处理问题并生成答案 创建基于文档的问答聊天机器人初始设置和导入文档加载和处理 利用LangChain构建具备记忆功能的对话检索链 设置对话历史记忆 为了使问答系统能够记住对话的上下文…

计算机网络-2-tcpip协议

1.说说 TCP/IP 四层模型? TCP/IP(Transmission Control Protocol/Internet Protocol)模型是一种用于描述互联网通信的协议层次结构。它分为四个主要层次,每个层次都定义了不同的协议来实现特定的功能。下面是TCP/IP模型各层的常用…

PCIE-flit mode retry

下一个即将发送的seq num: 下一个即将发送的ack或者nak的seq num: Tx发送exp seq num的个数: Tx发送nak的个数 下一个期望收到的flit的seq num,注意是指下个期望收到的有效的、non-idle、non_duplictae的flit: 收到的flit的真实的seq num(implicit…

控制台小游戏—扫雷

引言: 在前面一篇中,小编介绍了如何将代码分装在多个文件中的操作。在本篇文章中,小编将介绍一个广受欢迎的小游戏,以帮助大家熟悉这个操作。这个小游戏不仅可以让我们熟悉将代码放在多个文件中的操作,还可以加深我们…

PPT时间轴怎么做?用这款AI软件一键快速生成!

当ppt中需要呈现时间顺序、发展历程甚至是沧海桑田的变化时,很多人都会首选ppt时间轴这种视觉化的方式,它简洁直观,让人可以快速领会ppt想表达的意图,达到一图胜千言的目的。 对于不擅长制作ppt时间轴的人,最好的方式…

2024买一个机械硬盘

1997年,博主配了第一个电脑,CPU是6X86, 您可能没有听说过,那时的硬盘只有2GB~4GB,侯杰在深入浅出MFC中说以后要有大颗的硬盘,当时感觉看到这个单位来描述硬盘,感觉挺有意思。1999年,博主在电脑城…

mujoco_py ERROR: GLEW initalization error: Missing GL version

1. 问题描述: 运行mujoco ROS节点的时候,遇到错误如下: from pkg_resources import load_entry_point Creating window glfw ERROR: GLEW initalization error: Missing GL version 2. 解决方法 在./bashrc文件中添加: export L…

Vue状态管理工具:Pinia

基本概念 Pinia 是一个专为 Vue.js 设计的状态管理库,特别是针对 Vue 3 进行了优化,完美支持Vue3的Composition api 以及TypesCcript语法。它提供了一种更加简单、直观且可扩展的方式来组织和访问应用程序的状态。目前Pinia已经取代Vuex成为vue官方文档…

总结:数字图像处理基础知识

数字图像处理中的图像坐标系是理解图像数据结构和图像处理算法的基础。在计算机视觉和图像处理领域,通常有两种主要的坐标系统用于描述图像中的像素位置:笛卡尔坐标系和像素坐标系。下面我将详细介绍这两种坐标系统及其在数字图像处理中的应用。 1. 笛卡…

T/CECS 10035-2019 绿色建材评价 金属复合装饰材料

一、绿色建材 绿色建材是指在全生命周期内减少对天然资源消耗和减轻对生态环境影响,具有节能、减排、安全、便利和可循环的建材产品,获得绿色产品证书的产品在实际招投标以及品牌宣传中具有绝对优势。 二、认证模式 初始工厂检查产品抽样检验获证后监督…

稳压二极管、肖特基二极管、TVS管、静电ESD管的区别

1.稳压二极管 正向导通电压跟普通二级管一样约为0.7v,反向状态下在临界电压之前截止,在达到临界电压的条件下会处于导通的状态,电压也不再升高,所以用在重要元器件上,起到稳压作用。 稳压二极管主要利用其反向击穿时…

LLM概念梳理(二):检索增强RAG

非常感谢RAG(检索增强生成)技术详解:基于垂直领域专有数据的 Chatbots 是如何实现的,这篇文章对 RAG 技术进行了详细的描述。我根据自己的理解,并且按照代码思路重新进行整理。 RAG 技术看似神奇,其本质是…

2024.8.22(Docker)

一、回顾 高并发集群 eleme后端登录模块 1、数据库 1.主从复制(高可用) 2.传统的主从复制 3.gtids事务型的主从复制 4.注意 (1)server_id唯一 (2)8.x版本需要get_ssl_pub_key (3)5.x不需要 (4…

ts枚举类型校验,提示枚举信息

ts 类型验证,提示枚举信息 const eventTypeList [MOUSE_MOVE, // 鼠标移动LEFT_CLICK // 左键单击// MOUSE_OUT, ] as consttype EventTypeList typeof eventTypeList[number]

FST(Finite State Transducer)

有限状态转换器(Finite State Transducer,简称FST)是一种计算模型,它是有限状态自动机(Finite State Automaton,简称FSA)的扩展。FSA是一种理论计算模型,用于表示和处理正则语言&…