复现yolov5CPP经验贴

news2024/11/17 1:47:17

源码:
https://github.com/Hexmagic/ONNX-yolov5/blob/master/src/test.cpp
该源码亲测可行,但是还是有一些问题
在这里插入图片描述此处改成False

在这里插入图片描述
此处改成自己转换好的onnx模型路径

用神经网络工具:
https://github.com/lutzroeder/netron
用该工具可查看输入输出非常重要,不然后面参数设置没法设置,运行就会报错,有四个参数必须一致在这里插入图片描述
输入的图像网络大小必须和转出模型输入网络大小一致都是640,640,不然报错

在这里插入图片描述
其次查看输出
在这里插入图片描述
必须一致
在这里插入图片描述
然后配置相应的opencv环境既可以,注意版本4.54以上的就有dnn推理模块,以下可能没有该模块,就容易报错

最后,源码还有一个问题,就是容易越界报错。
在这里插入图片描述
这段代码我改成如下:
在这里插入图片描述
上述即是我所遇到的问题。
我的自己修改后可执行代码:

#include <opencv2/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
using namespace cv;
using namespace std;

Mat letterbox(Mat &img, Size new_shape, Scalar color, bool _auto, bool scaleFill, bool scaleup, int stride)
{
	float width = img.cols;
	float height = img.rows;
	float r = min(new_shape.width / width, new_shape.height / height);
	if (!scaleup)
		r = min(r, 1.0f);
	int new_unpadW = int(round(width * r));
	int new_unpadH = int(round(height * r));
	int dw = new_shape.width - new_unpadW;
	int dh = new_shape.height - new_unpadH;
	if (_auto)
	{
		dw %= stride;
		dh %= stride;
	}
	dw /= 2, dh /= 2;
	Mat dst;
	resize(img, dst, Size(new_unpadW, new_unpadH), 0, 0, INTER_LINEAR);
	int top = int(round(dh - 0.1));
	int bottom = int(round(dh + 0.1));
	int left = int(round(dw - 0.1));
	int right = int(round(dw + 0.1));
	copyMakeBorder(dst, dst, top, bottom, left, right, BORDER_CONSTANT, color);
	return dst;
}

int main(int argc, char *argv[])
{
	string model_path = "muti_single_peson_15000best320.onnx";
	dnn::Net model = dnn::readNetFromONNX(model_path);
	Mat img0 = imread("1.png");

	Mat img = letterbox(img0, Size(640, 640), Scalar(114, 114, 114), false, false, true, 32);
	Mat blob;
	dnn::blobFromImage(img, blob, 1 / 255.0f, Size(img.cols, img.rows), Scalar(0, 0, 0), true, false);
	model.setPreferableBackend(dnn::DNN_BACKEND_OPENCV);
	model.setPreferableTarget(dnn::DNN_TARGET_CPU);
	model.setInput(blob);
	vector<string> outLayerNames = model.getUnconnectedOutLayersNames();
	vector<Mat> result; 
	
	model.forward(result, outLayerNames);

	Mat out = Mat(result[0].size[1], result[0].size[2], CV_32F, result[0].ptr<float>());
	vector<Rect> boxes;
	vector<int> indices;
	vector<float> scores;
	for (int r = 0; r < out.size[0]; r++)
	{
		float cx = out.at<float>(r, 0);
		float cy = out.at<float>(r, 1);
		float w = out.at<float>(r, 2);
		float h = out.at<float>(r, 3);
		float sc = out.at<float>(r, 4);
		Mat confs = out.row(r).colRange(5,85);
		confs *= sc;
		double minV = 0, maxV = 0;
		double *minI = &minV;
		double *maxI = &maxV;
		minMaxIdx(confs, minI, maxI);
		scores.push_back(maxV);
		boxes.push_back(Rect(cx - w / 2, cy - h / 2, w, h));
		indices.push_back(r);
	}
	dnn::NMSBoxes(boxes, scores, 0.25f, 0.45f, indices);
	int index = 0;
	for (auto &ind : indices)
	{
		cout << indices[index] << ":" << scores[ind] << endl;
		Rect rect = boxes[indices[index++]];
		cv::rectangle(img, rect, Scalar(0, 255, 0), 1, LINE_AA);
		
	}
	cv::imshow("output", img);
	cv::waitKey(10000);
}

欢迎交流
在这里插入图片描述
加好友交流,还请备注姓名,专业,否则可能无法验证通过,谢谢配合,

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

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

相关文章

【UE4 第一人称射击游戏】24-添加人工智能的敌人跟随功能

上一篇&#xff1a;【UE4 第一人称射击游戏】23-添加子弹伤害本篇效果&#xff1a;步骤&#xff1a;将 导航网格体边界体积 拖入视口按P键显示区域将导航区域扩大一些如果不想让导航体覆盖上面的区域可以将导航体的高度降低一些打开“SimpleAI”&#xff0c;添加一个“Pawn感应…

Java Type

Type 是Java 编程语言中所有类型的公共高级接口&#xff08;官方解释&#xff09;&#xff0c;也就是Java 中所有类型的”爹“。其中”所有类型“的描述尤为指的关注。它并不是我们平常工作中经常使用的int、String、List、Map等数据类型&#xff0c;而是从Java语言角度磊说&am…

shell练习之安全脚本

题目&#xff1a; 将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问 1.初始配置 首先使用systemctl工具启用firewalld服务&#xff1a; ​[rootlocalhost ~]# systemctl enable firewalld如果已经启用了&#xff0c;我们现在可以通过执行以下命令启动firewalld&a…

失败就是差一点的成功,社科院与杜兰大学金融管理硕士项目为你在职读研助力

