EmguCV学习笔记 C# 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 DNN推理流程

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

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

public static Net ReadNet(

string model,

string config = null,

string framework = null

)

参数说明:

  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 static Net ReadNetFromTensorflow(

string model,

string config = null

)

参数说明:

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

返回值:

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

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

【示例代码】

Net net = DnnInvoke.ReadNetFromTensorflow("graph_opt.pb");

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

blobFromImage方法的声明如下:

public static void BlobFromImage(

IInputArray image,

IOutputArray blob,

double scaleFactor = 1,

Size size = default,

MCvScalar mean = default,

bool swapRB = false,

bool crop = false,

DepthType ddepth = DepthType.Cv32F

)

参数说明:

  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中很多参数都是浮点数,所以该参数设置默认即可。

【示例代码】

Mat blob = DnnInvoke.BlobFromImage(m, 1.0, new Size(360, 360), new MCvScalar(127.5, 127.5, 127.5), false, false);

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

SetInput方法的声明如下:

public void SetInput(

IInputArray blob,

string name = "",

double scaleFactor = 1,

MCvScalar mean = default

)

参数说明:

  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 Mat Forward(

string outputName = ""

)

(2)public void Forward(

IOutputArrayOfArrays outputBlobs,

string[] outBlobNames

)

参数说明:

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

【示例代码】

(1)

Mat mout = net.Forward();

(2)

VectorOfMat mout = new VectorOfMat();

net.Forward(mout, names);

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

相关推荐
m0_656974741 分钟前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo8 分钟前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
其实吧31 小时前
基于Matlab的图像融合研究设计
人工智能·计算机视觉·matlab
ctrey_1 小时前
2024-11-1 学习人工智能的Day20 openCV(2)
人工智能·opencv·学习
绕灵儿2 小时前
OpenCV通过指针裁剪图像
人工智能·opencv·计算机视觉
一马平川的大草原3 小时前
如何基于pdf2image实现pdf批量转换为图片
计算机视觉·pdf·文件拆分
九鼎科技-Leo3 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发3 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
小乖兽技术3 小时前
C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
c++·c#·交互·ipc
幼儿园园霸柒柒3 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节