返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++如何实现yolov5转onnx
  • 879
分享到

c++如何实现yolov5转onnx

2023-06-22 04:06:12 879人浏览 安东尼
摘要

本篇内容介绍了“c++如何实现yolov5转onnx”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!训练模型.pt转onnx训练部分根据呼声再

本篇内容介绍了“c++如何实现yolov5转onnx”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

训练模型.pt转onnx

训练部分根据呼声再决定要不要写一份博客吧!!
注意事项:
1.训练代码一定要选择yolov5 5.0版本
2. 进入models/exprort.py;

c++如何实现yolov5转onnx

将红框区域换成你自己的训练完的模型

c++如何实现yolov5转onnx

将版本换成12;

c++如何实现yolov5转onnx

直接运行即可,会生成出onnx的模型出来。

c++代码解析

博主使用的是OpenCV4.5.3版本,已经编译好的,需要直接扫码加我发你

main函数部分

c++如何实现yolov5转onnx

读取模型利用的是dnn::readNet,opencv其实挺强大的博主已经读过tf模型,torch模型后续都会出对应博客,这里总共有三点改,输入图片path,输入类别名class_names,net部分改成自己的模型

net.set这些参数都固定就好,有兴趣的同学可以研究研究DNN_TARGET_CPU这个地方,是可以使用gpu和cuda的,但是博主还没复现过

推理部分讲解

void postprocess(cv::Mat& cv_src, std::vector<cv::Mat>& outs, const std::vector<std::string>& classes, int net_size){float confThreshold = 0.1f;float nmsThreshold = 0.1f;std::vector<int> classIds;std::vector<float> confidences;std::vector<cv::Rect> boxes;int strides[] = { 8, 16, 32 };std::vector<std::vector<int> > anchors ={{ 10,13, 16,30, 33,23 },{ 30,61, 62,45, 59,119 },{ 116,90, 156,198, 373,326 }};for (size_t k = 0; k < outs.size(); k++){float* data = outs[k].ptr<float>();int stride = strides[k];int num_classes = outs[k].size[4] - 5;for (int i = 0; i < outs[k].size[2]; i++){for (int j = 0; j < outs[k].size[3]; j++){for (int a = 0; a < outs[k].size[1]; ++a){float* record = data + a * outs[k].size[2] * outs[k].size[3] * outs[k].size[4] +i * outs[k].size[3] * outs[k].size[4] + j * outs[k].size[4];float* cls_ptr = record + 5;for (int cls = 0; cls < num_classes; cls++){float score = sigmoid(cls_ptr[cls]) * sigmoid(record[4]);if (score > confThreshold){float cx = (sigmoid(record[0]) * 2.f - 0.5f + (float)j) * (float)stride;float cy = (sigmoid(record[1]) * 2.f - 0.5f + (float)i) * (float)stride;float w = pow(sigmoid(record[2]) * 2.f, 2) * anchors[k][2 * a];float h = pow(sigmoid(record[3]) * 2.f, 2) * anchors[k][2 * a + 1];float x1 = std::max(0, std::min(cv_src.cols, int((cx - w / 2.f) * (float)cv_src.cols / (float)net_size)));float y1 = std::max(0, std::min(cv_src.rows, int((cy - h / 2.f) * (float)cv_src.rows / (float)net_size)));float x2 = std::max(0, std::min(cv_src.cols, int((cx + w / 2.f) * (float)cv_src.cols / (float)net_size)));float y2 = std::max(0, std::min(cv_src.rows, int((cy + h / 2.f) * (float)cv_src.rows / (float)net_size)));classIds.push_back(cls);confidences.push_back(score);boxes.push_back(cv::Rect(cv::Point(x1, y1), cv::Point(x2, y2)));}}}}}}std::vector<int> indices;cv::dnn::NMSBoxes(boxes, confidences, confThreshold, nmsThreshold, indices);for (size_t i = 0; i < indices.size(); i++){int idx = indices[i];cv::Rect box = boxes[idx];drawPred(classIds[idx], confidences[idx], box.x, box.y,box.x + box.width, box.y + box.height, cv_src, classes);}}

抬头部分是两大目标检测的阈值设置,然后anchors这些都不建议动,除非你在训练的时候用了你自己生成的anchors的话,就改成你自己的,然后根据训练推理后,会生成我们所对应的坐标框以及分数,将分数和狂送到容器中,dnn中有nms等底层函数哦
cv::dnn::NMSBoxes(boxes, confidences, confThreshold, nmsThreshold, indices);
对应输入就可以了,然后得到我们的Box,index,和置信度,接下来就到了我们的画图环节。

darpred部分

void drawPred(int classId, float conf, int left, int top, int right, int bottom, cv::Mat& frame,const std::vector<std::string>& classes){cv::rectangle(frame, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(0, 255, 0), 3);std::string label = cv::fORMat("%.2f", conf);if (!classes.empty()) {CV_Assert(classId < (int)classes.size());label = classes[classId] + ": " + label;}int baseLine;cv::Size labelSize = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);top = std::max(top, labelSize.height);cv::rectangle(frame, cv::Point(left, top - round(1.5 * labelSize.height)), cv::Point(left + round(1.5 * labelSize.width), top + baseLine), cv::Scalar(0, 255, 0), cv::FILLED);cv::putText(frame, label, cv::Point(left, top), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(), 2);}

