OpenVINO示例介绍

接着前面系列博客来讲,我们知道学东西应该先从官网的示例来着手,循序渐进,这是一个很好的学习方法。有两处例子:

第一处,OpenVINO安装路径下的例子,在用Using Installer安装OpenVINO Runtime的时候,其会提示你一个安装路径,如下图:

OpenVINO示例介绍_第1张图片

安装完毕后,可以在此目录下(结合自己的路径)看到有关的cpp以及python例子,然后就可以先练练手,玩起来了。

OpenVINO示例介绍_第2张图片

第二处,OpenVINO在github上 有个open_model_zoo ,这年头大家都喜欢自家整个模型库,比如隔壁tensorflow家的model garden(博主也有一篇博客对它里面的object detection库进行了介绍,感兴趣的看客可移步过去)。对于Open_model_zoo里面例子的使用介绍见博主的另一篇博客

https://blog.csdn.net/jiugeshao/article/details/124763586?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124763586%22%2C%22source%22%3A%22jiugeshao%22%7D&ctrtid=WFqK3https://blog.csdn.net/jiugeshao/article/details/124763586?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124763586%22%2C%22source%22%3A%22jiugeshao%22%7D&ctrtid=WFqK3

 如果是新手,且还是第一次接触OpenVINO,那么很是建议先看完博主所写的前两篇博客,本篇电脑的软件环境也同前两篇博客,python还是用的testOpenVINO虚拟环境。

OpenVINO使用介绍_竹叶青lvye的博客-CSDN博客_openvino使用

 Intel Movidius Neural Computer Stick 2使用(PC-Based Ubuntu)_竹叶青lvye的博客-CSDN博客

再交待下博主的环境配置:

Ubuntu 20.04

python3.6.13 (Anaconda)

cuda version: 11.2

cudnn version: cudnn-11.2-linux-x64-v8.1.1.33

一. OpenVINO安装路径下的自带例子

1. 如果要跑c++版的例子,则需要按照如下官网页面去编译下自带示例。

Get Started with Sample and Demo Applications — OpenVINO™ documentation

 cd到/home/sxhlvye/intel/openvino_2022/samples/cpp目录下,结合自己的路径

OpenVINO示例介绍_第3张图片

 终端执行如下语句进行编译

./build_samples.sh

 编译生成的文件见如下路径(终端中的log日志底部会有提示,编译出来的东西生成到哪里去了,注意去看下)

OpenVINO示例介绍_第4张图片

 移步到/home/sxhlvye/inference_engine_cpp_samples_build/intel64目录下,便可以看到一个个示例对应的可执行文件。

OpenVINO示例介绍_第5张图片

2. 先在python环境下跑通一个sample例子

(1) 安装对应框架的开发包。

由于博主前两篇博客中,只安装了tensorflow和onnx的openVINO包。所以博主这边再安装全,如下命令即可。

python -m pip install openvino-dev[caffe,onnx,tensorflow2,pytorch,mxnet]

(2) 下载模型

博主想要测试下classification_sample_async例子

OpenVINO示例介绍_第6张图片

 官网对这个例子使用介绍见如下链接

Image Classification Async Python* Sample — OpenVINO™ documentation

 其测试的是alexnet模型

OpenVINO示例介绍_第7张图片

 博主这边想来测试下resnet-50-pytorch模型,如下两处都对这个模型进行了介绍

resnet-50-pytorch — OpenVINO™ documentation

open_model_zoo/models/public/resnet-50-pytorch at master · openvinotoolkit/open_model_zoo · GitHub

 这边所使用的模型都是openVINO官网提供出来的模型,想了解更多模型可以直接去github上model zoo去看下

https://github.com/openvinotoolkit/open_model_zoo/tree/master/models/public

OpenVINO示例介绍_第8张图片

或者到此页面也能看到列举出来的模型,其和github上的也是保持一致的

resnet-50-pytorch — OpenVINO™ documentation

下载之前需要在终端中设置如下的环境变量,不然下载会失败

