点击上方蓝字关注我们
微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识
安装与测试
首先需要从官方下载安装文件,下载OpenVINO2020R01版本,然后默认安装,图示如下:
还可以修改安装路径,我安装在Cintel这个自己创建的目录下了。安装好之后,首先运行环境设置脚本,图示如下:
运行自带的车牌测试程序
如果到这边,就说明一切OK,安装已经好拉,这里其实有个前提,就是要预先安装好下面几个软件:
- CMake3.14.x
- VS2015
- Python3.6.5
安装好之后,可以去下载官方提供的各种预训练模型,以人脸检测为例,我下载了驾驶常见下的人脸检测模型,运行脚本如下:
代码语言:javascript复制python downloader.py --name face-detection-adas-0001
其中face-detection-adas-0001 表示下载这个人脸检测模型,千万不要不带参数运行,不带参数默认是下载全部,一个是没必要,另外一个时间太长,不如需要什么下载什么好!
OpenCV支持配置
也不知道从那个版本开始,OpenVINO自带的OpenCV编译不生成OpenCV的 world的lib跟dll文件了。导致我前期教程里面的配置跟现在的版本有点不匹配,经常有人问题,这里我就重新说一下OpenCV支持OpenVINO的配置。
首先还是配置包含目录跟库目录跟OpenCV其它版本配置没有区别,关键是链接器的配置,以前只需要配置opencv_world4.x.lib一个即可。现在没有opencv world,所以要把下面的全部添加进去才可以
代码语言:javascript复制opencv_calib3d420.lib
opencv_core420.lib
opencv_dnn420.lib
opencv_features2d420.lib
opencv_flann420.lib
opencv_gapi420.lib
opencv_highgui420.lib
opencv_imgcodecs420.lib
opencv_imgproc420.lib
opencv_ml420.lib
opencv_objdetect420.lib
opencv_photo420.lib
opencv_stitching420.lib
opencv_video420.lib
opencv_videoio420.lib
另外一个改动是环境变量里面,多了两个DLL依赖
代码语言:javascript复制tbb.dll
ngraph.dll
我本机的指向路径为:
代码语言:javascript复制C:Intelopenvino_2020.1.033deployment_toolsinference_engineexternaltbbbin
C:Intelopenvino_2020.1.033deployment_toolsngraphlib
其它的配置跟之前一样!这里就不再赘述了!少废话!环境变量直接看这里
我这次配置是基于release版本的,原因是我之前有个视频配置教程是debug模式,很多人跟我release下不工作,我晕倒!所以这次直接配置了VS的release模型下。
应用代码演示
OpenCV4.2 OpenVINO2020 的人脸检测代码实现
模型来自intel官方提供的,文章提到的
- face-detection-adas-0001
基于OpenCV4.2深度神经网络,使用OpenVINO的Infernece Engine(简称IE)来实现推理加速,设置使用IE作为计算后台分别使用CPU与NCS2的代码设置为:
代码语言:javascript复制net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
net.setPreferableTarget(DNN_TARGET_MYRIAD)
此外OpenCV4.2还有一个新的关于IE的相关API函数
代码语言:javascript复制cv::String cv::dnn::setInferenceEngineBackendType(
const cv::String & newBackendType
)
newBackendType表示支持的计算后天类型。官方文档上给出的支持的类型有
代码语言:javascript复制CV_DNN_BACKEND_INFERENCE_ENGINE_NGRAPH "NGRAPH"
CV_DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_API "NN_BUILDER"
CV_DNN_INFERENCE_ENGINE_VPU_TYPE_MYRIAD_2 "Myriad2"
CV_DNN_INFERENCE_ENGINE_VPU_TYPE_MYRIAD_X "MyriadX"
但是经过我测试,发现ngraph与nn_builder的确是可以用,剩下的我即时插上NCS2,都无法正常工作!还有待于进一步的探索跟发现!但是NCS2调用,可以通过下面两行代码设置进行支持:
代码语言:javascript复制net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
net.setPreferableTarget(DNN_TARGET_MYRIAD);
亲测有效!
完整的演示代码如下:
代码语言:javascript复制#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
using namespace cv;
using namespace cv::dnn;
using namespace std;
int main(int argc, char** argv) {
string xml = "D:/projects/models/face-detection-adas-0001/FP32/face-detection-adas-0001.xml";
string bin = "D:/projects/models/face-detection-adas-0001/FP32/face-detection-adas-0001.bin";
namedWindow("openvino2020 opencv4.2-demo", WINDOW_AUTOSIZE);
// 加载视频流或者文件
VideoCapture cap("D:/images/video/Boogie_Up.mp4");
Mat frame;
// read network
// setInferenceEngineBackendType(CV_DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_API);
Net net = readNetFromModelOptimizer(xml, bin);
net.setPreferableBackend(DNN_BACKEND_INFERENCE_ENGINE);
net.setPreferableTarget(DNN_TARGET_MYRIAD);
ostringstream ss;
while (true) {
int64 start = getTickCount();
bool ret = cap.read(frame);
if (!ret) {
break;
}
// 1x3x384x672 BGR
Mat blob = blobFromImage(frame, 1.0, Size(672, 384), Scalar(), false, false);
net.setInput(blob);
// 执行推理
Mat detection = net.forward();
// 解析结果
Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());
float confidence_threshold = 0.5;
for (int i = 0; i < detectionMat.rows; i ) {
float confidence = detectionMat.at<float>(i, 2);
if (confidence > confidence_threshold) {
size_t objIndex = (size_t)(detectionMat.at<float>(i, 1));
float tl_x = detectionMat.at<float>(i, 3) * frame.cols;
float tl_y = detectionMat.at<float>(i, 4) * frame.rows;
float br_x = detectionMat.at<float>(i, 5) * frame.cols;
float br_y = detectionMat.at<float>(i, 6) * frame.rows;
Rect object_box((int)tl_x, (int)tl_y, (int)(br_x - tl_x), (int)(br_y - tl_y));
rectangle(frame, object_box, Scalar(0, 0, 255), 2, 8, 0);
putText(frame, format(" confidence %.2f, %s", confidence, "face"), Point(tl_x - 10, tl_y - 5), FONT_HERSHEY_SIMPLEX, 0.7, Scalar(255, 0, 0), 2, 8);
}
}
float fps = getTickFrequency() / (getTickCount() - start);
ss.str("");
ss << "FPS: " << fps;
putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8);
imshow("openvino2020 opencv4.2-demo", frame);
char c = waitKey(1);
if (c == 27) {
break;
}
}
waitKey(0);
destroyAllWindows();
}
当计算设备为CPU的时候
代码语言:javascript复制CV_DNN_BACKEND_INFERENCE_ENGINE_NGRAPH "NGRAPH"
CV_DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_API "NN_BUILDER"
运行结果如下:
当计算后台设置为NCS2的时候:
可见NCS2速度还行!
志合者不以山海为远
道乖者不以咫尺为近