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

yolov5 opencv dnn部署自己的模型

yolov5 opencv dnn部署自己的模型

      • github开源代码地址
      • 使用github源码结合自己导出的onnx模型推理自己的视频
        • 推理条件
        • c++部署
        • c++ 推理结果

github开源代码地址

  1. yolov5官网还提供的dnn、tensorrt推理链接
  2. 本人使用的opencv c++ github代码,代码作者非本人,也是上面作者推荐的链接之一
  3. 如果想要尝试直接运行源码中的yolo.cpp文件和yolov5s.pt推理sample.mp4,请参考这个链接的介绍

使用github源码结合自己导出的onnx模型推理自己的视频

推理条件

windows 10
Visual Studio 2019
Nvidia GeForce GTX 1070
opencv 4.5.5、opencv4.7.0 (注意 4.7.0中也会出现跟yolov5 opencv dnn部署 github代码一样的问题)
yolov5 v6.1版本

c++部署

环境和代码的大致步骤跟yolov5 opencv dnn部署 github代码一样

在将所有前置布置好了之后,运行yolo.cpp的时候可能会出现图1problem的问题。
在这里插入图片描述
这个是由于yolov5 v6.1版本的问题,可以参考github源码中的issue的解决方案。当然,也可以按照下面的进行代码进行修改。