export OMZ_ROOT=https://github.com/openvinotoolkit/open_model_zoo

官网如下页面链接上也说明了此步骤

Model Downloader and other automation tools — OpenVINO™ documentation

OpenVINO示例介绍_第9张图片

 如下命令语句即可以下载模型

omz_downloader --name resnet-50-pytorch

OpenVINO示例介绍_第10张图片

(3) 模型转换

从终端中可以看到此在电脑上的保存路径,但这边是pytorch的pth模型结构,所以需要转换,一种方法是类似博主博客 第二步里的方法,使用mo命令转换; 一种在此同等目录下,使用omz_converter转换

omz_converter --name resnet-50-pytorch

 其会自动将刚下载的模型转换成OpenVINO IR模型,提供了两种量化模型,一种是FP16的,一种是FP32的

OpenVINO示例介绍_第11张图片

OpenVINO示例介绍_第12张图片

OpenVINO示例介绍_第13张图片

 转换log日志太长,这边只贴上在转换FP32时的部分log日志

========== Converting resnet-50-pytorch to IR (FP32)
Conversion command: /home/sxhlvye/anaconda3/envs/testOpenVINO/bin/python -- /home/sxhlvye/anaconda3/envs/testOpenVINO/bin/mo --framework=onnx --data_type=FP32 --output_dir=/home/sxhlvye/intel/openvino_2022.1.0.643/samples/python/classification_sample_async/public/resnet-50-pytorch/FP32 --model_name=resnet-50-pytorch --input=data '--mean_values=data[123.675,116.28,103.53]' '--scale_values=data[58.395,57.12,57.375]' --reverse_input_channels --output=prob --input_model=/home/sxhlvye/intel/openvino_2022.1.0.643/samples/python/classification_sample_async/public/resnet-50-pytorch/resnet-v1-50.onnx '--layout=data(NCHW)' '--input_shape=[1, 3, 224, 224]' '--layout=data(NCHW)' '--input_shape=[1, 3, 224, 224]'

如下是将pytorch模型转换为onnx模型

OpenVINO示例介绍_第14张图片

 如下是将onnx以FP32精度量化为OpenVINO IR模型

OpenVINO示例介绍_第15张图片

从如上截图中可以看到omz_converter也是通过调用mo命令来转换的,其跟随参数很多。咱们也可以拿这个完全体的命令语句来做模板,所以这个转换语句是相当有价值的,值得参考。如下官网上有对mo命令可选参数的介绍:

Compression of a Model to FP16 — OpenVINO™ documentation

Setting Input Shapes — OpenVINO™ documentation

 Changing input shapes — OpenVINO™ documentation

Convert model with Model Optimizer — OpenVINO™ documentation

Embedding Preprocessing Computation — OpenVINO™ documentation

Convert model with Model Optimizer — OpenVINO™ documentation

(4) 运行sample程序,用上面转换得到的OpenVINO模型来预测图片

终端cd到classification_sample_async.py文件所在目录下,同时将上面FP32量化的模型文件拷贝到此目录下,运行命令行参考官网,对一张香蕉图片进行预测

python classification_sample_async.py -m resnet-50-pytorch.xml -i banana.jpg -d GPU

OpenVINO示例介绍_第16张图片

 所用香蕉图片长这个样子

OpenVINO示例介绍_第17张图片

 结果是正确的,对应于imagenet_2012.txt ,上面结果得分最大的类别位于954,因为下标是0开始,所以对应txt中的955行。

OpenVINO示例介绍_第18张图片

小验证1:

博主又跑了下上面生成的FP16量化模型,结果如下:

OpenVINO示例介绍_第19张图片

 对比FP32的结果,差距微乎其微。

小验证2:

上面第(3)步是使用的omz_converter命令来对第(2)步的模型进行转换的,这里自己手动直接使用mo命令语句来尝试下转化。可以参考官网Converting an ONNX Model — OpenVINO™ documentation

