前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >系列 | OpenVINO视觉加速库使用五

系列 | OpenVINO视觉加速库使用五

作者头像
OpenCV学堂
发布2019-04-29 16:16:04
2.1K0
发布2019-04-29 16:16:04
举报

InferRequest调用

OpenVINO中的推断引擎(Inference Engine-IE)在加载网络权重与配置文件,生成一个可执行网络以后,通过下面两个API可以获取InferRequest对象

代码语言:javascript
复制
// 获取对象指针InferRequest::Ptr request = executable_network.CreateInferRequestPtr();// 获取对象InferRequest request = executable_network.CreateInferRequest();

得到的InferRequest对象有两种执行方式

代码语言:javascript
复制
// 同步request.Infer()// 异步request.StartAsync()

在同步模式下推断函数Infer会一直阻塞,直到执行结束;在异步模式下推断调用函数StartAsync会立即返回,通过检查

代码语言:javascript
复制
IInferRequest::WaitMode::RESULT_READY

来实现数据接收与数据解析。对于视频分析、视频中对象检测,OpenVINO官方建议通过异步方式可以实现更快的帧率处理,在请求推断图阶段可以请求两个InferRequest对象,进行异步处理。其处理流程图示如下:

行人检测模型

使用OpenVINO模型库中pedestrian-detection-adas-0002模型实现行人检测。该模型是基于SSD MobileNet V1版本上进行优化生成的,其主要的性能指标如下:

代码语言:javascript
复制
1Average Precision (AP) 88%
2Target pedestrian size 60 x 120 pixels on Full HD image
3Max objects to detect 200
4GFlops 2.836
5MParams 1.165
6Source framework Caffe*

模型要求的输入图像格式:

NxCxHxW = [1x3x384x672]

通道顺序为: BGR

步骤与代码解释

获取推断请求

代码语言:javascript
复制
// 创建可执行网络对象
auto executable_network = plugin.LoadNetwork(network, {});

// 请求推断图
InferRequest::Ptr async_infer_request_next = executable_network.CreateInferRequestPtr();
InferRequest::Ptr async_infer_request_curr = executable_network.CreateInferRequestPtr();

加载视频文件并读取第一帧

代码语言:javascript
复制
// 读取第一帧
Mat curr_frame;  
Mat next_frame;
cap.read(curr_frame);
int width = curr_frame.cols;
int height = curr_frame.rows;

// 设置当前infer request
frameToBlob(curr_frame, async_infer_request_curr, inputName);
bool isLastFrame = false;
bool isFirstFrame = true;

开启异步执行模式推断

代码语言:javascript
复制
// 开启异步模式
if (isFirstFrame) { // run once
    async_infer_request_curr->StartAsync();
    async_infer_request_next->StartAsync();
    isFirstFrame = false;
} else {
    if (!isLastFrame) {
        async_infer_request_next->StartAsync();
    }
}

检查异步状态与解析输出数据

代码语言:javascript
复制
// 检查异步返回
if (OK == async_infer_request_curr->Wait(IInferRequest::WaitMode::RESULT_READY)) {
    const float *detections = async_infer_request_curr->GetBlob(outputName)->buffer().as<PrecisionTrait<Precision::FP32>::value_type*>();
    for (int i = 0; i < maxProposalCount; i++) {
        float image_id = detections[i * objectSize + 0];
        int label = static_cast<int>(detections[i * objectSize + 1]);
        float confidence = detections[i * objectSize + 2];
        float xmin = detections[i * objectSize + 3] * width;
        float ymin = detections[i * objectSize + 4] * height;
        float xmax = detections[i * objectSize + 5] * width;
        float ymax = detections[i * objectSize + 6] * height;
        if (confidence > 0.5) {
            rectangle(curr_frame, Point2f(xmin, ymin), Point2f(xmax, ymax), Scalar(0, 255, 255), 1);
        }
    }
}

异步请求交换,准备执行下一帧

代码语言:javascript
复制
// 异步交换
next_frame.copyTo(curr_frame);
async_infer_request_curr.swap(async_infer_request_next);

运行结果如下:

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档