cv.dnn介绍及常用模块
介绍
OpenCV中的深度学习模块(DNN)只提供了推理功能,不涉及模型的训练,即模型训练好了,进行预测,支持多种深度学习框架,比如TensorFlow,Caffe,Torch和Darknet。
OpenCV那为什么要实现深度学习模块?
轻量型。DNN模块只实现了推理功能,代码量及编译运行开销远小于其他深度学习模型框架。
使用方便。DNN模块提供了内建的CPU和GPU加速,无需依赖第三方库,若项目中之前使用了OpenCV,那么通过DNN模块可以很方便的为原项目添加深度学习的能力。
通用性。DNN模块支持多种网络模型格式,用户无需额外的进行网络模型的转换就可以直接使用,支持的网络结构涵盖了常用的目标分类,目标检测和图像分割的类别
DNN模块还有网络层面的优化
- 层融合:层融合通过对网络结构的分析,把多个层合并到一起,从而降低网络复杂度和减少运算量。
- 内存复用:第一种内存复用的方法是输入内存复用,即当前层的输出复用当前层的输入。第二种内存复用的方法是后续层复用前面层的输出。
常用模块
dnn.blobFromImage
blobFromImage(image,scalefactor=None,size=None,mean=None,swapRB=None,crop=None,ddepth=None):#进行批量图片处理blobFromImages(images,scalefactor=None,size=None, mean=None,swapRB=None,crop=None,ddepth=None):
参数:
image:cv2.imread 读取的图片数据scalefactor: 缩放像素值,如 [0, 255] - [0, 1]size: 输出blob(图像)的尺寸,如 (netInWidth, netInHeight),范围[0,255]mean: 从各通道减均值. 如果输入 image 为 BGR 次序,且swapRB=True,则通道次序为 (mean-R, mean-G, mean-B).swapRB: 交换 3 通道图片的第一个和最后一个通道,如 BGR - RGBcrop: 图像尺寸 resize 后是否裁剪. 如果crop=True,则,输入图片的尺寸调整resize后,一个边对应与 size 的一个维度,而另一个边的值大于等于 size 的另一个维度;然后从 resize 后的图片中心进行 crop. 如果crop=False,则无需 crop,只需保持图片的长宽比- ddepth: 输出 blob 的 Depth. 可选: CV_32F 或 CV_8U
import cv2from cv2 import dnnimport numpy as npimport matplotlib.pyplot as pltimg_cv2 = cv2.imread("test.jpeg")print("原图像大小: ", img_cv2.shape)inWidth = 256inHeight = 256outBlob1 = cv2.dnn.blobFromImage(img_cv2,scalefactor=1.0 / 255,size=(inWidth, inHeight),mean=(0, 0, 0),swapRB=False,crop=False)print("未裁剪输出: ", outBlob1.shape)#输出4维数组,图片是3维,第1维图片的个数,第2维通道数,第3,4维高度,宽度outimg1 = np.transpose(outBlob1[0], (1, 2, 0))outBlob2 = cv2.dnn.blobFromImage(img_cv2,scalefactor=1.0 / 255,size=(inWidth, inHeight),mean=(0, 0, 0),swapRB=False,crop=True)print("裁剪输出: ", outBlob2.shape)outimg2 = np.transpose(outBlob2[0], (1, 2, 0))plt.figure(figsize=[10, 10])plt.subplot(1, 3, 1)plt.title('输入图像', fontsize=16)plt.imshow(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB))plt.axis("off")plt.subplot(1, 3, 2)plt.title('输出图像 - 未裁剪', fontsize=16)plt.imshow(cv2.cvtColor(outimg1, cv2.COLOR_BGR2RGB))plt.axis("off")plt.subplot(1, 3, 3)plt.title('输出图像 - 裁剪', fontsize=16)plt.imshow(cv2.cvtColor(outimg2, cv2.COLOR_BGR2RGB))plt.axis("off")plt.show()
dnn.NMSBoxes
作用:根据给定的检测boxes和对应的scores进行NMS(非极大值抑制)处理
NMSBoxes(bboxes,scores,score_threshold,nms_threshold,eta=None,top_k=None)
参数:
boxes: 待处理的边界框 bounding boxesscores: 对于于待处理边界框的 scoresscore_threshold: 用于过滤 boxes 的 score 阈值nms_threshold: NMS 用到的阈值indices: NMS 处理后所保留的边界框的索引值eta: 自适应阈值公式中的相关系数:

top_k: 如果 top_k>0,则保留最多 top_k 个边界框索引值.
dnn.readNet
作用:加载深度学习网络及其模型参数
readNet(model, config=None, framework=None)
参数:
- 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, caffeModel=None)
作用:加载采用Caffe的配置网络和训练的权重参数
- Darknet
readNetFromDarknet(cfgFile, darknetModel=None)
作用:加载采用Darknet的配置网络和训练的权重参数
- Tensorflow
readNetFromTensorflow(model, config=None)
作用:加载采用Tensorflow 的配置网络和训练的权重参数
参数:
model: .pb 文件
config: .pbtxt 文件
- Torch
readNetFromTorch(model, isBinary=None)
作用:加载采用 Torch 的配置网络和训练的权重参数
参数:
model: 采用 torch.save()函数保存的文件
- ONNX
readNetFromONNX(onnxFile)
作用:加载 .onnx 模型网络配置参数和权重参数