mo --input_model resnet-v1-50.onnx --input=data --mean_values=data[123.675,116.28,103.53] --scale_values=data[58.395,57.12,57.375] --reverse_input_channels --output=prob --layout "nchw->nchw" '--input_shape=[1,3,224,224]'

 转换日志如下,可知默认就是FP32精度模式

Model Optimizer arguments:
Common parameters:
	- Path to the Input Model: 	/home/sxhlvye/intel/openvino_2022.1.0.643/samples/python/classification_sample_async/resnet-v1-50.onnx
	- Path for generated IR: 	/home/sxhlvye/intel/openvino_2022.1.0.643/samples/python/classification_sample_async/.
	- IR output name: 	resnet-v1-50
	- Log level: 	ERROR
	- Batch: 	Not specified, inherited from the model
	- Input layers: 	data
	- Output layers: 	prob
	- Input shapes: 	[1,3,224,224]
	- Source layout: 	Not specified
	- Target layout: 	Not specified
	- Layout: 	nchw->nchw
	- Mean values: 	data[123.675,116.28,103.53]
	- Scale values: 	data[58.395,57.12,57.375]
	- Scale factor: 	Not specified
	- Precision of IR: 	FP32
	- Enable fusing: 	True
	- User transformations: 	Not specified
	- Reverse input channels: 	True
	- Enable IR generation for fixed input shape: 	False
	- Use the transformations config file: 	None
Advanced parameters:
	- Force the usage of legacy Frontend of Model Optimizer for model conversion into IR: 	False
	- Force the usage of new Frontend of Model Optimizer for model conversion into IR: 	False
OpenVINO runtime found in: 	/home/sxhlvye/intel/openvino_2022/python/python3.6/openvino
OpenVINO runtime version: 	2022.1.0-7019-cdb9bec7210-releases/2022/1
Model Optimizer version: 	2022.1.0-7019-cdb9bec7210-releases/2022/1
[ SUCCESS ] Generated IR version 11 model.
[ SUCCESS ] XML file: /home/sxhlvye/intel/openvino_2022.1.0.643/samples/python/classification_sample_async/resnet-v1-50.xml
[ SUCCESS ] BIN file: /home/sxhlvye/intel/openvino_2022.1.0.643/samples/python/classification_sample_async/resnet-v1-50.bin
[ SUCCESS ] Total execution time: 0.97 seconds. 
[ SUCCESS ] Memory consumed: 296 MB. 
It's been a while, check for a new version of Intel(R) Distribution of OpenVINO(TM) toolkit here https://software.intel.com/content/www/us/en/develop/tools/openvino-toolkit/download.html?cid=other&source=prod&campid=ww_2022_bu_IOTG_OpenVINO-2022-1&content=upg_all&medium=organic or on the GitHub*
[ INFO ] The model was converted to IR v11, the latest model format that corresponds to the source DL framework input/output format. While IR v11 is backwards compatible with OpenVINO Inference Engine API v1.0, please use API v2.0 (as of 2022.1) to take advantage of the latest improvements in IR v11.
Find more information about API v2.0 and IR v11 at https://docs.openvino.ai

再用其转换后的OpenVINO IR模型预测下图片,结果如下,和omz_converter命令一致。

OpenVINO示例介绍_第20张图片

3. 再在c++环境下跑通上面sample例子

有了上面的基础,这边就很轻松了,上面第一点就介绍了openVINO自带的例子,这里移步到编译所生成的可执行文件目录下,同时将前面第二点生成的模型也拷贝过来,图片也一并拷贝过来

OpenVINO示例介绍_第21张图片

 执行如下命令:

./classification_sample_async -m resnet-v1-50.xml -i banana.jpg -d GPU

 结果如下:

[ INFO ] OpenVINO Runtime version ......... 2022.1.0
[ INFO ] Build ........... 2022.1.0-7019-cdb9bec7210-releases/2022/1
[ INFO ] 
[ INFO ] Parsing input parameters
[ INFO ] Files were added: 1
[ INFO ]     banana.jpg
[ INFO ] Loading model files:
[ INFO ] resnet-v1-50.xml
[ INFO ] model name: torch-jit-export
[ INFO ]     inputs
[ INFO ]         input name: data
[ INFO ]         input type: f32
[ INFO ]         input shape: {1, 3, 224, 224}
[ INFO ]     outputs
[ INFO ]         output name: prob
[ INFO ]         output type: f32
[ INFO ]         output shape: {1, 1000}
[ INFO ] Read input images
[ WARNING ] Image is resized from (640, 447) to (224, 224)
[ INFO ] Set batch size 1
[ INFO ] model name: torch-jit-export
[ INFO ]     inputs
[ INFO ]         input name: data
[ INFO ]         input type: u8
[ INFO ]         input shape: {1, 224, 224, 3}
[ INFO ]     outputs
[ INFO ]         output name: prob
[ INFO ]         output type: f32
[ INFO ]         output shape: {1, 1000}
[ INFO ] Loading model to the device GPU
[ INFO ] Create infer request
[ INFO ] Start inference (asynchronous executions)
[ INFO ] Completed 1 async request execution
[ INFO ] Completed 2 async request execution
[ INFO ] Completed 3 async request execution
[ INFO ] Completed 4 async request execution
[ INFO ] Completed 5 async request execution
[ INFO ] Completed 6 async request execution
[ INFO ] Completed 7 async request execution
[ INFO ] Completed 8 async request execution
[ INFO ] Completed 9 async request execution
[ INFO ] Completed 10 async request execution
[ INFO ] Completed async requests execution

Top 10 results:

Image banana.jpg

classid probability
------- -----------
954     14.5919666 
940     11.0981741 
941     10.7811651 
942     10.2868891 
951     10.2691641 
939     9.9962120  
945     9.9133644  
953     9.7936678  
943     9.1681681  
950     8.4921722  

可以看到分类结果和python下是保持一致的。

4. 继续再跑跑别的安装目录下的OpenVINO Sample例子

这里选择hello_reshape_ssd。这里只跑下c++版的,看个效果,参考官网运行此例子

Hello Reshape SSD C++ Sample — OpenVINO™ documentation

OpenVINO示例介绍_第22张图片

 博主测试图片如下

OpenVINO示例介绍_第23张图片

 测试结果如下:

OpenVINO示例介绍_第24张图片

其它例子参考上面的方法运行就可以了,这里不再详述了。

二. open_model_zoo例子

上面第一步里已经涉及了很多,比如模型下载,转换等介绍,所以第二部分不会再详解,快速的来看下怎么跑出效果来。

1.从github上下载例子

GitHub - openvinotoolkit/open_model_zoo: Pre-trained Deep Learning models and demos (high quality and extremely fast)

博主这里放在此路径下(结合自己的路径)

OpenVINO示例介绍_第25张图片

2.python下运行例子

(1)准备图片、模型、标签文件

这里演示运行classification_demo例子,例子路径如下(结合自己的路径)

 博主把图片、imagenet_2012.txt(标签文件也就是label文件)、测试模型也放过来了

OpenVINO示例介绍_第26张图片

 注:imagenet_2012.txt不知道的童鞋可以在如下open_model_zoo目录下找(结合自己的路径)

OpenVINO示例介绍_第27张图片

 这里会分别测试resnet-50-pytorch模型(第一步里已经生成了)和resnet-50-tf模型。resnet-50-tf模型参考上面的下载和转换就行。

omz_downloader --name resnet-50-tf
omz_converter --name resnet-50-tf

 部分下载日志和转换日志如下(因为觉得里面信息有些参考价值,所以贴下)

OpenVINO示例介绍_第28张图片

 可以看出来和上面的pytorch模型通道结构是不一样的,这里是NHWC格式。

(2)安装依赖包

参考gitbub这一页

open_model_zoo/demos at master · openvinotoolkit/open_model_zoo · GitHub

 cd到目录/home/sxhlvye/open_model_zoo-master/demos下(结合自己的open_model_zoo放置路径)

终端执行如下命令:

python -m pip install --user -r requirements.txt

 此外还需要参考此页