#include <fstream>#include <opencv2/opencv.hpp>std::vector<std::string> load_class_list()
{std::vector<std::string> class_list;std::ifstream ifs("./config_files/classes_fire.txt");std::string line;while (getline(ifs, line)){class_list.push_back(line);}return class_list;
}void load_net(cv::dnn::Net &net, bool is_cuda)
{auto result = cv::dnn::readNet("./config_files/yolov5n.onnx");if (is_cuda){std::cout << "Attempty to use CUDA\n";result.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);result.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);}else{std::cout << "Running on CPU\n";result.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);result.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);}net = result;
}const std::vector<cv::Scalar> colors = {cv::Scalar(255, 255, 0), cv::Scalar(0, 255, 0), cv::Scalar(0, 255, 255), cv::Scalar(255, 0, 0)};const float INPUT_WIDTH = 640.0;
const float INPUT_HEIGHT = 640.0;
const float SCORE_THRESHOLD = 0.2;
const float NMS_THRESHOLD = 0.4;
const float CONFIDENCE_THRESHOLD = 0.4;struct Detection
{int class_id;float confidence;cv::Rect box;
};cv::Mat format_yolov5(const cv::Mat &source) {int col = source.cols;int row = source.rows;int _max = MAX(col, row);cv::Mat result = cv::Mat::zeros(_max, _max, CV_8UC3);source.copyTo(result(cv::Rect(0, 0, col, row)));return result;
}// 所有的代码修改都在这个函数中
void detect(cv::Mat &image, cv::dnn::Net &net, std::vector<Detection> &output, const std::vector<std::string> &className) {cv::Mat blob;auto input_image = format_yolov5(image);cv::dnn::blobFromImage(input_image, blob, 1./255., cv::Size(INPUT_WIDTH, INPUT_HEIGHT), cv::Scalar(), true, false);net.setInput(blob);std::vector<cv::Mat> outputs;// 添加代码,使用opencv4.5.5的时候注释掉,使用opencv4.7.0可以使用net.enableWinograd(false);net.forward(outputs, net.getUnconnectedOutLayersNames());float x_factor = input_image.cols / INPUT_WIDTH;float y_factor = input_image.rows / INPUT_HEIGHT;float *data = (float *)outputs[0].data;const int dimensions = 85;const int rows = 25200;const int max_wh = 768;  // 这个值是偏移量,这个酌情选择,不然太大会导致dnn:nms不工作// 添加代码int out_dim2 = outputs[0].size[2]; // 这里的是class+conf+xywh,相当于COCO的指标的85std::vector<int> class_ids;std::vector<float> confidences;std::vector<cv::Rect> boxes;std::vector<cv::Rect> boxes_muti;for (int i = 0; i < rows; ++i) {// 添加代码int index = i * out_dim2; // 每一次循环索引都是下一个pre_box的初始位置float confidence = data[4 + index]; // 修改代码 这样读取的值就是下一个的pre_box的confif (confidence >= CONFIDENCE_THRESHOLD) {// 修改代码 这样读取的值就是下一个的pre_box的classfloat * classes_scores = data + 5 + index;cv::Mat scores(1, className.size(), CV_32FC1, classes_scores);cv::Point class_id;double max_class_score;minMaxLoc(scores, 0, &max_class_score, 0, &class_id);max_class_score *= confidence;  // conf = obj_conf * cls_confif (max_class_score > SCORE_THRESHOLD) {confidences.push_back(max_class_score);class_ids.push_back(class_id.x);// 修改代码,这样读取的值就是下一个的pre_box的xywhfloat x = data[0 + index];float y = data[1 + index];float w = data[2 + index];float h = data[3 + index];int left = int((x - 0.5 * w) * x_factor);int top = int((y - 0.5 * h) * y_factor);int width = int(w * x_factor);int height = int(h * y_factor);boxes.push_back(cv::Rect(left, top, width, height));// 实现多分类NMS,如果不需要实现,就直接删掉该部分// 在这里添加的是类似yolov5nms的class_id位置偏移int left_muti = int((x - 0.5 * w) * x_factor + class_id.x * max_wh);int top_muti = int((y - 0.5 * h) * y_factor + class_id.x * max_wh);int width_muti = int(w * x_factor + class_id.x * max_wh);int height_muti = int(h * y_factor + class_id.x * max_wh);boxes_muti.push_back(cv::Rect(left_muti, top_muti, width_muti, height_muti));}}}std::vector<int> nms_result;cv::dnn::NMSBoxes(boxes_muti, confidences, SCORE_THRESHOLD, NMS_THRESHOLD, nms_result);for (int i = 0; i < nms_result.size(); i++) {int idx = nms_result[i];Detection result;result.class_id = class_ids[idx];result.confidence = confidences[idx];result.box = boxes[idx];output.push_back(result);}
}int main(int argc, char **argv)
{std::vector<std::string> class_list = load_class_list();cv::Mat frame;cv::VideoCapture capture("sample_fire2.mp4");// 如果想要将结果保存为视频/*cv::VideoWriter writer;int coder = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');double fps_w = 25.0;//设置视频帧率std::string filename = "fire.avi";//保存的视频文件名称writer.open(filename, coder, fps_w, cv::Size(640, 360));//创建保存视频文件的视频流 Size(640, 360)是smaple_fire2.mp4的分辨率*/if (!capture.isOpened()){std::cerr << "Error opening video file\n";return -1;}// 因为是window系统,且直接使用VStudio运行代码的,如果想使用cuda,直接将is_cuda = true即可bool is_cuda = argc > 1 && strcmp(argv[1], "cuda") == 0;cv::dnn::Net net;load_net(net, is_cuda);auto start = std::chrono::high_resolution_clock::now();int frame_count = 0;float fps = -1;int total_frames = 0;while (true){capture.read(frame);if (frame.empty()){std::cout << "End of stream\n";break;}std::vector<Detection> output;detect(frame, net, output, class_list);frame_count++;total_frames++;int detections = output.size();for (int i = 0; i < detections; ++i){auto detection = output[i];auto box = detection.box;auto classId = detection.class_id;const auto color = colors[classId % colors.size()];cv::rectangle(frame, box, color, 3);cv::rectangle(frame, cv::Point(box.x, box.y - 20), cv::Point(box.x + box.width, box.y), color, cv::FILLED);cv::putText(frame, class_list[classId].c_str(), cv::Point(box.x, box.y - 5), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));}if (frame_count >= 30){auto end = std::chrono::high_resolution_clock::now();fps = frame_count * 1000.0 / std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();frame_count = 0;start = std::chrono::high_resolution_clock::now();}if (fps > 0){std::ostringstream fps_label;fps_label << std::fixed << std::setprecision(2);fps_label << "FPS: " << fps;std::string fps_label_str = fps_label.str();cv::putText(frame, fps_label_str.c_str(), cv::Point(10, 25), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255), 2);}cv::imshow("output", frame);//  writer.write(frame);  // 如果想要将结果保存为视频if (cv::waitKey(1) != -1){capture.release();// writer.release();  // 如果想要将结果保存为视频std::cout << "finished by user\n";break;}}std::cout << "Total frames: " << total_frames << "\n";return 0;
}
c++ 推理结果

