使用OpenVINO ToolKit 实时推断
微信公众号: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,在我的机器上改动主要有两个地方:
因为我原来已经安装了OpenCV4.0,所以我把所有的VS2015配置都指向了OpenVINO中的OpenCV路径。
把默认路径(假设你安装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(104, 117, 123), false, false);
// 执行图像分类
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研习社】