OpenCV 调用自定义训练的 YOLO-V8 Onnx 模型

一、YOLO-V8 转 Onnx

在本专栏的前面几篇文章中,我们使用 ultralytics 公司开源发布的 YOLO-V8 模型,分别 Fine-Tuning 实验了 目标检测、关键点检测、分类 任务,实验后发现效果都非常的不错,但是前面的演示都是基于 ultralytics 框架实现的,如果要发布到移动端或服务端,就需要考虑通用开放格式了,比如 Onnx 格式。

Onnx 格式是一种开放格式,用于表示深度学习模型。它是由微软,亚马逊和Facebook共同开发的,目的是为了促进不同深度学习框架和工具之间的模型互操作性。通过Onnx,开发人员可以更容易地在不同的深度学习框架之间转换模型,例如从PyTorchTensorFlow,反之亦然。

ultralytics 框架针对格式的转换已经做好了封装,只需要通过 model.export 方法,便可以转到多种不同格式的模型,格式如下:

格式format模型元数据论据
PyTorch-yolov8n.pt-
TorchScripttorchscriptyolov8n.torchscriptimgsz, optimize, batch
ONNXonnxyolov8n.onnximgsz, half, dynamic, simplify, opset, batch
OpenVINOopenvinoyolov8n_openvino_model/imgsz, half, int8, batch
TensorRTengineyolov8n.engineimgsz, half, dynamic, simplify, workspace, int8, batch
CoreMLcoremlyolov8n.mlpackageimgsz, half, int8, nms, batch
TF SavedModelsaved_modelyolov8n_saved_model/imgsz, keras, int8, batch
TF GraphDefpbyolov8n.pbimgsz, batch
TF 轻型tfliteyolov8n.tfliteimgsz, half, int8, batch
TF 边缘TPUedgetpuyolov8n_edgetpu.tfliteimgsz
TF.jstfjsyolov8n_web_model/imgsz, half, int8, batch
PaddlePaddlepaddleyolov8n_paddle_model/imgsz, batch
NCNNncnnyolov8n_ncnn_model/imgsz, half, batch

下面使用前面做过的人脸检测模型,转为 Onnx 格式,并使用 OpenCV 运行推理,该模型的训练过程可以参考下面文章:

基于 YOLO V8 Fine-Tuning 训练自定义的目标检测模型(人脸检测)

下面过程使用的依赖版本如下:

ultralytics==8.1.37
opencv-python==4.7.0.68
onnx==1.16.1

YOLO-V8 默认的 Pytorch 模型转为 Onnx 模型 :

from ultralytics import YOLOmodel = YOLO("runs/detect/train/weights/best.pt")model.export(format="onnx", imgsz=[640,640], opset=12)

运行后可以在 runs/detect/train/weights/ 下看到 best.onnx 模型:

在这里插入图片描述

二、OpenCV 调用 Onnx 模型

OpenCVdnn 模块提供了 readNetFromONNX ,可以方便的读取 Onnx 模型,整个运行示例过程如下:

import cv2
import numpy as nponnx_model_path = "runs/detect/train/weights/best.onnx"
input_shape = (640, 640)
net = cv2.dnn.readNetFromONNX(onnx_model_path)
model_classify = ["face"]def recognize(img_path, threshold=0.5):img = cv2.imread(img_path)blob = cv2.dnn.blobFromImage(img, 1 / 255.0, input_shape, swapRB=True, crop=False)net.setInput(blob)output = net.forward()output = output.transpose((0, 2, 1))height, width, _ = img.shapex_factor, y_factor = width / input_shape[0], height / input_shape[1]classifys, scores, boxes = [], [], []for i in range(output[0].shape[0]):box = output[0][i]_, _, _, max_idx = cv2.minMaxLoc(box[4:])class_id = max_idx[1]score = box[4:][class_id]if (score > threshold):scores.append(score)classifys.append(model_classify[int(class_id)])x, y, w, h = box[0].item(), box[1].item(), box[2].item(), box[3].item()x = int((x - 0.5 * w) * x_factor)y = int((y - 0.5 * h) * y_factor)w = int(w * x_factor)h = int(h * y_factor)box = np.array([x, y, w, h])boxes.append(box)indexes = cv2.dnn.NMSBoxes(boxes, scores, 0.25, 0.45)for i in indexes:classify, score, box = classifys[i], scores[i], boxes[i]print(class_id, score, box)x, y, w, h = box[0], box[1], box[2], box[3]cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)label = f'{classify}: {score:.2f}'cv2.putText(img, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)cv2.imshow("img", img)cv2.waitKey(0)if __name__ == '__main__':recognize('data/images/10.jpg',0.3)

运行效果示例:

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

C语言分支和循环(下)

C语言分支和循环(下) 1. 随机数生成1.1 rand1.2 srand1.3 time1.4 设置随机数的范围 2. 猜数字游戏实现 掌握了前面学习的这些知识,我们就可以写⼀些稍微有趣的代码了,比如: 写⼀个猜数字游戏 游戏要求: 电…

第6章 复制

文章目录 前言1.配置1.1建立复制1.2断开复制1.3 安全性1.4 只读1.5 传输延迟 2. 拓扑2.1.一主一从结构2.2.一主多从结构2.3.树状主从结构 3.原理3.1复制过程3.2数据同步3.3全量复制 前言 复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础&…

智能交通(2)——IntelliLight智能交通灯

