基于C++和ONNX Runtime的YOLOv5目标检测实战

1. 前言

在计算机视觉领域,目标检测是一项关键任务,其应用广泛,涵盖了安防监控、自动驾驶、工业检测等众多领域。YOLOv5作为一种先进的目标检测算法,以其速度快、精度高的特点备受关注。本文将详细介绍如何使用C++结合ONNX Runtime推理引擎来部署YOLOv5模型,实现高效的目标检测。

2. ONNX与YOLOv5

2.1 ONNX简介

ONNX(Open Neural Network Exchange)是一种开放的神经网络交换格式,旨在促进不同深度学习框架之间的模型互操作性。它允许开发者在一个框架中训练模型,然后将其转换为ONNX格式,并在另一个支持ONNX的框架或推理引擎中进行部署,大大提高了模型的可移植性和灵活性。

2.2 YOLOv5模型

YOLOv5是YOLO系列目标检测算法的最新版本,其在保持高检测精度的同时,显著提升了检测速度。YOLOv5模型具有多种尺寸(如n、s、m、l、x),适用于不同的应用场景。本文将以YOLOv5n模型为例,展示如何在C++中进行推理部署。

3. 环境搭建

3.1 安装依赖库

  • OpenCV:用于图像处理和显示,提供了丰富的图像处理函数和数据结构。
  • ONNX Runtime:ONNX模型的推理引擎,负责加载和执行ONNX模型。

3.2 准备YOLOv5模型

将训练好的YOLOv5模型转换为ONNX格式,并确保模型文件路径正确。在代码中,通过指定模型文件路径来加载模型。

4. 代码实现

4.1 图像预处理

图像预处理是目标检测的重要环节,包括图像缩放、归一化等操作。在代码中,resize_image函数实现了图像的缩放和填充,保持图像的长宽比,使其适应模型的输入尺寸(640x640)。

Mat resize_image(Mat &srcimg, int &newh, int &neww, int &srch, int &srcw, int &top, int &left) {
   
    int inpHeight = 640;
    int inpWidth = 640;
    bool keep_ratio = true;
    Mat dstimg;
    if (keep_ratio && srch!= srcw) {
   
        // 计算缩放比例
        float hw_scale = (float)srch / srcw;
        if (hw_scale > 1) {
   
            newh = inpHeight;
            neww = int(inpWidth / hw_scale);
            resize(srcimg, dstimg, Size(neww, newh), INTER_AREA);
            left = int((inpWidth - neww) * 0.5);
            // 填充图像
            copyMakeBorder(dstimg, dstimg, 0, 0, left, inpWidth - neww - left, BORDER_CONSTANT, 114);
        } else {
   
            newh = (int)inpHeight * hw_scale;
            neww = inpWidth;
            resize(srcimg, dstimg, Size(neww, newh), INTER_AREA);
            top = (int)(inpHeight - newh) * 0.5;
            copyMakeBorder(dstimg, dstimg, top, inpHeight - newh - top, 0, 0, BORDER_CONSTANT, 114);
        }
    } else {
   
        resize(srcimg, dstimg, Size(neww, newh), INTER_AREA);
    }
    return dstimg;
}

4.2 模型推理

模型推理部分是核心,通过ONNX Runtime加载模型,并将预处理后的图像数据输入模型,获取预测结果。在infer函数中,首先初始化ONNX Runtime环境和会话,然后将图像数据转换为模型输入张量,执行推理,最后对输出结果进行后处理,包括解析边界框、置信度和类别信息。

