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

EmguCV学习笔记 VB.Net 11.2 DNN推理流程

 版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。

教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记

学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客

 学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客

11.2 推理流程

通常情况下按照如下流程使用推理模型:

1dnnInvoke类的一系列readNet方法(如ReadNetFromCaffe、ReadNetFromDarknet、ReadNetFromTensorflow)来读取推理模型文件,并返回一个dnnInvoke类的实例。通常情况下,如果不知道模型文件属于哪类推理模型,可以直接使用readNet,它的声明如下:

Public Shared Function ReadNet (

         model As String,

         Optional config As String = Nothing,

         Optional framework As String = Nothing

) As Net

参数说明:

  1. model: 训练的权重参数的模型二值文件,支持的格式有:*.caffemodel(Caffe)、*.pb(TensorFlow)、*.t7 或 *.net(Torch)、 *.weights(Darknet)、*.bin(DLDT).
  2. config: 包含网络配置的文本文件,支持的格式有:*.prototxt (Caffe)、*.pbtxt(TensorFlow)、*.cfg (Darknet)、*.xml (DLDT).
  3. framework: 所支持格式的框架名

除了使用ReadNet方法,也可以使用专门的方法来加载相应推理模型:

(1)加载采用Caffe的配置网络和训练的权重参数

readNetFromCaffe(prototxt, caffeModel=None)

(2)加载采用Darknet的配置网络和训练的权重参数

readNetFromDarknet(cfgFile, darknetModel=None)

(3)加载采用Tensorflow 的配置网络和训练的权重参数

readNetFromTensorflow(model, config=None)

(4)加载采用 Torch 的配置网络和训练的权重参数

readNetFromTorch(model, isBinary=None)

(5)加载 .onnx 模型网络配置参数和权重参数

readNetFromONNX(onnxFile)

例如,常用的readNetFromTensorflow方法,声明如下:

Public Shared Function ReadNetFromTensorflow (

         model As String,

         Optional config As String = Nothing

) As Net

参数说明:

  1. model:TensorFlow模型文件的路径。
  2. config:模型配置文件的路径。

返回值:

返回一个Dnn.Net类的实例。

其余的readNetxxx方法,请参考以上声明。

【示例代码】

Dim net As Dnn.Net = DnnInvoke.ReadNetFromTensorflow("graph_opt.pb")

2、dnnInvoke类的blobFromImage方法来将图像转换为网络输入的blob格式。blobFromImage方法是dnnInvoke类中用于图像预处理的方法之一,它可以将输入图像转换为特定格式的blob数据,以便于输入到深度学习模型中进行处理。

blobFromImage方法的声明如下:

Public Shared Function BlobFromImage(

    ByVal image As Mat,

    ByVal scalefactor As Double,

    ByVal size As Size,

    ByVal mean As MCvScalar,

    ByVal swapRB As Boolean,

    ByVal crop As Boolean

) As Mat

参数说明:

  1. image:输入的图像,类型为Image(Of Gray, Byte);
  2. scalefactor:图像缩放因子,用于对输入图像进行缩放。默认值为1.0,表示不进行缩放;
  3. size:网络输入层的大小,用于指定输出的blob数据的大小。注意,有些推理模型文件指定了这个参数的大小。
  4. mean:均值,用于对图像进行均值归一化;
  5. swapRB:是否交换红色通道和蓝色通道。默认值为True,表示交换;
  6. crop:是否对图像进行裁剪。默认值为False,表示不进行裁剪。
  7. ddepth:图像的数据类型,目前仅支持32F和8U。即32位的浮点数( CV_32F ),因为DNN中很多参数都是浮点数,所以该参数设置默认即可。

【示例代码】

Dim blob As Mat = DnnInvoke.BlobFromImage(m, 1.0, New Drawing.Size(360, 360), New MCvScalar(127.5, 127.5, 127.5), False, False)

3、Dnn.Net类的SetInput方法设置输入数据。

SetInput方法的声明如下:

Public Sub SetInput (

         blob As IInputArray,

         Optional name As String = "",

         Optional scaleFactor As Double = 1,

         Optional mean As MCvScalar = Nothing

)

参数说明:

  1. blob:输入数据,由DnnInvoke.BlobFromImage获得的Mat对象。
  2. name:指定输入数据所属的Blob名称。Blob是深度学习中的一个概念,它是指一组多维数组,用于存储神经网络中的中间结果或输出结果。在一个深度学习模型中,通常会存在多个Blob,每个Blob的名称和维度都不同。例如,在使用Caffe模型时,模型文件中会定义多个Blob,每个Blob都有一个唯一的名称。这些名称通常以输入层的名称开始,例如“data”、“label”等等。
  3. scaleFactor:对输入数据进行缩放操作。如果为1.0,则表示不进行缩放操作;如果为0.5,则表示将输入数据的大小缩小一半。
  4. mean:对输入数据进行均值减法操作,从而将输入数据的颜色空间进行标准化,以减少输入数据中的冗余信息,提高模型的准确率。

【示例代码】

net.SetInput(blob)

4、Dnn.Net类的forward方法用于进行模型推理,将输入数据传入模型进行计算,并输出模型的预测结果。该方法需要在SetInput方法之后调用,以确保输入数据已经被正确设置。

常用的声明有

(1)Public Function Forward (

         Optional outputName As String = ""

) As Mat

(2)Public Sub Forward (

         outputBlobs As IOutputArrayOfArrays,

         outBlobNames As String()

)

参数说明:

  1. outputName:输出层名称。可以指定一个或多个输出层的名称,用于获取相应的输出结果。
  2. outputBlobs:输出Blob数据,这是一个VectorOfMat对象。
  3. outBlobNames:需要获取的Blob数据对应的名称。

【示例代码】

(1)

Dim mout As Mat = net.Forward()

(2)

    Dim mout As New VectorOfMat

net.Forward(mout, names)

5、数据分析。由于各个推理模型不一样,所以最后获得的数据的结构不同。需要根据不同的推理模型进行不同分析。将在后面小节的代码中具体说明。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • iPhone的安全模式如何操作
  • 嵌入式OpenHarmony源码基本原理详解
  • 内网安全-横向移动【3】
  • 检查Index对象是否单调递减pandas.Index.is_monotonic_decreasing
  • 【学习笔记】3GPP WG SA5 Rel-19标准化工作管理和编排
  • 衡石分析平台使用手册-单机安装及启动
  • vue3实现打飞机(雷电)
  • HTML 超链接
  • 常见的正则化方法以及L1,L2正则化的简单描述
  • ELK学习笔记(三)——使用Filebeat8.15.0收集日志
  • 【大模型理论篇】大模型周边自然语言处理技术(NLP)原理分析及数学推导(Word2Vec、TextCNN、FastText)
  • 常见的pytest二次开发功能
  • 垃圾回收概述及算法
  • 机器学习之 PCA降维
  • 外排序之文件归并排序实现
  • (三)从jvm层面了解线程的启动和停止
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【前端学习】-粗谈选择器
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • golang 发送GET和POST示例
  • HashMap剖析之内部结构
  • iOS小技巧之UIImagePickerController实现头像选择
  • javascript数组去重/查找/插入/删除
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python学习之路13-记分
  • React组件设计模式(一)
  • vue--为什么data属性必须是一个函数
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从PHP迁移至Golang - 基础篇
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 收藏好这篇,别再只说“数据劫持”了
  • 微信小程序开发问题汇总
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #14vue3生成表单并跳转到外部地址的方式
  • #AngularJS#$sce.trustAsResourceUrl
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (26)4.7 字符函数和字符串函数
  • (7)摄像机和云台
  • (C++17) std算法之执行策略 execution
  • (C语言)共用体union的用法举例
  • (java)关于Thread的挂起和恢复
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (简单) HDU 2612 Find a way,BFS。
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战