前言
明天咱们一起来看一下如何应用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机器学习
如果文章对你有帮忙,欢送关注、点赞、珍藏