主要内容gydF4y2Ba

火车深度学习的语义分割网络使用3 d仿真数据gydF4y2Ba

这个例子展示了如何使用3 d仿真数据来训练一个语义分割网络和现实世界的数据调整它使用生成对抗网络(甘斯)。gydF4y2Ba

这个示例使用3 d仿真数据生成的驾驶场景设计师和虚幻引擎®。这样的一个例子,演示如何生成仿真数据,看看gydF4y2Ba深度和语义分割使用虚幻引擎模拟可视化gydF4y2Ba(自动驾驶工具箱)gydF4y2Ba。生成图像的三维仿真环境和相应的地面实况像素标签。使用模拟数据避免了注释过程,既繁琐,需要大量的人力物力。然而,域名转移模型只能模拟训练数据上表现不佳的现实世界的数据集。为了解决这个问题,您可以使用域适应调整训练模型做一个真实的数据集。gydF4y2Ba

这个示例使用AdaptSegNet [gydF4y2Ba1gydF4y2Ba),适应的网络输出的结构分割预测,这看起来像无论输入域。AdaptSegNet网络是基于氮化镓的两个网络模型,由训练有素的同时最大化的性能:gydF4y2Ba

  1. 发电机——网络训练生成高质量的真实或模拟输入图像分割结果gydF4y2Ba

  2. 鉴频器,网络比较并试图区分生成器的细分预测是否真实或模拟数据gydF4y2Ba

微调AdaptSegNet模型对于现实世界的数据,这个示例使用的一个子集gydF4y2BaCamVid数据gydF4y2Ba(gydF4y2Ba2gydF4y2Ba)和适应模型生成高质量的分类预测CamVid数据。gydF4y2Ba

下载Pretrained网络gydF4y2Ba

下载pretrained网络。pretrained模型允许您运行整个示例,而不必等待培训完成。如果你想训练网络,设置gydF4y2BadoTraininggydF4y2Ba变量来gydF4y2Ba真正的gydF4y2Ba。gydF4y2Ba

doTraining = false;gydF4y2Ba如果gydF4y2Ba~ doTraining pretrainedURL =gydF4y2Ba“https://ssd.mathworks.com/万博1manbetxsupportfiles/vision/data/trainedAdaptSegGANNet.mat”gydF4y2Ba;pretrainedFolder = fullfile (tempdir,gydF4y2Ba“pretrainedNetwork”gydF4y2Ba);pretrainedNetwork = fullfile (pretrainedFolder,gydF4y2Ba“trainedAdaptSegGANNet.mat”gydF4y2Ba);gydF4y2Ba如果gydF4y2Ba~存在(pretrainedNetworkgydF4y2Ba“文件”gydF4y2Bamkdir (pretrainedFolder);disp (gydF4y2Ba“下载pretrained网络(57 MB)…”gydF4y2Ba);websave (pretrainedNetwork pretrainedURL);gydF4y2Ba结束gydF4y2Bapretrained =负载(pretrainedNetwork);dlnetGenerator = pretrained.dlnetGenerator;gydF4y2Ba结束gydF4y2Ba

下载数据集gydF4y2Ba

下载模拟和实际数据集使用gydF4y2BadownloadDatasetgydF4y2Ba支持功能部分中定义的函数,这个例子。万博1manbetx的gydF4y2BadownloadDatasetgydF4y2Ba功能下载整个CamVid数据集和数据分割成训练集和测试集。gydF4y2Ba

驾驶场景生成的模拟数据集是设计师。生成的场景,包括553逼真图像标签,被不真实的呈现引擎。你使用这个数据集来训练模型。gydF4y2Ba

真实数据集的一个子集CamVid从剑桥大学的数据集。该模型适应真实世界的数据,69 CamVid图像。评估训练模型,使用368 CamVid图像。gydF4y2Ba

下载时间取决于您的网络连接。gydF4y2Ba

simulationDataURL =gydF4y2Ba“https://ssd.mathworks.com/万博1manbetxsupportfiles/vision/data/SimulationDrivingDataset.zip”gydF4y2Ba;realImageDataURL =gydF4y2Ba“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/files/701_StillsRaw_full.zip”gydF4y2Ba;realLabelDataURL =gydF4y2Ba“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/LabeledApproved_full.zip”gydF4y2Ba;simulationDataLocation = fullfile (tempdir,gydF4y2Ba“SimulationData”gydF4y2Ba);realDataLocation = fullfile (tempdir,gydF4y2Ba“RealData”gydF4y2Ba);[simulationImagesFolder, simulationLabelsFolder realImagesFolder realLabelsFolder,gydF4y2Ba…gydF4y2BarealTestImagesFolder realTestLabelsFolder] =gydF4y2Ba…gydF4y2BadownloadDataset (simulationDataLocation、simulationDataURL realDataLocation、realImageDataURL realLabelDataURL);gydF4y2Ba

下载文件包括像素标签为真正的域,但请注意,您不使用这些像素标签在训练过程中。这个示例使用真正的域像素标签只计算均值交叉在联盟(借据)值来评估培训的有效性模型。gydF4y2Ba

负载模拟和真实的数据gydF4y2Ba

使用gydF4y2BaimageDatastoregydF4y2Ba加载模拟和实际数据集进行训练。通过使用一个图像数据存储,您可以有效地负载大量的磁盘上的图像。gydF4y2Ba

simData = imageDatastore (simulationImagesFolder);realData = imageDatastore (realImagesFolder);gydF4y2Ba

预览图像的模拟数据集和真实数据集。gydF4y2Ba

simImage =预览(simData);realImage =预览(realData);蒙太奇({simImage, realImage})gydF4y2Ba

真实和模拟图像看起来很不同。因此,模型训练模拟数据,评估实际数据由于表现不佳域的转变。gydF4y2Ba

模拟数据和真实数据加载Pixel-Labeled图像gydF4y2Ba

通过使用加载模拟像素标签图像数据gydF4y2BapixelLabelDatastoregydF4y2Ba(计算机视觉工具箱)gydF4y2Ba。一个像素标签数据存储封装了像素标签数据和标签ID到一个类名称映射。gydF4y2Ba

