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