前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenVINO 2020R01 SDK的改动与应用开发演示

OpenVINO 2020R01 SDK的改动与应用开发演示

作者头像
OpenCV学堂
发布2020-03-25 23:17:23
1.4K0
发布2020-03-25 23:17:23
举报
文章被收录于专栏:贾志刚-OpenCV学堂

OpenVINO 2020R01版本

之前写了一篇OpenVINO2020R01版本中如何使用OpenCV深度神经网络模型实现模型推理加速,详细交代了相关配置与程序演示内容。

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

但是还缺少OpenVINO SDK开发与应用程序集成相关的代码演示部分,所以这篇文章就是关于OpenVINO SDK应用开发代码演示相关步骤与说明,代码主要是跟我之前的OpenVINO2019R03的测试程序差不多,在此基础上稍有改动。

开发环境配置

要使用OpenVINO的推理引擎的相关SDK开发,首先就要完成相关配置,这里先说一下我的开发环境:

  • VS2015
  • Windows 10 64位
  • OpenCV4.2
  • OpenVINO2020R01

在VS2015中配置OpenVINO开发支持,很简单的!(以我安装好的路径为例)

1. 配置包含目录,指向include目录

代码语言:javascript
复制
C:\Intel\openvino_2020.1.033\deployment_tools\inference_engine\include

2. 配置库目录,指向lib目录

代码语言:javascript
复制
C:\Intel\openvino_2020.1.033\deployment_tools\inference_engine\lib\intel64\Release

3. 配置链接器

代码语言:javascript
复制
inference_engine.lib

4. 配置环境变量,指向bin目录

代码语言:javascript
复制
C:\Intel\openvino_2020.1.033\deployment_tools\inference_engine\bin\intel64\Release

此外环境变量还需要添加

代码语言:javascript
复制
C:\Intel\openvino_2020.1.033\deployment_tools\ngraph\libC:\Intel\openvino_2020.1.033\deployment_tools\inference_engine\external\tbb\bin

配置好之后,记得重启一下VS2015/VS2017/VS2019即可。

SDK开发程序演示

首先可以调用InferenceEngine::Core 来实现设备支持查询,代码如下:

代码语言:javascript
复制
 Core ie;
 vector<string> availableDevices = ie.GetAvailableDevices();
 for (int i = 0; i < availableDevices.size(); i++) {
          printf("supported device name : %s \n", availableDevices[i].c_str());
 }

本机查询结果如下:

基于face-detection-retail-0004人脸检测模型,实现图像人脸检测演示程序,首先需要加载IR模型与配置信息(xml与bin文件),代码如下

代码语言:javascript
复制
//  加载检测模型
CNNNetReader network_reader;
network_reader.ReadNetwork(model_xml);
network_reader.ReadWeights(model_bin);

设置网络的输入与输出

代码语言:javascript
复制
// 请求网络输入与输出信息
auto network = network_reader.getNetwork();
InferenceEngine::InputsDataMap input_info(network.getInputsInfo());
InferenceEngine::OutputsDataMap output_info(network.getOutputsInfo());
// 设置输入格式
for (auto &item : input_info) {
      auto input_data = item.second;
      input_data->setPrecision(Precision::U8);
      input_data->setLayout(Layout::NCHW);
      input_data->getPreProcess().setResizeAlgorithm(RESIZE_BILINEAR);
      input_data->getPreProcess().setColorFormat(ColorFormat::RGB);
}
printf("get it \n");


// 设置输出格式
for (auto &item : output_info) {
      auto output_data = item.second;
      output_data->setPrecision(Precision::FP32);
}

创建可执行网络,在2020之前的版本中,创建可执行网络CPU执行的时候使用MKLDNNPlugin.dll,但是很多网络模型CPU扩展支持,所以会这样去加载

代码语言:javascript
复制
// 创建可执行网络对象
ie.AddExtension(std::make_shared<Extensions::Cpu::CpuExtensions>(), "CPU");
auto executable_network = ie.LoadNetwork(network, "CPU");

2020R01版本安装好之后的sample代码中是这样:

代码语言:javascript
复制
IExtensionPtr extension_ptr = make_so_pointer<IExtension>(FLAGS_l);
ie.AddExtension(extension_ptr, "CPU");

我是从sample代码(Sample代码中还有CPU_EXTENSION,这个深深误导了我)做参考写这个演示程序的,后来我发现我死活也找不到编译好的CPU_EXTENSION相关文件,搜索了整个sample代码,还是没有!于是我在官方的Release Notes里面找到了这样一段话

