【深度学习】【Opencv】Python/C++调用onnx模型【基础】

news2024/11/28 15:40:14

【深度学习】【Opencv】python/C++调用onnx模型【基础】

提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论

文章目录

  • 【深度学习】【Opencv】python/C++调用onnx模型【基础】
  • 前言
  • Python版本OpenCV
    • Windows平台安装OpenCV
    • opencv调用onnx模型
  • C++版本OpenCV
    • Windows平台安装OpenCV
    • opencv调用onnx模型
      • 简单使用
      • 调用onnx模型
  • 总结


前言

OpenCV是一个基于BSD许可发行的跨平台计算机视觉和机器学习软件库(开源),可以运行在Linux、Windows、Android和Mac OS操作系统上。可以将pytorch中训练好的模型使用ONNX导出,再使用opencv中的dnn模块直接进行加载使用。
系列学习目录:
【CPU】Pytorch模型转ONNX模型流程详解
【GPU】Pytorch模型转ONNX格式流程详解
【ONNX模型】快速部署
【ONNX模型】多线程快速部署
【ONNX模型】Opencv调用onnx


Python版本OpenCV

Windows平台安装OpenCV

博主在win10环境下装anaconda环境,而后搭建onnx模型运行所需的openCV环境。

# 搭建opencv环境
conda create -n opencv_onnx python=3.10 -y
# 激活环境
activate opencv_onnx
# 安装opencv
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

查看opencv版本

import cv2
cv2.__version__

opencv调用onnx模型

现在代码抛开任何pytorch相关的依赖,也抛开了onnx相关的依赖,只使用opencv完成了整个推理流程。

import cv2
import numpy as np

def normalizeImage(image,mean,std):
    normalized = image.astype(np.float32)
    normalized = normalized / 255.0 - mean
    normalized = normalized / std
    return normalized

def main():
    # 读取图片
    image = cv2.imread(r"./animal-1.jpg")
    # 将BGR图像转换为RGB格式
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    # 获取图像的大小
    ori_w, ori_h, = image.shape[0], image.shape[1]

    # 指定调整后的大小
    new_width = 416
    new_height = 416
    # 图片尺寸缩放
    resized_img = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_AREA)

    # 定义每个通道的归一化参数
    mean = np.array([0.485, 0.456, 0.406]).astype(np.float32)  # 均值
    std = np.array([0.229, 0.224, 0.225]).astype(np.float32)  # 标准差
    # 图片归一化
    normalized = normalizeImage(resized_img, mean, std)

    # 加载ONNX模型
    net = cv2.dnn.readNetFromONNX("PFNet.onnx")  # 加载训练好的识别模型
    # onnx是多输出,每个输出都会对应一个name,因此需要获取所有输出的name
    output_layer_names = net.getUnconnectedOutLayersNames()
    blob = cv2.dnn.blobFromImage(normalized)  # 由图片加载数据 这里还可以进行缩放、归一化等预处理
    # 将Blob设置为模型的输入
    net.setInput(blob)
    # 运行前向传播,将所有输出name作为参数传递
    out = net.forward(output_layer_names)
    out = np.squeeze(out[3]) * 255.0
    output = cv2.resize(out, (ori_h, ori_w), interpolation=cv2.INTER_AREA)

    # 保存图像
    cv2.imwrite('saved_opencv_python_image.png', output)

if __name__ == '__main__':
    main()


C++版本OpenCV

Windows平台安装OpenCV

官网下载安装文件地址,博主使用opencv-4.8.0-windows.exe版本双击运行解压后即可获得以下文件:
打开VS 2019:新建新项目---->控制台应用---->配置项目---->项目路径以及勾选“将解决方案和项目放在同一目录中---->点击创建。

设置OpenCV路径:项目---->属性。

添加附加包含目录:Debug | x64---->C/C+±—>常规---->附加包含目录。

D:\C++_demo\opencv\build\x64\vc16\bin
D:\C++_demo\opencv\build\bin
D:\C++_demo\opencv\build\include
D:\C++_demo\opencv\build\include\opencv2

链接器:Debug | x64---->链接器---->常规---->附加包含目录。

D:\C++_demo\opencv\build\x64\vc16\lib

链接器:Debug | x64---->链接器---->输入---->附加依赖项。

在D:\C++_demo\opencv\build\x64\vc16\lib下找到附加依赖项的文件。

opencv_world480d.lib

在Debug x64模式下测试,要将带有d的opencv_world480d.dll文件复制到自己项目的Debug下。

没有Debug目录时,需要在Debug | x64模式下运行一遍代码。

D:\C++_demo\opencv\build\x64\vc16\bin
===>
D:\C++_demo\opencv_onnx\x64\Debug

这里博主为了方便调试安装的是debug版本的,读者可以安装release版本的,只需要将属性的Debug | x64变成Release | x64即可,再将opencv_world480.dll文件复制到自己项目的Release下。

opencv调用onnx模型

简单使用