对于这个示例,用于自动驾驶应用程序指定五类:路,背景,人行道上,天空,和汽车。gydF4y2Ba

类= [gydF4y2Ba“路”gydF4y2Ba“背景”gydF4y2Ba“路面”gydF4y2Ba“天空”gydF4y2Ba“汽车”gydF4y2Ba];numClasses =元素个数(类);gydF4y2Ba

模拟数据集有八类。减少的数量从8 - 5类分组,树,交通信号,光从原数据集到一个类背景类。返回分组标签id使用helper函数gydF4y2BasimulationPixelLabelIDsgydF4y2Ba。这个helper函数附加到的例子作为支持文件。万博1manbetxgydF4y2Ba

labelIDs = simulationPixelLabelIDs;gydF4y2Ba

使用的类和标签id来创建一个像素标签仿真数据的数据存储。gydF4y2Ba

simLabels = pixelLabelDatastore (simulationLabelsFolder、类labelIDs);gydF4y2Ba

初始化分割图像的colormap使用helper函数gydF4y2BadomainAdaptationColorMapgydF4y2Ba,支持函数中定义的部分。万博1manbetxgydF4y2Ba

深度贴图= domainAdaptationColorMap;gydF4y2Ba

通过覆盖标签预览pixel-labeled图像图像的使用gydF4y2BalabeloverlaygydF4y2Ba(图像处理工具箱)gydF4y2Ba函数。gydF4y2Ba

simImageLabel =预览(simLabels);overlayImageSimulation = labeloverlay (simImage simImageLabel,gydF4y2Ba“ColorMap”gydF4y2Ba、深度贴图);图imshow (overlayImageSimulation) labelColorbar(深度贴图、类);gydF4y2Ba

仿真和实际数据用于训练转向零中心,中心周围的数据来源,通过使用gydF4y2Ba变换gydF4y2Ba函数和gydF4y2BapreprocessDatagydF4y2Ba中定义的helper函数,支持功能部分。万博1manbetxgydF4y2Ba

preprocessedSimData =变换(simData @ (simData) preprocessData (simData));preprocessedRealData =变换(realData @ (realData) preprocessData (realData));gydF4y2Ba

使用gydF4y2Ba结合gydF4y2Ba函数将转换后的图像数据存储和像素标签模拟域的数据存储。训练过程不使用真实数据的像素标签。gydF4y2Ba

combinedSimData =结合(preprocessedSimData simLabels);gydF4y2Ba

定义AdaptSegNet发电机gydF4y2Ba

这个示例修改VGG-16网络pretrained ImageNet完全卷积网络。扩大接受字段,扩张卷积层2和4添加的步伐。这使得输出特性映射分辨率输入大小的八分之一。深黑色的空间金字塔池(ASPP)是用于提供多尺度信息,紧随其后的是一个gydF4y2Baresize2dlayergydF4y2Ba的upsampling因子8调整输出输入的大小。gydF4y2Ba

AdaptSegNet生成器中使用网络这个例子见下图。gydF4y2Ba

Adapseg_diagram_proposal.pnggydF4y2Ba

得到一个pretrained VGG-16网络,安装gydF4y2Bavgg16gydF4y2Ba。如果支持包没有万博1manbetx安装,那么软件提供一个下载链接。gydF4y2Ba

网= vgg16;gydF4y2Ba

使VGG-16网络适用于语义分割,删除所有VGG层之后gydF4y2Ba“relu4_3”gydF4y2Ba。gydF4y2Ba

vggLayers = net.Layers (24);gydF4y2Ba

创建一个图像输入层的大小由- 720 - 1280 -发电机- 3。gydF4y2Ba

inputSizeGenerator = (1280 720 3);inputLayer = imageInputLayer (inputSizeGenerator,gydF4y2Ba“归一化”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“inputLayer”gydF4y2Ba);gydF4y2Ba

创建完全卷积网络层。使用膨胀的因素2和4扩大各自的领域。gydF4y2Ba

fcnlayers = [convolution2dLayer (3 [3], 360,gydF4y2Ba“DilationFactor”gydF4y2Ba(2 - 2),gydF4y2Ba“填充”gydF4y2Ba(2 2 2 2),gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“conv5_1”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“零”gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu5_1”gydF4y2Ba3)convolution2dLayer([3], 360年,gydF4y2Ba“DilationFactor”gydF4y2Ba(2 - 2),gydF4y2Ba“填充”gydF4y2Ba(2 2 2 2),gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“conv5_2”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“零”gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu5_2”gydF4y2Ba3)convolution2dLayer([3], 360年,gydF4y2Ba“DilationFactor”gydF4y2Ba(2 - 2),gydF4y2Ba“填充”gydF4y2Ba(2 2 2 2),gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“conv5_3”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“零”gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu5_3”gydF4y2Ba3)convolution2dLayer([3], 480年,gydF4y2Ba“DilationFactor”gydF4y2Ba(4 - 4),gydF4y2Ba“填充”gydF4y2Ba(4 4 4 4),gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“conv6_1”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“零”gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu6_1”gydF4y2Ba3)convolution2dLayer([3], 480年,gydF4y2Ba“DilationFactor”gydF4y2Ba(4 - 4),gydF4y2Ba“填充”gydF4y2Ba(4 4 4 4),gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“conv6_2”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“零”gydF4y2Ba)reluLayer (gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“relu6_2”gydF4y2Ba));gydF4y2Ba

结合层和创建层图。gydF4y2Ba

层= [inputLayer vggLayers fcnlayers];lgraph = layerGraph(层);gydF4y2Ba

ASPP用于提供多尺度信息。ASPP模块添加到图层图表和一个过滤器的大小等于通道使用的数量gydF4y2BaaddASPPToNetworkgydF4y2Ba中定义的helper函数,支持功能部分。万博1manbetxgydF4y2Ba

lgraph = addASPPToNetwork (lgraph numClasses);gydF4y2Ba

应用gydF4y2Baresize2dLayergydF4y2Ba与upsampling因子8输出匹配输入的大小。gydF4y2Ba

