版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
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
)
参数说明:
- model: 训练的权重参数的模型二值文件,支持的格式有:*.caffemodel(Caffe)、*.pb(TensorFlow)、*.t7 或 *.net(Torch)、 *.weights(Darknet)、*.bin(DLDT).
- config: 包含网络配置的文本文件,支持的格式有:*.prototxt (Caffe)、*.pbtxt(TensorFlow)、*.cfg (Darknet)、*.xml (DLDT).
- 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
)
参数说明:
- model:TensorFlow模型文件的路径。
- 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
)
参数说明:
- image:输入的图像,类型为Image(Of Gray, Byte);
- scalefactor:图像缩放因子,用于对输入图像进行缩放。默认值为1.0,表示不进行缩放;
- size:网络输入层的大小,用于指定输出的blob数据的大小。注意,有些推理模型文件指定了这个参数的大小。
- mean:均值,用于对图像进行均值归一化;
- swapRB:是否交换红色通道和蓝色通道。默认值为True,表示交换;
- crop:是否对图像进行裁剪。默认值为False,表示不进行裁剪。
- 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
)
参数说明:
- blob:输入数据,由DnnInvoke.BlobFromImage获得的Mat对象。
- name:指定输入数据所属的Blob名称。Blob是深度学习中的一个概念,它是指一组多维数组,用于存储神经网络中的中间结果或输出结果。在一个深度学习模型中,通常会存在多个Blob,每个Blob的名称和维度都不同。例如,在使用Caffe模型时,模型文件中会定义多个Blob,每个Blob都有一个唯一的名称。这些名称通常以输入层的名称开始,例如"data"、"label"等等。
- scaleFactor:对输入数据进行缩放操作。如果为1.0,则表示不进行缩放操作;如果为0.5,则表示将输入数据的大小缩小一半。
- mean:对输入数据进行均值减法操作,从而将输入数据的颜色空间进行标准化,以减少输入数据中的冗余信息,提高模型的准确率。
【示例代码】
net.SetInput(blob);
4、Dnn.Net类的forward方法用于进行模型推理,将输入数据传入模型进行计算,并输出模型的预测结果。该方法需要在SetInput方法之后调用,以确保输入数据已经被正确设置。
常用的声明有
(1)public Mat Forward(
string outputName = ""
)
(2)public void Forward(
IOutputArrayOfArrays outputBlobs,
string[] outBlobNames
)
参数说明:
- outputName:输出层名称。可以指定一个或多个输出层的名称,用于获取相应的输出结果。
- outputBlobs:输出Blob数据,这是一个VectorOfMat对象。
- outBlobNames:需要获取的Blob数据对应的名称。
【示例代码】
(1)
Mat mout = net.Forward();
(2)
VectorOfMat mout = new VectorOfMat();
net.Forward(mout, names);
5、数据分析。由于各个推理模型不一样,所以最后获得的数据的结构不同。需要根据不同的推理模型进行不同分析。将在后面小节的代码中具体说明。