主要内容

语义分割使用深度学习

这个例子展示了如何使用语义段图像分割网络。

语义分割图像的每个像素分类网络,导致图像分割的类。应用语义分割包括自主驾驶的道路分割为医学诊断和癌症细胞分割。欲了解更多,请看开始使用语义分割使用深度学习

这个例子首先向您展示如何细分图像使用pretrained Deeplab v3 +网络[1],这是一种卷积神经网络(CNN)设计语义图像分割。其他类型的语义分割网络包括完全卷积网络(FCN) SegNet, U-Net。然后,您可以下载一个数据集训练Deeplab v3使用传输的网络学习。这里显示的训练过程可以应用到其他类型的语义分割网络。

为了说明培训过程,下面的例子使用了CamVid数据集从剑桥大学[2]。这个数据集是一组包含街道开车时视图获得的图像。数据集提供了进行像素级标签32语义类包括汽车、行人、道路。

CUDA-capable NVIDIA GPU™是强烈推荐用于运行这个例子。使用GPU的并行计算需要工具箱™。关于支持计算能力的信息,看到万博1manbetxGPU计算的需求(并行计算工具箱)

下载Pretrained语义分割网络

下载pretrained版本DeepLab v3 + CamVid数据集上训练。

pretrainedURL =“https://ssd.mathworks.com/万博1manbetxsupportfiles/vision/data/deeplabv3plusResnet18CamVid.zip”;pretrainedFolder = fullfile (tempdir,“pretrainedNetwork”);pretrainedNetworkZip = fullfile (pretrainedFolder,“deeplabv3plusResnet18CamVid.zip”);如果~存在(pretrainedNetworkZip“文件”mkdir (pretrainedFolder);disp (“下载pretrained网络(58 MB)…”);websave (pretrainedNetworkZip pretrainedURL);结束解压缩(pretrainedNetworkZip pretrainedFolder)

加载pretrained网络。

pretrainedNetwork = fullfile (pretrainedFolder,“deeplabv3plusResnet18CamVid.mat”);data =负载(pretrainedNetwork);网= data.net;

这类网络训练分类列表。

类=字符串(net.Layers(结束). class)
类=11×1的字符串“天空”“建设”、“极”“道路”“路面”“树”“SignSymbol”“栅栏”“车”“行人”“自行车”

执行语义图像分割

读一个图像包含类网络训练的分类。

我= imread (“highway.png”);

调整图像的输入规模网络。

inputSize = net.Layers (1) .InputSize;我= imresize(我inputSize (1:2));

执行语义分割使用semanticseg功能和pretrained网络。

C = semanticseg(我,净);

覆盖图像的分割结果之上labeloverlay。设置覆盖映射到颜色映射值定义的CamVid数据集[2]。

提出= camvidColorMap;我= labeloverlay (C“Colormap”提出,“透明”,0.4);图imshow (B) pixelLabelColorbar(提出、类);

虽然网络对城市的形象pretrained开车,它产生一个合理的结果在公路上驾驶的场景。改善分割结果,应该重新训练网络附加图像包含高速公路驾驶场景。余下的这个例子向您展示了如何使用传输列车语义分割网络学习。

火车一个语义分割网络

这个例子列车Deeplab v3 +网络权值初始化从pre-trained Resnet-18网络。ResNet-18是一种有效的网络,非常适合应用有限的处理资源。其他pretrained网络也可以使用如MobileNet v2或ResNet-50取决于应用程序的需求。更多细节,请参阅Pretrained深层神经网络(深度学习工具箱)

得到一个pretrained Resnet-18,安装resnet18(深度学习工具箱)。安装完成后,运行下面的代码来验证安装是否正确。

resnet18 ();

下载CamVid数据集

从以下网址下载CamVid数据集。

