c++部署yolov5模型

2023-05-16

C++部署yolov5模型

  • 前言
  • 一、准备模型
  • 二、Fastdeploy准备
  • 三 调用
  • 总结

前言

不可否认,yolov5在目标检测方面大杀四方,在 SOTA 榜上留下过万众瞩目的成绩,但是官网代码给的只有 python 版本的 infer 代码,要求不高的话,勉勉强强可以实现部署,现在,我想在 win 下实现 c++ 部署过程,主要原因有:

  1. c++编译的文件,直接 cp 所有的 dll 以及 exe 到目标机器上就行,而 python 需要安装各种环境;
  2. c++的效率高于 python
  3. win 下我感觉 c++ 的部署与移植的便利性远远高于 python

谈到深度学习模型的部署问题,就引出来了几个常见的部署工具,例如 OpenVINO, tensorrt, onnxruntime等,以及基于这些框架又封装一层的,如 FastDeploy, mmdeploy等,这些工具各有特点,但对于目前的我来讲,就是想以最快的速度完成 ultracity/yolov5 生成的 pt 模型的部署,所以,选择了比较简单的 FastDeploy添加链接描述
现在这个 toolbox 能实现很多的功能,支持的模型也很多,有需要的话,可以自己上官网看看,这里就不做过多介绍了。

一、准备模型

FastDeploy 在调用 yolov5 的模型时,不是直接调用的 *.pt 文件,而是调用的 *.onnx(一种通用的深度学习模型)文件,因此,首先是需要对 *.pt 的文件进行格式转换,但并不是所有yolov5 的代码都支持 export *.pt to *.onnx 的功能,在这里,需要关注下 yolov5tag ,大于等于 v6.0 的才有 export.py 这个文件,所以,如果是老用户,就不不需读此文章了。

python export --weights *.pt --include onnx

二、Fastdeploy准备

这个还是需要自己编译下的,我是用 cmake 编译的,具体步骤:

  1. 设置下 ENABLE 目录下的选项:在这里插入图片描述我是用视觉模块,所以,我把 ENABLE_VISION 设置为 ON, 并且,因为我需要调用 onnx,也把 ORT_BACKENDPADDLE_BACKEND 设置为 ON,个人建议,用啥选啥,不用的先不要选,曾经遇到过坑,在编译的时候 ENABLE_OPENVINO_BACKEND=ON,然后再程序运行的时候就卡住不动了,结果发现是因为缺少了一个*.xml的文件,如果没人指点的话,估计这一个月都不知道问题出在哪里。2. 设置 with,在这里插入图片描述
    个人建议 WITH_GPU,因为在运行的时候,有 GPU 就调用 GPU 了,没有 GPU 就调用 CPU了,兼容性好点。

三 调用

如果第一,二步没啥问题,就恭喜了,后面的调用就更简单了,直接看下代码吧:

bool demo_yolov5onnx(const std::string& model_file, const std::string& img_path, const int& loop, const int& use_gpu) {
	fastdeploy::RuntimeOption option; // Configuration information for model inference 	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
	if (use_gpu == 1) {
		option.UseGpu();
	} else {
		option.UseCpu();
	}
	auto model = fastdeploy::vision::detection::YOLOv5(model_file, "hello", option);

	if (!model.Initialized()) {
		std::cerr << "Failed to initialize." << std::endl;
		return false;
	}
	std::cout << "init successful" << std::endl;

	cv::Mat im = cv::imread(img_path);
	fastdeploy::vision::DetectionResult result;

	clock_t t1, t2;
	for (int i = 0; i < loop; i++) {
		t1 = clock();
		if (!model.Predict(im, &result)) {
			std::cerr << "Failed to predict." << std::endl;
			return false;
		}
		t2 = clock();
		std::cout << "predict image cost time: " << t2 - t1 << std::endl;
	}

	std::cout << "=================================" << std::endl;
	std::cout << result.Str() << std::endl;
	std::cout << "=================================" << std::endl;

	cv::Mat vis_im = fastdeploy::vision::VisDetection(im, result, 0.5);
	cv::imwrite("vis_result.jpg", vis_im); // The visualization results are saved locally
	return true;
}

调用还是比较简单的,也就三五句有用的语句。

总结

FastDeploy封装的还是挺简单的,使用很方便,但是,毕竟是二次开发的工具,在功能上,还是会受限的,所以,要想能更精通的实现模型部署的工作,还是需要学习下底层的部署工具(OpenVINO,ONNXRuntime, TensorRT)的使用以及对模型框架本身的理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++部署yolov5模型 的相关文章

