前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV4.2 + OpenVINO2020安装配置与应用演示

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

作者头像
OpenCV学堂
发布2020-03-24 14:47:58
1.8K0
发布2020-03-24 14:47:58
举报

点击上方蓝字关注我们

微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识

安装与测试

首先需要从官方下载安装文件,下载OpenVINO2020R01版本,然后默认安装,图示如下:

还可以修改安装路径,我安装在C\intel这个自己创建的目录下了。安装好之后,首先运行环境设置脚本,图示如下:

运行自带的车牌测试程序

如果到这边,就说明一切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:\Intel\openvino_2020.1.033\deployment_tools\inference_engine\external\tbb\bin
C:\Intel\openvino_2020.1.033\deployment_tools\ngraph\lib

其它的配置跟之前一样!这里就不再赘述了!少废话!环境变量直接看这里

我这次配置是基于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速度还行!

志合者不以山海为远

道乖者不以咫尺为近

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档