[C++]使用onnxruntime部署yolov8-cls图像分类onnx模型

news2024/10/11 19:11:13

如果只需要opencv去部署yolov8分类模型可以参考博文:https://blog.csdn.net/FL1623863129/article/details/142734780

本文和 opencv去部署yolov8分类模型区别是:opencv部署推理核心使用opencv自带api,而本文推理核心用的onnxruntime,opencv只是辅助作用即读取图片

【算法介绍】

C++使用ONNX Runtime部署YOLOv8-cls图像分类ONNX模型是一种高效的方法,能够充分利用硬件资源,实现低延迟、高效率的推理。

YOLOv8-cls是YOLO系列的最新版本之一,特别针对图像分类任务进行了优化。它继承了YOLO系列模型快速检测速度和较高准确率的特点,并通过改进网络架构和优化损失函数等策略,进一步提升了性能。

ONNX Runtime是一个跨平台的高性能推理引擎,支持多种机器学习框架导出的ONNX模型。ONNX(Open Neural Network Exchange)是一种开放标准,用于模型之间的互操作,使得开发者可以轻松地在不同框架之间迁移模型,而无需重新训练。

在C++中使用ONNX Runtime部署YOLOv8-cls模型,需要先将训练好的PyTorch模型转换为ONNX格式,然后利用ONNX Runtime的C++ API进行模型加载和推理。这包括设置环境、初始化会话、配置内存分配信息等步骤。推理过程中,需要将输入图像进行预处理,然后输入到模型中,最后获取并处理模型的输出。

这种方法具有高度的灵活性和可扩展性,可以适应不同的应用场景和硬件环境。同时,由于ONNX Runtime提供了高效的图优化和硬件加速功能,因此可以实现更快的推理速度和更好的性能表现。

总之,C++使用ONNX Runtime部署YOLOv8-cls图像分类ONNX模型是一种高效、灵活且可扩展的方法,适用于各种计算机视觉任务。

【效果展示】

【部分实现代码】

#pragma once
#include <iostream>
#include <opencv2/core.hpp>
#include <fstream>
#include "inference.h"
#include <chrono>


using namespace std;

int main(int argc, char *argv[])
{

    if (argc == 1)
    {
        std::cout << "Usage: main.exe <image_path>" << std::endl;
        return 0;
    }
    DL_INIT_PARAM params;
    params.labelPath = "class_names.txt";
    params.modelPath = "yolov8s-cls.onnx";
    params.modelType = YOLO_CLS_V8;
    params.imgSize = {224, 224};
    params.rectConfidenceThreshold = 0.4;
    params.iouThreshold = 0.0001;
    params.cudaEnable = false;

    auto starttime_1 = std::chrono::high_resolution_clock::now();
    std::unique_ptr<YOLO_V8> yolo(new YOLO_V8);
    yolo->CreateSession(params);
    auto starttime_3 = std::chrono::high_resolution_clock::now();
    auto duration_ms4 = std::chrono::duration_cast<std::chrono::milliseconds>(starttime_3 - starttime_1).count();
    std::cout << "[YOLO_V8]: warm up: " << duration_ms4 << "ms" << std::endl;
    std::string imagepath = argv[1];
    cv::Mat image = cv::imread(imagepath);
    auto starttime_2 = std::chrono::high_resolution_clock::now();
    auto results = yolo->Inference(image);
    auto starttime_4 = std::chrono::high_resolution_clock::now();
    auto duration_ms3 = std::chrono::duration_cast<std::chrono::milliseconds>(starttime_4 - starttime_2).count();
    std::cout << "[YOLO_V8]: inference time: " << duration_ms3 << " ms" << std::endl;
    for (const auto &result : results)
    {
        std::cout << "[YOLO_V8]: label is: " << result.className << ", confidence is: " << result.confidence << std::endl;
        std::string text = result.className + " " + std::to_string(result.confidence).substr(0, 4);
        cv::putText(image, text, cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0), 2);
    }

    return 0;
}

【测试环境】

vs2019

cmake==3.24.3

opencv==4.8.0

onnxruntime==1.12.0

【运行步骤】

通过cmake编译出exe后,执行

yolov8-cls.exe 【图片路径】即可

【完整源码下载】

https://download.csdn.net/download/FL1623863129/89853760

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

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

相关文章

ros2:从github上下载源码进行编译

首先&#xff0c;创建工作空间 # 1. 递归创建工作空间目录 mkdir -p catkin_ws/src # 2. 进入src目录 cd catkin_ws/src然后如果你没有安装git&#xff0c;需要 sudo apt install git然后输入。 git clone https://github.com/6-robot/wpr_simulation.git这时候&#xff0c;…

LeetCode-12. 整数转罗马数字【哈希表 数学 字符串】

LeetCode-12. 整数转罗马数字【哈希表 数学 字符串】 题目描述&#xff1a;解题思路一&#xff1a;贪心解题思路二&#xff1a;背诵版&#xff0c;只需写出1954开头的数字进行贪心即可。解题思路三&#xff1a;暴力匹配 题目描述&#xff1a; 七个不同的符号代表罗马数字&…

拿下奇怪的前端报错:1比特丢失导致的音视频播放时长无限增长-浅析http分片传输核心和一个坑点

问题背景 在一个使用MongoDB GridFS实现文件存储和分片读取的项目中&#xff0c;同事遇到了一个令人困惑的问题&#xff1a;音频文件总是丢失最后几秒&#xff0c;视频文件也出现类似情况。更奇怪的是&#xff0c;播放器显示的总时长为无限大。这个问题困扰了团队成员几天&…

gradle build --offline idea怎么配置 打包命令使用gradle build --offline进行打包怎么操作

