前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >网络模型量化与推理加速框架OpenVINO最新版本SDK演示

网络模型量化与推理加速框架OpenVINO最新版本SDK演示

作者头像
OpenCV学堂
发布2019-10-30 11:55:39
1.4K0
发布2019-10-30 11:55:39
举报

神经网络模型量化与推理加速神器

论文

01

英特尔从2018年发布OpenVINO 视觉框架之后,很多公司与开发者尝试之后,反馈良好。至今英特尔几乎每个季度都会更新一个小版本发布,最新发布的OpenVINO 2019R03版本,跟2018年的版本有了全方位的性能提升、SDK开发接口更加的易用易学,对开发者更加的友好。去年我记得我使用OpenVINO SDK开发应用程序的时候,经常被代码中的各种路径常量搞得晕头转向,吐槽这种加载IE的方式很让人无语,果然,今年都改好啦。而且更重要的是优化整个开发流程的SDK使用,使得整个工作流看上去更加合理,符合程序员的思维习惯。同时对各种硬件支持,更加的灵活方便,加强了可配置性。另外还有个值得惊喜的地方是支持INT8的模型量化啦,这个真的好!

查询支持硬件设备

02

SDK新增了支持设备的查询,这个功能很实用!代码如下:

代码语言:javascript
复制
// 创建IE插件, 查询支持硬件设备
 InferenceEngine::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());
 }

运行时候结果如下:

我有个NCS2的计算棒,所以它也会找到。

推理引擎SDK开发演示

03

使用自带的人脸检测模型,实现人脸检测程序,SDK开发流程如下:

加载插件

代码语言:javascript
复制
// 创建IE插件, 查询支持硬件设备
Core ie;

加载模型文件

代码语言: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);
}

创建可执行网络

- CPU支持

代码语言:javascript
复制
ie.AddExtension(std::make_shared<Extensions::Cpu::CpuExtensions>(), "CPU");
auto executable_network = ie.LoadNetwork(network, "CPU");

- GPU运行

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

- NCS2计算棒运行

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

设置输入数据

代码语言: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];
            }
        }
    }
}

执行推理

代码语言:javascript
复制
// 执行预测
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-2019R03 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);

运行结果如下

模型下载

04

安装好OpenVINO之后在

代码语言:javascript
复制
deployment_tools\tools\model_downloader

目录下有个downloader.py文件,在命令行中运行

代码语言:javascript
复制
python downloader.py --name face-detection-retail-0004

即可下载模型,之前在我的视频课程中有很多人问我为什么不能下载,无法创建目录等问题,我都晕死了!大多数都是因为在运行命令行的时候没有以管理员权限运行,所以无法成功!

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

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

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

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

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