upSampleLayer = resize2dLayer (gydF4y2Ba“规模”gydF4y2Ba8gydF4y2Ba“方法”gydF4y2Ba,gydF4y2Ba双线性的gydF4y2Ba,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“resizeLayer”gydF4y2Ba);lgraphGenerator = addLayers (lgraph upSampleLayer);lgraphGenerator = connectLayers (lgraphGenerator,gydF4y2Ba“additionLayer”gydF4y2Ba,gydF4y2Ba“resizeLayer”gydF4y2Ba);gydF4y2Ba

可视化发电机网络在一个阴谋。gydF4y2Ba

情节(lgraphGenerator)标题(gydF4y2Ba“发电机”gydF4y2Ba)gydF4y2Ba

定义AdaptSeg鉴频器gydF4y2Ba

鉴频器网络包括五个卷积与内核层3和2的步幅的大小,在通道的数量是{64、128、256、512、1}。每一层是紧随其后的是一个漏水的ReLU层参数化的规模0.2,除了最后一层。gydF4y2Baresize2dLayergydF4y2Ba是用来调整鉴频器的输出。注意,本例中没有使用批处理规范化,作为鉴别器联合训练与分割网络使用一个小批量的大小。gydF4y2Ba

AdaptSegNet鉴别器网络在这个例子见下图。gydF4y2Ba

Adapseg_Discriminator_diagram_proposal.jpggydF4y2Ba

创建一个图像输入层的大小1280 - - - 720gydF4y2BanumClassesgydF4y2Ba这需要细分预测的仿真和实际领域。gydF4y2Ba

inputSizeDiscriminator = [1280 720 numClasses];gydF4y2Ba

创建完全卷积层和生成鉴别器层图。gydF4y2Ba

%因素卷积的通道数层。gydF4y2BanumChannelsFactor = 64;gydF4y2Ba%比例因子来调整鉴频器的输出。gydF4y2BaresizeScale = 64;gydF4y2Ba%标量乘法器为漏ReLU层。gydF4y2BaleakyReLUScale = 0.2;gydF4y2Ba%的创建层鉴别器。gydF4y2Ba层= [imageInputLayer inputSizeDiscriminator,gydF4y2Ba“归一化”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“inputLayer”gydF4y2Ba)convolution2dLayer (3 numChannelsFactorgydF4y2Ba“步”gydF4y2Ba2,gydF4y2Ba“填充”gydF4y2Ba,1gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“conv1”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba)leakyReluLayer (leakyReLUScalegydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“lrelu1”gydF4y2Ba)convolution2dLayer (3 numChannelsFactor * 2gydF4y2Ba“步”gydF4y2Ba2,gydF4y2Ba“填充”gydF4y2Ba,1gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“conv2”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba)leakyReluLayer (leakyReLUScalegydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“lrelu2”gydF4y2Ba)convolution2dLayer (3 numChannelsFactor * 4gydF4y2Ba“步”gydF4y2Ba2,gydF4y2Ba“填充”gydF4y2Ba,1gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“conv3”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba)leakyReluLayer (leakyReLUScalegydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“lrelu3”gydF4y2Ba)convolution2dLayer (3, numChannelsFactor * 8,gydF4y2Ba“步”gydF4y2Ba2,gydF4y2Ba“填充”gydF4y2Ba,1gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“conv4”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba)leakyReluLayer (leakyReLUScalegydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“lrelu4”gydF4y2Ba)convolution2dLayer (3、1gydF4y2Ba“步”gydF4y2Ba2,gydF4y2Ba“填充”gydF4y2Ba,1gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“classifer”gydF4y2Ba,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba)resize2dLayer (gydF4y2Ba“规模”gydF4y2BaresizeScale,gydF4y2Ba“方法”gydF4y2Ba,gydF4y2Ba双线性的gydF4y2Ba,gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“resizeLayer”gydF4y2Ba);];gydF4y2Ba%创建鉴别器的层图。gydF4y2BalgraphDiscriminator = layerGraph(层);gydF4y2Ba

可视化鉴别器网络在一个阴谋。gydF4y2Ba

情节(lgraphDiscriminator)标题(gydF4y2Ba“鉴频器”gydF4y2Ba)gydF4y2Ba

指定培训选项gydF4y2Ba

指定这些训练选项。gydF4y2Ba

  • 设置迭代的总数gydF4y2Ba5000年gydF4y2Ba。通过这样做,你的火车大约10网络时代。gydF4y2Ba

  • 发电机的学习速率gydF4y2Ba2.5的军医gydF4y2Ba。gydF4y2Ba

  • 鉴频器的学习速率gydF4y2Ba1的军医gydF4y2Ba。gydF4y2Ba

  • 设置L2正则化因子gydF4y2Ba0.0005gydF4y2Ba。gydF4y2Ba

  • 学习速率成倍减少基于公式gydF4y2Ba lgydF4y2Ba egydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba ngydF4y2Ba 我gydF4y2Ba ngydF4y2Ba ggydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba egydF4y2Ba ×gydF4y2Ba (gydF4y2Ba 我gydF4y2Ba tgydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba 我gydF4y2Ba ogydF4y2Ba ngydF4y2Ba tgydF4y2Ba ogydF4y2Ba tgydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba 我gydF4y2Ba tgydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba 我gydF4y2Ba ogydF4y2Ba ngydF4y2Ba 年代gydF4y2Ba ]gydF4y2Ba pgydF4y2Ba ogydF4y2Ba wgydF4y2Ba egydF4y2Ba rgydF4y2Ba 。这有助于减少稳定在较高的迭代梯度。设置的权力gydF4y2Ba0.9gydF4y2Ba。gydF4y2Ba

  • 敌对的重量损失gydF4y2Ba0.001gydF4y2Ba。gydF4y2Ba

  • 初始化的速度梯度gydF4y2Ba[]gydF4y2Ba。这个值被个存储的速度梯度。gydF4y2Ba

  • 初始化参数梯度的移动平均线gydF4y2Ba[]gydF4y2Ba。这个值被亚当初始化存储参数梯度的平均值。gydF4y2Ba

  • 初始化参数梯度平方的移动平均gydF4y2Ba[]gydF4y2Ba。这个值被亚当初始化存储参数梯度平方的平均值。gydF4y2Ba

  • 设置mini-batch大小gydF4y2Ba1gydF4y2Ba。gydF4y2Ba

