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

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

具体步骤如下:

  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) * scaley1 = (cy - h // 2) * scalex2 = (cx + w // 2) * scaley2 = (cy + h // 2) * scalex1, 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 = kpointx_ = 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 ortfrom 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) * scaley1 = (cy - h // 2) * scalex2 = (cx + w // 2) * scaley2 = (cy + h // 2) * scalex1, 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=kpointx_=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()

 结果如下:

相关文章:

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

具体步骤如下: 加载图像: 从指定路径读取一张图像(这里假设图像名为bus.jpg)。将图像从 BGR 颜色空间转换为 RGB 颜色空间。 图像预处理: 计算图像的高度、宽度,并确定其中的最大值作为新图像的边长。创建一…...

matlab实现模拟退火算法

模拟退火算法(Simulated Annealing, SA)是一种通用概率优化算法,用于在给定的大搜索空间内寻找问题的近似全局最优解。该算法灵感来源于物理学中固体物质的退火过程,其中温度逐渐降低,粒子逐渐趋于能量最低状态。 在M…...

【Prettier】代码格式化工具Prettier的使用和配置介绍

前言 前段时间,因为项目的prettier的配置和eslint格式检查有些冲突,在其prettier官网和百度了一些配置相关的资料,在此做一些总结,以备不时之需。 Prettier官网 Prettier Prettier 是一种前端代码格式化工具,支持ja…...

【计算机网络】网络基础

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…...

MFC在对话框中实现打印和打印预览

首先在这里感谢互联网的大哥们!同时我讨厌动不动就是要vip才能查看!所以我写的不需要vip就能看。只求点个赞。 直接上代码,新建6个文件CPrintFrame.cpp;CPrintFrame.h;CPrintPreviewView.cpp;CPrintPrevie…...

移动端页面出现闪屏

v-cloak 的作用和用法 用法: 这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。官方API {{msg}} HTML 绑定 Vue实例,在页面加载时…...

elasticsearch的高亮查询三种模式查询及可能存在的问题

目录 高亮查询使用介绍 高亮参数 三种分析器 可能存在的查询问题 fvh查询时出现StringIndexOutOfBoundsException越界 检索高亮不正确 参考文档 高亮查询使用介绍 Elasticsearch 的高亮(highlight)可以从搜索结果中的一个或多个字段中获取突出显…...

【精品实战项目】深度学习预测、深度强化学习优化、附源码数据手把手教学

目录 前言 一、预测算法数据与代码介绍(torch和mxnet都有) 1.1 数据介绍 1.2 代码介绍 1.3 优化介绍 二、深度强化学习算法优化 2.1 DDPG 介绍 DPG--deterministic policy gradient DQN--deep Q-network DDPG--deep deterministic policy gradient 三、其他算法 总结…...

JavaScript 手写仿深拷贝

实现对象参数的深拷贝并返回拷贝之后的新对象,因为参数对象和参数对象的每个数据项的数据类型范围仅在数组、普通对象({})、基本数据类型中且无需考虑循环引用问题,所以不需要做过多的数据类型判断,核心步骤有&#xf…...

spring低版本设置cookie的samesite属性

场景:比较古老的项目了,ssh架子,Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,可用于防止 CSRF 攻击和用户追踪。因此需要给其字段赋值。 网上找了很多资源,由于jar版本比较低,没有…...

GPT4o编写步进电机控制代码

我给出的要求如下: 基于STM32F407 HAL库,写一个步进电机控制程序,需要控制8个步进电机,我会给出描述步进电机的结构体变量,基于这些变量需要你做出以下功能,电机脉冲通过定时器中断翻转脉冲引脚的电平实现…...

关于Spring Boot的自动配置

目录 1.EnableAutoConfiguration注解 2.SpringBootConfiguration注解 3.Import注解 4.spring.factories 5.总结 (1)EnableAutoConfiguration (2)AutoConfigurationImportSelector (3) SpringFactoriesLoade…...

## 已解决:`java.sql.SQLSyntaxErrorException: SQL语法错误` 异常的正确解决方法,亲测有效!!! ###

1. 问题描述 java.sql.SQLSyntaxErrorException 是 Java 程序在执行 SQL 查询时,因 SQL 语法错误而抛出的异常。通常情况下,错误信息会指示出错的 SQL 语句及错误原因,如拼写错误、关键字遗漏、字段名称错误等。 典型的错误信息如下&#x…...

备战秋招60天算法挑战,Day22

题目链接: https://leetcode.cn/problems/missing-number/ 视频题解: https://www.bilibili.com/video/BV1HS42197Hc/ LeetCode 268.丢失的数字 题目描述 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组…...

在Linux下搭建go环境

下载go go官网:All releases - The Go Programming Language 我们可以吧压缩包下载到Windows上再传到Linux上,也可以直接web下载: wget https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz 解压 使用命令解压: tar -x…...

738.单调递增的数字

738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输…...

近年国际重大网络安全事件深度剖析:安全之路任重道远

引言 在当今数字化时代&#xff0c;网络安全已成为全球关注的焦点。随着信息技术的飞速发展&#xff0c;网络攻击的手段和规模也在不断升级&#xff0c;给个人、企业和国家带来了巨大的威胁。本文将盘点近年来国际上发生的重大网络安全事件&#xff0c;分析其影响和教训&#…...

Windows C++控制台菜单库开发与源码展示

Windows C控制台菜单库 声明&#xff1a;演示视频&#xff1a;一、前言二、具体框架三、源码展示console_screen_set.hframeconsole_screen_frame_base.hconsole_screen_frame_char.hconsole_screen_frame_wchar_t.hconsole_screen_frame.h menuconsole_screen_menu_base.hcons…...

ARM——驱动——Linux启动流程和Linux启动

一、flash存储器 lash存储器&#xff0c;全称为Flash EEPROM Memory&#xff0c;又名闪存&#xff0c;是一种长寿命的非易失性存储器。它能够在断电情况下保持所存储的数据信息&#xff0c;因此非常适合用于存储需要持久保存的数据。Flash存储器的数据删除不是以单个的字节为单…...

Docker和虚拟机的区别详细讲解

Docker 和虚拟机&#xff08;VM&#xff09;是现代 IT 基础设施中常见的技术&#xff0c;它们都用于在单一硬件上运行多个操作环境&#xff0c;但它们的工作原理、性能、资源利用和使用场景存在显著差异。以下是对 Docker 和虚拟机区别的详细讲解。 一、基础概念 1. Docker …...

leetcode_68. 文本左右对齐

68. 文本左右对齐 题目描述&#xff1a;给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff1b;也就是说&#xff0c…...

python探索分形和混沌

简单产生复杂&#xff0c;混沌孕育秩序 0. 引言 a. 分形 fractal 【也叫碎形】 分形是一种具有自相似性和复杂结构的几何图形。在分形结构中&#xff0c;无论放大多少次&#xff0c;局部的结构特征都与整体结构相似。这种特性在自然界中广泛存在&#xff0c;比如树木枝干、山…...

LeetCode77 组合

前言 题目&#xff1a; 77. 组合 文档&#xff1a; 代码随想录——组合 编程语言&#xff1a; C 解题状态&#xff1a; 没尝试出来 思路 经典的组合问题&#xff0c;可以考虑使用回溯法。使用回溯法时可以根据回溯法的模板来考虑如何解决。 代码 回溯法 class Solution { p…...

C#:Bitmap类使用方法—第1讲

首先看一下Bitmap定义&#xff1a;封装 GDI 位图&#xff0c;此位图由图形图像及其属性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。 下面介绍一下使用的例子&#xff1a; Bitmap image1; private void Button1_Click(System.Object sender, System.Eve…...

PaddleNLP 3.0 支持大语言模型开发

huggingface不支持模型并行。张量并行&#xff0c;不满足大规模预训练的需求。 1、组网部分 2、数据流 3、训练器 4、异步高效的模型存储...

32次8.21(学习playbook-roles,脚本创建数据库和表,mycat读写分离)

1.roles目录介绍 files&#xff1a;⽤来存放由copy模块或script模块调⽤的⽂件。 tasks&#xff1a;⾄少有⼀个main.yml⽂件&#xff0c;定义各tasks。 handlers:有⼀个main.yml⽂件&#xff0c;定义各handlers。 templates&#xff1a;⽤来存放jinjia2模板。 vars&#xff1a…...

I2C通信协议(软件I2C和硬件I2C)

相比于之前学的异步全双工且需要两条通信线的串口通信&#xff0c;I2C则为同步半双工&#xff0c;仅需要一条通信线&#xff0c;全双工与半双工区别如下&#xff1a; 全双工&#xff08;Full Duplex&#xff09;半双工&#xff08;Half Duplex&#xff09;数据传输方式同时双向…...

Linux入门——08 进程间通讯——管道

1.进程间通讯 1.1什么是通讯 进程具有独立性&#xff08;每个进程都有自己的PCB,独立地址空间&#xff0c;页表&#xff09;但是要进行进程的通信&#xff0c;通信的成本一定不低&#xff0c;打破了独立性 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给…...

深入探讨SD NAND的SD模式与SPI模式初始化

在嵌入式系统和存储解决方案中&#xff0c;SD NAND的广泛应用是显而易见的。CS创世推出的SD NAND支持SD模式和SPI模式&#xff0c;这两种模式在功能和实现上各有优劣。在本文中&#xff0c;我们将深入探讨这两种模式的初始化过程&#xff0c;并比较它们在不同应用场景下的优劣&…...

【jvm】栈和堆的区别

目录 1. 用途2. 线程共享性3. 内存分配和回收4. 生命周期5. 性能特点 1. 用途 1.堆&#xff1a;主要用于存储对象实例和数组。在Java中&#xff0c;所有通过new关键字创建的对象都会被分配到堆上。堆是一个大的内存池&#xff0c;用于存储所有的Java对象&#xff0c;包括实例变…...