今天我们一起来看一下如何使用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
1 def get_pytorch_onnx_model(original_model): 2 # define the directory for further converted model save 3 onnx_model_path = dirname 4 # define the name of further converted model 5 onnx_model_name = "deeplabv3_resnet101.onnx" 6 7 # create directory for further converted model 8 os.makedirs(onnx_model_path, exist_ok=True) 9 10 # get full path to the converted model 11 full_model_path = os.path.join(onnx_model_path, onnx_model_name) 12 13 # generate model input 14 generated_input = Variable( 15 torch.randn(1, 3, 448, 448) 16 ) 17 18 # model export into ONNX format 19 torch.onnx.export( 20 original_model, 21 generated_input, 22 full_model_path, 23 verbose=True, 24 input_names=["input"], 25 output_names=["output",'aux'], 26 opset_version=11 27 ) 28 29 return full_model_path