numIterations = 5000;learnRateGenBase = 2.5的军医;learnRateDisBase = 1的军医;l2Regularization = 0.0005;权力= 0.9;lamdaAdv = 0.001;韦尔= [];averageGrad = [];averageSqGrad = [];miniBatchSize = 1;gydF4y2Ba

火车在GPU上,如果一个是可用的。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。自动检测你是否有空GPU,集gydF4y2BaexecutionEnvironmentgydF4y2Ba来gydF4y2Ba“汽车”gydF4y2Ba。如果你没有一个GPU,或不希望使用一个用于培训,集gydF4y2BaexecutionEnvironmentgydF4y2Ba来gydF4y2Ba“cpu”gydF4y2Ba。为了确保培训使用GPU,集gydF4y2BaexecutionEnvironmentgydF4y2Ba来gydF4y2Ba“图形”gydF4y2Ba。关于支持计算能力的信息,看到万博1manbetxgydF4y2BaGPU计算的需求gydF4y2Ba(并行计算工具箱)gydF4y2Ba。gydF4y2Ba

executionEnvironment =gydF4y2Ba“汽车”gydF4y2Ba;gydF4y2Ba

创建gydF4y2BaminibatchqueuegydF4y2Ba从仿真领域的综合数据存储对象。gydF4y2Ba

mbqTrainingDataSimulation = minibatchqueue (combinedSimData,gydF4y2Ba“MiniBatchSize”gydF4y2BaminiBatchSize,gydF4y2Ba…gydF4y2Ba“MiniBatchFormat”gydF4y2Ba,gydF4y2Ba“SSCB”gydF4y2Ba,gydF4y2Ba“OutputEnvironment”gydF4y2Ba,executionEnvironment);gydF4y2Ba

创建gydF4y2BaminibatchqueuegydF4y2Ba从输入图像数据存储对象的域。gydF4y2Ba

mbqTrainingDataReal = minibatchqueue (preprocessedRealData,gydF4y2Ba“MiniBatchSize”gydF4y2BaminiBatchSize,gydF4y2Ba…gydF4y2Ba“MiniBatchFormat”gydF4y2Ba,gydF4y2Ba“SSCB”gydF4y2Ba,gydF4y2Ba“OutputEnvironment”gydF4y2Ba,executionEnvironment);gydF4y2Ba

火车模型gydF4y2Ba

火车模型使用自定义训练循环。辅助函数gydF4y2BamodelGradientsgydF4y2Ba支持功能部分中定义的,这个例子中,万博1manbetx计算梯度生成器和鉴别器和损失。创建培训进展图使用gydF4y2BaconfigureTrainingLossPlottergydF4y2Ba附加到这个例子作为支持文件,使用和更新培训进展万博1manbetxgydF4y2BaupdateTrainingPlotsgydF4y2Ba。循环训练数据和更新网络参数在每个迭代。gydF4y2Ba

每一次迭代:gydF4y2Ba

  • 看图片和标签的信息gydF4y2BaminibatchqueuegydF4y2Ba仿真数据使用的对象gydF4y2Ba下一个gydF4y2Ba函数。gydF4y2Ba

  • 阅读的图像信息gydF4y2BaminibatchqueuegydF4y2Ba真实的数据使用的对象gydF4y2Ba下一个gydF4y2Ba函数。gydF4y2Ba

  • 评估模型梯度使用gydF4y2BadlfevalgydF4y2Ba和gydF4y2BamodelGradientsgydF4y2Ba中定义的helper函数,支持功能部分。万博1manbetxgydF4y2BamodelGradientsgydF4y2Ba返回损失的梯度对可学的参数。gydF4y2Ba

  • 更新发电机使用的网络参数gydF4y2BasgdmupdategydF4y2Ba函数。gydF4y2Ba

  • 更新鉴别器网络参数使用gydF4y2BaadamupdategydF4y2Ba函数。gydF4y2Ba

  • 更新培训进展情节每次迭代和显示各种计算损失。gydF4y2Ba

