东莞做网站首选,4399小游戏大全网页版,专做农产品的网站有哪些,德国 网站建设1.DNN模块
1.1. 模块简介
OpenCV中的深度学习模块#xff08;DNN#xff09;只提供了推理功能#xff0c;不涉及模型的训练#xff0c;支持多种深度学习框架#xff0c;比如TensorFlow#xff0c;Caffe,Torch和Darknet。 OpenCV那为什么要实现深度学习模块#xff1f;… 1.DNN模块
1.1. 模块简介
OpenCV中的深度学习模块DNN只提供了推理功能不涉及模型的训练支持多种深度学习框架比如TensorFlowCaffe,Torch和Darknet。 OpenCV那为什么要实现深度学习模块 轻量型。DNN模块只实现了推理功能代码量及编译运行开销远小于其他深度学习模型框架。 使用方便。DNN模块提供了内建的CPU和GPU加速无需依赖第三方库若项目中之前使用了OpenCV那么通过DNN模块可以很方便的为原项目添加深度学习的能力。 通用性。DNN模块支持多种网络模型格式用户无需额外的进行网络模型的转换就可以直接使用支持的网络结构涵盖了常用的目标分类目标检测和图像分割的类别如下图所示 DNN模块支持多种类型网络层基本涵盖常见的网络运算需求。 也支持多种运算设备CPUGPU等和操作系统Linux,windows,MacOS等。 1.2.模块架构
DNN模块的架构如下图所示 从上往下依次是
第一层语言绑定层主要支持Python和Java还包括准确度测试、性能测试和部分示例程序。第二层C的API层是原生的API功能主要包括加载网络模型、推理运算以及获取网络的输出等。第三层实现层包括模型转换器、DNN引擎以及层实现等。模型转换器将各种网络模型格式转换为DNN模块的内部表示DNN引擎负责内部网络的组织和优化层实现指各种层运算的实现过程。第四层加速层包括CPU加速、GPU加速、Halide加速和Intel推理引擎加速。CPU加速用到了SSE和AVX指令以及大量的多线程元语而OpenCL加速是针对GPU进行并行运算的加速。Halide是一个实验性的实现并且性能一般。Intel推理引擎加速需要安装OpenVINO库它可以实现在CPU、GPU和VPU上的加速在GPU上内部会调用clDNN库来做GPU上的加速在CPU上内部会调用MKL-DNN来做CPU加速而Movidius主要是在VPU上使用的专用库来进行加速。
除了上述的加速方法外DNN模块还有网络层面的优化。这种优化优化分两类一类是层融合还有一类是内存复用。 层融合 层融合通过对网络结构的分析把多个层合并到一起从而降低网络复杂度和减少运算量。 如上图所示卷积层后面的BatchNorm层、Scale层和RelU层都被合并到了卷积层当中。这样一来四个层运算最终变成了一个层运算。 如上图所示网络结构将卷积层1和Eltwise Layer和RelU Layer合并成一个卷积层将卷积层2作为第一个卷积层新增的一个输入。这样一来原先的四个网络层变成了两个网络层运算。 如上图所示原始的网络结构把三个层的输出通过连接层连接之后输入到后续层这种情况可以把中间的连接层直接去掉将三个网络层输出直接接到第四层的输入上面这种网络结构多出现SSD类型的网络架构当中。 内存复用 深度神经网络运算过程当中会占用非常大量的内存资源一部分是用来存储权重值另一部分是用来存储中间层的运算结果。我们考虑到网络运算是一层一层按顺序进行的因此后面的层可以复用前面的层分配的内存。 下图是一个没有经过优化的内存重用的运行时的存储结构红色块代表的是分配出来的内存绿色块代表的是一个引用内存蓝色箭头代表的是引用方向。数据流是自下而上流动的层的计算顺序也是自下而上进行运算。每一层都会分配自己的输出内存这个输出被后续层引用为输入。 对内存复用也有两种方法
第一种内存复用的方法是输入内存复用。 如上图所示如果我们的层运算是一个in-place模式那么我们无须为输出分配内存直接把输出结果写到输入的内存当中即可。in-place模式指的是运算结果可以直接写回到输入而不影响其他位置的运算如每个像素点做一次Scale的运算。类似于in-place模式的情况就可以使用输入内存复用的方式。
第二种内存复用的方法是后续层复用前面层的输出。 如上图所示在这个例子中Layer3在运算时Layer1和Layer2已经完成了运算。此时Layer1的输出内存已经空闲下来因此Layer3不需要再分配自己的内存直接引用Layer1的输出内存即可。由于深度神经网络的层数可以非常多这种复用情景会大量的出现使用这种复用方式之后网络运算的内存占用量会下降30%~70%。
2.常用方法简介
DNN模块有很多可直接调用的Python API接口现将其介绍如下
2.1.dnn.blobFromImage
作用根据输入图像创建维度N图片的个数通道数C高H和宽W次序的blobs
原型
blobFromImage(image, scalefactorNone, sizeNone, meanNone, swapRBNone, cropNone, ddepthNone):
参数 image:cv2.imread 读取的图片数据 scalefactor: 缩放像素值如 [0, 255] - [0, 1] size: 输出blob(图像)的尺寸如 (netInWidth, netInHeight)mean: 从各通道减均值. 如果输入 image 为 BGR 次序且swapRBTrue则通道次序为 (mean-R, mean-G, mean-B).swapRB: 交换 3 通道图片的第一个和最后一个通道如 BGR - RGBcrop: 图像尺寸 resize 后是否裁剪. 如果cropTrue则输入图片的尺寸调整resize后一个边对应与 size 的一个维度而另一个边的值大于等于 size 的另一个维度然后从 resize 后的图片中心进行 crop. 如果cropFalse则无需 crop只需保持图片的长宽比ddepth: 输出 blob 的 Depth. 可选: CV_32F 或 CV_8U
示例
import cv2
from cv2 import dnn
import numpy as np
import matplotlib.pyplot as pltimg_cv2 cv2.imread(test.jpeg)
print(原图像大小: , img_cv2.shape)inWidth 256
inHeight 256
outBlob1 cv2.dnn.blobFromImage(img_cv2,scalefactor1.0 / 255,size(inWidth, inHeight),mean(0, 0, 0),swapRBFalse,cropFalse)
print(未裁剪输出: , outBlob1.shape)
outimg1 np.transpose(outBlob1[0], (1, 2, 0))outBlob2 cv2.dnn.blobFromImage(img_cv2,scalefactor1.0 / 255,size(inWidth, inHeight),mean(0, 0, 0),swapRBFalse,cropTrue)
print(裁剪输出: , outBlob2.shape)
outimg2 np.transpose(outBlob2[0], (1, 2, 0))plt.figure(figsize[10, 10])
plt.subplot(1, 3, 1)
plt.title(输入图像, fontsize16)
plt.imshow(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB))
plt.axis(off)
plt.subplot(1, 3, 2)
plt.title(输出图像 - 未裁剪, fontsize16)
plt.imshow(cv2.cvtColor(outimg1, cv2.COLOR_BGR2RGB))
plt.axis(off)
plt.subplot(1, 3, 3)
plt.title(输出图像 - 裁剪, fontsize16)
plt.imshow(cv2.cvtColor(outimg2, cv2.COLOR_BGR2RGB))
plt.axis(off)
plt.show()
输出结果为 另外一个API与上述API类似是进行批量图片处理的其原型如下所示
blobFromImages(images, scalefactorNone, sizeNone, meanNone, swapRBNone, cropNone, ddepthNone):
作用批量处理图片创建4维的blob其它参数类似于 dnn.blobFromImage。
2.2.dnn.NMSBoxes
作用根据给定的检测boxes和对应的scores进行NMS非极大值抑制处理
原型
NMSBoxes(bboxes, scores, score_threshold, nms_threshold, etaNone, top_kNone)
参数
boxes: 待处理的边界框 bounding boxesscores: 对于于待处理边界框的 scoresscore_threshold: 用于过滤 boxes 的 score 阈值nms_threshold: NMS 用到的阈值indices: NMS 处理后所保留的边界框的索引值eta: 自适应阈值公式中的相关系数 top_k: 如果 top_k0则保留最多 top_k 个边界框索引值.2.3. dnn.readNet
作用加载深度学习网络及其模型参数
原型
readNet(model, configNone, frameworkNone)参数
model: 训练的权重参数的模型二值文件支持的格式有*.caffemodel(Caffe)、*.pb(TensorFlow)、*.t7 或 *.net(Torch)、 *.weights(Darknet)、*.bin(DLDT).config: 包含网络配置的文本文件支持的格式有*.prototxt (Caffe)、*.pbtxt (TensorFlow)、*.cfg (Darknet)、*.xml (DLDT).framework: 所支持格式的框架名
该函数自动检测训练模型所采用的深度框架然后调用 readNetFromCaffe、readNetFromTensorflow、readNetFromTorch 或 readNetFromDarknet 中的某个函数完成深度学习网络模型及模型参数的加载。
下面我们看下对应于特定框架的API
Caffe
readNetFromCaffe(prototxt, caffeModelNone)作用加载采用Caffe的配置网络和训练的权重参数Darknet readNetFromDarknet(cfgFile, darknetModelNone)作用加载采用Darknet的配置网络和训练的权重参数 Tensorflow readNetFromTensorflow(model, configNone)作用加载采用Tensorflow 的配置网络和训练的权重参数 参数 model: .pb 文件config: .pbtxt 文件 Torch readNetFromTorch(model, isBinaryNone)作用加载采用 Torch 的配置网络和训练的权重参数 参数 model: 采用 torch.save()函数保存的文件 ONNX readNetFromONNX(onnxFile) 作用加载 .onnx 模型网络配置参数和权重参数 总结 DNN模块是OPenCV中的深度学习模块 优势轻量型方便通用性 架构语言绑定层API层实现层加速层 加速方法层融合、内存复用 常用API dnn.blobfromImage 利用图片创建输入到模型中的blobs dnn.NMSBoxes 根据boxes和scores进行非极大值抑制 dnn.readNet 加载网络模型和训练好的权重参数