做深度学习神经网络的设计、训练与部署,往往会困扰于不同的操作系统,不同的深度学习框架,不同的部署硬件,以及不同的版本。由于相互之间的不兼容,给开发使用者造成了很大的不便。

联合使用OpenVINO和ONNX,便可以解决从不同框架模型到不同硬件之间快速部署的问题。

最近参加“英特尔®OpenVINO™领航者联盟 DFRobot行业AI开发者大赛”活动,主办方提供了拿铁熊猫LattePanda和Intel神经计算棒NCS2,本文所列数据都是在该平台上运行得到的。

硬件1:拿铁熊猫LattePanda Delta

采用了 Intel 全新 N 系列赛扬 4 核处理器,最高可达 2.40 GHz,4GB内存,内置蓝牙和 WiFi 模组,支持 USB 3.0 接口、HDMI 视频输出、3.5mm音频接口,100/1000Mbps 以太网口,以及额外的 MicroSD 扩展卡槽。集成一块 Arduino Leonardo 单片机,可以外拓各种传感器模块,支持 Windows 和 Linux 双操作系统。在功能和价格上都是完美的选择。

硬件2:Intel神经计算棒NCS2

Intel® Movidius™ Myriad™ X VPU核心,USB 3.1 Type-A接口,支持TensorFlow, Caffe, MXNet, ONNX, PyTorch/ PaddlePaddle(通过ONNX)。

软件环境:OpenVINO,Ubuntu, Windows® 10

先来一张硬件合照,确实是小巧,接上鼠标、键盘、显示器,连上USB摄像头和蓝牙音箱,我们来看看这台巴掌大的电脑性能怎么样!

为什么选择ONNX和OpenVINO?

Open Neural Network Exchange(ONNX,开放神经网络交换),是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互。

ONNX的规范及代码主要由微软,亚马逊 ,Facebook 和 IBM 等公司共同开发,以开放源代码的方式托管在Github上。目前官方支持加载ONNX模型并进行推理的深度学习框架有: Caffe2, PyTorch, MXNet,ML.NET,TensorRT 和 Microsoft CNTK,并且 TensorFlow 也非官方的支持ONNX。---维基百科

OpenVINO是英特尔推出一套基于深度学习的计算机视觉加速优化框架,支持其它机器学习平台模型的压缩优化、加速计算等功能。主要包括两个核心组件一个预训练模型库:

OpenVINO 核心组件-模型优化器

模型优化器Model Optimizer,模型优化器支持的深度学习框架包括:

-ONNX -TensorFlow -Caffe -MXNet

OpenVINO 核心组件-推断引擎

推断引擎(Inference Engine)支持硬件指令集层面的深度学习模型加速运行,同时对传统的OpenCV图像处理库也进行了指令集优化,有显著的性能与速度提升。支持的硬件平台包括如下:

-CPU -GPU -FPGA -MYRIAD(英特尔加速计算棒) -HDDL -GAN

ONNX便是一种通用货币,开发者可以把自己开发训练好的模型保存为ONNX文件;而部署工程师可以借助OpenVINO,把ONNX部署在不同的硬件平台上,而不必关心开发者使用的是哪一种框架。

所以,只要你的模型可以转为ONNX模型,而ONNX模型又可以通过OpenVINO高效、快速地部署在Intel的CPU、GPU、神经计算棒、甚至是FPGA上,使你的模型开发、训练与部署可以分开,又不必受到不同软硬件开发环境的困扰,大大提高部署实现的效率。

如何使用OpenVINO部署ONNX模型

首先,你需要安装OpenVINO,

我使用的是最新版的OpenVINO 2020.4,具体安装设置,请参考如下链接: https://docs.openvinotoolkit.org/2020.4/index.html

然后,你需要有一个ONNX模型。

你可以下载别人训练好的公开的ONNX文件,也可以从别的框架模型转化,当然也可以自己训练,然后保存为ONNX格式。本文选择自己训练。

我采用mnist手写数据集与印刷体混合的数据集,构建卷积神经网络,进行训练,达到精度96.4%,将训练结果保存为ONNX模型:

使用mo.py对ONNX模型进行优化:

命令如下:

python "C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\model_optimizer\mo.py" --input_model=Xubett964.onnx --output_dir=. --model_name=Xubett964.fp16 --data_type=FP16

Model Optimizer arguments:

Common parameters:

- Path to the Input Model:      C:\openVINOdemo\shuatiP\Xubett964.onnx

- Path for generated IR:        C:\openVINOdemo\shuatiP\.

- IR output name:       Xubett964.fp16

- Log level:    ERROR

- Batch:        Not specified, inherited from the model

- Input layers:         Not specified, inherited from the model