void infer(cv::Mat frame, const std::string& onnxfilepath, float confThreshold, float iouThreshold,
            std::vector<cv::Rect>& boxes, std::vector<float>& confs, std::vector<int>& classIds, std::vector<int>& indices) {
   
    // 初始化相关变量
    if(boxes.size()) boxes.clear();
    if(confs.size()) confs.clear();
    if (classIds.size()) classIds.clear();
    if (indices.size()) indices.clear();
    static bool is_initialized = false;
    static Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "yolov5s-5.0");
    static Ort::SessionOptions session_options;
    static std::vector<const char*> input_node_names = {
    "images" };
    static std::vector<const char*> output_node_names = {
    "output0" };
    static size_t input_tensor_size = 3 * 640 * 640;
    static std::vector<float> input_tensor_values(input_tensor_size);

    // 初始化模型路径
#ifdef _WIN32
    static wchar_t *model_path = 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

40% 降本:多点 DMALL x StarRocks 的湖仓升级实战

小编导读&#xff1a; 多点 DMALL 成立于2015年&#xff0c;持续深耕零售业&#xff0c;为企业提供一站式全渠道数字零售解决方案 DMALL OS。作为 DMALL OS 数字化能力的技术底座&#xff0c;大数据平台历经多次迭代平稳支撑了公司 To B 业务的快速开展。随着国家产业升级和云原…

AI-Talk开发板之超拟人

一、说明 运行duomotai_ap sdk下的LLM_chat例程&#xff0c;实现开发板和超拟人大模型进行语音交互&#xff0c;支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人&#xff0c;如果当前SDK在v2.3.o以下&#xff0c;需要更新SDK。在SDK目录(duomotai_ap)下…

graylog+sidecar通过docker-compose部署并采集SSH登录日志

文章目录 前言一、graylog日志系统数据流向清洗图二、资源准备及部署1.docker-compose部署2.准备docker-compose.yml文件3.安装graylog-sidecar并配置4.给sidecar创建token 三、graylog-WEB配置采集SSH日志1.配置Inputs2.创建sidecar采集器3.将页面创建好的sidecar与服务器绑定…

【Vue.js】监听器功能(EventListener)的实际应用【合集】

目录 &#x1f914;在实际开发过程中&#xff0c;我遇到了一个颇为棘手的小问题 &#x1f60b;解决这个小问题 问题出现的原因剖析 解决方法阐述 问题成功解决&#xff01;​ &#x1f4d6;相关知识总结 基本概念 使用方法 实际应用场景 &#x1f914;在实际开发过程中…

2023年区块链职业技能大赛——区块链应用技术(一)模块一

模块一:区块链产品方案设计及系统运维: 任务1-1:区块链产品需求分析与方案设计 1.依据给定区块链食品溯源系统的业务架构图&#xff0c;对考题进行业务分析&#xff0c;可能多的去考虑一个业务系统所需要的模块&#xff0c;使用Visio或思维导图工具展现本系统的基本设计概念和…

【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 一、在media文件夹中添加想要使用的图片素材​ 二、在entry/src/main/ets/page目录下创建Welcome.ets文件 1. 整体结构与组件声…

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio&#xff0c;打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件&#xff0c;将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包&#xff0c;应用的名称…

MES管理系统如何解决企业制造瓶颈

在当今全球化与信息化高度融合的时代&#xff0c;制造业作为支撑国家经济发展的关键产业&#xff0c;正处于发展的十字路口&#xff0c;面临着一系列严峻挑战。从日常所需的各类用品到先进的高端工业产品&#xff0c;制造业的稳定发展对经济的稳健运行至关重要&#xff0c;一旦…

Maven 详细配置:Maven settings 配置文件的详细说明

Maven settings 配置文件是 Maven 环境的重要组成部分&#xff0c;它用于定义用户特定的配置信息和全局设置&#xff0c;例如本地仓库路径、远程仓库镜像、代理服务器以及认证信息等。settings 文件分为全局配置文件&#xff08;settings.xml&#xff09;和用户配置文件&#x…

【C++】18.继承

文章目录 1.继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化 1.3 继承类模板 2.基类和派生类对象赋值转换3.继承中的作用域3.1 隐藏规则&#xff1a;3.2 考察继承作用域相关选择题 4.派生类的默认成员函数4…