论文分享:IntelliLight | Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mininghttps://dl.acm.org/doi/10.1145/3219819.3220096摘要 智能交通灯控制对于高效的交通系统至关重要。目前现有的交通信号灯大多由手…

【Python系列】列表推导式:简洁而强大的数据操作工具

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

已成功与服务器建立连接,但是在登录过程中发生错误。(provider: SSL提供程序,error:0-证书链是由不受信任的颁发机构颁发的。)

已成功与服务器建立连接,但是在登录过程中发生错误。(provider: SSL提供程序,error:0-证书链是由不受信任的颁发机构颁发的。) 在连接SQL Server2008R2数据库时发生错误。 连接字符串:server127.0.0.1;uidsa;pwd1;databasedb; 解决办法: 方…

PySide(PyQt)在图像上画线

1、按鼠标左键任意画线 import sys from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget from PySide6.QtGui import QPainter, QPixmap, QMouseEvent, QColor, QPen from PySide6.QtCore import Qt, QPointclass PaintLabel(QLabel):def __init__(self…

如何使用FlowUs打造爆款自媒体内容?内容资产管理沉淀的先进工具选息流

FlowUs 是一款流行的在线协作工具,它以其灵活的块编辑器、看板视图、数据库管理等功能受到众多个人和团队的喜爱。将其应用于内容资产管理,尤其是对于追求打造爆款自媒体的创作者而言,可以极大地提升内容创作、组织、分发及分析的效率。 内容…

无刷直流电机(BLDCM)仿真建模

无刷直流电机,即BLDCM在各个行业应用非常广泛。在汽车电子领域,BLDCM被广泛用于电动汽车、混合动力汽车、电动自行车等车辆的驱动系统中。由于BLDCM具有高效率、高力矩密度和快速响应的优势,它可以提供可靠的动力输出,并且可以通过…

idea常用配置 | 快捷注释

idea快速注释 一、类上快速注释 (本方法是IDEA环境自带的,设置特别方便简单易使用) 1、偏好设置->编辑器->文件和代码模版 | File-Settings-Editor-File and Code Templates 2、右下方的“描述”中有相对应的自动注注释配置格式 贴…

力扣 单词规律

所用数据结构 哈希表 核心方法 判断字符串pattern 和字符串s 是否存在一对一的映射关系,按照题意,双向连接的对应规律。 思路以及实现步骤 1.字符串s带有空格,因此需要转换成字符数组进行更方便的操作,将字符串s拆分成单词列表…

Java单体架构项目_云霄外卖-特殊点

项目介绍: 定位: 专门为餐饮企业(餐厅、饭店)定制的一款软件商品 分为: 管理端:外卖商家使用 用户端(微信小程序):点餐用户使用。 功能架构: &#xff08…

Python学习笔记20:进阶篇(九)常见标准库使用之sys模块和re模块

前言 本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。 根据模块知识,一次讲解单个或者多个模块的内容。 教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html 错误输出…

电商平台数据爬取经验分享

一、引言 在电商领域,数据的重要性不言而喻。无论是市场趋势分析、竞争对手研究,还是用户行为洞察,都离不开数据的支持。而数据爬虫作为获取这些数据的重要工具,其技术的掌握和运用对于电商平台来说至关重要。本文将结合个人实际…

AI绘画 Stable Diffusion【实战进阶】:图片的创成式填充,竖图秒变横屏壁纸!想怎么扩就怎么扩!

大家好,我是向阳。 所谓图片的创成式填充,就是基于原有图片进行扩展或延展,在保证图片合理性的同时实现与原图片的高度契合。是目前图像处理中常见应用之一。之前大部分都是通过PS工具来处理的。今天我们来看看在AI绘画工具 Stable Diffusio…

架构师篇-7、企业安全架构设计及实践

摘要: 认识企业安全架构企业安全案例分析及实践 内容: 为什么做企业安全架构怎么做好安全架构设计案例实践分析&随堂练 为什么要做企业安全架构 安全是麻烦制造者? 整天提安全需求增加开发工作增加运维要求增加不确定性延后业务上线…

[C++][设计模式][适配器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件系统中,由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足如何应对这些”迁移的变化“?如何既能利用现…

【单片机毕业设计选题24038】-基于STM32的木材厂环境监测系统

系统功能: 系统上电后根据采集到的传感器值自动控制,温度过高后自动开启风扇通风降温,湿度过 高后自动开启风扇除湿,光照过低后自动开启补光,雨量过高蜂鸣器报警,火焰传感器检 测到火灾后蜂鸣器报警并打开水泵灭火。…

20240629在飞凌的OK3588-C开发板的Linux R4系统下使用i2cdetect确认I2C总线

rootok3588:/# i2cdetect -y -r 0 rootrk3588-buildroot:/# i2cdetect -l rootrk3588-buildroot:/# i2cdetect -F 0 20240629在飞凌的OK3588-C开发板的Linux R4系统下使用i2cdetect确认I2C总线 2024/6/29 15:37 在CAM1、CAM2挂载OV13850。 在CAM3、CAM4和CAM5挂载OV5645了。 in…

Spring-循环依赖是如何解决的

1、bean被创建保存到spring容器的过程 1、实例化 -> 获取对象; 2、填充属性;这里可能需要依赖其它的bean。 3、AOP代理对象替换; 4、加入单例池; 问题: 循环依赖怎么处理 ServiceA 中有属性ServiceB b&#…

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

法一:第一次安装宝塔 第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了 法二:第一种方法没解决用这种 出现mysqli::real_connect(): (HY000/2002): No such file or directory错误通…