文章目录


OpenCV 4.X 版本集成了很多直接利用 DNN 模块的 Python API 接口.

安装:

1
sudo pip install opencv-python

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from cv2 import dnn
# Variables with simple values
DNN_BACKEND_DEFAULT = 0
DNN_BACKEND_HALIDE = 1

DNN_BACKEND_INFERENCE_ENGINE = 2

DNN_BACKEND_OPENCV = 3
DNN_BACKEND_VKCOM = 4

DNN_TARGET_CPU = 0
DNN_TARGET_MYRIAD = 3
DNN_TARGET_OPENCL = 1

DNN_TARGET_OPENCL_FP16 = 2

DNN_TARGET_VULKAN = 4

__loader__ = None
__spec__ = None

1. dnn.blobFromImage

定义:

1
2
3
4
5
6
7
8
def blobFromImage(image, 
scalefactor=None,
size=None,
mean=None,
swapRB=None,
crop=None,
ddepth=None):
pass

作用:

根据输入图像,创建 NCHW 次序的 4-dim blobs.

参数:

[1] - image: cv2.imread 读取的图片数据;

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

[3] - size: 输出图像的尺寸,如 netInWidth,netInHeight.

[4] - mean: 从各通道减均值。如果输入 image 为 BGR 次序,且 swapRB=True,则通道次序为 mean−R,mean−G,mean−B.

[5] - swapRB: 交换 3 通道图片的第一个和最后一个通道,如 BGR - RGB.

[6] - crop: 图像尺寸 resize 后是否裁剪。如果 crop=True ,则,输入图片的尺寸调整 resize 后,一个边对应与 size 的一个维度,而另一个边的值大于等于 size 的另一个维度;然后从 resize 后的图片中心进行 crop. 如果 crop=False ,则无需 crop,只需保持图片的长宽比.

[7] - ddepth: 输出 blob 的 Depth. 可选: CV_32F 或 CV_8U.

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import cv2
from cv2 import dnn
import numpy as np
import matplotlib.pyplot as plt

img_cv2 = cv2.imread("test.jpg")
print("[INFO]Image shape: ", img_cv2.shape)

inWidth = 256
inHeight = 256
outBlob1 = cv2.dnn.blobFromImage(img_cv2,
scalefactor=1.0 / 255,
size=(inWidth, inHeight),
mean=(0, 0, 0),
swapRB=False,
crop=False)
print("[INFO]outBlob1 shape: ", outBlob1.shape)
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("[INFO]outBlob2 shape: ", outBlob2.shape)
outimg2 = np.transpose(outBlob2[0], (1, 2, 0))

