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

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

如果只需要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.mrgr.cn/news/44392.html

相关文章:

  • Unsloth 大模型微调工具简明教程
  • 分词的艺术:为AI拆解文本
  • 课堂点名系统小程序的设计
  • 问:说说JRE、JDK、JVM 及 JIT都是干嘛的?
  • Apache Ranger 70道面试题及参考答案
  • 基于Python的人工智能应用案例系列(19):SpaCy评论情感极性分类
  • SumatraPDF一打开就无响应怎么办?
  • 信息学奥赛一本通 2100:【23CSPJ普及组】一元二次方程(uqe) | 洛谷 P9750 [CSP-J 2023] 一元二次方程
  • Ajax面试题:(第一天)
  • 分享股票期货高频数据获取以及我的策略
  • 【Canvas与色彩】十六等分多彩隔断圆环
  • Network - Telnet协议
  • Linux:进程的创建、终止和等待
  • python爬虫 - 初识requests模块
  • 用Python实现运筹学——Day 14: 线性规划总结与案例复习
  • Arduino UNO R3自学笔记21 之 Arduino电机的闭环控制(PID)
  • C# 泛型集合实战:List<T>与Dictionary<TKey, TValue>的使用与优势
  • 给Linux操作系统命令取个别名
  • 【含文档】基于Springboot+Android的房屋租赁App(含源码+数据库+lw)
  • 数据采集工具sqoop介绍