推理引擎(ie)应用开发流程
与相关函数介绍
通过openvino的推理引擎跟相关应用集成相关深度学习模型的应用基本流程如下:
图-1
从图-1可以看到只需要七步就可以完成应用集成,实现深度学习模型的推理预测,各步骤中相关的api函数支持与作用解释如下:
step 1:
inferenceengine::core // ie对象
step 2:
core.readnetwork(xml/onnx)输入的ir或者onnx格式文件,返回cnnnetwork对象
step 3:
inferenceengine::inputsdatamap, inferenceengine::inputinfo, // 模型输入信息
inferenceengine::outputsdatamap // 模型输出信息
使用上述两个相关输入与输出对象就可以设置输入的数据类型与精度,获取输入与输出层的名称。
step 4:
executablenetwork loadnetwork (
const cnnnetwork &network,
const std::string &devicename,
const std::map &config={}
)
通过core的loadnetwork方法生成可执行的网络,如果你有多个设备,就可以创建多个可执行的网络。其参数解释如下:
network 参数表示step2加载得到cnnnetwork对象实例
devicename表示模型计算所依赖的硬件资源,可以为cpu、gpu、 fpga、 fpga、myriad
config默认为空
inferrequest inferenceengine::createinferrequest()
表示从可执行网络创建推理请求。
step 5:
根据输入层的名称获取输入buffer数据缓冲区,然后把输入图像数据填到缓冲区,实现输入设置。其中根据输入层名称获取输入缓冲区的函数为如下:
blob::ptr getblob (
const std::string &name // 输入层名称
)
注意:返回包含输入层维度信息,支持多个输入层数据设置!
step 6:
推理预测,直接调用推理请求的inferrequest.infer()方法即可,该方法无参数。
step 7:
调用inferrequest的getblob()方法,使用参数为输出层名称,就会得到网络的输出预测结果,根据输出层维度信息进行解析即可获取输出预测信息与显示。
图像分类与resnet网络
图像分类是计算机视觉的关键任务之一,关于图像分类最知名的数据集是imagenet,包含了自然场景下大量各种的图像数据,支持1000个类别的图像分类。openvino在模型库的public中有resnet模型1000个分类的预训练模型支持,它们主要是:
- resnest-18-pytorch
- resnest-34-pytorch
- resnest-50-pytorch
- resnet-50-tf
其中18、34、50表示权重层,pytorch表示模型来自pytorch框架训练生成、tf表示tensorflow训练生成。resnet系列网络的详细说明如下:
图-2(来自《deep residual learning for image recognition》论文)
我们以resnet18-pytorch的模型为例,基于pytorch框架我们可以很轻松的把它转换为onnx格式文件。然后使用netron工具打开,可以看到网络的输入图示如下:
图-3
查看网络的输出:
图-4
这样我们很清楚的知道网络的输入与输出层名称,输入数据格式与输出数据格式,其中输入数据格式nchw中的n表示图像数目,这里是1、c表示图像通道数,这里输入的是彩色图像,通道数为3、h与w分别表示图像的高与宽,均为224。在输出格式中1x1000中1表示图像数目、1000表示预测的1000个分类的置信度数据。
程序实现的基本流程与步骤
前面已经介绍了ie sdk相关函数,图像分类模型resnet18的输入与输出格式信息。现在我们就可以借助ie sdk来完成一个完整的图像分类模型的应用部署了,根据前面提到的步骤各步的代码实现与解释如下:
1. 初始化ie
inferenceengine::core ie;
2. 加载resnet18网络
inferenceengine::cnnnetwork network = ie.readnetwork(onnx);
inferenceengine::inputsdatamap inputs = network.getinputsinfo();
inferenceengine::outputsdatamap outputs = network.getoutputsinfo();
3. 获取输入与输出名称、设置输入与输出数据格式
std::string input_name = ;
for (auto item : inputs) {
input_name = item.first;
auto input_data = item.second;
input_data->setprecision(precision::fp32);
input_data->setlayout(layout::nchw);
input_data->getpreprocess().setcolorformat(colorformat::rgb);
std::cout << input name: << input_name
std::cout << output name: << output_name size_t h = input->gettensordesc().getdims()[2];
size_t w = input->gettensordesc().getdims()[3];
size_t image_size = h*w;
cv::mat blob_image;
cv::resize(src, blob_image, cv::size(w, h));
cv::cvtcolor(blob_image, blob_image, cv::color_bgr2rgb);
blob_image.convertto(blob_image, cv_32f);
blob_image = blob_image / 255.0;
cv::subtract(blob_image, cv::scalar(0.485, 0.456, 0.406), blob_image);
cv::divide(blob_image, cv::scalar(0.229, 0.224, 0.225), blob_image);
// hwc =》nchw
float* data = static_cast(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_sizech + row*w + col] = blob_image.at(row, col)[ch];
}
}
}
在输入数据部分opencv导入的图像三通道顺序是bgr,所以要转换为rgb,resize到224x224大小、像素值归一化为0~1之间、然后要减去均值(0.485, 0.456, 0.406),除以方差(0.229, 0.224, 0.225)完成预处理之后再填充到blob缓冲区中区。
6. 推理
infer_request.infer();
7. 解析输出与显示结果
auto output = infer_request.getblob(output_name);
const float* probs = static_cast(output->buffer());
const sizevector outputdims = output->gettensordesc().getdims();
std::cout << outputdims[0] << x << outputdims[1] << std::endl;
float max = probs[0];
int max_index = 0;
for (int i = 1; i < outputdims[1]; i++) {
if (max < probs[i]) {
max = probs[i];
max_index = i;
}
}
cv::puttext(src, labels[max_index], cv::point(50, 50), cv::font_hershey_simplex, 1.0, cv::scalar(0, 0, 255), 2, 8);
cv::imshow(输入图像, src);
cv::waitkey(0);
解析部分代码首先通过输出层名称获取输出数据对象blob,然后根据输出格式1x1000,寻找最大值对应的index,根据索引index得到对应的分类标签,然后通过opencv图像输出分类结果。
运行结果
图-5(来自imagenet测试集)
这样我们就使用openvino 的推理引擎相关的sdk函数支持成功部署resnet18模型,并预测了一张输入图像。你可以能还想知道除了图像分类模型,openvino 推理引擎在对象检测方面都有哪些应用,我们下次继续…….
单相电能表怎么看度数_单相电能表接线图
博物馆加载AI 现代科学使用信息技术守护文明
怎样在Finder文件夹中创建一个快速文本文件
“西安巨舟电子设备”总经理马小安: 科技助行 品质助赢
2021年推荐的6款Windows XP CD刻录机
简述OpenVINO™ + ResNet实现图像分类
加拿大科学家研究出无机材料晶体可替代有机半导体组件
华为2021年“鸿蒙计划”被曝光 瞄准更高维度的操作系统
电子市场震荡:欧盟决定统一充电接口,中国制造商应对困境
教您打造小型、控制精确的超舒适智能按摩椅
集创北方加强产业联动,推动中国半导体跨越式发展
有什么适合打游戏的蓝牙耳机?玩游戏不延迟的蓝牙耳机推荐
充电桩行业仍处于快速发展期,头部企业逐渐星辰规模效应
人工智能与物联网重新定义未来的可能性
赛灵思宣布获得三星电子5G网络设备芯片交易合同
三星Galaxy新品发布会将于1月14日举行
浅谈FPGA设计的基本原则
LDO的行为及其有趣的参数
在先进的制造业工厂中 人才与AI机器的协作能力更加重要
正弦交流电量的相量表示