主要内容

使用扩张卷积的语义分割

使用扩张卷积训练语义分割网络。

语义分割网络对图像中的每个像素进行分类,从而得到按类分割的图像。语义分割的应用包括用于自动驾驶的道路分割和用于医疗诊断的癌细胞分割。要了解更多信息,请参见开始使用深度学习进行语义分割

像DeepLab[1]这样的语义分割网络广泛使用了扩张卷积(也称为atrous卷积),因为它们可以在不增加参数或计算数量的情况下增加层的接受域(层可以看到的输入区域)。

负荷训练数据

该示例使用一个简单的32x32三角形图像数据集进行演示。数据集包括随附的像素标签地面真相数据。加载训练数据imageDatastore和一个pixelLabelDatastore

dataFolder = fullfile(toolboxdir(“愿景”),“visiondata”“triangleImages”);imageFolderTrain = fullfile(数据文件夹,“trainingImages”);labelFolderTrain = fullfile(数据文件夹,“trainingLabels”);

创建一个imageDatastore图片。

imdsTrain = imageDatastore(imageFolderTrain);

创建一个pixelLabelDatastore对于ground truth像素标签。

classNames = [“三角形”“背景”];标签= [255 0];pxdsTrain = pixelLabelDatastore(标签foldertrain,classNames,标签)
pxdsTrain = PixelLabelDatastore with properties: Files: {200x1 cell} ClassNames: {2x1 cell} ReadSize: 1 ReadFcn: @readDatastoreImage AlternateFileSystemRoots: {}

创建语义分割网络

这个例子使用了一个简单的基于扩张卷积的语义分割网络。

为训练数据创建一个数据源,并获取每个标签的像素计数。

ds = combine(imdsTrain,pxdsTrain);tbl = countEachLabel(pxdsTrain)
台=2×3表名字PixelCount ImagePixelCount  ______________ __________ _______________ {' 三角形的}10326 2.048 e + 05年{‘背景’}1.9447 e + 05年2.048 e + 05

大多数像素标签用于背景。这种阶级不平衡使学习过程偏向优势阶级。要解决这个问题,可以使用类加权来平衡类。您可以使用几种方法来计算类的权重。一种常见的方法是逆频率加权,其中类权重是类频率的逆。此方法增加了给予未表示类的权重。使用逆频率加权计算类权重。

numberPixels = sum(tbl.PixelCount);频率= tbl。PixelCount / numberPixels;classWeights = 1 ./ frequency;

使用与输入图像大小对应的输入大小的图像输入层创建用于像素分类的网络。接下来,指定卷积、批处理归一化和ReLU层的三个块。对于每个卷积层,指定32个增加膨胀因子的3 × 3滤波器,并填充输入,使它们与输出大小相同“填充”选项“相同”.要对像素进行分类,需要包含卷积层K1 × 1卷积,其中K是类的数量,后面是一个softmax层和一个pixelClassificationLayer用逆类权值。

inputSize = [32 32 1];filterSize = 3;numFilters = 32;numClasses = numel(classNames);图层= [imageInputLayer(inputSize) convolution2dLayer(filterSize,numFilters,“DilationFactor”, 1“填充”“相同”卷积2dlayer (filterSize,numFilters,“DilationFactor”2,“填充”“相同”卷积2dlayer (filterSize,numFilters,“DilationFactor”4“填充”“相同”batchNormalizationLayer reluLayer convolution2dLayer(1,numClasses)“类”一会,“ClassWeights”classWeights)];

列车网络的

指定培训选项。

选项= trainingOptions(“个”...“MaxEpochs”, 100,...“MiniBatchSize”, 64,...“InitialLearnRate”1 e - 3);

使用trainNetwork

net = trainNetwork(ds,layers,options);
单CPU训练。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |丧失准确性  | |========================================================================================| | 1 | 1 | 00:00:01 | 91.62% | 1.6825 | 0.0010 | | 17 | 50 | 00:00:17 | 88.56% | 0.2393 | 0.0010 | | 100 | | 00:00:29 | 92.08% | 0.1672 | 0.0010 | | 150 | | 00:00:41 | 93.17% | 0.1472 |0.0010 | 67 | 200 | | 00:00:54 | 94.15% | 0.1313 | 0.0010 | 84 | 250 | | 00:01:06 | 94.47% | 0.1167 | 0.0010 | 100 | 300 | | 00:01:18 | | 0.1100 | 0.0010 95.04%  | |========================================================================================| 培训完成:马克思时代完成。

测试网络

加载测试数据。创建一个imageDatastore图片。创建一个pixelLabelDatastore对于ground truth像素标签。

imageFolderTest = fullfile(数据文件夹,“testImages”);imdsTest = imageDatastore(imageFolderTest);labelFolderTest = fullfile(数据文件夹,“testLabels”);pxdsTest = pixelLabelDatastore(labelFolderTest,classNames,labels);

利用测试数据和训练过的网络进行预测。

pxdsPred = semanticseg(imdsTest,net,“MiniBatchSize”32岁的“WriteLocation”, tempdir);
运行的语义分割网络  ------------------------------------- * 100张图片处理。

评估预测精度evaluateSemanticSegmentation

metrics = evaluateSemanticSegmentation(pxdsPred,pxdsTest);
评估语义分割结果---------------------------------------- *选择的指标:全局精度,类别精度,IoU,加权IoU, BF分数。*处理了100张图像。*完成……完成了。*数据集指标:GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU MeanBFScore  ______________ ____________ _______ ___________ ___________ 0.95237 0.97352 0.72081 0.92889 0.46416

有关评估语义分割网络的更多信息,请参见evaluateSemanticSegmentation

新图像

读取并显示测试图像triangleTest.jpg

imgTest = imread(“triangleTest.jpg”);图imshow (imgTest)

图中包含一个轴对象。axis对象包含一个image类型的对象。

分割测试图像使用semanticseg并使用显示结果labeloverlay

C = semanticseg(imgTest,net);B = labeloverlay(imgTest,C);图imshow (B)

图中包含一个轴对象。axis对象包含一个image类型的对象。