前言
最近看到了一个深度学习库OpenVINO
,专门用于Intel
硬件上部署深度学习模型,其内置了非常非常多使用的预训练模型,比如道路分割、人脸提取、3D姿态估计等等。但是配置和调用有点小恶心,这里以道路分割为例,展示如何配置OpenVINO
的环境,以及模型下载和调用
国际惯例,参考博客:
OpenVINO
提供的所有预训练模型列表
OpenVINO
的物体分割文档
OpenVino (二) Win10 python配置
配置
需要注册一个账号下载OpenVINO
,按照官网给出的win10
安装方法 一直各种下一步。因为我的python
是用Anaconda
安装的3.7.6
版本,不知道为什么在最后一步的时候检测不到python
,这里就是坑的开始。
各种下一步顺利,运行测试案例能成功,但是直接在jupyter
中运行
from openvino.inference_engine import IECore,IENetwork
会报错:
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-3-cebd727a66b4> in <module>
----> 1 from openvino.inference_engine import IECore,IENetworkC:\ProgramData\Anaconda3\lib\site-packages\openvino\inference_engine\__init__.py in <module>
----> 1 from .ie_api import *2 __all__ = ['IENetwork', "TensorDesc", "IECore", "Blob", "get_version"]3 __version__ = get_version()4 ImportError: DLL load failed: 找不到指定的模块。
但是如果你在终端,先执行官方文档说的:
cd C:\Program Files (x86)\IntelSWTools\openvino\bin\
setupvars.bat
再在这个终端启动python
执行import
就可以
python
from openvino.inference_engine import IECore,IENetwork
每次都要这样操作一遍,这明显就是环境变量只对当前终端生效了,整个电脑的环境并未改变,所以有两种方案解决:一是找到所有缺失的dll添加到PATH
中,二是利用python
在执行脚本之前加入环境变量,所幸第二个方案在github中有人提到过,issue
在此,所以只需要在脚本最开头,加入
import os
os.environ['Path']+= 'C:\\Program Files (x86)\\IntelSWTools\\openvino_2020.4.287\\deployment_tools\\ngraph\\lib;' \'C:\\Program Files (x86)\\IntelSWTools\\openvino_2020.4.287\\deployment_tools\\inference_engine\\external\\tbb\\bin;'\'C:\\Program Files (x86)\\IntelSWTools\\openvino_2020.4.287\\deployment_tools\\inference_engine\\bin\\intel64\\Debug;'\'C:\\Program Files (x86)\\IntelSWTools\\openvino_2020.4.287\\deployment_tools\\inference_engine\\bin\\intel64\\Release;'\'C:\\Program Files (x86)\\IntelSWTools\\openvino_2020.4.287\\deployment_tools\\inference_engine\\external\\hddl\\bin;' \'C:\\Program Files (x86)\\IntelSWTools\\openvino_2020.4.287\\deployment_tools\\model_optimizer;'
然后
from openvino.inference_engine import IECore,IENetwork
就成功啦。
道路分割案例执行
模型获取
首先从官方文档上:
net = IENetwork(model=path_to_xml_file, weights=path_to_bin_file)
或者官方提供的案例,在安装路径
\IntelSWTools\openvino\deployment_tools\open_model_zoo\demos\python_demos\3d_segmentation_demo
中可以看到,OpenVINO
的模型推断需要一个xml
和bin
,分别定义模型和权重,获取方法也在文档中写出来了:
You can download the pre-trained models using the OpenVINO Model Downloader or from https://download.01.org/opencv/.
这个Model Downloader
的位置在安装路径
\IntelSWTools\openvino_2020.4.287\deployment_tools\tools\model_downloader
下可以找到,调用方法是
python downloader.py --name road-segmentation-adas-0001
后面这个模型名字可以从这个路径找到
\IntelSWTools\openvino_2020.4.287\deployment_tools\open_model_zoo\intel_models
其实就是OpenVINO
官方modelzoo
提供的预训练模型名字,直接把名字copy
过来就会自动下载,下载目录就是downloader.py
的所在目录。因为案例是道路分割的,所以取下载road-segmentation-adas-0001
模型
模型调用
这一步就简单了,直接仿照官方例子去执行。
\IntelSWTools\openvino\deployment_tools\open_model_zoo\demos\python_demos\3d_segmentation_demo
这里就不写官方那么复杂了,就写一下必要步骤,首先是初始化模型:
model_xml = './OpenVINO_model/road-segmentation-adas-0001.xml'
model_bin = './OpenVINO_model/road-segmentation-adas-0001.bin'ie=IECore()
net = ie.read_network(model=model_xml,weights=model_bin)
exec_net = ie.load_network(network=net, device_name='CPU')
然后使用opencv
读取图片做推断,但是要注意先获取一下输入输出
input_blob = next(iter(net.input_info))
out_blob = next(iter(net.outputs))
n,c,h,w = net.input_info[input_blob].input_data.shape
然后把图片resize
一下,丢到网络推断
image = cv2.imread('./OpenVINO_model/img1.jpg')
image = cv2.resize(image,(w,h))
image = image.transpose((2,0,1)) # HWC to CHW
image = image[np.newaxis,...]
image.shape
#(1, 3, 512, 896)
res = exec_net.infer(inputs={input_blob:image})
最后获取输出以及可视化
res = res[out_blob]
从官方文档可以发现输出的维度分别代表什么意思
The output is a blob with the shape [B, C=4, H=512, W=896]. It can be treated as a four-channel feature map, where each channel is a probability of one of the classes: BG, road, curb, mark.
那么获取道路就是维度1。
import matplotlib.pyplot as plt
plt.imshow(image[0].transpose(1,2,0)/255.0)
plt.imshow(res[0,1,...], 'jet', interpolation='none', alpha=0.7)
plt.figure(figsize=(16,16))
plt.subplot(121)
plt.imshow(image[0].transpose(1,2,0)/255.0)
plt.axis('off')
plt.subplot(122)
plt.imshow(image[0].transpose(1,2,0)/255.0)
plt.imshow(res[0,1,...], 'jet', interpolation='none', alpha=0.7)
plt.axis('off')
后记
这里核心点就是:环境配置、模型下载、模型载入推断
官方有很多模型,建议多看文档就能玩很多有意思的demo。
完整的python
脚本实现放在微信公众号的简介中描述的github中,有兴趣可以去找找,同时文章也同步到微信公众号中,有疑问或者兴趣欢迎公众号私信。