openvino toolkit 是英特尔推出的一款深度学习推断引擎,支持多种网络框架。官方声称它支持超过100种网络训练导出的模型,展示了其广泛的兼容性。以下是官方对该工具包的主要特点的总结:
在英特尔平台上,OpenVINO ToolKit 能够将计算机视觉相关深度学习性能提升至19倍以上,有效解除基于CNN的网络在边缘设备上的性能瓶颈。它通过加速与优化OpenCV和OpenVX视觉库的传统API,并基于通用API接口,支持在CPU、GPU、FPGA等设备上运行。工具包包括两个主要部分:
模型优化器和推断引擎
支持在Windows和Linux系统上使用,适用于Python和C++语言,这意味着在Ubuntu上也可以放心使用。OpenVINO ToolKit支持从各种常见的深度学习框架导出的模型,并且推断引擎兼容多种硬件设备,包括:
CPU、GPU、FPGA、VPU
工作流程如下:
安装OpenVINO ToolKit首先需要注册并下载,建议下载Web Installer。Windows平台下的预安装要求如下:
安装完成后,执行以下步骤:
完成车辆与车牌识别,模型支持中文车牌识别,显示如下:
表示安装成功!
使用DLIE实现加速
配置OpenCV DLIE支持版本。已安装的OpenVINO包含了编译好的支持DLIE(深度学习推断引擎)的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如下:
代码语言:javascript 代码运行次数:0
运行 复制 “`javascript cv::dnn::Net::setPreferableBackend(int backendId) “` backendId 表示后台计算id: – DNN_BACKEND_INFERENCE_ENGINE表示使用英特尔的推断库 – DNN_BACKEND_OPENCV通常使用OpenCV DNN作为后台计算
读取网络后使用OpenCV作为计算后台:
代码语言:javascript 代码运行次数:0
运行 复制 “`javascript Net net = readNetFromCaffe(protxt, bin_model); net.setPreferableBackend(DNN_BACKEND_OPENCV); net.setPreferableTarget(DNN_TARGET_CPU); “`
读取网络后使用DLIE作为计算后台:
代码语言:javascript 代码运行次数:0
运行 复制 “`javascript 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默认使用DNN_BACKEND_OPENCV作为后台。使用GoogLeNet Caffe模型对同一张图像进行分类推断:
对比时间开销:
可以看出,使用DLIE作为后台进行推断后,网络在OpenCV DNN中的运行速度提升了约9倍。相关代码如下:
代码语言:javascript 代码运行次数:0
运行 复制 “`javascript // 加载网络 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 times; double time = net.getPerfProfile(times); float ms = (time * 1000) / getTickFrequency(); printf(“current inference time : %.2f ms \n”, ms); “`
基于残差网络的实时人脸检测,使用OpenCV DNN运行:
惊人的是,i7的CPU可以达到约36帧的FPS,画面效果非常出色,足以证明OpenCV DNN的实时性能。如此专业的文章,希望能得到赞赏!
代码语言:javascript 代码运行次数:0
运行 复制 “`javascript 博观而约取厚积而薄发 “`