OpenCV DNN神经网络部署流程

news2024/11/28 0:34:38
  • 💂 个人主页:风间琉璃
  • 🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主
  • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)订阅专栏

目录

前言

一、加载网络模型

二、构建输入

三、执行推理

四、解析输出


前言

OpenCV DNN(Deep Neural Networks)模块是OpenCV库中的一个模块,用于在计算机视觉任务中使用深度神经网络模型。它提供了加载、推断和可视化使用各种深度学习框架(如Caffe、TensorFlow、Torch/PyTorch等)训练的模型的功能。

一般使用DNN模块进行部署有四大步骤:加载网络模型、构建输入、执行推理inference、解析输出

OpenCV官方文档:OpenCV: Deep Neural Network module

一、加载网络模型

在opencv中提供了dnn::readNet()函数用于加载已经训练完成的模型

Net cv::dnn::readNet(const String &  model,
                     const String &  config = "",
                     const String &  framework = "" 
                     )
  • model:模型文件名称。

  • config:配置文件名称。

  • framework:框架种类。

该函数可以加载已经完成训练的深度学习网络模型,返回一个Net类型的变量。

函数第一个参数是模型文件的名称,文件以二进制的形式保存着网络模型中权重系数。不同框架的模型具有不同的扩展名,该函数能够加载的框架、框架文件扩展名以及框架的网络如下。

函数第二个参数是网络模型的配置文件,不同框架的模型具有不同的扩展名,参数默认值表示不需要读取配置文件

最后一个参数是框架的种类,该函数可以根据文件的格式判断框架的种类,但是也可以通过第三个参数显示的给出框架的种类,参数默认值为空,表示根据文件格式判断框架种类。 

dnn::readNet()函数返回的Net类型是一个神经网络模型的类,OpenCV 4在Net类中提供了多个函数用于处理神经网络的模型,例如得到网络的层数、每层网络的权重、通过网络预测结果等。

OpenCV中加载网络模型之后,可以设置计算后台与计算目标设备,OpenCV DNN模块支持这两个设置的相关API如下:

(1)设置计算后台

void cv::dnn::Net::setPreferableBackend	(int backendId)	

 backendId 表示后台计算,常见参数如下:

DNN_BACKEND_DEFAULT (DNN_BACKEND_INFERENCE_ENGINE):表示默认使用intel的预测推断库(需要下载安装Intel® OpenVINO™ toolkit, 然后重新编译OpenCV源码,在CMake时候enable该选项方可), 可加速计算。


DNN_BACKEND_HALIDE


DNN_BACKEND_INFERENCE_ENGINE


DNN_BACKEND_OPENCV: 一般情况都是使用opencv dnn作为后台计算。


DNN_BACKEND_VKCOM


DNN_BACKEND_CUDA :使用GPU作为后台计算,可以加速。
 

 (2)设置目标设备

void cv::dnn::Net::setPreferableTarget	(int targetId)	

 常见的目标设备如下:

DNN_TARGET_CPU:其中表示使用CPU计算,默认是的


DNN_TARGET_OPENCL: 表示使用OpenCL加速


DNN_TARGET_OPENCL_FP16 :可以尝试


DNN_TARGET_MYRIAD :树莓派上的


DNN_TARGET_VULKAN


DNN_TARGET_FPGA :使用推理引擎的异构插件与CPU回退的FPGA设备


DNN_TARGET_CUDA :在GPU上使用;


DNN_TARGET_CUDA_FP16

利用opencv加速主要涉及两个函数的调用,使用opencv设置参数使用不同的运行后台程序,例如使用GPU,CPU。

dnnnet.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
dnnnet.setPreferableTarget(cv::dnn::DNN_BACKEND_CUDA);

二、构建输入

在进行深度学习或图片分类时,blobFromImage主要是用来对图片进行预处理。

  • images:输入图像,图像可以是单通道、三通道或者四通道。

  • scalefactor:图像像素缩放系数。

  • size:输出图像的尺寸

  • mean:像素值去均值化的数值。

  • swapRB:是否交换三通道图像的第一个通道和最后一个通道的标志。

  • crop:调整大小后是否对图像进行剪切的标志。

  • ddepth:输出图像的数据类型,可选参数为CV_32F或CV_8U。

该函数能够将任意尺寸和数据类型的图像转换成指定尺寸和数据类型

该第一个参数是原始图像,图像可以是单通道、三通道或者四通道。

第二个参数是图像像素的缩放系数,是一个double类型的数据,参数默认是为1.0,表示不进行任何缩放。

第三个参数是输出图像的尺寸,一般为模型输入需要的尺寸。

第四个参数是像素值去均值化的数值,去均值化的目的是为了减少关照变化对图像中内容的影响,参数默认值为空,可以不输入任何参数