- Output layers:        Not specified, inherited from the model

- Input shapes:         Not specified, inherited from the model

- Mean values:  Not specified

- Scale values:         Not specified

- Scale factor:         Not specified

- Precision of IR:      FP16

- Enable fusing:        True

- Enable grouped convolutions fusing:   True

- Move mean values to preprocess section:       False

- Reverse input channels:       False

ONNX specific parameters:

Model Optimizer version:

[ SUCCESS ] Generated IR version 10 model.

[ SUCCESS ] XML file: C:\openVINOdemo\shuatiP\.\Xubett964.fp16.xml

[ SUCCESS ] BIN file: C:\openVINOdemo\shuatiP\.\Xubett964.fp16.bin

[ SUCCESS ] Total execution time: 11.34 seconds.

使用benchmark_app.py对上述模型进行评估:

可以更换参数,-d GPU, -d MYRIAD,对GPU和神经计算棒运行情况进行评估。命令如下:

python "C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\tools\benchmark_tool\benchmark_app.py"  -m Xubett964.fp16.xml -i images\image1.png -d CPU

[Step 1/11] Parsing and validating input arguments

C:\Program Files (x86)\IntelSWTools\openvino\python\python3.6\openvino\tools\benchmark\main.py:29: DeprecationWarning: The 'warn' method is deprecated, use 'warning' instead

logger.warn(" -nstreams default value is determined automatically for a device. "

[ WARNING ]  -nstreams default value is determined automatically for a device. Although the automatic selection usually provides a reasonable performance, but it still may be non-optimal for some cases, for more information look at README.

[Step 2/11] Loading Inference Engine

[ INFO ] InferenceEngine:

API version............. 2.1.2020.4.0-359-21e092122f4-releases/2020/4

[ INFO ] Device info

MKLDNNPlugin............ version 2.1

Build................... 2020.4.0-359-21e092122f4-releases/2020/4

[Step 3/11] Setting device configuration

[ WARNING ] -nstreams default value is determined automatically for CPU device. Although the automatic selection usually provides a reasonable performance,but it still may be non-optimal for some cases, for more information look at README.

[Step 4/11] Reading the Intermediate Representation network

[ INFO ] Read network took 31.25 ms

[Step 5/11] Resizing network to match image sizes and given batch

[ INFO ] Network batch size: 1

[Step 6/11] Configuring input of the model

[Step 7/11] Loading the model to the device

[ INFO ] Load network took 147.20 ms

[Step 8/11] Setting optimal runtime parameters

[Step 9/11] Creating infer requests and filling input blobs with images

[ INFO ] Network input 'imageinput' precision FP32, dimensions (NCHW): 1 1 28 28

C:\Program Files (x86)\IntelSWTools\openvino\python\python3.6\openvino\tools\benchmark\utils\inputs_filling.py:76: DeprecationWarning: The 'warn' method is deprecated, use 'warning' instead

",".join(BINARY_EXTENSIONS)))

[ WARNING ] No supported binary inputs found! Please check your file extensions: BIN

[ WARNING ] Some image input files will be ignored: only 0 files are required from 1

[ INFO ] Infer Request 0 filling

[ INFO ] Fill input 'imageinput' with random values (some binary data is expected)

[ INFO ] Infer Request 1 filling

[ INFO ] Fill input 'imageinput' with random values (some binary data is expected)

[ INFO ] Infer Request 2 filling

[ INFO ] Fill input 'imageinput' with random values (some binary data is expected)

[ INFO ] Infer Request 3 filling

[ INFO ] Fill input 'imageinput' with random values (some binary data is expected)

[Step 10/11] Measuring performance (Start inference asyncronously, 4 inference requests using 4 streams for CPU, limits: 60000 ms duration)

[Step 11/11] Dumping statistics report

Count:      768280 iterations

Duration:   60002.68 ms

Latency:    0.28 ms

Throughput: 12804.09 FPS

编写程序做推理验证

可以参考OpenVINO自带例子,Python的例子在下面的路径:

C:\Program Files (x86)\IntelSWTools\openvino\inference_engine\samples\python

也可以参考我的代码。

