使用LabVIEW实现基于pytorch的DeepLabv3图像语义分割


一、什么是语义分割

图像语义分割(semantic segmentation),从字面意思上理解就是让计算机根据图像的语义来进行分割,例如让计算机在输入下面左图的情况下,能够输出右图。语义在语音识别中指的是语音的意思,在图像领域,语义指的是图像的内容,对图片意思的理解,比如下图的语义就是一个人牵着四只羊;分割的意思是从像素的角度分割出图片中的不同对象,对原图中的每个像素都进行标注,比如下图中浅黄色代表人,蓝绿色代表羊。语义分割任务就是将图片中的不同类别,用不同的颜色标记出来,每一个类别使用一种颜色。常用于医学图像,卫星图像,无人车驾驶,机器人等领域。
在这里插入图片描述

  • 如何做到将像素点上色呢?

语义分割的输出和图像分类网络类似,图像分类类别数是一个一维的one hot 矩阵。例如:三分类的[0,1,0]。语义分割任务最后的输出特征图是一个三维结构,大小与原图类似,其中通道数是类别数,每个通道所标记的像素点,是该类别在图像中的位置,最后通过argmax 取每个通道有用像素 合成一张图像,用不同颜色表示其类别位置。 语义分割任务其实也是分类任务中的一种,他不过是对每一个像素点进行细分,找到每一个像素点所述的类别。 这就是语义分割任务啦~
在这里插入图片描述

二、什么是deeplabv3

DeepLabv3是一种语义分割架构,它在DeepLabv2的基础上进行了一些修改。为了处理在多个尺度上分割对象的问题,设计了在级联或并行中采用多孔卷积的模块,通过采用多个多孔速率来捕获多尺度上下文。此外,来自 DeepLabv2 的 Atrous Spatial Pyramid Pooling模块增加了编码全局上下文的图像级特征,并进一步提高了性能。
在这里插入图片描述

三、LabVIEW调用DeepLabv3实现图像语义分割

1、模型获取及转换

  • 安装pytorch和torchvision
  • 获取torchvision中的模型:deeplabv3_resnet101(我们获取预训练好的模型):
original_model = models.segmentation.deeplabv3_resnet101(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 = "deeplabv3_resnet101.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, 448, 448)
    )

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

    return full_model_path

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

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

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 = "deeplabv3_resnet101.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, 448, 448)
    )

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

    return full_model_path


def main():
    # initialize PyTorch ResNet-101 model
    original_model = models.segmentation.deeplabv3_resnet101(pretrained=True)

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


if __name__ == "__main__":
    main()

我们会发现,基于pytorch的DeepLabv3模型获取和之前的mask rcnn模型大同小异。

2、关于deeplabv3_resnet101

我们使用的模型是:deeplabv3_resnet101,该模型返回两个张量,与输入张量相同,但有21个classes。输出[“out”]包含语义掩码,而输出[“aux”]包含每像素的辅助损失值。在推理模式中,输出[‘aux]没有用处。因此,输出“out”形状为(N、21、H、W)。我们在转模型的时候设置H,W为448,N一般为1;

我们的模型是基于VOC2012数据集
VOC2012数据集分为20类,包括背景为21类,分别如下:
人 :人
动物:鸟、猫、牛、狗、马、羊
车辆:飞机、自行车、船、巴士、汽车、摩托车、火车
室内:瓶、椅子、餐桌、盆栽植物、沙发、电视/监视器
在这里插入图片描述

3、LabVIEW opencv dnn调用 deeplabv3 实现图像语义分割(deeplabv3_opencv.vi)

deeplabv3模型可以使用OpenCV dnn去加载的,也可以使用onnxruntime加载推理,所以我们分两种方式给大家介绍LabVIEW调用deeplabv3实现图像语义分割。

  • opencv dnn 调用onnx模型并选择
    在这里插入图片描述

  • 图像预处理
    最终还是采用了比较中规中矩的处理方式

在这里插入图片描述)

  • 执行推理

在这里插入图片描述

  • 后处理并实现实例分割
    因为后处理内容较多,所以直接封装为了一个子VI, deeplabv3_postprocess.vi,因为Labview没有专门的切片函数,所以会稍慢一些,所以接下来还会开发针对后处理和矩阵有关的函数,加快处理结果。

  • 整体的程序框架如下:
    在这里插入图片描述

  • 语义分割结果如下:
    在这里插入图片描述

4、LabVIEW onnxruntime调用 deeplabv3实现图像语义分割 (deeplabv3_onnx.vi)

  • 整体的程序框架如下:
    在这里插入图片描述
  • 语义分割结果如下:
    在这里插入图片描述

5、LabVIEW onnxruntime调用 deeplabv3 使用TensorRT加速模型实现图像语义分割(deeplabv3_onnx_camera.vi)

在这里插入图片描述

如上图所示,可以看到可以把人和背景完全分割开来,使用TensorRT加速推理,速度也比较快。


四、deeplabv3训练自己的数据集

训练可参考:https://github.com/pytorch/vision

总结

以上就是今天要给大家分享的内容。大家可关注微信公众号: VIRobotics,回复关键字:DeepLabv3图像语义分割源码 获取本次分享内容的完整项目源码及模型。

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

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

