主要内容

使用扩展卷积的语义分割

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

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

像Deeplab [1]这样的语义分割网络使得扩张卷曲(也称为不足卷积)的广泛使用,因为它们可以增加层的接收场(层可以看到的输入区域)而不增加参数的数量或计算。

负荷训练数据

该示例使用一个简单的32 × 32三角形图像数据集进行演示。该数据集包括相应的像素标签地面真实数据。使用imageDatastore和一个pixelLabelDatastore

datafolder = fullfile(toolboxdir('想象'),'VisionData'“triangleImages”);imageFolderTrain = fullfile (dataFolder,'培训码');labelFolderTrain = fullfile (dataFolder,'训练标签');

创建一个imageDatastore对于图像。

imdsTrain = imageDatastore (imageFolderTrain);

创建一个pixelLabelDatastore用于地面真实像素标签。

一会= [“三角形”“背景”];标签= [255 0];pxdstrain = pixellabeldataStore(LabelfoltTrain,ClassNames,标签)
pxdstrain = pixellabeldataStore与属性:文件:{200x1 cell} classNames:{2x1 cell} readsize:1 readfcn:@readdataStoreimage alternatefilesystemroots:{}

创建语义分段网络

此示例使用基于扩展卷积的简单语义分段网络。

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

pximdstrain = pixellabelimagedataStore(imdstrain,pxdstrain);TBL = CONSECHANCELABEL(PXDSTRAIN)
TBL =.2×3表名称pixelcount imagepixelcount ______________ _________________________ {'triangle'} 10326 2.048E + 05 {'背景'} 1.9447E + 05 2.048E + 05

大多数像素标签用于背景。此类不平衡偏见了学习过程,支持主导类。要解决此问题,请使用类加权来平衡类。您可以使用多种方法来计算类权重。一种常用方法是逆频加权,其中类权重是类频率的倒数。该方法增加了所代表的类别的重量。使用逆频加权计算类重量。

numberpixels = sum(tbl.pixelcount);频率= tbl.pixelcount / numperspixels;Classweights = 1 ./频率;

使用与输入图像大小相对应的图像输入层,创建用于像素分类的网络。接下来,指定三个卷积块、批标准化和ReLU层。对于每个卷积层,指定32个具有递增膨胀因子的3 × 3滤波器,并通过设置'填充'选项“相同”.要对像素进行分类,包括一个卷积层K.1比1卷积,在哪里K.是类的数量,后跟一个softmax层和一个PixelclassificationLayer.逆类权值。

inputSize = [32 32 1];filterSize = 3;numFilters = 32;numClasses =元素个数(类名);[imageInputLayer(inputSize)卷积2dlayer (filterSize,numFilters, numFilters,“DilationFactor”, 1'填充'“相同”)BatchnormalizationLayer Rufulayer Convolution2dlayer(过滤,NumFilters,“DilationFactor”2,'填充'“相同”)BatchnormalizationLayer Rufulayer Convolution2dlayer(过滤,NumFilters,“DilationFactor”4'填充'“相同”) batchNormalizationLayer reluLayer卷积2dlayer (1,numClasses) softmaxLayer pixelClassificationLayer(“类”一会,'classweight'classWeights)];

火车网络

指定培训选项。

选择= trainingOptions ('sgdm'......'maxepochs',100,......'minibatchsize', 64,......'italllearnrate',1E-3);

使用培训网络Trainnetwork.

net = trainnetwork(pximdstrain,图层,选项);
单CPU培训。初始化输入数据规范化。|========================================================================================| | 时代| |迭代时间| Mini-batch | Mini-batch |基地学习  | | | | ( hh: mm: ss) | | |丧失准确性  | |========================================================================================| | 1 | 1 |就是| | 1.6825 | 0.0010 91.62%| | 17 | 50 | 00:00:17 | 88.56% | 0.2393 | 0.0010 | | 34 | 100 | 00:00:34 | 92.08% | 0.1672 | 0.0010 | | 50 | 150 | 00:00:51 | 93.17% | 0.1472 | 0.0010 | | 67 | 200 | 00:01:08 | 94.15% | 0.1313 | 0.0010 | | 84 | 250 | 00:01:24 | 94.47% | 0.1167 | 0.0010 | | 100 | 300 | 00:01:42 | 95.04% | 0.1100 | 0.0010 | |========================================================================================|

测试网络

加载测试数据。创建一个imageDatastore对于图像。创建一个pixelLabelDatastore用于地面真实像素标签。

imagefoldertest = fullfile(datafolder,“testImages”);imdstest = imageageataStore(imagefoldertest);labelfoldertest = fullfile(datafolder,'testlabels');pxdstest = pixellabeldataStore(Labelfoldert,ClassNames,标签);

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

pxdsPred = semanticseg (imdsTest净,'minibatchsize',32,'writeelocation',Tempdir);
运行语义分割网络------------------------------- * Processed 100图像。

使用预测精度评估预测精度评估评估

指标= evaluateSemanticSegmentation (pxdsPred pxdsTest);
评估语义分割结果--------------------------------- *所选指标:全球准确性,课程准确性,iou,加权iou,bf得分。*处理100个图像。*完成......完成。*数据集指标:GlobalAccuracy意味着意思意味着Weirceediou含义___________________________ 0.97352 0.46416 0.46416 0.46416

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

分段新映像

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

imgtest = imread('triangletest.jpg');图imshow(imgtest)

图包含轴。轴包含类型图像的对象。

段使用测试图像SemanticSeg.并使用显示结果Labeloverlay.

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

图包含轴。轴包含类型图像的对象。