前言

明天咱们一起来看一下如何应用LabVIEW实现语义宰割。

一、什么是语义宰割

图像语义宰割(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 osimport torchimport torch.onnxfrom torch.autograd import Variablefrom torchvision import modelsimport redirname, 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_pathdef 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/vi...

总结

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

如果有问题能够在评论区里探讨,发问前请先点赞反对一下博主哦,如您想要探讨更多对于LabVIEW与人工智能技术,欢送退出咱们的技术交换群:705637299,,进群请备注暗号:LabVIEW机器学习

如果文章对你有帮忙,欢送关注、点赞、珍藏