<think>好的,我现在需要帮助用户了解如何在LabVIEW中调用PyTorch训练好的模型。首先,我要回忆一下LabVIEWPyTorch的特点。LabVIEW主要用于数据采集和仪器控制,而PyTorch深度学习框架。用户的问题是如何将两者结合,调用训练好的模型。 首先,LabVIEW本身可能不支持直接加载PyTorch模型,因此需要考虑中间步骤。可能需要将PyTorch模型转换为ONNX格式,因为ONNX是一种开放的模型格式,支持跨平台使用。然后,LabVIEW可以通过调用外部库或接口来加载ONNX模型。 接下来,我需要确认转换PyTorch模型到ONNX的具体步骤。用户需要先使用PyTorch的导出功能,将模型保存为ONNX文件。这涉及到使用torch.onnx.export函数,可能需要提供示例输入张量。 然后,LabVIEW如何调用ONNX模型呢?LabVIEW可能没有内置的ONNX运行时支持,因此需要考虑使用外部接口,例如调用Python脚本,或者使用LabVIEW的Python节点。另外,可能需要安装ONNX Runtime库,并通过DLL调用等方式在LabVIEW中集成。 另外,用户可能需要通过LabVIEW调用Python代码来执行模型推理。这种情况下,需要确保LabVIEW能够与Python环境正确交互,例如使用System Exec VI或Python Node。这需要配置好Python环境路径,并安装必要的库如onnxruntime。 还需要考虑数据类型的转换问题。LabVIEW的数据结构可能需要转换为Python可接受的格式,例如将数组转换为NumPy数组,再传递给ONNX Runtime进行推理,然后将结果返回给LabVIEW。 可能的步骤总结如下: 1. 将PyTorch模型导出为ONNX格式。 2. 在LabVIEW中配置Python环境或ONNX Runtime。 3. 使用LabVIEW调用Python脚本或ONNX Runtime加载模型并进行推理。 4. 处理输入输出数据的转换。 需要验证这些步骤的可行性,例如检查LabVIEW是否支持调用外部Python脚本,或者是否有现成的工具包支持ONNX模型。如果用户没有相关经验,可能需要详细说明每一步的具体操作,包括代码示例和配置步骤。 另外,可能存在的挑战包括环境配置问题、版本兼容性、数据预处理和后处理的正确性。需要提醒用户注意这些潜在问题,并建议进行测试和调试。 总结,关键点在于模型转换、LabVIEW与外部环境的交互以及数据格式处理。需要分步骤解释,并提供具体的代码示例和配置说明,确保用户能够逐步操作。</think>在LabVIEW中调用PyTorch训练好的模型,需要通过中间格式(如ONNX)或借助Python脚本实现。以下是详细步骤: --- ### **1. 将PyTorch模型转换为ONNX格式** **原理**:ONNX是一种通用模型格式,LabVIEW可通过ONNX Runtime调用。 #### **步骤**: 1. **保存PyTorch模型**: ```python import torch import torch.onnx # 假设已定义并训练好模型 model model.eval() # 设置为评估模式 dummy_input = torch.randn(1, 输入通道数, 输入高度, 输入宽度) # 示例输入 torch.onnx.export( model, dummy_input, "model.onnx", input_names=["input"], output_names=["output"] ) ``` 2. **验证ONNX模型**: ```python import onnx onnx_model = onnx.load("model.onnx") onnx.checker.check_model(onnx_model) ``` --- ### **2. LabVIEW调用ONNX模型的两种方法** #### **方法1:通过Python脚本调用(推荐)** **原理**:利用LabVIEW的`Python Node`或`System Exec`执行Python推理脚本。 1. **安装依赖库**: ```bash pip install onnxruntime numpy ``` 2. **编写Python推理脚本(`inference.py`)**: ```python import numpy as np import onnxruntime as ort def infer(input_data): sess = ort.InferenceSession("model.onnx") input_name = sess.get_inputs()[0].name output_name = sess.get_outputs()[0].name result = sess.run([output_name], {input_name: input_data}) return result[0] ``` 3. **LabVIEW调用Python脚本**: - **使用`Python Node`**(需LabVIEW 2020+): - 配置Python路径:`Tools > Python > Python Session`。 - 调用`infer`函数并传递输入数据(需将LabVIEW数组转换为NumPy数组)。 - **使用`System Exec`**: - 通过命令行执行Python脚本并传递参数(需处理输入/输出的字符串解析)。 --- #### **方法2:直接集成ONNX Runtime(高级)** **原理**:通过LabVIEW调用C/C++ DLL接口(需ONNX Runtime的C API封装)。 1. **下载ONNX Runtime C库**: - 从[ONNX Runtime官网](https://onnxruntime.ai/)下载预编译库。 2. **在LabVIEW中封装DLL**: - 使用`Call Library Function Node`加载`onnxruntime.dll`。 - 封装关键函数:`OrtSessionOptionsAppendExecutionProvider_CPU`, `OrtSessionRun`等。 3. **数据转换**: - 将LabVIEW数组转换为ONNX Runtime接受的`float32`数组格式。 --- ### **3. 示例:LabVIEW + Python节点调用模型** 1. **LabVIEW框图**: - 使用`Python Node`调用`inference.py`中的`infer`函数。 - 输入数据需转换为NumPy数组(例如:使用`Flatten to String`传递数据)。 2. **数据预处理**: - 若输入是图像,需在LabVIEW中调整尺寸、归一化,并转换为`float32`数组。 3. **结果解析**: - 从Python脚本返回的结果中提取输出值,并转换为LabVIEW支持的格式(如数组或数值)。 --- ### **注意事项** 1. **环境一致性**: - 确保LabVIEW和Python使用相同位数的版本(如64位)。 2. **性能优化**: - 批量处理数据以减少Python调用开销。 - 使用GPU加速(需安装`onnxruntime-gpu`)。 3. **错误处理**: - 添加异常捕获逻辑(如模型加载失败、输入维度不匹配)。 --- ### **总结** - **推荐路径**:PyTorch → ONNX → LabVIEW调用Python脚本。 - **关键点**:模型格式转换、数据接口对齐、环境配置。 - **适用场景**:实时推理、与硬件采集系统集成(如工业检测、信号处理)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

virobotics

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值