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

    文章

    3937

    浏览量

    61371
  • 代码
    +关注

    关注

    30

    文章

    4558

    浏览量

    66909
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40814
  • SDK
    SDK
    +关注

    关注

    3

    文章

    967

    浏览量

    44800

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

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

收藏 人收藏

    评论

    相关推荐

    如何使用OpenVINO C++ API部署FastSAM模型

    象的位置和边界。本文将介绍如何使用 OpenVINO C++ API 部署 FastSAM 模型,以实现快速高效的语义分割。在前文中我们发表了《基于 OpenVINO Python API 部署
    的头像 发表于 11-17 09:53 468次阅读
    如何使用<b class='flag-5'>OpenVINO</b> C++ API部署FastSAM模型

    基于XIAO的图像分类处理项目

    XIAOXIAO今天小编给大家带来的是圣地亚哥的Maker Marcelo Rovai 使用 XIAO ESP32S3 Sensor 搭配Edge Impulse 实现图像分类的项目。
    的头像 发表于 10-28 09:50 731次阅读
    基于XIAO的<b class='flag-5'>图像</b><b class='flag-5'>分类</b>处理项目

    TDengine+OpenVINO+AIxBoard助力时序数据分类

    如何使用 TDengine 作为基础软件存储实验数据,并通过 TDengine 高效的查询能力在 OpenVINO 部署深度学习模型,最终在 AIxBoard 开发板上实时运行分类任务。
    的头像 发表于 10-27 11:08 355次阅读
    TDengine+<b class='flag-5'>OpenVINO</b>+AIxBoard助力时序数据<b class='flag-5'>分类</b>

    在英特尔开发套件上用OpenVIN实现中文图文检索

    embedding,根据特征相似度匹配可完成图像分类和相似查找任务。CLIP 模型的 zero-shot 分类效果就能达到在 Imagenet 上监督训练的 ResNet
    的头像 发表于 10-27 11:06 360次阅读
    在英特尔开发套件上用OpenVIN<b class='flag-5'>实现</b>中文图文检索

    如何使用OpenVINO Python API部署FastSAM模型

    象的位置和边界。本文将介绍如何使用 OpenVINO Python API 部署 FastSAM 模型,以实现快速高效的语义分割。
    的头像 发表于 10-27 11:04 325次阅读

    【KV260视觉入门套件试用体验】四、学习过程梳理&amp;DPU镜像&amp;Resnet50

    =xilinx-kv260-dpu-v2022.2-v3.0.0.img.gz 镜像下载 Vitis AI Library 用户指南 镜像安装教程,软件开发教程。 五、DPU-ResNet50 实验 ResNet50模型以其深度和准确性,在
    发表于 09-26 15:21

    【KV260视觉入门套件试用体验】部署DPU镜像并运行Vitis AI图像分类示例程序

    本文首先将会对Vitis统一软件平台和Vitsi AI进行简单介绍,然后介绍如何在KV260上部署DPU镜像,最后在KV260 DPU镜像上运行Vitis AI自带的图像分类示例。通过本文,你将会
    发表于 09-10 23:01

    OpenVINO™ 赋能 BLIP 实现视觉语言 AI 边缘部署

    图》中,我们介绍了利用OpenVINO运行StableDiffusion模型,快速实现文生图应用。让人人可以成为绘画大师,利用AI随心作画。随着计算机视觉和自然语
    的头像 发表于 09-04 16:21 405次阅读
    <b class='flag-5'>OpenVINO</b>™ 赋能 BLIP <b class='flag-5'>实现</b>视觉语言 AI 边缘部署

    如何在OpenVINO trade工具包中推断两个图像

    无法在OpenVINO™工具包中对两个输入图像运行推理。
    发表于 08-15 08:24

    在Raspberry Pi上从源代码构建OpenVINO 2021.3收到错误怎么解决?

    在 Raspberry Pi 上从源代码构建 OpenVINO™2021.3。 运行OpenVINO™推理,并收到错误消息: ModuleNotFoundError:没有
    发表于 08-15 08:24

    永久设置OpenVINO trade Windows reg10的工具套件环境变量

    您可以在 Windows® 10 中手动设置OpenVINO™环境变量。在 Windows® 10 系统中,转到 >系统和安全>系统>高级系统设置&
    发表于 08-15 07:18

    从Docker映像为Raspbian OpenVINO工具套件的安装过程

    openvino_fd_myriad.py 在此脚本中,OpenCV* 从中间表示 (IR) 格式加载人车-单车检测模型和图像。然后,它运行推理,将图像与检测结果保存为 out.png 。 这完成了从 Docker* 映像为
    发表于 08-15 06:59

    如何在使用Inspector运行OpenVINO C++样本时避免内存泄露?

    运行OpenVINO图像分类 Async C++示例带英特尔® Inspector用于检查内存问题。使用命令: $ pwd /home/centos
    发表于 08-15 06:18

    AI爱克斯开发板上使用OpenVINO加速YOLOv8目标检测模型

    《在AI爱克斯开发板上用OpenVINO加速YOLOv8分类模型》介绍了在AI爱克斯开发板上使用OpenVINO 开发套件部署并测评YOLOv8的分类模型,本文将介绍在AI爱克斯开发板
    的头像 发表于 05-26 11:03 738次阅读
    AI爱克斯开发板上使用<b class='flag-5'>OpenVINO</b>加速YOLOv8目标检测模型

    在AI爱克斯开发板上用OpenVINO™加速YOLOv8目标检测模型

    《在 AI 爱克斯开发板上用 OpenVINO 加速 YOLOv8 分类模型》介绍了在 AI 爱克斯开发板上使用 OpenVINO 开发套件部署并测评 YOLOv8 的分类模型,本文将
    的头像 发表于 05-12 09:08 875次阅读
    在AI爱克斯开发板上用<b class='flag-5'>OpenVINO</b>™加速YOLOv8目标检测模型