【图像分类】基于OpenVINO实现PyTorch ResNet50图像分类

简介: 【图像分类】基于OpenVINO实现PyTorch ResNet50图像分类

‍‍🏡博客主页: virobotics(仪酷智能):LabVIEW深度学习、人工智能博主

🍻本文由virobotics(仪酷智能)原创首发

🥳欢迎大家关注✌点赞👍收藏⭐留言📝

前言

Hello,大家好,我是virobotics(仪酷智能),一个深耕于LabVIEW和人工智能领域的开发工程师。

前面博文给大家介绍了OpenVINO工具包及具体的安装,今天我们一起来看一下,如何使用LabVIEW OpenVINO工具包实现resnet50的推理部署。

一、ResNet简介

1.1 ResNet概念及特点

ResNet在2015名声大噪,何恺明推出的ResNet在ISLVRC和COCO上横扫所有选手,获得冠军,而且影响了2016年DL在学术界和工业界的发展方向。ResNet在网络结构上做了大创新,而不再是简单的堆积层数,它对每层的输入做一个reference, 学习形成残差函数, 而不是学习一些没有reference的函数。这种残差函数更容易优化,能使网络层数大大加深。

我们知道,在计算机视觉里,特征的“等级”随增网络深度的加深而变高,研究表明,网络的深度是实现好的效果的重要因素。然而梯度弥散/爆炸成为训练深层次的网络的障碍,导致无法收敛。有一些方法可以弥补,如归一初始化,各层输入归一化,使得可以收敛的网络的深度提升为原来的十倍。然而,虽然收敛了,但网络却开始退化了,即增加网络层数却导致更大的误差, 如下图。 这种deep plain net收敛率十分低下。
image.png

1.2 ResNet完整结构

ResNet比起VGG19这样的网络深很多,但是运算量是少于VGG19等的。如下图所示为其完整结构:

image.png

1.3 ResNet50 网络模型

ResNet50是ResNet中的一种, ResNet50 网络中包含了 49 个卷积层、一个全连接层。如图下图所示,ResNet50网络结构可以分成七个部分,第一部分不包含残差块,主要对输入进行卷积、正则化、激活函数、最大池化的计算。第二、三、四、五部分结构都包含了残差块,图中的绿色图块不会改变残差块的尺寸,只用于改变残差块的维度。在ResNet50网络结构中 ,残差块都有三层卷积,那网络总共有1+3×(3+4+6+3)=49个卷积层,加上最后的全连接层总共是 50 层,这也是ResNet50 名称的由来。网络的输入为 224×224×3,经过前五部分的卷积计算,输出为 7×7×2048,池化层会将其转化成一个特征向量,最后分类器会对这个特征向量进行计算并输出类别概率。
image.png

二、环境搭建

2.1 部署本项目时所用环境

操作系统:Windows10
python:3.6及以上
LabVIEW:2018及以上 64位版本
AI视觉工具包:techforce_lib_opencv_cpu-1.0.0.98.vip【1.0.0.98及以上版本均可】
OpenVINO工具包:virobotics_lib_openvino-1.0.0.9.vip【1.0.0.9及以上版本均可】

2.2 LabVIEW工具包下载及安装

AI视觉工具包下载与安装参考:
https://blog.csdn.net/virobotics/article/details/123656523
AI视觉工具包介绍:
https://blog.csdn.net/virobotics/article/details/123522165
OpenVINO工具包下载与安装参考:
https://blog.csdn.net/virobotics/article/details/130226410
LabVIEW OpenVINO AI加速工具包介绍:
https://blog.csdn.net/virobotics/article/details/130220080

三、LabVIEW OpenVINO实现resnet50图像分类

3.1 模型获取及转换为onnx

安装pytorch和torchvision
获取torchvision中的模型:resnet50(我们获取预训练好的模型):
original_model = models.resnet50(pretrained=True)
转onnx
def get_pytorch_onnx_model(original_model):

# define the directory for further converted model save
onnx_model_path = "A:\\code\\pytorch\\image_classfier"
# define the name of further converted model
onnx_model_name = "resnet50.onnx"

# create directory for further converted model
os.makedirs(onnx_model_path, exist_ok=True)

# get full path to the converted model
full_model_path = os.path.join(onnx_model_path, onnx_model_name)

# generate model input
generated_input = Variable(
    torch.randn(1, 3, 224, 224)
)

# model export into ONNX format
torch.onnx.export(
    original_model,
    generated_input,
    full_model_path,
    verbose=True,
    input_names=["input"],
    output_names=["output"],
    opset_version=11
)

return full_model_path

完整获取模型及转换python代码如下:

import os
import torch
import torch.onnx
from torch.autograd import Variable
from torchvision import models

def get_pytorch_onnx_model(original_model):

# define the directory for further converted model save
onnx_model_path = "A:\\code\\pytorch\\image_classfier"
# define the name of further converted model
onnx_model_name = "resnet50.onnx"