第五个参数为是否交换三通道图像的第一个通道和最后一个通道的标志,由于RGB颜色空间图像在OpenCV中有两种颜色通道顺序,该参数可以实现RGB通道顺序和BGR通道顺序间的转换,参数默认是为false,表示不进行交换。

第六个参数是图像调整尺寸时是否剪切的标志,当该参数为true时,调整图像的尺寸使得图像的行(或者列)等于需要输出的尺寸,而图像的列(或者行)大于需要输出的尺寸,之后从图像的中心剪切出需要的尺寸作为结果输出;当该参数为false时,直接调整图像的行和列满足尺寸要求,不保证图像原始的横纵比,参数默认值为false。

最后一个参数是输出图像的数据类型,可选参数为CV_32F或CV_8U,参数默认值为CV_32F。

这是一个重载成员函数,为方便起见而提供。它与上述函数的区别仅在于它接受的参数。

opencv也同时支持对一系列图片进行操作 

 

数据预处理后,就需要将数据送入网络模型中,在OpenCV中设置网络新的输入数据,使用setInput()函数。

  • blob:新的输入数据,数据类型为CV_32F或CV_8U。

  • name:输入网络层的名称。

  • scalefactor:可选的标准化比例

  • mean:可选的减数数值。

 

 该函数可以重新设置网络的输入值,函数第一个参数为新的输入数据,数据类型必须是CV_32F或CV_8U。第二个参数是输入网络层的名称,该参数可以使用默认值。第三个参数是可选的标准化比例,默认值为1。第四个参数是可选的减数数值,默认值为Scalar(),表示缺省该参数。

三、执行推理

forward()函数,执行前向传输,输入参数为需要输出的网络层的名称,返回值为Mat类型数据。

这个函数只需要提供layer的name即可;函数返回一个Mat变量,返回值是指输入的layername首次出现的输出。默认输出整个网络的运行结果

四、解析输出

这里就需要我们对部署的网络模型有一定的了解,主要是处理forward()函数输出层的结果。

以YOLOv4为例,YOLOv4网络的输出为矩形框,每个矩形框由一个向量表示,所有矩形框组成一个向量组。每个向量的长度为类别数 + 5个参数,这五个参数的前四个分别是矩形框在图像上的位置center_x, center_y, width, height(均为比例,范围在0-1之间),第五个参数是该矩形框可能包含物体的置信度。从向量的第六个参数开始,分别表示矩形框中物体对应每个类别的置信度。

我们需要根据其网络结构的输出,对参数处理,完成最终的目标检测任务。这里的后处理也是很重要的,同时也是难点。

参考文章:OpenCV 3.4.11 cv::dnn::Net::forward()函数第一个参数的理解 - 灰信网(软件开发博客聚合) (freesion.com)

结束语
感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,博主要一下你们的三连呀(点赞、评论、收藏),不要钱的还是可以搞一搞的嘛~

不知道评论啥的,即使扣个666也是对博主的鼓舞吖 💞 感谢 💐

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

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

相关文章

公开游戏、基于有向图的游戏

目录 〇,背景 一,公开游戏、策梅洛定理 1,公开游戏 2,策梅洛定理 二,有向图游戏 1,狭义有向图游戏 2,广义有向图游戏 3,狭义有向图游戏的SG数 4,Bash Game 力扣…

【List篇】使用Arrays.asList生成的List集合,操作add方法报错

早上到公司,刚到工位,测试同事就跑来说"功能不行了,报服务器异常了,咋回事";我一脸蒙,早饭都顾不上吃,要来了测试账号复现了一下,然后仔细观察测试服务器日志,发现报了一个…

【C语言】错题本(3)

