查看原文
其他

使用OpenVINO ToolKit 实时推断

gloomyfish OpenCV学堂 2020-02-04


微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
觉得文章有用,请戳底部【好看】支持

OpenVINO ToolKit介绍

OpenVINO ToolKit是英特尔发布的一套深度学习推断引擎,支持各种网络框架,官方给出的说明是支持100多种网络训练导出的模型(100多种网络模型,无知限制了我的想象力)官方对这个工具包的主要特点总结如下:

  • 在Intel平台上提升计算机视觉相关深度学习性能达19倍以上

  • 解除CNN-based的网络在边缘设备的性能瓶颈

  • 对OpenCV,OpenXV*视觉库的传统API实现加速与优化

  • 基于通用API接口在CPU、GPU、FPGA等设备上运行加上

工具包(ToolKit)主要包括两个部分:

  • 模型优化器

  • 推断引擎

支持在Windows与Linux系统,Python/C++语言,也就是说ubuntu上可以放心使用!支持各种常见的深度学习框架的导出模型、推断引擎支持各种硬件设备包括

  • CPU

  • GPU

  • FPGA

  • VPU

调用工作流程如下:

安装OpenVINO ToolKit

首先需要注册与下载,下载地址如下(建议下载Web Installer):

https://software.intel.com/en-us/openvino-toolkit/choose-download

Windows平台下的预安装要求如下:

很不幸的是我已经全部满足,所以下载好了就直接安装吧!

安装好以后执行:

完成车辆与车牌识别,注意模型支持中文车牌识别, 显示如下:

表示安装成功!

使用DLIE实现加速

配置OpenCV DLIE支持版本
安装好的OpenVINO已经包含编译好的支持DLIE(deep learning Inference Engine)OpenCV开发SDK, 只需要要稍微配置一下即可支持,最新版本是OpenCV4.0.1,在我的机器上改动主要有两个地方:

  1. 因为我原来已经安装了OpenCV4.0,所以我把所有的VS2015配置都指向了OpenVINO中的OpenCV路径。

  2. 把默认路径(假设你安装OpenVINO时候没有修改)
    C:\Intel\computer_vision_sdk_2018.5.456\deployment_tools\inference_engine\bin\intel64\Debug,添加到环境变量中去

OpenCV DNN模块支持的相关API如下

cv::dnn::Net::setPreferableBackend(
    int backendId
)
backendId 表示后台计算id,
- DNN_BACKEND_INFERENCE_ENGINE表示使用intel的预测推断库
- DNN_BACKEND_OPENCV 一般情况都是使用opencv dnn作为后台计算

读取网络之后使用OpenCV作为计算后台

Net net = readNetFromCaffe(protxt, bin_model);
net.setPreferableBackend(DNN_BACKEND_OPENCV);
net.setPreferableTarget(DNN_TARGET_CPU);

读取网络之后使用DLIE作为计算后台

Net net = readNetFromCaffe(protxt, bin_model);
net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
net.setPreferableTarget(DNN_TARGET_CPU);

其中DNN_BACKEND_INFERENCE_ENGINE表示使用DLIE加速推断,DNN_TARGET_CPU表示在CPU设备上使用。如果没有安装DLIE,OpenCV默认的backend是DNN_BACKEND_OPENCV。
基于GooglNet Caffe模型对同一张图像进行分类预测推断

对比一下时间开销:

可以看出来,使用了DLIE作为backend进行推断之后,网络在OpenCV DNN中运行速度提升9倍左右。相关代码:

// 加载网络
Net net = readNetFromCaffe(protxt, bin_model);
net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE); // DLIE加速
// net.setPreferableBackend(DNN_BACKEND_OPENCV); 不使用DLIE加速
net.setPreferableTarget(DNN_TARGET_CPU);

if (net.empty()) {
    printf("read caffe model data failure...\n");
    return -1;
}
Mat inputBlob = blobFromImage(src, 1.0, Size(w, h), Scalar(104117123), falsefalse);

// 执行图像分类
Mat prob;
net.setInput(inputBlob);
prob = net.forward();
vector<double> times;
double time = net.getPerfProfile(times);
float ms = (time * 1000) / getTickFrequency();
printf("current inference time : %.2f ms \n", ms);

基于残差网络的实时人脸检测,OpenCV DNN运行

什么!i7的CPU FPS=36帧左右,画面太美好,谁还敢说OpenCV DNN不够实时。这么硬核的文章,求个好看不为过吧!

博观而约取
厚积而薄发

推荐阅读

2018年原创技术文章汇总
OpenCV调用Faster-RCNN对象检测网络
使用DCGAN实现图像生成
Selective Search算法与演示
tensorflow模型导出与OpenCV DNN中使用

插播一条信息
欢迎扫码加入【OpenCV研习社】

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存