随机推荐

  • 网易我的世界服务器正在维护,网易《我的世界》Hypixel中国版服务器将停止运营...

    4月16日消息 网易 我的世界 官方现已发布Hypixel中国版服务器停止运营公告 网易表示 xff0c 由于其与Hypixel团队的合作即将到期 xff0c 按照约定将于2020年6月30日10点停止运营Hypixel中国版服务器 届时将
  • 七日杀服务器怎么修改天数,七日杀如何调整天数 | 手游网游页游攻略大全

    发布时间 xff1a 2016 01 21 有这种报错的是硬件加速的问题 调整硬件加速的方法 右键桌面属性 点设置 在设置界面中点高级 然后弹出一个界面 点击疑问解答 然后把硬件加速调到最大 如果还是不能解决可能是软件本身有问题 建议重新安
  • 如何给服务器传输文件,给服务器传输文件

    给服务器传输文件 内容精选 换一换 公有云通常指第三方供应商为用户提供的能够通过Internet使用的云端基础设施和服务 xff0c 其核心属性是共享资源服务 华为云是公有云品牌 xff0c 在SAP系统迁移的过程中 xff0c 您可以单独
  • 服务器架设文件服务器,服务器架设文件服务器

    服务器架设文件服务器 内容精选 换一换 安装完操作系统后的临时云服务器需要进行相关配置 xff0c 并安装原生的XEN和KVM驱动 xff0c 才能保证后续创建的云服务器正常使用 该任务指导用户完成Linux云服务器的相关配置与驱动安装 x
  • 基于YOLOv3的视频中无人机的目标检测(包括CUDA等环境配置)

    在SLAM毫无建树的我又投入了深度学习的大坑 xff0c 由于项目需求需要做无人机的目标检测 xff0c 这里把搭建系统中的一些问题记录下来 xff0c 方便之后复现 系统搭建 采用YOLOv3来进行无人机的检测 xff0c yolo的安装
  • 【CAN】CAN基础概念2

    摘自VECTOR官网E Learning的资料 9 帧类型 数据帧 为传输用户数据 xff0c ISO 11898 1定义了数据帧 数据帧可以传输的最大有效负载为八个字节 xff0c 即数据场 除了数据场 xff0c 数据帧还包括执行CAN
  • 如何设计一个锂电池充电电路(TP4056)

    这个是个单节18650锂电池的充电模块 xff0c 这个是个18650的锂电池 xff0c 18指的是它的直径是18mm xff0c 65指的是它的高度为65mm 这个18650电池的标称电压是3 7V xff0c 电池充满时电压为4 2V
  • 黑马程序员C++系统班学习笔记(一)——Linux操作系统一

    黑马程序员C 43 43 系统班链接 xff1a https www bilibili com video av37403127 from 61 search amp seid 61 5509409937472093685 本笔记旨在记录学
  • ubunbtu下基于c++实现MQTT客户端通信

    文章目录 一 MQTT简介1 1 MQTT 服务器 xff08 Broker xff09 是发布 订阅架构的核心1 2 MQTT 网络协议1 3 服务质量1 4 MQTT 数据包结构1 4 1 MQTT固定头1 4 2 MQTT可变头 Va
  • python 提取页面验证码

    以下代码都使用python 43 selenium 实现 xff0c 请先搭建好开发环境 1 页面的验证码若为静态验证码可以使用截屏的方式获取代码如下 driver save screenshot 39 C crawlerScript pi
  • 基于单片机的GPS开发 (four) GPS基础知识

    一 GPS硬件模块 xff1a VCC xff1a 兼容3 3V和5V GND xff1a 地 TXD xff1a 接51单片机的RXD P3 0 RXD xff1a 可接单片机的TXD P3 1 或者直接悬空 PPS xff1a 时钟脉冲
  • 记录:C++打印堆栈信息并优化打印结果

    1 介绍打印堆栈信息函数 头文件 xff1a span class token macro property span class token directive hash span span class token directive k
  • Ubuntu “无法定位软件包”

    Ubuntu 无法定位软件包 问题描述 xff1a 在使用Ubuntu 18 0 4 安装ceres库时安装依赖项时报错 xff0c 如图所示 xff1a 原因分析 xff1a libcxsparse3 1 2软件包是Ubuntu 14 0
  • NVIDIA Jetson TX2:TX2平台介绍

    一 xff1a TX2平台概述 TX2是快速高效的嵌入式AI计算设备 低功耗 xff08 标准 xff09 模式 xff08 7 5w xff09 xff1b 高功耗模式 xff08 15w xff09 xff0c 性能是TX1的两倍 具有
  • VSCode安装配置C++开发环境

    真相需要去探寻 之前已经在VSCode上配置了Golang的开发环境 xff0c 使用起来还是十分舒服的 xff0c 特别是设置了镜像下载地址和掌握了go mod的使用 xff0c 小巧轻便 xff0c 舒爽流畅 最近要用到C 43 43
  • 图像处理的基本操作(灰度化,二值化)

    基本的概念 xff1a 图像的深度 xff1a 图像中像素点占得bit位数 xff0c 就是图像的深度 xff0c 并不是每个像素点分配了多少位内存空间 xff0c 就一定能够要用完 xff0c 深度仅仅标识用于真真能表示颜色的位数 xff
  • Ubuntu如何切换Python版本

    这几天一直在搞小米官方提供的ESP32 WiFi SDK xff0c 过程中遇到了很多坑 xff0c 其中包括Python版本兼容的问题 xff0c 我的Ubuntu 上安装的Python版本是Python3 xff0c 而脚本的使用的是p
  • C++面试宝典:__FILE__,__func__,__LINE__

    C语言中 xff0c FILE xff0c func xff0c LINE 常用于logout xff0c debug调试 注意 xff1a 其使用不需要定义 xff0c FILE 指示当前文件名 xff0c func 指示当前函数名 xf
  • C++面试宝典:头文件引用的顺序

    头文件引用的顺序 当我们有多个头文件的时候 xff0c 特定情况下要注意引用的顺序 如果要在文件a h中声明一个在文件b h中定义的变量 xff0c 而不引用b h 那么要在a cpp文件中引用b h文件 xff0c 并且要先引用b h x
  • c++部署yolov5模型

    C 43 43 部署yolov5模型 前言一 准备模型二 Fastdeploy准备三 调用总结 前言 不可否认 xff0c yolov5在目标检测方面大杀四方 xff0c 在 SOTA 榜上留下过万众瞩目的成绩 xff0c 但是官网代码给的