0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述OpenVINO™ + ResNet实现图像分类

英特尔物联网 来源:英特尔物联网 作者:英特尔物联网 2021-05-18 09:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

推理引擎(IE)应用开发流程

与相关函数介绍

通过OpenVINO的推理引擎跟相关应用集成相关深度学习模型的应用基本流程如下:

3f4a03ea-b4ff-11eb-bf61-12bb97331649.png

图-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< std::string, std::string > &config={}
)

通过Core的LoadNetwork方法生成可执行的网络,如果你有多个设备,就可以创建多个可执行的网络。其参数解释如下:

network 参数表示step2加载得到CNNNetwork对象实例

deviceName表示模型计算所依赖的硬件资源,可以为CPUGPUFPGA、 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系列网络的详细说明如下:

406b3d52-b4ff-11eb-bf61-12bb97331649.png

图-2(来自《Deep Residual Learning for Image Recognition》论文)

我们以ResNet18-pytorch的模型为例,基于Pytorch框架我们可以很轻松的把它转换为ONNX格式文件。然后使用Netron工具打开,可以看到网络的输入图示如下:

40f2157a-b4ff-11eb-bf61-12bb97331649.png

图-3

查看网络的输出:

40fe8af8-b4ff-11eb-bf61-12bb97331649.png

图-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::endl;
}

std::string output_name = "";
for (auto item : outputs) {
output_name = item.first;
auto output_data = item.second;
output_data->setPrecision(Precision::FP32);
std::cout << "output name: " << output_name << std::endl;
}

4. 获取推理请求对象实例

auto executable_network = ie.LoadNetwork(network, "CPU");
auto infer_request = executable_network.CreateInferRequest();

5. 输入图像数据设置

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;
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<:vec3f>(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 ::value_type*>(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;
}
}<:fp32>

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 推理引擎在对象检测方面都有哪些应用,我们下次继续…….

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4408

    浏览量

    66905
  • 代码
    +关注

    关注

    30

    文章

    4946

    浏览量

    73214
  • OpenCV
    +关注

    关注

    33

    文章

    651

    浏览量

    44461
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1094

    浏览量

    51235

原文标题:OpenVINO™ + ResNet实现图像分类

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于瑞芯微RK3576的resnet50训练部署教程

    Resnet50简介ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络
    的头像 发表于 09-10 11:19 1142次阅读
    基于瑞芯微RK3576的<b class='flag-5'>resnet</b>50训练部署教程

    无法使用OpenVINO™在 GPU 设备上运行稳定扩散文本到图像的原因?

    OpenVINO™ GPU 设备上使用图像大小 (1024X576) 运行稳定扩散文本到图像,并收到错误消息: RuntimeError: Exception from
    发表于 06-25 06:36

    为什么无法通过“pip install openvino-dev==2025.0.0”安装 2025.0 OpenVINO™?

    通过“pip install openvino-dev==2025.0.0OpenVINO™ 2025.0 安装。 收到的错误: ERROR: No matching distribution found for openvino
    发表于 06-23 08:13

    在友晶LabCloud平台上使用PipeCNN实现ImageNet图像分类

    利用深度卷积神经网络(CNN)进行图像分类是通过使用多个卷积层来从输入数据中提取特征,最后通过分类层做决策来识别出目标物体。
    的头像 发表于 04-23 09:42 904次阅读
    在友晶LabCloud平台上使用PipeCNN<b class='flag-5'>实现</b>ImageNet<b class='flag-5'>图像</b><b class='flag-5'>分类</b>

    基于RV1126开发板实现自学习图像分类方案

    在RV1126开发板上实现自学习:在识别前对物体图片进行模型学习,训练完成后通过算法分类得出图像的模型ID。 方案设计逻辑流程图,方案代码分为分为两个业务流程,主体代码负责抓取、合成
    的头像 发表于 04-21 13:37 11次阅读
    基于RV1126开发板<b class='flag-5'>实现</b>自学习<b class='flag-5'>图像</b><b class='flag-5'>分类</b>方案

    基于RV1126开发板的resnet50训练部署教程

    本教程基于图像分类算法ResNet50的训练和部署到EASY-EAI-Nano(RV1126)进行说明
    的头像 发表于 04-18 15:07 950次阅读
    基于RV1126开发板的<b class='flag-5'>resnet</b>50训练部署教程

    在Visual Studio中使用OpenVINO™ C API时无法读取网络怎么解决?

    使用 OpenVINO C API 加载中间表示 (IR),方法是引用Hello 分类 C 样本。 使用ie_infer_request_set_blob 时收到的状态为 -1(一般错误)。
    发表于 03-07 07:01

    如何部署OpenVINO™工具套件应用程序?

    编写代码并测试 OpenVINO™ 工具套件应用程序后,必须将应用程序安装或部署到生产环境中的目标设备。 OpenVINO™部署管理器指南包含有关如何轻松使用部署管理器将应用程序打包并部署到目标主机的详细信息。 注意:OpenVIN
    发表于 03-06 08:23

    使用Python API在OpenVINO™中创建了用于异步推理的自定义代码,输出张量的打印结果会重复,为什么?

    使用 Python* API 在 OpenVINO™ 中创建了用于异步推理的自定义代码。 遇到输出张量的打印结果会重复的问题,即使输入图像不同。
    发表于 03-06 07:53

    无法使用API实现NPU与OpenVINO™的内存共享怎么办?

    无法使用 远程张量 API 实现 NPU 与OpenVINO™的内存共享。
    发表于 03-06 07:11

    请问如何使用OpenVINO™生成热图?

    是否可以使用 OpenVINO实现像 [i]逐层相关性传播 或 [i]Grad-CAM 这样的热图生成技术?
    发表于 03-06 06:22

    安装OpenVINO™ 2023.2使用pip install openvino-dev命令的开发工具后报错怎么解决?

    安装OpenVINO™ 2023.2 使用 pip install openvino-dev 命令的开发工具。 遇到错误: ModuleNotFoundError: 没有名为 \'distutils\' 的模块
    发表于 03-05 08:39

    安装OpenVINO™工具包稳定扩散后报错,怎么解决?

    已安装OpenVINO™工具包稳定扩散并收到错误消息: \"BackendCompilerFailed: openvino_fx raised RuntimeError
    发表于 03-05 06:56

    C#集成OpenVINO™:简化AI模型部署

    在开源测控、机器视觉、数采与分析三大领域中,如何快速将AI模型集成到应用程序中, 实现AI赋能和应用增值? 最容易的方式是:在C#中,使用 OpenVINO工具套件 集成AI模型。 1
    的头像 发表于 02-17 10:03 2543次阅读
    C#集成<b class='flag-5'>OpenVINO</b>™:简化AI模型部署

    C#中使用OpenVINO™:轻松集成AI模型!

    与分析三大领域中,如何快速将AI模型集成到应用程序中,实现AI赋能和应用增值?最容易的方式是:在C#中,使用OpenVINO™工具套件集成AI模型。 一,什么是OpenVINO™ 工具套件?
    的头像 发表于 02-07 14:05 1692次阅读
    C#中使用<b class='flag-5'>OpenVINO</b>™:轻松集成AI模型!