# create directory for further converted model
os.makedirs(onnx_model_path, exist_ok=True)

# get full path to the converted model
full_model_path = os.path.join(onnx_model_path, onnx_model_name)

# generate model input
generated_input = Variable(
    torch.randn(1, 3, 224, 224)
)

# model export into ONNX format
torch.onnx.export(
    original_model,
    generated_input,
    full_model_path,
    verbose=True,
    input_names=["input"],
    output_names=["output"],
    opset_version=11
)

return full_model_path

def main():

# initialize PyTorch MobileNetV2
original_model = models.resnet50(pretrained=True)

# get the path to the converted into ONNX PyTorch model
full_model_path = get_pytorch_onnx_model(original_model)
print("PyTorch resnet50 model was successfully converted: ", full_model_path)

if name == "main":
main()

3.2 LabVIEW OpenVINO调用 resnet50实现图像分类(openvino_resnet.vi.vi)

ImageNet (image-net.org),本课程使用到的模型是基于ILSVRC的1000种物体分类模型,如下图所示为在LabVIEW中部署ResNet50实现图像分类,使用OpenVINO实现加速。
注意:请将整个项目工程放置到不含有中文的路径中,否则会出现无法运行的情况。

image.png

运行结果如下,可以看到可以准确分类,因为我们调用的模型为与训练模型,所以只能分类1000种,如需更多分类,可以重新训练模型。
image.png

四、项目源码

如需源码,可查看:https://blog.csdn.net/virobotics/article/details/130959396?spm=1001.2014.3001.5501
更多内容可关注微信公众号:VIRobotics

总结

以上就是今天要给大家分享的内容,希望对大家有用。如有笔误,还请各位及时指正。后续还会继续给各位朋友分享其他案例,欢迎大家关注博主。我是virobotics(仪酷智能),我们下篇文章见~

如果有问题可以在评论区里讨论,提问前请先点赞支持一下博主哦,如您想要探讨更多关于LabVIEW与人工智能技术,欢迎加入我们的技术交流群:705637299。进群请备注:LabVIEW机器视觉

**如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏

目录
相关文章
|
3天前
|
机器学习/深度学习 数据可视化 算法
Pytorch CIFAR10图像分类 Swin Transformer篇(二)
Pytorch CIFAR10图像分类 Swin Transformer篇(二)
|
3天前
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch CIFAR10图像分类 Swin Transformer篇(一)
Pytorch CIFAR10图像分类 Swin Transformer篇(一)
|
3天前
|
机器学习/深度学习 PyTorch 算法框架/工具
【PyTorch实战演练】使用Cifar10数据集训练LeNet5网络并实现图像分类(附代码)
【PyTorch实战演练】使用Cifar10数据集训练LeNet5网络并实现图像分类(附代码)
106 0
|
3天前
|
机器学习/深度学习 PyTorch 语音技术
Pytorch迁移学习使用Resnet50进行模型训练预测猫狗二分类
深度学习在图像分类、目标检测、语音识别等领域取得了重大突破,但是随着网络层数的增加,梯度消失和梯度爆炸问题逐渐凸显。随着层数的增加,梯度信息在反向传播过程中逐渐变小,导致网络难以收敛。同时,梯度爆炸问题也会导致网络的参数更新过大,无法正常收敛。 为了解决这些问题,ResNet提出了一个创新的思路:引入残差块(Residual Block)。残差块的设计允许网络学习残差映射,从而减轻了梯度消失问题,使得网络更容易训练。
121 0
|
9月前
|
机器学习/深度学习 PyTorch 算法框架/工具
ResNet代码复现+超详细注释(PyTorch)
ResNet代码复现+超详细注释(PyTorch)
728 1
|
3天前
|
机器学习/深度学习 数据可视化 PyTorch
Pytorch CIFAR10图像分类 ZFNet篇
Pytorch CIFAR10图像分类 ZFNet篇
|
3天前
|
机器学习/深度学习 数据采集 PyTorch
PyTorch搭建卷积神经网络(ResNet-50网络)进行图像分类实战(附源码和数据集)
PyTorch搭建卷积神经网络(ResNet-50网络)进行图像分类实战(附源码和数据集)
104 1
|
7月前
|
机器学习/深度学习 数据采集 PyTorch
PyTorch应用实战二:实现卷积神经网络进行图像分类
PyTorch应用实战二:实现卷积神经网络进行图像分类
99 0
|
8月前
|
机器学习/深度学习 人工智能 PyTorch
ResNet详解:网络结构解读与PyTorch实现教程
ResNet详解:网络结构解读与PyTorch实现教程
558 0
|
11月前
|
机器学习/深度学习 存储 人工智能
模型推理加速系列 | 03:Pytorch模型量化实践并以ResNet18模型量化为例(附代码)
本文主要简要介绍Pytorch模型量化相关,并以ResNet18模型为例进行量化实践。