如果gydF4y2BadoTraininggydF4y2Ba%的dlnetwork对象创建生成器。gydF4y2BadlnetGenerator = dlnetwork (lgraphGenerator);gydF4y2Ba%创建dlnetwork鉴别器的对象。gydF4y2BadlnetDiscriminator = dlnetwork (lgraphDiscriminator);gydF4y2Ba%的次要情节创建生成器和鉴频器的损失。gydF4y2Ba无花果=图;[generatorLossPlotter, discriminatorLossPlotter] = configureTrainingLossPlotter(图);gydF4y2Ba%进行循环迭代的指定数量的数据。gydF4y2Ba为gydF4y2Baiter = 1: numIterationsgydF4y2Ba%重置minibatchqueue仿真数据。gydF4y2Ba如果gydF4y2Ba~ hasdata (mbqTrainingDataSimulation)重置(mbqTrainingDataSimulation);gydF4y2Ba结束gydF4y2Ba%获取下一个mini-batch仿真数据和标签。gydF4y2Ba[dlX,标签]=下一个(mbqTrainingDataSimulation);gydF4y2Ba%重置minibatchqueue真实的数据。gydF4y2Ba如果gydF4y2Ba~ hasdata (mbqTrainingDataReal)重置(mbqTrainingDataReal);gydF4y2Ba结束gydF4y2Ba%获取下一个mini-batch真实的数据。gydF4y2BadlZ =下一个(mbqTrainingDataReal);gydF4y2Ba%计算模型使用dlfeval和modelGradients函数梯度和损失。gydF4y2Ba[gradientGenerator, gradientDiscriminator lossSegValue、lossAdvValue lossDisValue] =gydF4y2Ba…gydF4y2Badlfeval (@modelGradients dlnetGenerator、dlnetDiscriminator dlX, dlZ,标签,lamdaAdv);gydF4y2Ba%应用L2正规化。gydF4y2BagradientGenerator = dlupdate (@ (g, w) g + l2Regularization * w, gradientGenerator, dlnetGenerator.Learnables);gydF4y2Ba%调整学习速率。gydF4y2BalearnRateGen = piecewiseLearningRate (iter, learnRateGenBase、numIterations、电力);learnRateDis = piecewiseLearningRate (iter, learnRateDisBase、numIterations、电力);gydF4y2Ba%更新发电机使用个网络可学的参数优化。gydF4y2Ba[dlnetGenerator。可学的,或者]=gydF4y2Ba…gydF4y2Ba韦尔,sgdmupdate (dlnetGenerator.Learnables gradientGenerator learnRateGen);gydF4y2Ba%更新鉴别器使用亚当优化网络可学的参数。gydF4y2Ba[dlnetDiscriminator。可学的,averageGrad averageSqGrad] =gydF4y2Ba…gydF4y2Baadamupdate (dlnetDiscriminator.Learnables gradientDiscriminator、averageGrad averageSqGrad, iter, learnRateDis);gydF4y2Ba%更新培训情节损失值。gydF4y2Baiter updateTrainingPlots (generatorLossPlotter discriminatorLossPlotter,gydF4y2Ba…gydF4y2Ba双(收集(extractdata (lossSegValue + lamdaAdv * lossAdvValue))),双(收集(extractdata (lossDisValue))));gydF4y2Ba结束gydF4y2Ba%保存训练模型。gydF4y2Ba保存(gydF4y2Ba“trainedAdaptSegGANNet.mat”gydF4y2Ba,gydF4y2Ba“dlnetGenerator”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

鉴频器现在可以确定模拟或真实的输入域。反过来,发生器可以产生类似的细分预测整个模拟和真实的领域。gydF4y2Ba

评估模型在实际测试数据gydF4y2Ba

评估培训AdaptSegNet网络的性能通过计算平均测试数据预测的借据。gydF4y2Ba

负载测试数据使用gydF4y2BaimageDatastoregydF4y2Ba。gydF4y2Ba

realTestData = imageDatastore (realTestImagesFolder);gydF4y2Ba

CamVid数据集有32类。使用gydF4y2BarealpixelLabelIDsgydF4y2Bahelper函数类的数量减少到5、仿真数据集。gydF4y2BarealpixelLabelIDsgydF4y2Bahelper函数附加到这个例子作为支持文件。万博1manbetxgydF4y2Ba

labelIDs = realPixelLabelIDs;gydF4y2Ba

使用gydF4y2BapixelLabelDatastoregydF4y2Ba(计算机视觉工具箱)gydF4y2Ba加载的地面实况标签图像测试数据。gydF4y2Ba

realTestLabels = pixelLabelDatastore (realTestLabelsFolder、类labelIDs);gydF4y2Ba

转变为零的数据中心的数据来源,至于训练数据,通过使用gydF4y2Ba变换gydF4y2Ba函数和gydF4y2BapreprocessDatagydF4y2Ba中定义的helper函数,支持功能部分。万博1manbetxgydF4y2Ba

preprocessedRealTestData =变换(realTestData @ (realTestData) preprocessData (realTestData));gydF4y2Ba

使用gydF4y2Ba结合gydF4y2Ba将转换后的图像数据存储和像素标签数据存储的测试数据。gydF4y2Ba

combinedRealTestData =结合(preprocessedRealTestData realTestLabels);gydF4y2Ba

创建gydF4y2BaminibatchqueuegydF4y2Ba从测试数据的综合数据存储对象gydF4y2Ba。gydF4y2Ba集gydF4y2Ba“MiniBatchSize”gydF4y2Ba来gydF4y2Ba1gydF4y2Ba为了便于评价指标。gydF4y2Ba

mbqimdsTest = minibatchqueue (combinedRealTestData,gydF4y2Ba“MiniBatchSize”gydF4y2Ba,1gydF4y2Ba…gydF4y2Ba“MiniBatchFormat”gydF4y2Ba,gydF4y2Ba“SSCB”gydF4y2Ba,gydF4y2Ba“OutputEnvironment”gydF4y2Ba,executionEnvironment);gydF4y2Ba

生成混淆矩阵单元阵列,使用helper函数gydF4y2BapredictSegmentationLabelsOnTestSetgydF4y2Ba在gydF4y2BaminibatchqueuegydF4y2Ba测试数据的对象。辅助函数gydF4y2BapredictSegmentationLabelsOnTestSetgydF4y2Ba下面列出的是在支持功能部分。万博1manbetxgydF4y2Ba

imageSetConfusionMat = predictSegmentationLabelsOnTestSet (dlnetGenerator mbqimdsTest);gydF4y2Ba

使用gydF4y2BaevaluateSemanticSegmentationgydF4y2Ba(计算机视觉工具箱)gydF4y2Ba测量语义细分指标测试集混淆矩阵。gydF4y2Ba

指标= evaluateSemanticSegmentation (imageSetConfusionMat、类gydF4y2Ba“详细”gydF4y2Ba、假);gydF4y2Ba

数据集水平指标,检查gydF4y2Bametrics.DataSetMetricsgydF4y2Ba。gydF4y2Ba

metrics.DataSetMetricsgydF4y2Ba
ans =gydF4y2Ba1×4表gydF4y2Ba_______ _________ ___________ GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU * * * 0.86883 0.769 0.64487 0.78026gydF4y2Ba

数据集的度量提供了一个网络性能的高级概述。看到每一个类对整体性能的影响,检查每个类指标使用gydF4y2Bametrics.ClassMetricsgydF4y2Ba。gydF4y2Ba

metrics.ClassMetricsgydF4y2Ba
ans =gydF4y2Ba5×2表gydF4y2Ba准确性借据________ ____路0.9147 - 0.81301 0.93418 - 0.85518路面背景天空0.33373 - 0.27105 0.83586 - 0.47399 0.82652 - 0.81109的车gydF4y2Ba

数据集性能好,但类指标显示,汽车和路面类不分段。使用额外的数据训练网络可以产生改善的结果。gydF4y2Ba

部分图片gydF4y2Ba

训练网络运行的测试图像检查分段输出预测。gydF4y2Ba

%从测试数据读取图像。gydF4y2Badata = readimage (realTestData, 350);gydF4y2Ba%执行零转移在图像的预处理步骤。gydF4y2Baprocesseddata = preprocessData(数据);gydF4y2Ba%将数据转换为dlarray。gydF4y2Baprocesseddata = dlarray (processeddata,gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba%预测网络的输出。gydF4y2Ba[genPrediction ~] =前进(dlnetGenerator processeddata);gydF4y2Ba%的标签,这是该指数的最大值频道维度。gydF4y2Ba[~,标签]= max (genPrediction [], 3);gydF4y2Ba%覆盖预测图像上的标签。gydF4y2BasegmentedImage = labeloverlay(数据,uint8(收集(extractdata(标签))),gydF4y2Ba“Colormap”gydF4y2Ba、深度贴图);gydF4y2Ba

显示结果。gydF4y2Ba

图imshow (segmentedImage);labelColorbar(深度贴图、类);gydF4y2Ba

比较结果与预期的地面真值存储在标签gydF4y2BarealTestLabelsgydF4y2Ba。绿色和红色区域突出区域分割结果不同于预期的地面实况。gydF4y2Ba

expectedResult = readimage (realTestLabels, 350);实际= uint8(收集(extractdata(标签)));预期= uint8 (expectedResult);实际图imshowpair(预计)gydF4y2Ba

视觉上,重叠的语义分割结果的路上,天空,建筑类。然而,结果不重叠的汽车和路面类。gydF4y2Ba

万博1manbetx支持功能gydF4y2Ba

模型梯度函数gydF4y2Ba

辅助函数gydF4y2BamodelGradientsgydF4y2Ba计算梯度和敌对的损失生成器和鉴频器。函数也可以计算分割损失发生器和叉鉴别器的损失。之间不需要状态信息被人铭记的迭代发生器和鉴别器网络,美国不更新。gydF4y2Ba

函数gydF4y2Ba[gradientGenerator, gradientDiscriminator lossSegValue、lossAdvValue lossDisValue] = modelGradients (dlnetGenerator、dlnetDiscriminator dlX, dlZ,标签,lamdaAdv)gydF4y2Ba%的标签进行对抗训练。gydF4y2BasimulationLabel = 0;realLabel = 1;gydF4y2Ba%提取发电机的仿真预测。gydF4y2Ba[genPredictionSimulation ~] =前进(dlnetGenerator dlX);gydF4y2Ba%计算发电机损失。gydF4y2BalossSegValue = segmentationLoss (genPredictionSimulation、标签);gydF4y2Ba%提取预测的真实数据生成器。gydF4y2Ba[genPredictionReal ~] =前进(dlnetGenerator, dlZ);gydF4y2Ba%提取将softmax鉴别器的真实数据的预测。gydF4y2Ba向前disPredictionReal = (dlnetDiscriminator softmax (genPredictionReal));gydF4y2Ba%建立一个矩阵的模拟实际预测大小的标签。gydF4y2BaY = simulationLabel *的(大小(disPredictionReal));gydF4y2Ba%计算敌对的损失做出真正的分布接近模拟标签。gydF4y2BalossAdvValue = mse (disPredictionReal, Y) /元素个数(Y (:));gydF4y2Ba%的梯度计算发电机方面的损失。gydF4y2BagradientGenerator = dlgradient (lossSegValue + lamdaAdv * lossAdvValue dlnetGenerator.Learnables);gydF4y2Ba%提取将softmax鉴别器的仿真预测。gydF4y2Ba向前disPredictionSimulation = (dlnetDiscriminator softmax (genPredictionSimulation));gydF4y2Ba%创建一个矩阵的模拟仿真预测大小的标签。gydF4y2BaY = simulationLabel *的(大小(disPredictionSimulation));gydF4y2Ba%计算鉴别器损失对模拟类。gydF4y2BalossDisValueSimulation = mse (disPredictionSimulation, Y) /元素个数(Y (:));gydF4y2Ba%提取将softmax鉴别器的真实数据的预测。gydF4y2Ba向前disPredictionReal = (dlnetDiscriminator softmax (genPredictionReal));gydF4y2Ba%建立一个矩阵的实际预测大小的标签。gydF4y2BaY = realLabel *的(大小(disPredictionReal));gydF4y2Ba%计算鉴别器失去对真正的类。gydF4y2BalossDisValueReal = mse (disPredictionReal, Y) /元素个数(Y (:));gydF4y2Ba%计算总鉴别器的损失。gydF4y2BalossDisValue = lossDisValueSimulation + lossDisValueReal;gydF4y2Ba%计算梯度的鉴别器方面的损失。gydF4y2BagradientDiscriminator = dlgradient (lossDisValue dlnetDiscriminator.Learnables);gydF4y2Ba结束gydF4y2Ba

分割损失函数gydF4y2Ba

辅助函数gydF4y2BasegmentationLossgydF4y2Ba分割损失计算功能,被定义为发电机使用模拟数据的熵损失及其各自的地面实况。通过使用helper函数计算损失gydF4y2BacrossentropygydF4y2Ba函数。gydF4y2Ba

函数gydF4y2Ba损失= segmentationLoss(预测、目标)gydF4y2Ba%生成地面真理的一个炎热的编码。gydF4y2BaoneHotTarget = onehotencode(分类(extractdata(目标),4);gydF4y2Ba%转换一个炎热dlarray编码的数据。gydF4y2BaoneHotTarget = dlarray (oneHotTarget,gydF4y2Ba“SSBC”gydF4y2Ba);gydF4y2Ba%计算将softmax预测的输出。gydF4y2BapredictSoftmax = softmax(预测);gydF4y2Ba%计算熵的损失。gydF4y2Ba损失= crossentropy (predictSoftmax oneHotTarget,gydF4y2Ba“TargetCategories”gydF4y2Ba,gydF4y2Ba“独家”gydF4y2Ba)/(元素个数(oneHotTarget) / 2);gydF4y2Ba结束gydF4y2Ba

辅助函数gydF4y2BadownloadDatasetgydF4y2Ba下载模拟和实际数据集从指定的url指定的文件夹位置,如果他们不存在。函数返回的路径模拟,真实的训练数据,真实的测试数据。功能下载整个CamVid数据集和数据分割成使用训练集和测试集gydF4y2BasubsetCamVidDatasetFileNamesgydF4y2Ba垫文件,连接到例子作为支持文件。万博1manbetxgydF4y2Ba

函数gydF4y2Ba[simulationImagesFolder, simulationLabelsFolder realImagesFolder realLabelsFolder,gydF4y2Ba…gydF4y2BarealTestImagesFolder realTestLabelsFolder] =gydF4y2Ba…gydF4y2BadownloadDataset (simulationDataLocation、simulationDataURL realDataLocation、realImageDataURL realLabelDataURL)gydF4y2Ba%建立训练图像仿真数据和标签的文件夹位置。gydF4y2BasimulationDataZip = fullfile (simulationDataLocation,gydF4y2Ba“SimulationDrivingDataset.zip”gydF4y2Ba);gydF4y2Ba%得到仿真数据如果它不存在。gydF4y2Ba如果gydF4y2Ba~存在(simulationDataZipgydF4y2Ba“文件”gydF4y2Bamkdir (simulationDataLocation) disp (gydF4y2Ba“下载仿真数据”gydF4y2Ba);websave (simulationDataZip simulationDataURL);解压缩(simulationDataZip simulationDataLocation);gydF4y2Ba结束gydF4y2BasimulationImagesFolder = fullfile (simulationDataLocation,gydF4y2Ba“SimulationDrivingDataset”gydF4y2Ba,gydF4y2Ba“图片”gydF4y2Ba);simulationLabelsFolder = fullfile (simulationDataLocation,gydF4y2Ba“SimulationDrivingDataset”gydF4y2Ba,gydF4y2Ba“标签”gydF4y2Ba);camVidLabelsZip = fullfile (realDataLocation,gydF4y2Ba“CamVidLabels.zip”gydF4y2Ba);camVidImagesZip = fullfile (realDataLocation,gydF4y2Ba“CamVidImages.zip”gydF4y2Ba);gydF4y2Ba如果gydF4y2Ba~存在(camVidLabelsZipgydF4y2Ba“文件”gydF4y2Ba)| | ~存在(camVidImagesZipgydF4y2Ba“文件”gydF4y2Bamkdir (realDataLocation) disp (gydF4y2Ba“下载数据集16 MB CamVid标签…”gydF4y2Ba);websave (camVidLabelsZip realLabelDataURL);解压缩(camVidLabelsZip fullfile (realDataLocationgydF4y2Ba“CamVidLabels”gydF4y2Ba));disp (gydF4y2Ba“下载587 MB CamVid数据集图像…”gydF4y2Ba);websave (camVidImagesZip realImageDataURL);解压缩(camVidImagesZip fullfile (realDataLocationgydF4y2Ba“CamVidImages”gydF4y2Ba));gydF4y2Ba结束gydF4y2Ba%建立训练图像和真实数据标签的文件夹位置。gydF4y2BarealImagesFolder = fullfile (realDataLocation,gydF4y2Ba“火车”gydF4y2Ba,gydF4y2Ba“图片”gydF4y2Ba);realLabelsFolder = fullfile (realDataLocation,gydF4y2Ba“火车”gydF4y2Ba,gydF4y2Ba“标签”gydF4y2Ba);gydF4y2Ba%建立真实数据的测试图片和标签的文件夹位置。gydF4y2BarealTestImagesFolder = fullfile (realDataLocation,gydF4y2Ba“测试”gydF4y2Ba,gydF4y2Ba“图片”gydF4y2Ba);realTestLabelsFolder = fullfile (realDataLocation,gydF4y2Ba“测试”gydF4y2Ba,gydF4y2Ba“标签”gydF4y2Ba);gydF4y2Ba%分区数据分为训练集和测试集,如果他们不存在。gydF4y2Ba如果gydF4y2Ba~存在(realImagesFoldergydF4y2Ba“文件”gydF4y2Ba)| | ~存在(realLabelsFoldergydF4y2Ba“文件”gydF4y2Ba)| |gydF4y2Ba…gydF4y2Ba~存在(realTestImagesFoldergydF4y2Ba“文件”gydF4y2Ba)| | ~存在(realTestLabelsFoldergydF4y2Ba“文件”gydF4y2Bamkdir (realImagesFolder);mkdir (realLabelsFolder);mkdir (realTestImagesFolder);mkdir (realTestLabelsFolder);gydF4y2Ba%加载垫测试和培训文件的名称。gydF4y2Bapartitionname =负载(gydF4y2Ba“subsetCamVidDatasetFileNames.mat”gydF4y2Ba);gydF4y2Ba%提取测试图片的名字。gydF4y2BaimageTestNames = partitionNames.imageTestNames;gydF4y2Ba%去除空细胞。gydF4y2BaimageTestNames = imageTestNames (~ cellfun (gydF4y2Ba“isempty”gydF4y2BaimageTestNames));gydF4y2Ba%提取测试标签的名字。gydF4y2BalabelTestNames = partitionNames.labelTestNames;gydF4y2Ba%去除空细胞。gydF4y2BalabelTestNames = labelTestNames (~ cellfun (gydF4y2Ba“isempty”gydF4y2BalabelTestNames));gydF4y2Ba%将测试图像复制到相应的文件夹中。gydF4y2Ba为gydF4y2Bai = 1:尺寸(imageTestNames, 1) labelSource = fullfile (realDataLocation,gydF4y2Ba“CamVidLabels”gydF4y2BalabelTestNames(我));imageSource = fullfile (realDataLocation,gydF4y2Ba“CamVidImages”gydF4y2Ba,gydF4y2Ba701 _stillsraw_fullgydF4y2BaimageTestNames(我));拷贝文件(imageSource {1}, realTestImagesFolder);拷贝文件(labelSource {1}, realTestLabelsFolder);gydF4y2Ba结束gydF4y2Ba%提取火车图片名称。gydF4y2BaimageTrainNames = partitionNames.imageTrainNames;gydF4y2Ba%去除空细胞。gydF4y2BaimageTrainNames = imageTrainNames (~ cellfun (gydF4y2Ba“isempty”gydF4y2BaimageTrainNames));gydF4y2Ba%提取火车标签的名字。gydF4y2BalabelTrainNames = partitionNames.labelTrainNames;gydF4y2Ba%去除空细胞。gydF4y2BalabelTrainNames = labelTrainNames (~ cellfun (gydF4y2Ba“isempty”gydF4y2BalabelTrainNames));gydF4y2Ba%将训练图像复制到相应的文件夹中。gydF4y2Ba为gydF4y2Bai = 1:尺寸(imageTrainNames, 1) labelSource = fullfile (realDataLocation,gydF4y2Ba“CamVidLabels”gydF4y2BalabelTrainNames(我));imageSource = fullfile (realDataLocation,gydF4y2Ba“CamVidImages”gydF4y2Ba,gydF4y2Ba701 _stillsraw_fullgydF4y2BaimageTrainNames(我));拷贝文件(imageSource {1}, realImagesFolder);拷贝文件(labelSource {1}, realLabelsFolder);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

辅助函数gydF4y2BaaddASPPToNetworkgydF4y2Ba创造了深黑色的空间金字塔池(ASPP)层并将它们添加到输入层图。函数返回层图与ASPP层连接到它。gydF4y2Ba

函数gydF4y2Balgraph = addASPPToNetwork (lgraph numClasses)gydF4y2Ba%定义ASPP扩张的因素。gydF4y2BaasppDilationFactors = (6、12);gydF4y2Ba%定义ASPP过滤器的大小。gydF4y2BaasppFilterSizes = (3 3);gydF4y2Ba%提取最后一层的层图。gydF4y2BalastLayerName = lgraph.Layers(结束). name;gydF4y2Ba%定义添加层。gydF4y2BaaddLayer = additionLayer(元素个数(asppDilationFactors),gydF4y2Ba“名字”gydF4y2Ba,gydF4y2Ba“additionLayer”gydF4y2Ba);gydF4y2Ba%添加添加层到层图。gydF4y2Balgraph = addLayers (lgraph addLayer);gydF4y2Ba%创建ASPP层连接层gydF4y2Ba%和连接层图。gydF4y2Ba为gydF4y2Bai = 1:元素个数(asppDilationFactors) asppConvName =gydF4y2Ba“asppConv_”gydF4y2Ba+字符串(我);branchFilterSize = asppFilterSizes(我);branchDilationFactor = asppDilationFactors(我);asspLayer = convolution2dLayer (branchFilterSize numClasses,gydF4y2Ba“DilationFactor”gydF4y2BabranchDilationFactor,gydF4y2Ba…gydF4y2Ba“填充”gydF4y2Ba,gydF4y2Ba“相同”gydF4y2Ba,gydF4y2Ba“名字”gydF4y2BaasppConvName,gydF4y2Ba“WeightsInitializer”gydF4y2Ba,gydF4y2Ba“narrow-normal”gydF4y2Ba,gydF4y2Ba“BiasInitializer”gydF4y2Ba,gydF4y2Ba“零”gydF4y2Ba);lgraph = addLayers (lgraph asspLayer);lgraph = connectLayers (lgraph lastLayerName asppConvName);lgraph = connectLayers (lgraph、asppConvName strcat (addLayer.Name,gydF4y2Ba' / 'gydF4y2Ba我,addLayer.InputNames {}));gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

辅助函数gydF4y2BapredictSegmentationLabelsOnTestSetgydF4y2Ba计算预测的混淆矩阵和地面真理标签使用gydF4y2BasegmentationConfusionMatrixgydF4y2Ba(计算机视觉工具箱)gydF4y2Ba函数。gydF4y2Ba

函数gydF4y2BaminbatchTestData confusionMatrix = predictSegmentationLabelsOnTestSet(净)confusionMatrix = {};i = 1;gydF4y2Ba而gydF4y2Bahasdata (minbatchTestData)gydF4y2Ba%使用从数据库检索mini-batch旁边。gydF4y2Ba[dlX, gtlabels] =下一个(minbatchTestData);gydF4y2Ba%预测网络的输出。gydF4y2Ba[genPrediction ~] =前进(网络,dlX);gydF4y2Ba%的标签,这是该指数的最大值频道维度。gydF4y2Ba[~,标签]= max (genPrediction [], 3);gydF4y2Ba%得到每个图像的混合矩阵。gydF4y2BaconfusionMatrix{我}= segmentationConfusionMatrix(双(收集(extractdata(标签))),双(收集(extractdata (gtlabels))));我=我+ 1;gydF4y2Ba结束gydF4y2BaconfusionMatrix = confusionMatrix ';gydF4y2Ba结束gydF4y2Ba

辅助函数gydF4y2BapiecewiseLearningRategydF4y2Ba计算当前学习速率基于迭代数。gydF4y2Ba

函数gydF4y2Balr = piecewiseLearningRate(我baseLR numIterations、电力)分数= i / numIterations;因素=(1 -分数)^ * 1 e1;lr = baseLR *因素;gydF4y2Ba结束gydF4y2Ba

辅助函数gydF4y2BapreprocessDatagydF4y2Ba执行零中心转变图像通道的数量减去相应的意思。gydF4y2Ba

函数gydF4y2Badata = preprocessData(数据)gydF4y2Ba%提取各自的渠道。gydF4y2Barc =数据(:,:1);gc =数据(:,:,2);公元前=数据(:,:,3);gydF4y2Ba%计算各自的通道。gydF4y2Bar =意味着(rc (:));g =意味着(gc (:));b =意味着(bc (:));gydF4y2Ba%的转变意味着数据的各自的通道。gydF4y2Badata =单(数据)-单(shiftdim ([r g b], 1));gydF4y2Ba结束gydF4y2Ba

引用gydF4y2Ba

[1]蔡、Yi-Hsuan徐粹挂,塞缪尔·舒尔特Kihyuk孙、杨Ming-Hsuan,印度Chandraker。“学习适应结构化输出空间语义分割。“在gydF4y2Ba2018年IEEE / CVF计算机视觉与模式识别会议gydF4y2Ba,7472 - 81。盐湖城犹他:IEEE 2018。https://doi.org/10.1109/CVPR.2018.00780。gydF4y2Ba

加布里埃尔·[2]Brostow J。,Julien Fauqueur, and Roberto Cipolla. “Semantic Object Classes in Video: A High-Definition Ground Truth Database.”模式识别的字母gydF4y2Ba30日,没有。2(2009年1月):88 - 97。https://doi.org/10.1016/j.patrec.2008.04.005。gydF4y2Ba