imageURL =“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/files/701_StillsRaw_full.zip”;labelURL =“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/LabeledApproved_full.zip”;outputFolder = fullfile (tempdir,“CamVid”);labelsZip = fullfile (outputFolder,“labels.zip”);imagesZip = fullfile (outputFolder,“images.zip”);如果~存在(labelsZip“文件”)| | ~存在(imagesZip“文件”mkdir (outputFolder) disp (“下载数据集16 MB CamVid标签…”);websave (labelsZip labelURL);解压缩(labelsZip fullfile (outputFolder“标签”));disp (“下载557 MB CamVid数据集图像…”);websave (imagesZip imageURL);解压缩(imagesZip fullfile (outputFolder“图片”));结束

注意:下载数据的时间取决于您的网络连接。上面的命令使用MATLAB直到下载完成。或者,您可以使用web浏览器来第一个数据下载到您的本地磁盘。用你从网上下载的文件,更改outputFolder变量上面下载的文件的位置。

负载CamVid图片

使用imageDatastore加载CamVid图像。的imageDatastore使您能够有效地负载大量的磁盘上的图像。

imgDir = fullfile (outputFolder,“图片”,701 _stillsraw_full);imd = imageDatastore (imgDir);

显示一个图像。

I = readimage (imd, 559);I = histeq(我);imshow(我)

负载CamVid Pixel-Labeled图片

使用pixelLabelDatastore加载CamVid像素标签图像数据。一个pixelLabelDatastore封装了像素标签数据和标签ID到一个类名称映射。

使训练更容易,组32原始类CamVid 11类。

类= [“天空”“建筑”“极”“路”“路面”“树”“SignSymbol”“篱笆”“汽车”“行人”“自行车”];

多个类减少32类到11日从原始数据集被组合在一起。例如,“车”是“汽车”的结合,“SUVPickupTruck”,“Truck_Bus”、“训练”和“OtherMoving”。返回分组标签id使用支持功能万博1manbetxcamvidPixelLabelIDs年底上市这个例子。

labelIDs = camvidPixelLabelIDs ();

使用id来创建类和标签pixelLabelDatastore。

labelDir = fullfile (outputFolder,“标签”);pxds = pixelLabelDatastore (labelDir、类labelIDs);

读取和显示一个pixel-labeled图像覆盖上面的图像。

C = readimage (pxds, 559);提出= camvidColorMap;我= labeloverlay (C“ColorMap”,提出);imshow (B) pixelLabelColorbar(提出、类);

没有颜色叠加的地区没有像素标签和培训期间不习惯。

统计分析数据集

看到CamVid类标签的数据集的分布,使用countEachLabel。这个函数计算像素的数量类标签。

台= countEachLabel (pxds)
台=11×3表名字PixelCount __________ ImagePixelCount * * *售予{‘天空’}7.6801 4.8315 e + e + 07年08年{“建筑”}1.1737 e + 08年4.8315 e + 08年{“极点”}4.7987 4.8315 e + e + 06年08年{‘路’}1.4054 e + 08年4.8453 e + 08年{“路面”}3.3614 4.7209 e + e + 07年08年{‘树’}5.4259 4.479 e + e + 07年08年{‘SignSymbol} 5.2242 4.6863 e + e + 06年08年{“栅栏”}6.9211 2.516 e + e + 06年08年{‘汽车’}2.4437 4.8315 e + e + 07年08年{“行人”}3.4029 4.4444 e + e + 06年08年{“骑自行车”}2.5912 e + e + 08年06 2.6196

可视化类的像素数量。

频率= tbl.PixelCount /笔(tbl.PixelCount);栏(1:元素个数(类),频率)xticks(1:元素个数(类))xticklabels (tbl.Name) xtickangle (45) ylabel (“频率”)

理想情况下,所有类都有一个相同数量的观察。然而,类CamVid不平衡,这是一个常见的问题在汽车数据集的街景。这样的场景有更多的天空、建筑和道路比行人和骑自行车的像素像素,因为天空,建筑物和道路覆盖更多的区域形象。如果不能正确处理,这种不平衡会对学习过程是不利的,因为学习是有偏见的主要类。后来在这个例子中,您将使用类权重来处理这个问题。

CamVid中的图像数据集大小是720 * 960。图像大小选择这样一个足够大的批处理的图像能装入内存在训练一个NVIDIA™泰坦X 12 GB的内存。您可能需要调整图像小尺寸如果你GPU没有足够的内存或减少训练批量大小。

准备培训,验证集和测试集

Deeplab v3 +使用60%的训练数据集的照片。其余的图像分割均匀在20%和20%分别进行验证和测试。下面的代码随机分割图像和像素标签数据输入训练,验证和测试集。

[imdsTrain, imdsVal imdsTest、pxdsTrain pxdsVal, pxdsTest] = partitionCamVidData (imd, pxds);

60/20/20分割结果在以下数量的训练,验证和测试图片:

numTrainingImages =元素个数(imdsTrain.Files)
numTrainingImages = 421
numValImages =元素个数(imdsVal.Files)
numValImages = 140
numTestingImages =元素个数(imdsTest.Files)
numTestingImages = 140

创建网络

使用deeplabv3plusLayers函数创建一个基于ResNet-18 DeepLab v3 +网络。选择最好的网络为您的应用程序需要实证分析和另一个层面的hyperparameter调优。例如,您可以尝试不同的基地网络如ResNet-50或MobileNet v2,或者你可以尝试其他的语义分割SegNet等网络体系结构,完全卷积网络(FCN),或U-Net。

%指定网络图像大小。这通常是一样的训练图像大小。图象尺寸= (720 960 3);%指定类的数量。numClasses =元素个数(类);%创建DeepLab v3 +。numClasses lgraph = deeplabv3plusLayers(图象尺寸,“resnet18”);

平衡类使用类权重

如图所示,在CamVid类不平衡。改善训练,你可以使用类权重平衡类。与早些时候使用像素标签数量计算countEachLabel并计算中值频率类权重。

imageFreq =(资源。PixelCount。/ tbl.ImagePixelCount;classWeights =值(imageFreq)。/ imageFreq
classWeights =11×10.3182 0.2082 5.0924 0.1744 0.7103 0.4175 4.5371 1.8386 1.0000 6.6059⋮

使用指定的类权重pixelClassificationLayer

pxLayer = pixelClassificationLayer (“名字”,“标签”,“类”tbl.Name,“ClassWeights”,classWeights);lgraph = replaceLayer (lgraph,“分类”,pxLayer);

选择培训选项

优化算法用于训练是随机梯度下降法与动量(个)。使用trainingOptions(深度学习工具箱)指定用于个hyper-parameters。

%定义验证数据。dsVal =结合(imdsVal pxdsVal);%定义培训选项。选择= trainingOptions (“个”,“LearnRateSchedule”,“分段”,“LearnRateDropPeriod”10“LearnRateDropFactor”,0.3,“动量”,0.9,“InitialLearnRate”1 e - 3,“L2Regularization”,0.005,“ValidationData”dsVal,“MaxEpochs”30岁的“MiniBatchSize”8“洗牌”,“every-epoch”,“CheckpointPath”tempdir,“VerboseFrequency”2,“阴谋”,“训练进步”,“ValidationPatience”4);

学习速率使用分段的时间表。学习速率是每10时期下降了0.3倍。这允许网络快速学习更高的初始学习速率,而能够找到一个解决方案接近局部最优学习速率下降。

网络测试与验证数据每一时代通过设置“ValidationData”参数。的“ValidationPatience”设置为4时停止训练早验证准确性是收敛的。这可以防止网络过度拟合训练数据集。

mini-batch大小为8是用来减少内存使用,同时培训。你可以增加或减少该值基于GPU内存的数量在您的系统上。

此外,“CheckpointPath”设置为一个临时位置。这个名称-值对支持网络检查点的储蓄,每个培训时代的终结。如果训练中断是由于系统故障或停电时,你可以从保存的检查点恢复训练。确保指定的位置“CheckpointPath”有足够的空间来存储网络的检查点。例如,拯救100 Deeplab v3 +关卡需要~ 6 GB的磁盘空间,因为每个检查点是61 MB。

数据增加

数据增加用于提高网络精度通过随机改变原始数据在训练。通过使用数据,您可以添加更多的各种训练数据不增加标记训练样本的数量。应用相同的随机变换图像和像素标签使用数据存储的数据结合变换。首先,结合imdsTrainpxdsTrain

dsTrain =结合(imdsTrain pxdsTrain);

下一步,使用数据存储变换申请所需的数据扩展中定义的支持功能万博1manbetxaugmentImageAndLabel。这里,随机左/右反射和随机X / Y翻译+ / - 10像素用于数据增大。

xTrans = -10 [10];yTrans = -10 [10];dsTrain =变换(dsTrain @(数据)augmentImageAndLabel(数据、xTrans yTrans));

注意数据增加不是应用于测试和验证数据。理想情况下,测试和验证数据应该代表的原始数据和修改的公正的评价。

开始训练

开始培训使用trainNetwork(深度学习工具箱)如果doTraining国旗是正确的。否则,加载一个pretrained网络。

注意:培训是验证一个NVIDIA™泰坦X 12 GB的GPU内存。如果你的GPU内存更少,培训期间你可能会耗尽内存。如果发生这种情况,尝试设置“MiniBatchSize”1在trainingOptions,或减少网络输入和调整训练数据。培训这个网络大约需要70分钟。根据您的GPU硬件,它可能需要更长的时间。

doTraining = false;如果doTraining[网,信息]= trainNetwork (dsTrain、lgraph选项);结束

测试网络在一个图像

作为一个快速检查、运行网络训练一个测试图像。

I = readimage (imdsTest 35);C = semanticseg(我,净);

显示结果。

我= labeloverlay (C“Colormap”提出,“透明”,0.4);imshow (B) pixelLabelColorbar(提出、类);

比较的结果C存储在预期的地面真理pxdsTest。绿色和红色区域突出区域分割结果不同于预期的地面实况。

expectedResult = readimage (pxdsTest 35);实际= uint8 (C);预期= uint8 (expectedResult);预计imshowpair(实际)

视觉上,语义分割结果重叠等类道路,天空,建筑。然而,小物品,例如行人和汽车是不准确的。重叠的数量可以测量每个类使用intersection-over-union(借据)度量,也被称为Jaccard指数。使用jaccard函数来衡量借据。

借据= jaccard (C, expectedResult);表(类、借据)
ans =11×2表类借据_______ ____“天空”0.93418“建筑”0.86604“极点”0.37524“道路”0.94517“路面”0.85422“树”0.91563“SignSymbol”0.62075“栅栏”0.81075“车”0.71446“行人”0.37249“骑自行车”0.69775

借据度量证实了视觉效果。路,天空,建筑类借据高分数,而类,如行人和汽车低分数。其他常见的细分指标包括骰子bfscore轮廓匹配分数。

评估培训网络

为多个测试图像,测量精度semanticseg在整个测试集。mini-batch大小为4是用来减少内存使用,同时分割图像。你可以增加或减少该值基于GPU内存的数量在您的系统上。

pxdsResults = semanticseg (imdsTest净,“MiniBatchSize”4“WriteLocation”tempdir,“详细”、假);

semanticseg测试集的返回结果pixelLabelDatastore对象。实际的数据为每个测试图像在像素标签imdsTest是在指定的位置写入磁盘吗“WriteLocation”参数。使用evaluateSemanticSegmentation测量语义细分指标测试集的结果。

指标= evaluateSemanticSegmentation (pxdsResults pxdsTest,“详细”、假);

evaluateSemanticSegmentation返回整个数据集的各种指标,单独的类,每个测试图像。数据集水平指标,检查metrics.DataSetMetrics

metrics.DataSetMetrics
ans =表1×5_______ GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU MeanBFScore * * *…………0.89244 0.8657 - 0.66347 0.82837 - 0.69324

数据指标提供一个网络性能的高级概述。看到每一个类对整体性能的影响,检查每个类指标使用metrics.ClassMetrics

metrics.ClassMetrics
ans =11×3表准确性借据MeanBFScore ________ _________ ___________天空建筑0.94272 0.90979 0.90853 0.81488 0.79161 0.63963杆0.93955 0.92638 0.80615 0.75997 0.24632 0.58505道路路面树0.90048 0.73874 0.74538 0.88173 0.7746 0.72892汽车栅栏SignSymbol 0.76491 0.42338 0.53707 0.83661 0.57442 0.5567 0.92588 0.79441 - 0.74331行人自行车0.86718 0.47077 0.64356 0.88881 0.6478 0.59473

虽然数据集的整体性能相当高,类指标显示,弱势类等行人,骑自行车,不分段以及类等,天空,建筑。额外的数据,包括更多的弱势类样本可能有助于改善结果。

万博1manbetx支持功能

函数labelIDs = camvidPixelLabelIDs ()%返回标签id对应于每个类。%% CamVid数据集有32类。成11类%原SegNet训练方法[1]。%%的11类:%的“天空”“建筑”,“极”,“路”,“路面”、“树”、“SignSymbol”,%“栅栏”,“车”、“行人”,“骑自行车”。%% CamVid像素标签id作为RGB颜色值提供。集团成% 11类并返回它们的单元阵列M-by-3矩阵。的%原CamVid列出类名与每一个RGB值。请注意%,其他/无效类下面被排除在外。labelIDs = {%的“天空”(128 128 128;%的“天空”]%“建设”(000 128 064;%“桥”128 000 000;%“建设”064 192 000;%的“墙”064 000 064;%的“隧道”192 000 128;%的“拱门”]%“极”(192 192 128;%”Column_Pole”000 000 064;%”TrafficCone”]%的道路(128 064 128;%的“路”128 000 192;%”LaneMkgsDriv”192 000 064;%”LaneMkgsNonDriv”]%“路面”(000 000 192;%“人行道”064 192 128;%”ParkingBlock”128 128 192;%”RoadShoulder”]%的“树”(128 128 000;%的“树”192 192 000;%”VegetationMisc”]%”SignSymbol”(192 128 128;%”SignSymbol”128 128 064;%”Misc_Text”000 064 064;%”TrafficLight”]%“栅栏”(064 064 128;%“栅栏”]%的“汽车”(064 000 128;%的“汽车”064 128 192;%”SUVPickupTruck”192 128 192;%”Truck_Bus”192 064 128;%“训练”128 064 064;%”OtherMoving”]%“行人”(064 064 000;%“行人”192 128 064;%的“孩子”064 000 192;%”CartLuggagePram”064 128 064;%的“动物”]%“自行车”(000 128 192;%“自行车”192 000 192;%”MotorcycleScooter”]};结束
函数一会pixelLabelColorbar(提出)% colorbar添加到当前轴。colorbar是格式化%显示类名与颜色。甘氨胆酸colormap(提出)% colorbar添加到当前的图。c = colorbar (“对等”甘氨胆酸,);%为刻度线使用类名。c。TickLabels =一会;numClasses =大小(提出,1);%中心标记标签。c。蜱虫= 1 / (numClasses * 2): 1 / numClasses: 1;%去除刻度线。c。TickLength = 0;结束
函数提出= camvidColorMap ()%定义colormap CamVid所使用的数据集。提出= (128 128 128%的天空128 0 0%的建筑192 192 192%极128 64 128%的道路60 40 222%的人行道上128 128 0%的树192 128 128% SignSymbol64 64 128%的栅栏64 0 128%的车64 64 0%行人0 128 192%骑自行车];%(0 1)之间的正常化。提出255 =提出。/;结束
函数[imdsTrain, imdsVal imdsTest、pxdsTrain pxdsVal, pxdsTest] = partitionCamVidData (imd pxds)%分区CamVid数据通过随机选择60%的数据进行训练。的%休息是用于测试。%设置初始随机状态例如再现性。rng (0);numFiles =元素个数(imds.Files);shuffledIndices = randperm (numFiles);%使用60%的图像进行训练。numTrain =圆(0.60 * numFiles);trainingIdx = shuffledIndices (1: numTrain);%使用20%的图像进行验证numVal =圆(0.20 * numFiles);valIdx = shuffledIndices (numTrain + 1: numTrain + numVal);%使用其余的测试。testIdx = shuffledIndices (numTrain + numVal + 1:结束);%创建图像数据存储进行训练和测试。trainingImages = imds.Files (trainingIdx);valImages = imds.Files (valIdx);testImages = imds.Files (testIdx);imdsTrain = imageDatastore (trainingImages);imdsVal = imageDatastore (valImages);imdsTest = imageDatastore (testImages);%提取类和标签id信息。类= pxds.ClassNames;labelIDs = camvidPixelLabelIDs ();%建立像素标签数据存储进行训练和测试。trainingLabels = pxds.Files (trainingIdx);valLabels = pxds.Files (valIdx);testLabels = pxds.Files (testIdx);pxdsTrain = pixelLabelDatastore (trainingLabels、类labelIDs);pxdsVal = pixelLabelDatastore (valLabels、类labelIDs);pxdsTest = pixelLabelDatastore (testLabels、类labelIDs);结束
函数data = augmentImageAndLabel(数据、xTrans yTrans)%增加图像和像素标签使用随机反射和图像%的翻译。i = 1:尺寸(数据,1)tform = randomAffine2d (“XReflection”,真的,“XTranslation”xTrans,“YTranslation”,yTrans);%中心视图输出空间中图像的中心%允许翻译将视图的输出图像。溃败= affineOutputView(大小(数据{我1}),tform,“BoundsStyle”,“centerOutput”);%扭曲图像和像素标签使用相同的变换。{我1}= imwarp(数据{1}我,tform,“OutputView”,溃败);{我2}= imwarp(数据{2}我,tform,“OutputView”,溃败);结束结束

引用

[1],Liang-Chieh et al。”与深黑色的分离卷积Encoder-Decoder语义图像分割。“大会(2018)。

[2]Brostow g J。,J. Fauqueur, and R. Cipolla. "Semantic object classes in video: A high-definition ground truth database."模式识别的字母。问题2卷。30日,2009年,页88 - 97。

另请参阅

|||||||(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|

相关的话题