#导入IE/OpenCV/numpy/time模块
from openvino.inference_engine import IECore, IENetwork
import cv2
import numpy as np
from time import time
#配置推断计算设备,IR文件路径,图片路径
DEVICE = 'MYRIAD'
#DEVICE = 'CPU'
model_xml = 'C:/openVINOdemo/shuatiP/Xubett964.fp16.xml'
model_bin = 'C:/openVINOdemo/shuatiP/Xubett964.fp16.bin'
image_file = 'C:/openVINOdemo/shuatiP/images/image5.png'
labels_map = ["+", "-", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "=", "×", "÷"]
#初始化插件,输出插件版本号
ie = IECore()
ver = ie.get_versions(DEVICE)[DEVICE]
print("{descr}: {maj}.{min}.{num}".format(descr=ver.description, maj=ver.major, min=ver.minor, num=ver.build_number))
#读取IR模型文件
net = ie.read_network(model=model_xml, weights=model_bin)
#准备输入输出张量
print("Preparing input blobs")
input_blob = next(iter(net.inputs))
out_blob = next(iter(net.outputs))
net.batch_size = 1
#载入模型到AI推断计算设备
print("Loading IR to the plugin...")
exec_net = ie.load_network(network=net, num_requests=1, device_name=DEVICE)
#读入图片
n, c, h, w = net.inputs[input_blob].shape
image = cv2.imread(image_file,0)
#执行推断计算
print("Starting inference in synchronous mode")
start = time()
res = exec_net.infer(inputs={input_blob: image})
end = time()
print("Infer Time:{}ms".format((end-start)*1000))
# 处理输出
print("Processing output blob")
res = res[out_blob]
indx=np.argmax(res)
label=labels_map[indx]
print("Label: ",label)
print("Inference is completed")
#显示处理结果
cv2.imshow("Detection results",image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行 digit_detector.py:

python digit_detector.py

myriadPlugin: 2.1.2020.4.0-359-21e092122f4-releases/2020/4

Preparing input blobs

digit_detector.py:27: DeprecationWarning: 'inputs' property of IENetwork class is deprecated. To access DataPtrs user need to use 'input_data' property of InputInfoPtr objects which can be accessed by 'input_info' property.

input_blob = next(iter(net.inputs))

Loading IR to the plugin...

Starting inference in synchronous mode

Infer Time:8.739948272705078ms

Processing output blob

Label:  7

Inference is completed

如上图所示,image5.png是7的图片,推理结果显示是7,说明推理是正确的。

ONNX格式的模型文件,可以作为不同深度学习框架之间的桥梁,OpenVINO提供了对ONNX模型的优化部署方案,使其可以快速部署到拿铁熊猫LattePanda和Intel神经计算棒NCS2等Intel相关的硬件,加速从深度学习模型到实际应用推理部署的过程。

老徐   2020.7

做深度学习神经网络的设计、训练与部署,往往会困扰于不同的操作系统,不同的深度学习框架,不同的部署硬件,以及不同的版本。由于相互之间的不兼容,给开发使用者造成了很大的不便。联合使用OpenVINO和ONNX,便可以解决从不同框架模型到不同硬件之间快速部署的问题。最近参加“英特尔®OpenVINO™领航者联盟 DFRobot行业AI开发者大赛”活动,主办方提供了拿铁熊猫LattePanda和Intel神经计算棒NCS2,本文所列数据都是在该平台上运行得到的。硬件1:拿铁熊猫LattePanda De
onnx open vino 和mnn都是作为cpu推理的框架,推理速度这里进行对比一下 模型 使用 python open vino 使用 这篇 文章 onnx 文件 对比代码如下: from open vino .inference_engine import IECore import onnx runtime import MNN import numpy as np import cv2 import time model="ctdet_coco_dlav0_512. onnx " mnnmodel="ctdet
安装 open vino linux系统下按照官网教程安装 open vino 并进行配置: https://docs. open vino toolkit.org/latest/_docs_install_guides_installing_ open vino _linux.html#install- open vino ONNX 模型 转换 对于pytorch、tensorflow等框架训练到 模型 都可以转换成 ONNX 模型 ...
使用 python API,对 open vino ONNX Runtime的推理时间进行比较。有学习并借用一些其他up的代码。 # open vino from open vino .inference_engine import IECore import numpy as np import cv2 import time ie = IECore() model="shufflenet-v2-10. onnx " #model="shufflenet-v2-10/shufflenet-v2-10.xml"
<p style="background: white;"><span lang="EN-US" style="font-size: 10pt; font-family: 微软雅黑, sans-serif; color: black; background-color: #f8cac6;">YOLOX</span><span style="font-size: 10.0pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">是旷视科技新近推出的高性能实时目标检测网络,性能超越了<span lang="EN-US">YOLOv3/YOLOv4 /YOLOv5</span>。</span><span lang="EN-US" style="font-size: 10.0pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black;"> </span><span lang="EN-US" style="font-size: 10pt; font-family: Arial, sans-serif; color: black; background-color: #f8cac6;"> Open VINO </span><span style="font-size: 10.0pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black;">是针对<span lang="EN-US">Intel</span>的<span lang="EN-US">CPU</span>等设备的加速工具。</span></p> <p style="background: white;"><span style="font-size: 10pt; font-family: 微软雅黑, sans-serif;">本课程在<span style="background-color: #f8cac6;"><span lang="EN-US">Windows</span>和<span lang="EN-US">Ubuntu</span>系统</span>上详细演示 使用 <span lang="EN-US"> Open VINO </span>对</span><span lang="EN-US" style="font-size: 10pt; font-family: Arial, sans-serif;">YOLOX</span><span style="font-size: 10pt; font-family: 微软雅黑, sans-serif;">进行</span><span style="font-size: 10pt; font-family: 微软雅黑, sans-serif;">加速和 部署 。其中对<span style="background-color: #f8cac6;"><span lang="EN-US"> Python </span>和<span lang="EN-US">C++</span></span>的<span lang="EN-US"> Open VINO </span> 部署 都进行了讲解。特别是讲述了针对<span style="background-color: #f8cac6;">自己数据集上训练出的<span lang="EN-US">YOLOX</span></span>的<span lang="EN-US"> Open VINO </span>加速 部署 方法。</span></p> <p style="margin: 0cm; background: white;"><span style="font-size: 10pt; font-family: 微软雅黑, sans-serif;"><strong>相关课程:</strong></span></p> <p style="margin: 0cm; background: white;"><span style="font-size: 10pt; font-family: 微软雅黑, sans-serif;">《<span lang="EN-US">YOLOX</span>目标检测实战:训练自己的数据集》<span lang="EN-US">https://edu.csdn.net/course/detail/35586</span></span></p> <p style="background: white;"><span style="font-size: 10pt; font-family: 微软雅黑, sans-serif;"> </span></p> <p style="margin: 0cm; background: white;"><span style="font-size: 10pt; font-family: 微软雅黑, sans-serif;">《<span lang="EN-US">YOLOX</span>目标检测实战:<span lang="EN-US">TensorRT</span>加速 部署 》<span lang="EN-US">https://edu.csdn.net/course/detail/35716</span></span></p> <p><img src="https://img-bss.csdnimg.cn/202108220519348711.jpg" alt=" open vino 加速演示" /></p> <p><img src="https://img-bss.csdnimg.cn/202108220323246885.jpg" alt="课程内容" /></p>
最近要 使用 open vino 部署 一个 深度学习 模型 模型 主要是 使用 pytorch进行训练, 部署 时首先转为 onnx 模型 ,然后在将 onnx 模型 转为 open vino 进行 部署 ,本文就记录一下在 onnx 模型 open vino 时所遇到的坑以及解决办法,未来有遇到新的问题会补充到本文。 1: open vino 模型 不支持动态shape的输入和输出 onnx 模型 open vino 的第一个问题就是 open vino 不支持输入和输出的shape是动态的,而 onnx 是支持动态shape的输入和输出, onnx 动态shape的设置是tor
ERROR: Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall. pip install
open vino 安装步骤https://docs. open vino toolkit.org/latest/ open vino _docs_install_guides_installing_ open vino _windows.html#Update-Path 错误1 安装程序没找到 python 和gpu 在安装 open vino 过程会遇到这样的错误,不用管直接继续安装(电脑已经安装anaconda python 3.6),之后在cmd执行Configure the Model Optimizer命令的时候会找到pyth
上一篇博客【 模型 部署 】PaddleOCR 模型 open vino 部署 (一)介绍了PaddleOCR检测 模型 DBNet的 部署 方法,本篇将介绍文本方向分类、文本识别的 部署 方法,同时将检测、方向分类、文本识别 模型 串联起来,给出完整的 部署 流程。 open vino 会将切片优化成split ,然后在c++中初始化会出错,于是将切片用index_select替代, 如下所示: preds_0_1 = preds[:, :2, :, :] preds_0_1 = preds.index_select(1, torch.tensor([0, 1]).to(preds.device))
编译 Samples 文件夹中的范例 1、进入安装目录 C:\Intel\ open vino _2021.3.394\deployment_tools\inference_engine\samples 路径。 2、这里有三个不同语言的samples,在 samples/cpp 文件夹中输入“cmd",运行 build_samples_msvc.bat,完成编译工作。其中 c/c++是需要进行编译, python 中未有发现 .bat文件,这里是对 cpp samples进行编译。 编译后的结果保存在 C:\Us
英特尔® Open VINO ™工具套件中级课程面向有一定基础的学员。若您是一名计算视觉技术的初学者,我们将建议您先学习英特尔® Open VINO ™工具套件的初级课程,再进行中级课程的学习。本课程将主要介绍计算机视觉应用的相关知识,特别是英特尔® Open VINO ™工具套件的整体架构以及 使用 方法。整个课程的视频课程部分包含了 Open VINO 模型 优化器和推理引擎的 使用 ,视频解码的 Open CV...