sigmod部分

inline float sigmoid(float x){return 1.f / (1.f + exp(-x));}

“c++如何实现yolov5转onnx”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: c++如何实现yolov5转onnx

本文链接: https://lsjlt.com/news/302481.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • c++如何实现yolov5转onnx
    本篇内容介绍了“c++如何实现yolov5转onnx”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!训练模型.pt转onnx训练部分根据呼声再...
    99+
    2023-06-22
  • c++调用实现yolov5转onnx介绍
    目录介绍训练模型.pt转onnxc++代码解析main函数部分推理部分讲解darpred部分sigmod部分结尾介绍 现在很多开发都是需要用c++做最后一步的移植部署,手写吧,先不说...
    99+
    2024-04-02
  • tensorflow转onnx如何实现
    本文小编为大家详细介绍“tensorflow转onnx如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“tensorflow转onnx如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。安装tf2onnx...
    99+
    2023-07-05
  • tensorflow转onnx的实现方法
    安装tf2onnx以及onnxruntime pip install onnxruntime pip install tf2onnx tf 转为onnx步骤为如下: 将tf动态图冻...
    99+
    2023-03-06
    tensorflow转onnx
  • 如何将模型转换为ONNX格式
    要将模型转换为ONNX格式,可以使用以下步骤: 安装ONNX工具包:首先,需要安装ONNX工具包。可以通过pip安装ONNX工具包...
    99+
    2024-04-02
  • C#如何实现强制转换
    这篇文章给大家分享的是有关C#如何实现强制转换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。int 关键字表示一种整型,是32位的,它的 .NET Framework 类型为 System.Int32。(int)...
    99+
    2023-06-17
  • C#如何实现Word转换RTF
    这篇文章主要介绍“C#如何实现Word转换RTF”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#如何实现Word转换RTF”文章能帮助大家解决问题。实践过程效果代码public part...
    99+
    2023-07-04
  • PyTorch模型转换为ONNX格式实现过程详解
    目录1. 安装依赖2. 准备模型3. 调整输入和输出节点4. 运行转换程序5. 使用后端框架测试ONNX模型6. 核对结果1. 安装依赖 将PyTorch模型转换为ONNX格式可以使...
    99+
    2023-05-17
    PyTorch模型转换为ONNX格式 PyTorch转换ONNX
  • C# DataGridView行列转换如何实现
    这篇文章主要讲解了“C# DataGridView行列转换如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C# DataGridView行列转换如何实现”吧!初始表...
    99+
    2023-07-05
  • C#如何实现转换十六进制
    这篇文章主要介绍“C#如何实现转换十六进制”,在日常操作中,相信很多人在C#如何实现转换十六进制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#如何实现转换十六进制”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • C++如何实现转置矩阵的循环
    这篇文章主要介绍了C++如何实现转置矩阵的循环,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言矩阵的转置主要考查我们对循环的使用,通过简单的循环结构,我们可以很方便的完成矩...
    99+
    2023-06-22
  • C#如何实现文字转语音功能
    本文小编为大家详细介绍“C#如何实现文字转语音功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#如何实现文字转语音功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果图关键是,c#有现成的一个引用右键点击...
    99+
    2023-06-29
  • c语言如何实现字符串反转
    C语言可以通过循环遍历字符串并交换字符的位置来实现字符串的反转。具体步骤如下:1. 首先,定义一个指向字符串的指针。2. 使用`st...
    99+
    2023-09-12
    c语言
  • C#如何实现将PDF转为线性化PDF
    这篇文章主要介绍了C#如何实现将PDF转为线性化PDF,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。线性化PDF文件是PDF文件的一种特殊格式,可以通过Internet更快地...
    99+
    2023-06-22
  • C#中如何实现EXCEL转换成TXT文档
    这篇文章主要为大家展示了“C#中如何实现EXCEL转换成TXT文档”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中如何实现EXCEL转换成TXT文档”这篇文章吧。C#数据转换前excel中的...
    99+
    2023-06-17
  • 详解C#如何实现隐式类型转换
    目录预期效果static using 与 global using隐式类型转换实现 Result 类型Result 类型是许多编程语言中处理错误的常用方式,包括 C# 的 dotNe...
    99+
    2023-01-05
    C#实现隐式类型转换 C#隐式类型转换 C# 类型转换
  • 如何使用C#/VB.NET实现将PDF转为Word
    本篇内容介绍了“如何使用C#/VB.NET实现将PDF转为Word”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!固定布局模式转换速度快,有利...
    99+
    2023-07-04
  • C语言如何实现常见进制转换
    这篇文章主要介绍“C语言如何实现常见进制转换”,在日常操作中,相信很多人在C语言如何实现常见进制转换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言如何实现常见进制转换”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-05
  • C#如何实现自定义隐式转换和显式转换
    这篇文章主要介绍了C#如何实现自定义隐式转换和显式转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基础知识类型转换有2种:隐式转换和显式转换。但是,不管是隐式转换,还是显式...
    99+
    2023-06-29
  • ONNX如何处理不同框架之间的模型转换问题
    ONNX(开放神经网络交换)是一种开放标准,旨在使不同深度学习框架之间的模型转换更加简单。它定义了一种通用的模型表示形式,使得框架之...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作