OpenCV 中的深度学习模块( DNN )只提供了推理功能,不涉及模型的训练,⽀持 多种深度学习框架,⽐如 TensorFlow , Caffe,Torch 和 Darknet 。

常⽤⽅法简介

        dnn.blobFromImage

作⽤:根据输⼊图像,创建维度 N (图⽚的个数),通道数 C ,⾼ H 和宽 W 次序的 blobs 原型:

blobFromImage(image,  
                  scalefactor=None,  
                  size=None,  
                  mean=None,  
                  swapRB=None,  
                  crop=None,  
                  ddepth=None):

参数:

image:cv2.imread 读取的图⽚数据

scalefactor: 缩放像素值,如 [0, 255] - [0, 1]

size: 输出 blob( 图像 ) 的尺⼨,如 (netInWidth, netInHeight)

mean: 从各通道减均值 . 如果输⼊ image 为 BGR 次序,且 swapRB=True ,则 通道次序为 (mean-R, mean-G, mean-B).

swapRB: 交换 3 通道图⽚的第⼀个和最后⼀个通道,如 BGR - RGB

crop: 图像尺⼨ resize 后是否裁剪 . 如果 crop=True  ,则,输⼊图⽚的尺⼨调整 resize 后,⼀个边对应与 size 的⼀个维度,⽽另⼀个边的值⼤于等于 size 的 另⼀个维度;然后从 resize 后的图⽚中⼼进⾏ crop. 如果 需 crop ,只需保持图⽚的⻓宽⽐

ddepth: 输出 blob 的 Depth. 可选 : CV_32F 或 CV_8U

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from cv2 import dnn
from pylab import mpl
def blob():
    img = cv.imread("opencv/img_3.png")
    print(img.shape)
    inWidth = 150
    inHeight = 150
    outBlob1 = dnn.blobFromImage(img,
                                 scalefactor=1.0/255,
                                 size=(inWidth,inHeight),
                                 mean=(0,0,0),
                                 swapRB=False,
                                 crop=False)
    print(outBlob1.shape)
    outimg1 = np.transpose(outBlob1[0],(1,2,0))
    outBlob2 = dnn.blobFromImage(img,
                                 scalefactor=1.0/255,
                                 size=(inWidth,inHeight),
                                 mean=(0,0,0),
                                 swapRB=True,
                                 crop=True)

    print("裁剪输出: ", outBlob2.shape)
    outimg2 = np.transpose(outBlob2[0], (1, 2, 0))
    # 设置显示中文字体
    mpl.rcParams["font.sans-serif"] = ["SimHei"]
    # 设置正常显示符号
    mpl.rcParams["axes.unicode_minus"] = False
    plt.figure(figsize=[5, 5])
    plt.subplot(1, 3, 1)
    plt.title('输⼊图像', fontsize=12)
    plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.axis("off")
    plt.subplot(1, 3, 2)
    plt.title('输出图像-未裁剪', fontsize=12)
    plt.imshow(cv.cvtColor(outimg1, cv.COLOR_BGR2RGB))
    plt.axis("off")
    plt.subplot(1, 3, 3)
    plt.title('输出图像-裁剪', fontsize=12)
    plt.imshow(outimg2)
    # plt.imshow(cv.cvtColor(outimg2, cv.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 boxes

scores: 对于于待处理边界框的 scores

score_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: 包含⽹络配置的⽂本⽂件,⽀持的格式有: (Caffe) 、 *.pbtxt  (TensorFlow) 、 *.prototxt  *.cfg  (Darknet) 、 *.xml  (DLDT).

 numba 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 模型⽹络配置参数和权重参数

Logo

在这里,我们一起交流AI,学习AI,用AI改变世界。如有AI产品需求,可访问讯飞开放平台,www.xfyun.cn。

更多推荐