我的编程空间,编程开发者的网络收藏夹
学习永远不晚

c++如何实现yolov5转onnx

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

c++如何实现yolov5转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_class="lazy" data-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_class="lazy" data-src.cols, int((cx - w / 2.f) * (float)cv_class="lazy" data-src.cols / (float)net_size)));float y1 = std::max(0, std::min(cv_class="lazy" data-src.rows, int((cy - h / 2.f) * (float)cv_class="lazy" data-src.rows / (float)net_size)));float x2 = std::max(0, std::min(cv_class="lazy" data-src.cols, int((cx + w / 2.f) * (float)cv_class="lazy" data-src.cols / (float)net_size)));float y2 = std::max(0, std::min(cv_class="lazy" data-src.rows, int((cy + h / 2.f) * (float)cv_class="lazy" data-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_class="lazy" data-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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

c++如何实现yolov5转onnx

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

c++如何实现yolov5转onnx

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

tensorflow转onnx如何实现

本文小编为大家详细介绍“tensorflow转onnx如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“tensorflow转onnx如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。安装tf2onnx
2023-07-05

tensorflow转onnx的实现方法

本文主要介绍了tensorflow转onnx的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-06

C#如何实现强制转换

这篇文章给大家分享的是有关C#如何实现强制转换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。int 关键字表示一种整型,是32位的,它的 .NET Framework 类型为 System.Int32。(int)
2023-06-17

C#如何实现Word转换RTF

这篇文章主要介绍“C#如何实现Word转换RTF”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#如何实现Word转换RTF”文章能帮助大家解决问题。实践过程效果代码public partial c
2023-07-04

C# DataGridView行列转换如何实现

这篇文章主要讲解了“C# DataGridView行列转换如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C# DataGridView行列转换如何实现”吧!初始表格需要进行行列转置
2023-07-05

PyTorch模型转换为ONNX格式实现过程详解

这篇文章主要为大家介绍了PyTorch模型转换为ONNX格式实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

C#如何实现转换十六进制

这篇文章主要介绍“C#如何实现转换十六进制”,在日常操作中,相信很多人在C#如何实现转换十六进制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#如何实现转换十六进制”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-17

C++如何实现转置矩阵的循环

这篇文章主要介绍了C++如何实现转置矩阵的循环,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言矩阵的转置主要考查我们对循环的使用,通过简单的循环结构,我们可以很方便的完成矩
2023-06-22

C#如何实现文字转语音功能

本文小编为大家详细介绍“C#如何实现文字转语音功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#如何实现文字转语音功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果图关键是,c#有现成的一个引用右键点击
2023-06-29

c语言如何实现字符串反转

C语言可以通过循环遍历字符串并交换字符的位置来实现字符串的反转。具体步骤如下:1. 首先,定义一个指向字符串的指针。2. 使用`strlen()`函数获取字符串的长度,即字符个数,保存在一个变量中。3. 使用两个指针,一个指向字符串的起始位
2023-09-12

C#中如何实现EXCEL转换成TXT文档

这篇文章主要为大家展示了“C#中如何实现EXCEL转换成TXT文档”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中如何实现EXCEL转换成TXT文档”这篇文章吧。C#数据转换前excel中的
2023-06-17

详解C#如何实现隐式类型转换

Result 类型是许多编程语言中处理错误的常用方式,包括 C# 的 dotNext 库。在本文中,我们将通过例子回顾 C# 中 using 语句和隐式类型转换的使用,感兴趣的可以了解一下
2023-01-05

C#如何实现将PDF转为线性化PDF

这篇文章主要介绍了C#如何实现将PDF转为线性化PDF,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。线性化PDF文件是PDF文件的一种特殊格式,可以通过Internet更快地
2023-06-22

如何使用C#/VB.NET实现将PDF转为Word

本篇内容介绍了“如何使用C#/VB.NET实现将PDF转为Word”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!固定布局模式转换速度快,有利
2023-07-04

C语言如何实现常见进制转换

这篇文章主要介绍“C语言如何实现常见进制转换”,在日常操作中,相信很多人在C语言如何实现常见进制转换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言如何实现常见进制转换”的疑惑有所帮助!接下来,请跟着小编
2023-07-05

C#如何实现自定义隐式转换和显式转换

这篇文章主要介绍了C#如何实现自定义隐式转换和显式转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基础知识类型转换有2种:隐式转换和显式转换。但是,不管是隐式转换,还是显式
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录