OpenCV4.2 + OpenVINO2020安装配置与应用演示

2020-03-24 14:47:58 浏览数 (1)

点击上方蓝字关注我们

微信公众号: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速度还行!

志合者不以山海为远

道乖者不以咫尺为近

0 人点赞