plt.figure(figsize=[10, 10])
plt.subplot(1, 3, 1)
plt.title('Input image', fontsize=16)
plt.imshow(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.subplot(1, 3, 2)
plt.title('Output image - no crop', fontsize=16)
plt.imshow(cv2.cvtColor(outimg1, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.subplot(1, 3, 3)
plt.title('Output image - crop', fontsize=16)
plt.imshow(cv2.cvtColor(outimg2, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.show()

img

2. dnn.blobFromImages

定义:

1
2
3
4
5
6
7
def blobFromImages(images, 
scalefactor=None,
size=None, mean=None,
swapRB=None,
crop=None,
ddepth=None):
pass

作用:

批量处理图片,创建 4-dim blobs. 其它参数类似于 dnn.blobFromImage .

3. dnn.Net_readFromModelOptimizer

定义:

1
2
def Net_readFromModelOptimizer(xml, bin):
pass

作用:

从 Intel’s Model Optimizer intermediate representation 创建网络.

参数:

[1] - xml: XML 网络拓扑结果的配置文件.

[2] - bin: 训练权重值的二值文件.

4. dnn.NMSBoxes

定义:

1
2
3
4
5
6
7
def NMSBoxes(bboxes, 
scores,
score_threshold,
nms_threshold,
eta=None,
top_k=None):
pass

作用:

根据给定的 boxes 和对应的 scores 进行 NMS 处理.

参数:

[1] - boxes: 待处理的边界框 bounding boxes.

[2] - scores: 对于于待处理边界框的 scores.

[3] - score_threshold: 用于过滤 boxes 的 score 阈值.

[4] - nms_threshold: NMS 用到的阈值.

[5] - indices: NMS 处理后所保留的边界框的索引值.

[6] - eta: 自适应阈值公式中的相关系数:nms_thresholdi+1=eta⋅nms_thresholdi

[7] - top_k: 如果 top_k>0,则保留最多 top_k 个边界框索引值.

5. dnn.NMSBoxesRotated

定义:

1
2
3
4
5
6
7
def NMSBoxesRotated(bboxes, 
scores,
score_threshold,
nms_threshold,
eta=None,
top_k=None):
pass

6. dnn.readNet

定义:

1
2
def readNet(model, config=None, framework=None):    
pass

作用:

从支持的格式中加载深度学习网络和模型参数.

参数:

[1] - model: 训练的权重参数的模型二值文件,支持的格式有: *.caffemodel Caffe、 *.pb TensorFlow、 *.t7*.net Torch、 *.weights Darknet、 *.bin DLDT.

[2] - config: 包含网络配置的文本文件,支持的格式有: *.prototxt Caffe、 *.pbtxt TensorFlow、 *.cfg Darknet、 *.xml DLDT.

[3] - framework: 所支持格式的框架名.

该函数自动检测训练模型所采用的深度框架,然后调用 readNetFromCaffereadNetFromTensorflowreadNetFromTorchreadNetFromDarknet 中的某个函数.

7. dnn.readNetFromCaffe

定义:

1
2
def readNetFromCaffe(prototxt, caffeModel=None):     
pass

作用:

加载采用 Caffe 的配置网络和训练的权重参数.

8. dnn.readNetFromDarknet

定义:

1
2
def readNetFromDarknet(cfgFile, darknetModel=None):    
pass

作用:

加载采用 Darknet 的配置网络和训练的权重参数.

9. dnn.readNetFromModelOptimizer

定义:

1
2
def readNetFromModelOptimizer(xml, bin):     
pass

作用:

加载采用 Intel’s Model Optimizer intermediate representation 的配置网络和训练的权重参数.

10. dnn.readNetFromONNX

定义:

1
2
def readNetFromONNX(onnxFile):    
pass

作用:

加载 .onnx 模型网络配置参数和权重参数.

11. dnn.readNetFromTensorflow

定义:

1
2
def readNetFromTensorflow(model, config=None):    
pass

作用:

加载采用 Tensorflow 的配置网络和训练的权重参数.

[1] - model: .pb 文件.

[2] - config: .pbtxt 文件.

12. dnn.readNetFromTorch

定义:

1
2
def readNetFromTorch(model, isBinary=None):     
pass

作用:

加载采用 Torch 的配置网络和训练的权重参数.

[1] - model: 采用 torch.save() 函数保存的文件.

所支持的 Torch nn.Module 网络层有:

1
2
3
4
5
6
7
8
9
- nn.Sequential
- nn.Parallel
- nn.Concat
- nn.Linear
- nn.SpatialConvolution
- nn.SpatialMaxPooling, nn.SpatialAveragePooling
- nn.ReLU, nn.TanH, nn.Sigmoid
- nn.Reshape
- nn.SoftMax, nn.LogSoftMax

13. dnn.readTensorFromONNX

定义:

1
2
def readTensorFromONNX(path):    
pass

作用:

.pb 文件创建 blob.

[1] - path: 包含 input tensor 的 .pb 文件.

14. dnn.resetMyriadDevice

定义:

1
2
3
def resetMyriadDevice():    
""" resetMyriadDevice() -> None . @brief Release a Myriad device is binded by OpenCV. . * . * Single Myriad device cannot be shared across multiple processes which uses . * Inference Engine's Myriad plugin. """
pass

15. dnn.shrinkCaffeModel

定义:

1
2
def shrinkCaffeModel(src, dst, layersTypes=None):    
pass

作用:

将 Caffe 网络的所有权重转换为半精度浮点数值 halfprecisionfloatingpoint.

参数:

[1] - src: Caffe 网路的原始单精度浮点数值权重模型文件 (后缀一般为 .caffemodel ).

[2] - dst: 转换后的权重文件.

[3] - layersTypes: 待转换参数的网络层类型,默认是只转换卷积层和全连接层的权重参数.

16. dnn.writeTextGraph

定义:

1
2
3
def writeTextGraph(model, output):    
#note: To reduce output file size, trained weights are not included.
pass

作用:

将以 protocol buffer 格式的二值网络,创建为文本表示 Createatextrepresentationforabinarynetworkstoredinprotocolbufferformat.

参数:

[1] - model: 二值网络 binarynetwork 的路径.

[2] - output: 创建的输出文件路径.

× 请我吃糖~
打赏二维码