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

    文章

    4303

    浏览量

    62411
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68324
  • OpenCV
    +关注

    关注

    29

    文章

    626

    浏览量

    41247
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1025

    浏览量

    45762

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

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

收藏 人收藏

    评论

    相关推荐

    使用卷积神经网络进行图像分类的步骤

    使用卷积神经网络(CNN)进行图像分类是一个涉及多个步骤的过程。 1. 问题定义 确定目标 :明确你想要分类图像类型,例如猫和狗、不同的植物种类等。 数据需求 :确定需要多少数据以及
    的头像 发表于 11-15 15:01 189次阅读

    基于改进ResNet50网络的自动驾驶场景天气识别算法

    ResNet50网络4组模块内加入SE模块,以便更好地拟合通道间复杂的鲁棒性。基于自动驾驶汽车路测图像数据对所提算法进行Python编程实现,结果表明:SE模块的加入能够增加算法的鲁棒性和准确性,提高了自动驾驶的天气识别精度。
    的头像 发表于 11-09 11:14 819次阅读
    基于改进<b class='flag-5'>ResNet</b>50网络的自动驾驶场景天气识别算法

    手把手教你使用LabVIEW TensorRT实现图像分类实战(含源码)

    Hello,大家好,我是virobotics(仪酷智能),一个深耕于LabVIEW和人工智能领域的开发工程师。 各位朋友,今天我们一起来探究一下如何基于LabVIEW使用TensorRT实现图像分类
    的头像 发表于 11-06 16:07 163次阅读
    手把手教你使用LabVIEW TensorRT<b class='flag-5'>实现</b><b class='flag-5'>图像</b><b class='flag-5'>分类</b>实战(含源码)

    使用OpenVINO Model Server在哪吒开发板上部署模型

    OpenVINO Model Server(OVMS)是一个高性能的模型部署系统,使用C++实现,并在Intel架构上的部署进行了优化,使用OpenVINO 进行推理,推理服务通过gPRC或REST
    的头像 发表于 11-01 14:19 174次阅读
    使用<b class='flag-5'>OpenVINO</b> Model Server在哪吒开发板上部署模型

    使用OpenVINO C# API部署YOLO-World实现实时开放词汇对象检测

    的快速准确识别,并通过AR技术将虚拟元素与真实场景相结合,为用户带来沉浸式的交互体验。在本文中,我们将结合OpenVINO C# API使用最新发布的OpenVINO 2024.0部署 YOLO-World实现实时开放词汇对象检
    的头像 发表于 08-30 16:27 540次阅读
    使用<b class='flag-5'>OpenVINO</b> C# API部署YOLO-World<b class='flag-5'>实现</b>实时开放词汇对象检测

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都觉得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的优化与整理,已经是非常贴近开发的使用习惯与推理方式。与OpenCV的Mat对象对接方式更是几乎无缝对接,非常的方便好用。
    的头像 发表于 07-26 09:20 766次阅读

    计算机视觉怎么给图像分类

    图像分类是计算机视觉领域中的一项核心任务,其目标是将输入的图像自动分配到预定义的类别集合中。这一过程涉及图像的特征提取、特征表示以及分类器的
    的头像 发表于 07-08 17:06 497次阅读

    一种利用光电容积描记(PPG)信号和深度学习模型对高血压分类的新方法

    模型提供了更好的结果[9]。我们的模型实现了最佳性能,表明在这种情况下使用平均池比最大池具有优势。这凸显了为信号图像分类任务选择适当的池化技术的重要性。
    发表于 05-11 20:01

    OpenAI发布图像检测分类器,可区分AI生成图像与实拍照片

    据OpenAI介绍,初步测试结果表明,该分类器在辨别非AI生成图像与DALL·E 3生成图像时,成功率高达近98%,仅有不到0.5%的非AI图像误判为DALL·E 3生成。此外,该工具
    的头像 发表于 05-09 09:57 417次阅读

    OpenVINO添加对Paddle 2.5的支持

    我是飞桨黑客马拉松第五期 OpenVINO 赛题获奖者——为 OpenVINO 添加了对 Paddle 2.5 的支持。在此记录下来贡献的过程,希望有更多的同学可以参与到 OpenVINO 的社区
    的头像 发表于 01-19 09:20 603次阅读

    基于OpenVINO™和AIxBoard的智能安检盒子设计

    公共安全问题日益凸显,传统安检手段面临挑战。为提高安检效率和保障公共安全,基于 OpenVINO™ 和 AIxBoard 的智能安检盒子应运而生。
    的头像 发表于 01-18 17:31 785次阅读
    基于<b class='flag-5'>OpenVINO</b>™和AIxBoard的智能安检盒子设计

    如何在MacOS上编译OpenVINO C++项目呢?

    英特尔公司发行的模型部署工具 OpenVINO 模型部署套件,可以实现在不同系统环境下运行,且发布的 OpenVINO 2023 最新版目前已经支持 MacOS 系统并同时支持在苹果 M 系列芯片上部署模型。
    的头像 发表于 01-11 18:07 846次阅读
    如何在MacOS上编译<b class='flag-5'>OpenVINO</b> C++项目呢?

    CNN图像分类策略

    在深度学习出现之前,自然图像中的对象识别过程相当粗暴简单:定义一组关键视觉特征(“单词”),识别每个视觉特征在图像中的存在频率(“包”),然后根据这些数字对图像进行分类。这些模型被称为
    发表于 12-25 11:36 276次阅读
    CNN<b class='flag-5'>图像</b><b class='flag-5'>分类</b>策略

    基于OpenVINO和AIxBoard的智能安检盒子设计

    公共安全问题日益凸显,传统安检手段面临挑战。为提高安检效率和保障公共安全,基于 OpenVINO 和 AIxBoard 的智能安检盒子应运而生。利用深度学习模型和 X 光图像处理技术,该设备能够实时识别危险物品并发出警报,为公共场所、机场等场景提供高效、准确的安检解决方案
    的头像 发表于 12-25 11:14 508次阅读
    基于<b class='flag-5'>OpenVINO</b>和AIxBoard的智能安检盒子设计

    如何快速下载OpenVINO Notebooks中的AI大模型

    OpenVINO Notebooks是Jupyter Notebook形式的OpenVINO范例程序大集合,方便开发者快速学习并掌握OpenVINO推理程序,并通过Copy&Paste方式将范例中的关键程序应用到自己的AI软件中
    的头像 发表于 12-12 14:40 1069次阅读
    如何快速下载<b class='flag-5'>OpenVINO</b> Notebooks中的AI大模型