两种方式 1&#xff1a;一种命令行执行gradle build --offline 2&#xff1a;一种直接gradle这里单击离线

多模态理论——什么是多模态?多模态的关键技术?

多模态理论 文章目录 多模态理论1.什么是多模态&#xff08;multimodal&#xff09;2.深度学习中的多模态3.多模态学习的关键技术3.1模态表示3.2多模态对齐3.3多模态融合 4.多模态任务 1.什么是多模态&#xff08;multimodal&#xff09; 模态指的是数据或者信息的表现形式&am…

完美收官丨飞易通端到端整体解决方案助力嵌入式技术发展

2024年10月10日&#xff0c;Embedded World 2024展会在美国德克萨斯州奥斯汀完美收官。Embedded World 2024是嵌入式系统领域的全球性盛会&#xff0c;汇聚了来自世界各地的专业人士&#xff0c;促进了嵌入式系统、工业自动化、汽车技术和通信系统领域的合作与发展。 应展会举办…

深入解析 Go 语言中的结构体:从基础用法到高级技巧的全方位指南

结构体&#xff08;Struct&#xff09;是 Go 语言中的一种重要数据类型&#xff0c;能够帮助我们将多个数据组合成一个自定义的类型。与其他编程语言的类&#xff08;Class&#xff09;类似&#xff0c;结构体允许我们定义字段、方法&#xff0c;并灵活操作数据。本文将从基础到…

遥控器传输信号算法详解!

一、算法概述 无人机遥控器信号传输算法主要基于无线通信技术&#xff0c;通过特定的调制、编码和信号处理技术&#xff0c;将遥控器的操作指令转化为无线电信号&#xff0c;并传输给无人机。无人机接收到信号后&#xff0c;再将其解码为可识别的指令&#xff0c;从而实现对无…

10月造价、注安考试的押题资料,到底有没有用?

​随着考试的临近&#xff0c;各大考试机构也开始推出了各种考前押题资料。面对网络铺卷而来的考前押题资料&#xff0c;考生自己也无从判断资料的质量&#xff0c;那该如何选择靠谱的押密资料呢&#xff1f;今天考试100就带大家来分析一下&#xff1a; 1、正确看待押题资料 首…

标签页(tabs)内容的显示和样式

1. 代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Tabs Example</title> &…

吴恩达深度学习笔记(一)-基础知识

上图三种神经网络&#xff1a;标准、卷积&#xff08;用于图像&#xff09;、循环&#xff08;序列化数据、时序数据&#xff09; 数据类型&#xff1a;结构化&#xff08;表格&#xff09;、非结构化&#xff08;语言、图片、文本&#xff09; 二分类问题&#xff1a; 0、1判…

Qt-窗口对话框QFileDialog的使用(53)

目录 描述 相关函数 使用 描述 文件对话框 ⽂件对话框⽤于应⽤程序中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件 相关函数 打开⽂件&#xff08;⼀次只能打开⼀个⽂件&#xff09; QString getOpenFileName 打开多个⽂件&#xff08;⼀次可以打开多个⽂件…

2024下半年软考中级网络工程师,这100题,必做!

第一章节&#xff1a;计算机硬件基础&#xff08;5&#xff09; 1、在机器指令的地址字段中&#xff0c;直接指出操作数本身的寻址方式称为&#xff08; &#xff09;。 A 隐含寻址 B 寄存器寻址 C 立即寻址 D 直接寻址 答案&#xff1a;C 解析: 立即寻址方式通常直接在指…

Copilot Coaching新功能铸就Word更强

Copilot 的意思是副驾驶。 现在&#xff0c;您的副驾驶教练来了&#xff1a;Copilot Coaching Copilot Coaching 是 Word 中的一项新 Copilot 功能&#xff0c;可在您查看内容时为您提供支持&#xff0c;以实现语法和拼写之外的改进 - 帮助您澄清想法&#xff0c;并为您提供有…

Granafa配置基于elasticsearch数据源的折线图

Granafa可以直接配置基于elasticsearch数据源的折线图&#xff0c;用于展示es库中数据的最值、均值、总量等

AI绘画教程 重阳节海报设计

本期 AI 绘画的主题是海报设计&#xff0c;让我们一同探索能设计出哪些不同风格的海报吧。 今天是重阳节&#xff0c;一起用 AI 绘画制作一些画风清新的海报吧。正所谓 “遥知兄弟登高处&#xff0c;遍插茱萸少一人”。让我们一起通过这些设计&#xff0c;在对长辈的思念与祝福…

2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型

E题补完计划开始,接着之前专栏里面的E题内容写完接下来的所有问题。经过第一问得到了最佳物料编码的前六位排名: 是通过聚合指标和熵权法计算得到的,现在我们需要完成第一问的接下来两个目标,分别是建立物料需求的周预测模型和利用历史数据对预测模型进行评价。对于周预测…

Python物联网编程:10个IoT设备通信的脚本

今天我们要聊的是如何使用Python编写脚本来实现10个IoT设备之间的通信。物联网&#xff08;IoT&#xff09;是一个充满无限可能的领域&#xff0c;它将日常设备连接到互联网&#xff0c;使它们能够互相通信、收集数据并做出响应。Python以其简洁易懂的语法和强大的库支持&#…

力扣题/回溯/N 皇后

N 皇后 力扣原题 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解…

代码随想录day32:动态规划part5

完全背包 二维 /* 完全背包&#xff1a;动态规划 */ int unboundedKnapsackDP(int[] wgt, int[] val, int cap) {int n wgt.length;// 初始化 dp 表int[][] dp new int[n 1][cap 1];// 状态转移for (int i 1; i < n; i) {for (int c 1; c < cap; c) {if (wgt[i -…