这里简单验证一下opencv是否安装成功,适用于包括博主在内的许多对c++不熟悉的人来说,代码完成了简单的图像的读取与显示。

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
	Mat src = imread("./animal-1.jpg");
	//没有图像输入
	if (src.empty()) {
		printf("....\n");
		return -1;
	}
	//namedWindow("输入窗口", WINDOW_FREERATIO);
	imshow("输入窗口", src);
	waitKey(0);
	destroyAllWindows();
	return 0;
}

调用onnx模型

将python版本的opencv转化成对应的c++版本的,发现输出的效果完全一致,onnx模型可以作为c++的接口来供其他应用调用。

#include <iostream>
#include <string>
#include <vector>
#include<opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
using namespace std;
cv::Mat normalizeImage(const cv::Mat& image, const cv::Scalar& mean, const cv::Scalar& std) {
    cv::Mat normalized;
    image.convertTo(normalized, CV_32F);
    cv::subtract(normalized / 255.0, mean, normalized);
    cv::divide(normalized, std, normalized);
    return normalized;
}
int main()
{   
    // 读取图片
    cv::Mat bgrImage = cv::imread("./animal-1.jpg", cv::IMREAD_COLOR);
    // 图片格式转化bgr-->rgb
    cv::Mat rgbImage;
    cv::cvtColor(bgrImage, rgbImage, cv::COLOR_BGR2RGB);
    // 获取图像的大小
    cv::Size originalSize(rgbImage.cols, rgbImage.rows);
    cv::Mat resizedImage;

    // 定义目标图像大小
    cv::Size targetSize(416, 416);
    //图片尺寸缩放
    cv::resize(rgbImage, resizedImage, targetSize, 0, 0, cv::INTER_AREA);

    // 定义每个通道的归一化参数
    cv::Scalar mean(0.485, 0.456, 0.406); // 均值
    cv::Scalar std(0.229, 0.224, 0.225);  // 标准差
    // 图片归一化
    cv::Mat normalized = normalizeImage(resizedImage, mean, std);
    
    // 加载ONNX模型
    cv::dnn::Net net = cv::dnn::readNetFromONNX("D:/C++_demo/opencv_onnx/PFNet.onnx");
    cv::Mat blob = cv::dnn::blobFromImage(normalized);
    // 将Blob设置为模型的输入
    net.setInput(blob);
    // 运行前向传播
    std::vector<cv::Mat> output_probs;
    // 获取多输出对应的名称
    std::vector<cv::String> output_layer_names = net.getUnconnectedOutLayersNames();
    net.forward(output_probs, output_layer_names);
    cv::Mat prediction = output_probs[3];
    cv::Mat mask;
    cv::resize(prediction.reshape(1, 416) * 255.0, mask, originalSize, 0, 0, cv::INTER_AREA);
    cv::imwrite("saved_opencv_c++_image.png", mask);
    return 0;
}


总结

尽可能简单、详细的介绍Python和C++下POpencv调用ONNX模型的流程。

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

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

相关文章

终极策略:如何利用亮数据代理轻松、高效地突破亚马逊的反爬障碍

文章目录 前言背景&#x1f4dc;第一步&#xff1a;打开亚马逊商城&#x1f6cd;️第二步&#xff1a;定位搜索框并搜索iphone15&#x1f50d;第三步&#xff1a;定位具体数据并保存到csv文件&#x1f4be;第三步&#xff1a;多页面数据抓取&#x1f4c4;&#x1f4c4;&#x1…

OpenCV 基础图像处理

1、生成图像 cv2.imread是OpenCV库中的一个函数&#xff0c;用于读取图像文件。它接受一个参数&#xff0c;即要读取的图像文件的路径&#xff0c;返回一个多维数组&#xff0c; 表示图像的像素值。该函数的常用参数包括&#xff1a;flags&#xff1a;指定读取图像的方式&#…

RabbitMQ学习总结(11)—— RabbitMQ 核心概念与架构

MQ 技术概述 什么是 MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游 “逻辑解耦+物理解耦” 的消息通信服务。使用…

系统集成|第十三章(笔记)

目录 第十三章 干系人管理13.1 概述与相关概念13.2 主要过程13.2.1 识别干系人13.2.2 编制项目干系人管理计划13.2.3 管理干系人参与13.2.4 项目干系人参与的监控 13.3 常见问题 上篇&#xff1a;第十二章、沟通管理 第十三章 干系人管理 13.1 概述与相关概念 概述&#xff1a…

21-SpringSecurity

SpringSecurity从入门到精通 0. 简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有…

会议剪影 | 思腾合力受邀参加2023第二届世界元宇宙大会并作主题演讲

由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办&#xff0c;上海市嘉定区安亭镇人民政府和中国仿真学会元宇宙专业委员会承办的第二届世界元宇宙大会于2023年9月20日-22日在上海安亭举行。 大会以“虚实相生、产业赋能”为主题&#xff0c;聚焦元宇宙关键技术发展的…

Redis原理(一):Redis数据结构(上)

文章目录 1、 Redis数据结构-动态字符串2、 Redis数据结构-intset3、 Redis数据结构-Dict4、 Redis数据结构-ZipList5、 Redis数据结构-ZipList的连锁更新问题6、 Redis数据结构-QuickList1、 Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串,value往往是字符串…