opencv 4.5.5
yolov5 v6.1 导出的是yolov5n.onnx

yolov5_deploy_fire

opencv 4.7.0
yolov5 v6.1 导出的是yolov5n.onnx

yolov5_deploy_fire2

相关文章:

yolov5 opencv dnn部署自己的模型

yolov5 opencv dnn部署自己的模型 github开源代码地址使用github源码结合自己导出的onnx模型推理自己的视频推理条件c部署c 推理结果 github开源代码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人&#xff0c;也是上面作者推荐的…...

Cortex-M4处理器 电源管理

Cortex-M4处理器的休眠模式可以降低功耗。 模式可以是以下一种或两种&#xff1a; 休眠模式停止处理器时钟深度睡眠模式停止系统时钟&#xff0c;关闭锁相环和闪存。 如果设备实现了两种提供不同级别省电的睡眠模式&#xff0c;那么SCR的SLEEPDEEP位将选择使用哪种睡眠模式。…...

Linux 驱动开发基础知识——编写LED驱动程序(三)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…...

YOLOv8 视频识别

YOLOv8 是一种目标检测算法&#xff0c;用于识别视频中的物体。要控制视频识别中的帧&#xff0c;可以通过以下方式来实现&#xff1a; 设置帧率&#xff1a;可以通过设置视频的帧率来控制视频的播放速度&#xff0c;从而影响视频识别的速度。 跳帧处理&#xff1a;可以通过跳…...

elementplus Dialog 对话框设置距离页面顶部的距离

默认为 15vh&#xff0c;当弹窗过于高的时候&#xff0c;这个距离其实是不合适的 <el-dialogv-model"dialogVisible"title"Tips"width"30%":before-close"handleClose"top"6vh"><span>This is a message</s…...

便捷接口调测:API 开发工具大比拼 | 开源专题 No.62

hoppscotch/hoppscotch Stars: 56.1k License: MIT Hoppscotch 是一个开源的 API 开发生态系统&#xff0c;主要功能包括发送请求和获取实时响应。该项目具有以下核心优势&#xff1a; 轻量级&#xff1a;采用简约的 UI 设计。快速&#xff1a;实时发送请求并获得响应。支持多…...

openssl3.2/test/certs - 008 - root-nonca trust variants: +serverAuth +anyEKU

文章目录 openssl3.2/test/certs - 008 - root-nonca trust variants: serverAuth anyEKU概述笔记END openssl3.2/test/certs - 008 - root-nonca trust variants: serverAuth anyEKU 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 // \file my_openssl_win_log_doc…...

cg插画设计行业怎么样,如何学习插画设计

插画设计行业是一个充满创意和艺术性的行业&#xff0c;随着数字化时代的不断发展&#xff0c;cg插画的应用范围越来越广泛&#xff0c;市场需求也在逐年增长。以下是一些关于acg插画设计行业的现状和发展趋势&#xff1a; 市场需求不断增长&#xff1a;随着广告、媒体、影视、…...

1.25学习总结

今天学习了二叉树&#xff0c;了解了二叉树的创建和遍历的过程 今天所了解的遍历过程主要分为三种&#xff0c;前序中序和后序&#xff0c;都是DFS的想法 前序遍历&#xff1a;先输出在遍历左节点和右节点&#xff08;输出->左->右&#xff09; 中序遍历&#xff1a;先…...

