使用LabVIEW onnx工具包实现mobilenet的推理部署

释放双眼,带上耳机,听听看~!
本教程介绍了如何使用LabVIEW onnx工具包实现mobilenet的推理部署,实现图像分类。文章涵盖了MobileNet的简介、环境搭建等内容。欢迎关注virobotics(仪酷智能)博客,了解更多深度学习和人工智能相关内容。

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

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

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

前言

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

今天我们一起来看一下,如何使用LabVIEW onnx工具包实现mobilenet的推理部署,实现图像分类。

一、MobileNet简介

MobileNet是一种轻量级的卷积神经网络模型,由Google团队在2017年提出。它的设计目的是在保持高精度的同时,大幅减少模型的参数量和计算量,以适应移动设备等资源受限环境的需求。

MobileNet使用了一种称为深度可分离卷积(depthwise separable convolution)的卷积操作,它将标准卷积分解为两个步骤:深度卷积和逐点卷积(pointwise convolution)。首先对输入的每个通道进行单独的卷积,然后在输出通道之间执行逐点卷积以生成最终结果。这种分解可以显著减少计算量和参数数量,同时还可以保持与标准卷积相当的准确性。基本单元是深度级可分离卷积(depthwise separable convolution),其实这种结构之前已经被使用在Inception模型中。深度级可分离卷积其实是一种可分解卷积操作(factorized convolutions),其可以分解为两个更小的操作:depthwise convolution和pointwise convolution,如图1所示。Depthwise convolution和标准卷积不同,对于标准卷积其卷积核是用在所有的输入通道上(input channels),而depthwise convolution针对每个输入通道采用不同的卷积核,就是说一个卷积核对应一个输入通道,所以说depthwise convolution是depth级别的操作。而pointwise convolution其实就是普通的卷积,只不过其采用1×1的卷积核。图2中更清晰地展示了两种操作。对于depthwise separable convolution,其首先是采用depthwise convolution对不同输入通道分别进行卷积,然后采用pointwise convolution将上面的输出再进行结合,这样其实整体效果和一个标准卷积是差不多的,但是会大大减少计算量和模型参数量。
使用LabVIEW onnx工具包实现mobilenet的推理部署
MobileNet的网络结构如表所示。首先是一个3×3的标准卷积,然后后面就是堆积depthwise separable convolution,并且可以看到其中的部分depthwise convolution会通过strides=2进行down sampling。然后采用average pooling将feature变成1×1,根据预测类别大小加上全连接层,最后是一个softmax层。如果单独计算depthwise convolution和pointwise convolution,整个网络有28层(这里Avg Pool和Softmax不计算在内)。

使用LabVIEW onnx工具包实现mobilenet的推理部署

二、环境搭建

2.1 部署本项目时所用环境

  • 操作系统:Windows10
  • python:3.6及以上
  • LabVIEW:2018及以上 64位版本
  • AI视觉工具包:techforce_lib_opencv_cpu-1.0.0.98.vip
  • onnx工具包:virobotics_lib_onnx_cuda_tensorrt-1.0.0.16.vip【1.0.0.16及以上版本】或virobotics_lib_onnx_cpu-1.13.1.2.vip

2.2 LabVIEW工具包下载及安装网址

三、LabVIEW onnx实现MobileNet图像分类

3.1 模型获取及转换为onnx

  • 安装pytorch和torchvision
  • 获取torchvision中的模型:mobilenet_(我们获取预训练好的模型):
original_model = models.mobilenet_v2(pretrained=True)
  • 转onnx
def get_pytorch_onnx_model(original_model):
    # define the directory for further converted model save
    onnx_model_path = dirname
    # define the name of further converted model
    onnx_model_name = "mobilenet.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

dirname, filename = os.path.split(os.path.abspath(__file__))
print(dirname)

def get_pytorch_onnx_model(original_model):
    # define the directory for further converted model save
    onnx_model_path = dirname
    # define the name of further converted model
    onnx_model_name = "mobilenet.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.mobilenet_v2(pretrained=True)

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


if __name__ == "__main__":
    main()

3.2 LabVIEW onnx调用MobileNet实现图像分类(call_onnx_mobilenet.vi)

ImageNet (image-net.org),本课程使用到的模型是基于ILSVRC的1000种物体分类模型,如下图所示为在LabVIEW中部署MobileNet实现图像分类,使用cuda实现加速。

使用LabVIEW onnx工具包实现mobilenet的推理部署

运行结果如下,可以看到可以准确分类,因为我们调用的模型为与训练模型,所以只能分类1000种,如需更多分类,可以重新训练模型。
使用LabVIEW onnx工具包实现mobilenet的推理部署

四、项目源码

如需源码,可查看blog.csdn.net/virobotics/…

总结

以上就是今天要给大家分享的内容,希望对大家有用。我们下篇文章见~

如您想要探讨更多关于LabVIEW与人工智能技术,欢迎加入我们的技术交流群:705637299。进群请备注:LabVIEW机器视觉

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

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

Transformers模型架构中的注意力机制

2023-11-28 10:18:14

AI教程

AI导航网站推荐:探索人工智能在各领域的应用和最新进展

2023-11-28 10:23:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索