open_model_zoo/README.md at master · openvinotoolkit/open_model_zoo · GitHub

配置下openmodelzoo_modelapi库

cd到/home/sxhlvye/open_model_zoo-master/demos/common/python目录下,执行如下语句

完毕后再此目录下能够看到whl文件

OpenVINO示例介绍_第29张图片

 cd到此目录下执行下命令语句,进行安装

pip install openmodelzoo_modelapi-0.0.0-py3-none-any.whl --force-reinstall

 此时执行如下语句不会出现报错

不然会报如下错误:

from openvino.model_zoo.model_api.models import Classification, outputTransform

ModuleNotFoundError: No module named 'openvino.model_zoo.model_api

(3)pycharm中运行此例子(classification python* Demo)

参看github讲解及官网

https://github.com/openvinotoolkit/open_model_zoo/tree/master/demos/classification_demo/python

Classification Python* Demo — OpenVINO™ documentation

 博主这里并没有安装介绍的那样使用命令行语句,而是直接在py文件中给入参数

OpenVINO示例介绍_第30张图片

classification_demo中的代码修改了如下几处即可。

OpenVINO示例介绍_第31张图片

 运行结果如下:

OpenVINO示例介绍_第32张图片

 ok,完毕。

3.c++下运行例子

(1)先编译例子

参照页面

open_model_zoo/demos at master · openvinotoolkit/open_model_zoo · GitHub

先做下这两步

OpenVINO示例介绍_第33张图片

 这边没有什么好说的,如下是博主的记录(结合自己的路径)

OpenVINO示例介绍_第34张图片

下面一步是官网上没有提到的,是个坑,下载open_mode_zoom时,gflas文件夹不会下载下来,需要手动去这个页面上下载下来

https://github.com/gflags/gflags/tree/e171aa2d15ed9eb17054558e0b3a6a413bb01067

下载完毕后,把文件夹里的文件拷贝到如下目录下(结合自己的open_model_zoo在电脑上的位置)

OpenVINO示例介绍_第35张图片

 不然后面编译的时候会出现报错:

-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
CMake Error at CMakeLists.txt:143 (add_subdirectory):
  The source directory

    /home/sxhlvye/open_model_zoo-master/demos/thirdparty/gflags

  does not contain a CMakeLists.txt file.


-- Configuring incomplete, errors occurred!
See also "/home/sxhlvye/omz_demos_build/CMakeFiles/CMakeOutput.log".
See also "/home/sxhlvye/omz_demos_build/CMakeFiles/CMakeError.log".
Error on or near line 105; exiting with status 1

只需要cd到/home/sxhlvye/open_model_zoo-master/demos(结合自己的路径),执行如下命令即可:

./build_demos.sh

OpenVINO示例介绍_第36张图片

OpenVINO示例介绍_第37张图片

完毕后在如下目录下就能看到编译获得的例子可执行文件

OpenVINO示例介绍_第38张图片

这里将python环境下测试所用的图片、模型、标签文件也都拷贝过来,并在终端运行如下命令,便可以运行起c++版本的分类例子,参考页面

open_model_zoo/demos/classification_benchmark_demo/cpp at master · openvinotoolkit/open_model_zoo · GitHub

./classification_benchmark_demo -m resnet-50-tf.xml -i banana.jpg -labels imagenet_2012.txt 

结果如下:

到此c++下例子也运行结束。

4.再跑跑别的例子

这里跑下c++版的object_detection_demmo, 使用yolo-v3-tf模型,标签文件使用coco_80cl.txt(上面第2点提到了标签文件去哪里找)。

OpenVINO示例介绍_第39张图片

OpenVINO示例介绍_第40张图片

 准备完毕后,执行如下命令行语句

./object_detection_demo -d GPU -i dog.jpg -m yolo-v3-tf.xml -labels coco_80cl.txt -at yolo -o output.jpg

检测效果如下:真是杠杠的!

OpenVINO示例介绍_第41张图片

别的不再演示了,自行发挥吧。

你可能感兴趣的:(openvino,sample,demo,model_zoo)