题目: 为了方便分析,我们将题目代码贴在下面: int main() {unsigned char puc[4];struct tagPIM{unsigned char ucPim1;unsigned char ucData0 : 1;unsigned char ucData1 : 2;unsigned char ucData2 : 3;}*pstPimData;pstPimData (struct tagPIM*)puc;memset(puc,0,4);pstPi…

【计算机网络】HTTP(上)

文章目录 1.HTTP概念2. URLurlencode 和 urldecode转义规则 3. HTTP的宏观理解HTTP的请求HTTP的响应 4. 见一见HTTP请求和响应请求报头 1. 模拟一个简单的响应response响应报头 2. 从路径中获取内容ReadFile函数的实现 3.不同资源进行区分反序列化的实现ReadOneLine函数的实现P…

VUE3+JAVA商城源码小程序APP商城

三勾小程序商城基于springbootelement-uiuniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端,包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 软件架构 后端&a…

多维时序 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络的多变量时间序列预测

多维时序 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络的多变量时间序列预测 目录 多维时序 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神…

深圳企业制作宣传片群体定位的重要性

相信众多企业都拍了自己公司的宣传片,尤其是在互联网高度发达的今天,宣传片可以说成为了我们企业对外宣传最主要的方式。看着企业多样式的宣传片种类,我们该如何评价一部宣传片的好坏呢?要知道宣传片的好坏是一个相对主观的问题&a…

Python多进程共享变量实现方法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说,直接开搞,如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 一、错误的实现方式 最初以为是没添加global声明导致修改未生效,但实际操作发现global方式在多进程中也只能读…

【ccf-csp题解】第3次csp认证-第三题-集合竞价-枚举

题目描述 思路讲解 本题数据量较小,所以只需要让时间复杂度控制在O(n^2)就可以满分通过,难度较低 可以用结构体数组事先存下每一个记录的信息,结构体如下: 其中bool值del可以表示这份记录是否已经被删 如…

CSP 202212-1 现值计算

答题 主要就是 #include<iostream>using namespace std;float calculate(float x,float i,int n){float rate1i,ratio1;while(n--){ratioratio*rate;}ratio1/ratio;return x*ratio; }int main() {int n;float rate,x,result0;cin>>n>>rate;for(int i0;i<…

springboot整合mybatisPlus全技巧(2-常用开发技巧:通用字段插入)

本系列专题基于 springboot 整合 mybatisPlus 的各种文章早已烂大街的背景下&#xff0c;根据 整合过程&#xff0c;MP开发中的常见技巧&#xff0c;MP开发中遇到的各种坑 三个方面&#xff0c;来对这一专题做一个全面且实用的总结&#xff0c;基本上只要你吃透这篇文章&#x…

骨传导耳机十大品牌有哪个,骨传导耳机十大品牌排行榜分享

在这个信息爆炸的时代&#xff0c;确实很容易在市场上找到各种各样的骨传导耳机品牌和型号&#xff0c;对于没有相关经验的消费者来说&#xff0c;他们很难判断哪些产品是真正值得信赖的&#xff0c;哪些可能有质量问题或者不适合自己的需求&#xff0c;现如今骨传导耳机的市场…

长胜证券:缩量情绪冰点再现 震荡孕育中期机会

长胜证券指出&#xff0c;近期商场的调整&#xff0c;主要原因来自北向资金扰动和商场牛熊转化期间的信心不足。随着稳增加方针的密布出台&#xff0c;经济修复进程有望加快&#xff0c;增量资金或重回抓反弹阶段&#xff0c;重视量能同步放大水平。一起注册制全面落地后&#…

RLAIF:一个不依赖人工的RLHF替代方案

深度学习自然语言处理 原创作者&#xff1a;Winnie LLM可以标记人类偏好数据&#xff0c;用于强化学习吗&#xff1f;尽管之前有一些类似的研究&#xff0c;但从没有人系统地对比RLHF和RLAIF的性能。今天&#xff0c;我们为大家带来一项Google最新的研究&#xff0c;来看看LLM是…

巧用抽象类与接口,打造高效Java程序(下)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:巧用抽象类与接口&#xff0c;打造高效Java程序(上)&#x1f649; &#x1f439;今日诗词:登锋履刃&#xff0c;何妨马革裹尸&#x1f439; ⛳️点赞 ☀️收藏⭐️…

护网行动为什么给的钱那么多

因为护网行动是国家应对网络安全问题所做的重要布局之一。 随着大数据、物联网、云计算的快速发展&#xff0c;愈演愈烈的网络攻击已经成为国家安全的新挑战。国家关键信息基础设施可能时刻受到来自网络攻击的威胁。网络安全的态势之严峻&#xff0c;迫切需要我们在网络安全领…

C++11新特性⑤ | 仿函数与lambda表达式

目录 1、引言 2、仿函数 3、lambda表达式 3.1、lambda表达式的一般形式 3.2、返回类型说明 3.3、捕获列表的规则 3.4、可以捕获哪些变量 3.5、lambda表达式给编程带来的便利 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…

Qt QTreeWidge解决setItemWidget后,导致复选框失效

一、问题&#xff1a; QTreeWidget某一项加上itemWidget后&#xff0c;导致复选框失效问题 二、解决方法 将要加上的widget控件加到该项的后续的列&#xff0c;即控件跟复选框不同一列 三、具体代码 QTreeWidget* treeW new QTreeWidget; treeW->setColumnCount(2); /…

2023最全的性能测试种类介绍,这6个种类特别重要!

系统的性能是一个很大的概念&#xff0c;覆盖面非常广泛&#xff0c;包括执行效率、资源占用、系统稳定性、安全性、兼容性、可靠性、可扩展性等&#xff0c;性能测试就是描述测试对象与性能相关的特征并对其进行评价而实施的一类测试。 性能测试是一个统称&#xff0c;它其实包…

微信小程序自动化测试pytest版工具使用方法

-mini https://github.com/zx490336534/pytest-mini 微信小程序自动化测试pytest插件/工具 基于MiniTest进行pytest改造 使用方法 准备测试小程序 根据miniprogram-demo项目介绍运行一次项目 成功运行后关闭 安装&更新 pip install pytest-mini --upgrade引入插件…