声音是如何产生的

一、音频概述 RTMP中一般音频采用aac编码&#xff0c;采样率为44100HZ, 每帧1024采样&#xff0c;帧率43&#xff0c;23.2ms一帧 RTC中一般音频采用opus编码&#xff0c;采样率为48000HZ&#xff0c;每帧480采样&#xff0c;帧率100&#xff0c;10ms一帧 通道数&#xff08;c…

什么是中间件中间件有哪些

什么是中间件&#xff1f; 中间件&#xff08;Middleware&#xff09;是指在客户端和服务器之间的一层软件组件&#xff0c;用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件&#xff0c;它可以在两个系统之间传递、处理、转换数据&#xff0c;以达到协…

问题清除指南|关于num_classes与 BCELoss、BCEWithLogitsLoss 和 CrossEntropyLoss 的关系

前言&#xff1a;关于「 num_classes 1 」引发的探究。 2024年尾声&#xff0c;学弟问到一个问题&#xff1a;在研究工作 CNNDetection 的github开源代码 networks/trainer.py 文件的 line 27 self.model resnet50(num_classes1) 中&#xff0c;变量 num_classes 的值为1&…

FinDKG: 用于检测金融市场全球趋势的动态知识图谱与大型语言模型

“FinDKG: Dynamic Knowledge Graphs with Large Language Models for Detecting Global Trends in Financial Markets” 论文地址&#xff1a;https://arxiv.org/pdf/2407.10909 摘要 动态知识图&#xff08;DKG&#xff09;能够表示对象间随时间变化的关系&#xff0c;适用于…

Robot---奇思妙想轮足机器人

1 背景 传统机器人有足式、轮式、履带式三种移动方式&#xff0c;每种移动方式都有各自的优缺点。轮式机器人依靠车轮在地面上移动&#xff0c;能源利用率高、移动速度快&#xff0c;但是仅以轮子与地面接触&#xff0c;缺乏越障能力和对复杂地形的适应能力&#xff0c;尤其面对…

高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图

目录 高效工作流&#xff1a;用Mermaid绘制你的专属流程图 一、流程图的使用场景 1.1、流程图flowChart 1.2、使用场景 二、如何使用mermaid画出优雅的流程图 2.1、流程图添加图名 2.2、定义图类型与方向 2.3、节点形状定义 2.3.1、规定语法 2.3.2、不同节点案例 2.…

.NET框架用C#实现PDF转HTML

HTML作为一种开放标准的网页标记语言&#xff0c;具有跨平台、易于浏览和搜索引擎友好的特性&#xff0c;使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式&#xff0c;我们可以更方便地在浏览器中展示PDF文档内容&#xff0c;同时也更容…

Tableau数据可视化与仪表盘搭建-可视化原则及BI仪表盘搭建

目录 可视化原则 BI仪表盘搭建 仪表盘搭建原则 明确仪表盘主题 仪表盘主题拆解 开发设计工作表 经营情况总览&#xff1a;突出显示的文字 经营数据详情&#xff1a;表格 每日营收数据&#xff1a;多轴折线图 每日流量数据&#xff1a;双轴组合图 新老客占比&#xf…

AIA - APLIC之三(附APLIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 APLIC复位 APLIC复位后,其所有状态都变得有效且一致,但以下情况除外: 每个中断域的domaincfg寄存器(spec第 4.5.1 节);可能是machine-level interrupt domain的MSI地址配置寄存器(spec第4.5.3 和4.5…

unity学习5:创建一个自己的3D项目

目录 1 在unity里创建1个3D项目 1.1 关于选择universal 3d&#xff0c;built-in render pipeline的区别 1.2 创建1个universal 3d项目 2 打开3D项目 2.1 准备操作面板&#xff1a;操作界面 layout,可以随意更换 2.2 先收集资源&#xff1a;打开 window的 AssetStore 下载…