代码语言:javascript
复制
https://software.intel.com/en-us/articles/OpenVINO-RelNote

什么意思啊,意思是2020版本开始,CPU执行代码这样就了可以了

代码语言:javascript
复制
auto executable_network = ie.LoadNetwork(network, "CPU");

跟计算棒执行没什么两样:

代码语言:javascript
复制
auto executable_network = ie.LoadNetwork(network, "MYRIAD");

直接用即可!再也不用为了CPU扩展加载而编译sample了!我感觉sample代码是不是要更新一波了。

下面就是请求推动,填上输入数据,然后执行推理

代码语言:javascript
复制
// 请求推断图
auto infer_request = executable_network.CreateInferRequest();

/** Iterating over all input blobs **/
for (auto & item : input_info) {
    auto input_name = item.first;

    /** Getting input blob **/
    auto input = infer_request.GetBlob(input_name);
    size_t num_channels = input->getTensorDesc().getDims()[1];
    size_t h = input->getTensorDesc().getDims()[2];
    size_t w = input->getTensorDesc().getDims()[3];
    size_t image_size = h*w;
    Mat blob_image;
    resize(src, blob_image, Size(h, w));

    // NCHW
    unsigned char* data = static_cast<unsigned char*>(input->buffer());
    for (size_t row = 0; row < h; row++) {
        for (size_t col = 0; col < w; col++) {
            for (size_t ch = 0; ch < num_channels; ch++) {
                data[image_size*ch + row*w + col] = blob_image.at<Vec3b>(row, col)[ch];
            }
        }
    }
} 

// 执行预测
infer_request.Infer();

对推理输出结果进行解析,得到输出

代码语言:javascript
复制
// 处理输出结果
for (auto &item : output_info) {
    auto output_name = item.first;

    // 获取输出数据
    auto output = infer_request.GetBlob(output_name);
    const float* detection = static_cast<PrecisionTrait<Precision::FP32>::value_type*>(output->buffer());
    const SizeVector outputDims = output->getTensorDesc().getDims();
    const int maxProposalCount = outputDims[2];
    const int objectSize = outputDims[3];

    // 解析输出结果
    for (int curProposal = 0; curProposal < maxProposalCount; curProposal++) {
        float label = detection[curProposal * objectSize + 1];
        float confidence = detection[curProposal * objectSize + 2];
        float xmin = detection[curProposal * objectSize + 3] * image_width;
        float ymin = detection[curProposal * objectSize + 4] * image_height;
        float xmax = detection[curProposal * objectSize + 5] * image_width;
        float ymax = detection[curProposal * objectSize + 6] * image_height;
        if (confidence > 0.5) {
            printf("label id : %d\n", static_cast<int>(label));
            Rect rect;
            rect.x = static_cast<int>(xmin);
            rect.y = static_cast<int>(ymin);
            rect.width = static_cast<int>(xmax - xmin);
            rect.height = static_cast<int>(ymax - ymin);
            putText(src, "OpenVINO-2020R01 face detection demo", Point(20, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2, 8);
            rectangle(src, rect, Scalar(0, 255, 255), 2, 8, 0);
        }
        std::cout << std::endl;
    }
}
imshow("openvino-ssd-face-demo", src);

代码实现之后,就开始编译了,这个时刻VS2015会开始翻车表演,你会得到很多C4996的错误,大致意思是告诉你一些API函数下个版本不能用了,早做打算,这个明明应该是个警告,怎么VS2015 IDE就是不让编译通过啊,没办法,直接强制告诉编译器,别管它,怎么设置,看这里:

怎么搞,就是在禁止特定警告中加上4996,意思是告诉编译器别检查此项了!然后再重新编译,一般都会正常通过了。

但是我有个哥们跟我一样,还是继续翻车了,无法编译通过,他还是有C2240跟C2664两个编译错误,这个其实是因为项目字节编码导致的,检查一下,如果你还是unicode的话改成下面这样就好啦!

这次是真的可以了,直接重新编译,生成,运行结果如下:

以上就是OpenVINO C++版本的SDK在Windows系统下我的调用经过!

总结一下:

1.不需要CPU扩展代码加载了,这个必须赞扬 2.VS2015上配置简单了 3.C4996希望下个版本可以没有了,影响开发体验

OpenVINO下载地址:

代码语言:javascript
复制
https://software.intel.com/en-us/openvino-toolkit/choose-download?innovator=CONT-0030837

云厚者,雨必猛

弓劲者,箭必远

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

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

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

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

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