Mybatis 日志(Log4j2)

之前我们介绍了使用JDK Log、Apache Commons Logging打印Mybatis运行时的日志&#xff1b;本篇我们介绍使用Log4j2打印Mybatis运行时的日志。 如何您对Mybatis中使用JDK Log、Apache Commons Logging打印Mybatis运行时的日志不太了解&#xff0c;可以参考&#xff1a; Mybati…

使用群晖实现Videostation电影的大容量存储及分享教程

文章目录 1.使用环境要求2.制作视频分享链接3.制作永久固定视频分享链接 李哥和他的女朋友是一对甜蜜的情侣&#xff0c;但不幸的是&#xff0c;由于工作原因&#xff0c;他们目前分隔两地&#xff0c;无法常常亲密相伴。 这个距离让李哥特别怀念和女朋友一起在电影院观看电影的…

zabbix6.0监控磁盘IO

客户端配置 配置参数 [rootora19c zabbix]# pwd /usr/local/zabbix/etc/ [rootora19c zabbix]# vim zabbix_agentd.conf UnsafeUserParameters1配置UI监控conf文件 [rootora19c zabbix_agentd.d]# pwd /usr/local/zabbix/etc/zabbix_agentd.d/ [rootora19c zabbix_agentd.d…

大数据Flink(八十六):DML:Group 聚合和Over 聚合

文章目录 DML:Group 聚合和Over 聚合 一、DML:Group 聚合

CasaOS:一个docker容器应用的可视化Portal

CasaOS 官网声称他是一个家庭云操作系统&#xff0c;但我实际使用后感觉称之为“docker容器的可视化Portal”更合适。因为它本身不具备IAAS、PAAS、或SAAS的开箱即用能力&#xff0c;更像是一个把OS上的docker Container集中管理并展示的索引目录&#xff0c;各个docker Contai…

点成分享丨水浴设备在食品理化特性研究中的应用

木薯粉拯救“一麦难求” 近年来&#xff0c;随着全球人口增长、城市化进程的加快及人们饮食习惯的改变&#xff0c;以小麦为原料的食品成为了人们的“热门主食”&#xff0c;但实际每年产出的小麦不足以满足人们与日俱增的需求。为了解决这一问题&#xff0c;人们开始寻找小麦…

CTF_BUUCTF_Reverse解题_04内涵的软件

题目地址&#xff1a;BUUCTF在线评测 拿到文件&#xff0c;运行&#xff0c;狗&#xff01;&#xff01;&#xff01; 不管回答Y还是N&#xff0c;程序都最终会一闪而过 上PE 32位C没壳 上IDA 32 F5反汇编一下&#xff1a; 直接发现Y和N&#xff0c; 看到有if判断语…

安科瑞医用隔离电源系统在江苏某医院项目中的应用

安科瑞 崔丽洁 江苏摘要&#xff1a;介绍该三级乙等综合医院采用安科瑞医用隔离电源系统&#xff0c;使用分体配电柜安装方式&#xff0c;从而实现将TN系统转化为IT系统&#xff0c;以及系统绝缘情况监测。 1、概述 该医院占地面积4.2万平方米&#xff0c;建筑面积7.14万平方米…

【C语言】通讯录

目录 一、关于通讯录 二、代码逻辑 三、通讯录实现 1.菜单设计 2.逻辑主要功能设计 3.增加联系人功能实现 4.显示全部联系人信息 5.删除联系人 6.查找联系人 7.修改联系人信息 8.对联系人进行排序 9.一键清空所有联系人 四、完整源码 test.c contact.c contact.…

新版WordPress系统文章自动采集插件/Auto Post pro完美运行版/多线程采集(wp自动采集)

源码介绍&#xff1a; 最新版WordPress系统文章自动采集插件&#xff0c;它是一款帮助用户提供方便快捷的文章自动采集方案的插件。WordPress自动采集插件&#xff0c;让内容采集变得高效便捷。作为Auto Post pro完美运行版&#xff0c;这里分享的是WordPress文章采集插件Auto…

【Vue3】v-model

v-model 基本用法 prop: modelValue 事件&#xff1a;update:modelValue <!-- App.vue --><template><div><h1>我是父组件</h1><div>isShow: {{ isShow }}</div><div><button click"isShow !isShow">开关&…

Java 华为真题-出租车计费

需求 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xff0c;总是偏大。 出租车司机解释说他不喜欢数字4&#xff0c;所以改装了计费表&#xff0c;任何数字位置遇到数字4就直接跳过&#xff0c;其余功能都正常。 比如&…

未曾想象!AIGC席卷之下,版权法律界竟手足无措?

人工智能生成内容&#xff08;AIGC&#xff09;的惊人崛起&#xff0c;标志着我们正步入一片前所未有的创作之境。美国纽约&#xff0c;销售员布雷特希克勒&#xff08;Brett Schickler&#xff09;通过与对话机器人ChatGPT的交流&#xff0c;仅用数小时便完成了一本名为《聪明…