C语言每日一题(48)回文链表

力扣 234 回文链表 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1…...

提高代码效率的5个Python内存优化技巧

大家好&#xff0c;当项目变得越来越大时&#xff0c;有效地管理计算资源是一个不可避免的需求。Python与C或c等低级语言相比&#xff0c;似乎不够节省内存。 但是其实有许多方法可以显著优化Python程序的内存使用&#xff0c;这些方法可能在实际应用中并没有人注意&#xff0…...

基于一款热门大屏可视化设计器使用教程

乐吾乐大屏可视化设计器是一个用于创建和定制大屏幕数据可视化展示的工具&#xff0c;支持零代码实现物联网、工业智能制造等领域的可视化大屏、触摸屏端UI以及工控可视化的解决方案。同时也是一个Web组态工具&#xff0c;支持2D、3D等多种形式&#xff0c;用于构建具有实时数据…...

梯度下降法、模拟训练、拟合二次曲线、最小二乘法、MSELoss、拟合:f(x)=ax^2+bx+c

本文目标&#xff1a; 以这个公式为例&#xff0c;设计一个算法&#xff0c;用梯度下降法来模拟训练过程&#xff0c;最终得出参数a,b,c 原理介绍 目标函数&#xff1a; 损失函数&#xff1a;&#xff0c;就是mse 损失函数展开&#xff1a; 损失函数对a,b,c求导数: 导数就是梯度…...

Web3.0投票如何做到公平公正且不泄露个人隐私

在当前的数字时代&#xff0c;社交平台举办投票活动已成为了一种普遍现象。然而&#xff0c;随之而来的是一些隐私和安全方面的顾虑&#xff0c;特别是关于个人信息泄露和电话骚扰的问题。期望建立一个既公平公正又能保护个人隐私的投票系统。Web3.0的出现为实现这一目标提供了…...

灰度图像的自动阈值分割

第一种&#xff1a;Otsu &#xff08;大津法&#xff09; 一、基于cv2的API调用 1、代码实现 直接给出相关代码&#xff1a; import cv2 import matplotlib.pylab as pltpath r"D:\Desktop\00aa\1.png" img cv2.imread(path, 0)def main2():ret, thresh1 cv2.…...

利用Maven获取jar包

我有一个习惯&#xff0c;就是程序不在线依赖网络的任何包。以前用C#时候虽然用Nuget找包&#xff0c;但是添加引用后又马上把Nuget引用删了&#xff0c;再把Nuget下载的dll拷贝到工程再引用dll。 这样做的好处是&#xff1a; 1.别人得到程序代码可以直接编译&#xff0c;不用…...

将vue组件发布成npm包

文章目录 前言一、环境准备1.首先最基本的需要安装nodejs&#xff0c;版本推荐 v10 以上&#xff0c;因为需要安装vue-cli2.安装vue-cli 二、初始化项目1.构建项目2.开发组件/加入组件3. 修改配置文件 三、调试1、执行打包命令2、发布本地连接包3、测试项目 四、发布使用1、注册…...

江科大STM32 中

目录 6、TIM&#xff08;Timer&#xff09;定时器基本定时器通用定时器高级定时器示例程序&#xff08;定时器定时中断&定时器外部时钟&#xff09;TIM输出比较示例程序&#xff08;PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机&#xff09;TIM输入捕获示例程序&…...

vue+draggable+el-upload上传图片拖拽重排方法

vuedraggableel-upload上传图片拖拽重排方法 1.html <el-row><el-col><el-form-item label"添加视频/图片" prop"device_id"><div class"image-upload"><draggable v-model"fileList" update"dataDr…...

微信的新版canvas绘制的图案发生变形和偏移的问题

一,现象 this.context.beginPath(); this.context.moveTo(10, 10); this.context.lineTo(10, 100); this.context.lineTo(100, 100); this.context.lineTo(100, 10); this.context.lineTo(10, 10); this.context.stroke();本来绘制的是正方形,结果绘制出来是个矩形,边的宽度也…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...