失败的人&#xff0c;只差了一点点&#xff1b;成功的人&#xff0c;是多做了一点点&#xff1b;顶尖的人&#xff0c;则是再多做一点点。小事成就大事&#xff0c;细节成就完美&#xff0c;所以&#xff0c;千万不要只差那么一点&#xff0c;就放弃了。都说失败是成功之母&…

从Reactor模式俯瞰Nginx,你会发现你与高手的差距就在设计模式上

我们知道了Nginx是做什么的以及它为何如此高效&#xff0c;以至于全宇宙拿它来做负载均衡或者说web server。 但是如果你只是了解了使用和知道了原理就认为已经掌握了它&#xff0c;那只能说你肤浅了&#xff0c;原理和使用技能看看大家都知道了&#xff0c;没必要拿出去和别人…

快排递归、迭代的实现和两种优化方法

目录 快速排序 实现代码 时间复杂度 快排的优化 随机选择策略 三位取中法 非递归的快排 快速排序 快速排序算法是基于分治策略的一个排序算法&#xff0c;其基本思想是对于输入的子数组进行分解、递归求解&#xff0c;最后合并。 分解&#xff1a;以数组中左边第一个数作…

运行flutter doctor命令检测环境是否配置成功报错及解决方案

/** 运行flutter doctor命令检测环境是否配置成功&#xff0c;报如下错误**/ 1. cmdline-tools component is missing & Android licenses status unknown 1.1.安装cmdline-tools 1.2.配置android-licenses 运行命令flutter doctor --android-licenses&#xff0c;提示…

封装一个帧动画组件,使用的是精灵图

我写的是淘宝小部件&#xff0c;限制很多&#xff0c;用的是精灵图&#xff0c;说下大概思路&#xff0c;主要是通过背景图片的X Y轴去控制&#xff0c;首先创建一个组件 例&#xff1a; 然后在props定义需要的参数&#xff0c;可通过父组件传递修改 需要传入精灵图地址、单…

【云原生】Prometheus监控docker容器

部署node-exporter用于搜集硬件和系统信息 // 全部主机都要做 docker run -d -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --nethost prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-point…

Windows系统pagefile.sys删除、移动

背景 在使用windows系统中通常会发现c盘系统盘容量和实际容量不符。以至于你以为还有几十个G的空间&#xff0c;但操作程序时会出现空间不足的情况 。 例如以下错误&#xff1a; # There is insufficient memory for the Java Runtime Environment to continue. # Native memo…

【六】Netty Google Protobuf 编解码

Netty Google Protobuf 编解码Google Protobuf 介绍Protobuf 的入门Protobuf 开发环境搭建Protobuf 下载创建.proto文件第五节的 对应实体&#xff08;SubscribeReq&#xff0c;SubscribeResp &#xff09;SubscribeReq.proto 文件SubscribeResp.proto利用命令生成对应的java文…

详解c++---string模拟实现

这里写目录标题前言准备工作构造函数析构函数迭代器的实现插入数据有关的函数实现reservepush_backoperatorappendinserterasefindresize[ ]clear>>>>新式拷贝构造函数新式赋值重载前言 在前面的文章里我们学习了c中string的用法&#xff0c;那么这篇文章我们将带…

Vue的双向绑定(数据劫持)

双向绑定所谓的双向绑定其实就是&#xff0c;ui或者数据有一方做了修改&#xff0c;那么另外一个也会随着改变。简单来说&#xff0c;视图驱动数据&#xff0c;同时数据也能驱动视图。视图驱动数据&#xff0c;只需要绑定事件。数据驱动视图&#xff0c;则需要去对数据做监听&a…

DC-DC PCB layout经验-含走线宽度和载流量表格

在DC-DC芯片的应用设计中&#xff0c;PCB布板是否合理对于芯片能否表现出其最优性能有着至关重要的影响。不合理的PCB布板会造成芯片性能变差如线性度下降&#xff08;包括输入线性度以及输出线性度&#xff09;、带载能力下降、工作不稳定、EMI辐射增加、输出噪声增加等&#…

不同Nodejs版本的TypeScript的建议配置

Node Target Mapping microsoft/TypeScript Wiki GitHubTypeScript is a superset of JavaScript that compiles to clean JavaScript output. - Node Target Mapping microsoft/TypeScript Wikihttps://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping以上是tsc…

SpringBoot+Vue项目知识管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

macOS 安装 Frama-C 及使用

操作系统&#xff1a;macOS 12.6 Monterey 官网安装指导&#xff1a;Get Frama-C 一、操作与避坑 &#x1f573;️ 1、macOS 包管理绕不开 Homebrew 工具&#xff0c;确保安装好。 2、安装 Frama-C 的必要依赖 brew install opam gmp gtk gtksourceview libgnomecanvas在安装…

MATLAB-最大值与最小值

在MATLAB中&#xff0c;用于计算最大值的函数是max函数&#xff0c;用于计算最小值的函数是min函数&#xff0c;其调用格式如下。Bmax(A) %计算最大值 &#xff0c;若A为向量&#xff0c;则计算并返回向量中的最大值;若A为矩阵&#xff0c;则计算并返回%一个含有各列最大值的行…

从0到1完成一个Vue后台管理项目(九、引入Breadcrumb面包屑,更改bug)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

ansible(第四天)

三&#xff1a;编写playbook 1.Ansible playbook 临时命令可以作为一次性对一组主机运行简单的任务。不过&#xff0c;若要真正发挥Ansible的力量&#xff0c;需要了解如 何使用playbook可以轻松重复的方式对一组主机执行多项复杂的任务。 play是针对对清单中选定的主机运行…