前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >系列 | OpenVINO视觉加速库使用七

系列 | OpenVINO视觉加速库使用七

作者头像
OpenCV学堂
发布2019-05-13 19:25:43
3.8K1
发布2019-05-13 19:25:43
举报

OpenVINO

还用介绍吗,直接看下面的系列文章了解OpenVINO是干什么用的,还有如何与OpenCV一起使用,实现对DNN模块的加速运行,OpenVINO SDK开发使用等相关技术。

环境配置

当前OpenVINO的最新发布是2019R01版本,可以直接下载安装即可,但是需要注意的是OpenVINO在Windows10系统需要以下依赖支持(需要预先安装好):

代码语言:javascript
复制
- CMake3.7以上版本
- VS2015/VS2017
- Python 3.6.5

需要特别注意的是OpenVINO还 不支持 Python 3.7!

扩展支持

VS2015版本请运行

代码语言:javascript
复制
%CV_SDK_DIR%\deployment_tools\inference_engine\samples\create_msvc2015_solution.bat

VS2017版本请运行

代码语言:javascript
复制
%CV_SDK_DIR%\deployment_tools\inference_engine\samples\create_msvc2017_solution.bat

成功运行之后,在Document目录下找到Samples.sln,双击打开工程文件,选择classification_sample工程,右键生成之后,切换到【Release】模式,再次点击生成,就会成功生成CPU扩展层解析支持。

支持OpenVINO DLL

执行成功执行之后,请把

代码语言:javascript
复制
%CV_SDK_DIR%\deployment_tools\inference_engine\bin\intel64\Release

配置到Window10系统环境变量PATH中去。

Python OpenVINO

把openvion python支持文件夹从

代码语言:javascript
复制
%CV_SDK_DIR%\python\python3.6

复制到Python默认安装路径下site-packages中(本人默认Python3.6.5路径)

代码语言:javascript
复制
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Lib\site-packages

OpenVINO-Python使用

首先需要导入openvino支持,导入代码如下:

代码语言:javascript
复制
from openvino.inference_engine import IENetwork, IEPlugin

加载CPU支持的IE插件与扩展

代码语言:javascript
复制
# 加载MKLDNN - CPU Target
log.basicConfig(format="[ %(levelname)s ] %(message)s", level=log.INFO, stream=sys.stdout)
plugin = IEPlugin(device="CPU", plugin_dirs=plugin_dir)
plugin.add_cpu_extension(cpu_extension)

如果出现无法加载DLL错误,请检查环境配置!

加载IR

代码语言:javascript
复制
# 加载IR
log.info("Reading IR...")
net = IENetwork(model=model_xml, weights=model_bin)

创建可执行网络

代码语言:javascript
复制
# 获取输入输出层
input_blob = next(iter(net.inputs))
out_blob = next(iter(net.outputs))
log.info("Loading IR to the plugin...")

# 创建可执行网络
exec_net = plugin.load(network=net, num_requests=2)
# Read and pre-process input image
n, c, h, w = net.inputs[input_blob].shape
del net

开启异步或者同步执行

代码语言:javascript
复制
# 开启同步或者异步执行模式
inf_start = time.time()
if is_async_mode:
    in_frame = cv2.resize(next_frame, (w, h))
    in_frame = in_frame.transpose((2, 0, 1))  # Change data layout from HWC to CHW
    in_frame = in_frame.reshape((n, c, h, w))
    exec_net.start_async(request_id=next_request_id, inputs={input_blob: in_frame})
else:
    in_frame = cv2.resize(frame, (w, h))
    in_frame = in_frame.transpose((2, 0, 1))  # Change data layout from HWC to CHW
    in_frame = in_frame.reshape((n, c, h, w))
    exec_net.start_async(request_id=cur_request_id, inputs={input_blob: in_frame})

解析输出

代码语言:javascript
复制
# 解析DetectionOut
res = exec_net.requests[cur_request_id].outputs[out_blob]
for obj in res[0][0]:
    # Draw only objects when probability more than specified threshold
    if obj[2] > 0.5:
        xmin = int(obj[3] * initial_w)
        ymin = int(obj[4] * initial_h)
        xmax = int(obj[5] * initial_w)
        ymax = int(obj[6] * initial_h)
        class_id = int(obj[1])

        # Draw box and label\class_id
        cv2.rectangle(frame, (xmin, ymin), (xmax, ymax), (0, 0, 255), 2)
        cv2.putText(frame, "face" + ' ' + str(round(obj[2] * 100, 1)) + ' %', (xmin, ymin - 7),
                    cv2.FONT_HERSHEY_COMPLEX, 0.6, (255, 0, 0), 1)

# 显示绘制文本
# inf_time_message = "Inference time: N\A for async mode" if is_async_mode else \
inf_time_message = "Inference time: {:.3f} ms, FPS:{:.3f}".format(det_time * 1000, 1000 / (det_time * 1000))
render_time_message = "OpenCV rendering time: {:.3f} ms".format(render_time * 1000)
async_mode_message = "Async mode is on. Processing request {}".format(cur_request_id) if is_async_mode else \
    "Async mode is off. Processing request {}".format(cur_request_id)

cv2.putText(frame, inf_time_message, (15, 15), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 0), 1)
cv2.putText(frame, render_time_message, (15, 30), cv2.FONT_HERSHEY_COMPLEX, 0.5, (10, 10, 200), 1)
cv2.putText(frame, async_mode_message, (10, int(initial_h - 20)), cv2.FONT_HERSHEY_COMPLEX, 0.5,
            (10, 10, 200), 1)

显示

代码语言:javascript
复制
cv2.imshow("OpenVINO-Python-SSD-Demo@57558865", frame)

异步交换

代码语言:javascript
复制
# ready for next frame
if is_async_mode:
    cur_request_id, next_request_id = next_request_id, cur_request_id
    frame = next_frame

运行如下:

妥妥的FPS在130+左右,对比VS2015+OpenVINO我深刻感受到Python+OpenVINO才是一个更好的选择!另外最后要说以下,Python+OpenVINO的开发环境配置我也是折腾了好久,还是坚持把这篇文章写出来了,希望提供给大家在使用OpenVINO时候多一个选择!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档