主要内容gydF4y2Ba

使用深度学习从分割图生成图像gydF4y2Ba

这个例子展示了如何使用pix2pixHD条件生成对抗网络(CGAN)从语义分割地图生成场景的合成图像。gydF4y2Ba

Pix2pixHD [gydF4y2Ba1gydF4y2Ba]由两个同时训练的网络组成,以最大限度地提高两者的性能。gydF4y2Ba

  1. 生成器是一个编码器-解码器风格的神经网络,它从语义分割图中生成场景图像。CGAN网络训练生成器生成被鉴别器误分类为真实的场景图像。gydF4y2Ba

  2. 鉴别器是一个全卷积神经网络,它将生成的场景图像与对应的真实图像进行比较,并尝试将它们分别分类为假的和真实的。CGAN网络训练鉴别器正确区分生成图像和真实图像。gydF4y2Ba

生成器和鉴别器网络在训练过程中相互竞争。当两个网络都不能进一步提高时,训练收敛。gydF4y2Ba

下载CamVid数据集gydF4y2Ba

此示例使用gydF4y2BaCamVid数据集gydF4y2Ba[gydF4y2Ba2gydF4y2Ba从剑桥大学接受培训。该数据集是701张图像的集合,其中包含驾驶时获得的街道视图。该数据集为32个语义类提供了像素标签,包括汽车、行人和道路。gydF4y2Ba

从这些url下载CamVid数据集。下载时间取决于你的网络连接。gydF4y2Ba

imageURL =gydF4y2Ba“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/files/701_StillsRaw_full.zip”gydF4y2Ba;labelURL =gydF4y2Ba“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/LabeledApproved_full.zip”gydF4y2Ba;dataDir = fullfile(tempdir,gydF4y2Ba“CamVid”gydF4y2Ba);downloadCamVidData (dataDir imageURL labelURL);imgDir = fullfile(dataDir,gydF4y2Ba“图片”gydF4y2Ba,gydF4y2Ba“701 _stillsraw_full”gydF4y2Ba);labelDir = fullfile(dataDir,gydF4y2Ba“标签”gydF4y2Ba);gydF4y2Ba

预处理训练数据gydF4y2Ba

创建一个gydF4y2BaimageDatastoregydF4y2Ba将图像存储在CamVid数据集中。gydF4y2Ba

imds = imageDatastore(imgDir);imagessize = [576 768];gydF4y2Ba

使用helper函数定义CamVid数据集中32个类的类名和像素标签idgydF4y2BadefineCamVid32ClassesAndPixelLabelIDsgydF4y2Ba.使用辅助函数获取CamVid数据集的标准颜色图gydF4y2Bacamvid32ColorMapgydF4y2Ba.gydF4y2Ba辅助函数作为支持文件附加到示例中。万博1manbetxgydF4y2Ba

numClasses = 32;[classes,labelIDs] = defineCamVid32ClassesAndPixelLabelIDs;cmap = camvid32ColorMap;gydF4y2Ba

创建一个gydF4y2BapixelLabelDatastoregydF4y2Ba(计算机视觉工具箱)gydF4y2Ba存储像素标签图像。gydF4y2Ba

pxds = pixelLabelDatastore(labelDir,classes,labelIDs);gydF4y2Ba

预览一个像素标签图像和相应的地面真实场景图像。将标签从分类标签转换为RGB颜色gydF4y2Balabel2rgbgydF4y2Ba(图像处理工具箱)gydF4y2Ba函数,然后在蒙太奇中显示像素标签图像和地面真值图像。gydF4y2Ba

Im =预览(imds);Px = preview(pxds);Px = label2rgb(Px,cmap);蒙太奇({px, im})gydF4y2Ba

使用辅助函数将数据划分为训练集和测试集gydF4y2BapartitionCamVidForPix2PixHDgydF4y2Ba.该函数作为支持文件附加到示例中。万博1manbetxhelper函数将数据分成648个训练文件和32个测试文件。gydF4y2Ba

[imdsTrain,imdsTest,pxdsTrain,pxdsTest] = partitionCamVidForPix2PixHD(imds,pxds,classes,labelIDs);gydF4y2Ba

使用gydF4y2Ba结合gydF4y2Ba函数将像素标签图像和地面真实场景图像合并到单个数据存储中。gydF4y2Ba

dsTrain = combine(pxdsTrain,imdsTrain);gydF4y2Ba

增加训练数据gydF4y2Ba变换gydF4y2Ba函数具有由辅助函数指定的自定义预处理操作gydF4y2BapreprocessCamVidForPix2PixHDgydF4y2Ba.这个辅助函数作为支持文件附加到示例中。万博1manbetxgydF4y2Ba

的gydF4y2BapreprocessCamVidForPix2PixHDgydF4y2Ba函数执行以下操作:gydF4y2Ba

  1. 将地面真值数据缩放到[- 1,1]范围。这个范围与final的范围相匹配gydF4y2BatanhLayergydF4y2Ba在发电机网络中。gydF4y2Ba

  2. 分别使用双三次和最近邻下采样,将图像和标签的大小调整为网络的输出大小,576 × 768像素。gydF4y2Ba

  3. 将单通道分割映射转换为32通道单热编码分割映射gydF4y2BaonehotencodegydF4y2Ba函数。gydF4y2Ba

  4. 在水平方向上随机翻转图像和像素标签对。gydF4y2Ba

dsTrain = transform(dsTrain,@(x) preprocessCamVidForPix2PixHD(x,imageSize));gydF4y2Ba

在蒙太奇中预览一个热编码分割图的通道。每个通道表示一个单热映射,对应于一个唯一类的像素。gydF4y2Ba

map = preview(dsTrain);蒙太奇(地图{1},gydF4y2Ba“大小”gydF4y2Ba, 8 [4],gydF4y2Ba“Bordersize”gydF4y2Ba5,gydF4y2Ba“写成BackgroundColor”gydF4y2Ba,gydF4y2Ba“b”gydF4y2Ba)gydF4y2Ba

创建发电机网络gydF4y2Ba

定义一个pix2pixHD生成器网络,该网络从深度方向的单热编码分割映射生成场景图像。该输入具有与原始分割映射相同的高度和宽度,并且具有与类相同的通道数量。gydF4y2Ba

generatorInputSize = [imageSize numClasses];gydF4y2Ba

创建pix2pixHD生成器网络gydF4y2Bapix2pixHDGlobalGeneratorgydF4y2Ba(图像处理工具箱)gydF4y2Ba函数。gydF4y2Ba

dlnetGenerator = pix2pixHDGlobalGenerator(generatorInputSize);gydF4y2Ba

显示网络结构。gydF4y2Ba

analyzeNetwork (dlnetGenerator)gydF4y2Ba

请注意,这个示例展示了如何使用pix2pixHD全局生成器生成大小为576 × 768像素的图像。要创建生成更高分辨率(如1152 × 1536像素或更高)图像的本地增强器网络,可以使用gydF4y2BaaddPix2PixHDLocalEnhancergydF4y2Ba(图像处理工具箱)gydF4y2Ba函数。局部增强网络有助于在非常高的分辨率下生成精细的电平细节。万博 尤文图斯gydF4y2Ba

创建鉴别网络gydF4y2Ba

定义将输入图像分类为真(1)或假(0)的patch GAN鉴别器网络。本例使用不同输入尺度的两个鉴别器网络,也称为多尺度鉴别器。第一个比例与图像大小相同,第二个比例是图像大小的一半。gydF4y2Ba

鉴别器的输入是单热编码分割图和待分类的场景图像的深度级联。将输入到鉴别器的通道数指定为标记类和图像颜色通道的总数。gydF4y2Ba

numImageChannels = 3;numChannelsDiscriminator = numClasses + numImageChannels;gydF4y2Ba

指定第一个鉴别符的输入大小。创建具有实例规范化的补丁GAN鉴别器gydF4y2BapatchGANDiscriminatorgydF4y2Ba(图像处理工具箱)gydF4y2Ba函数。gydF4y2Ba

discriminatorInputSizeScale1 = [imageSize numChannelsDiscriminator];dlnetDiscriminatorScale1 = patchGANDiscriminator(discriminatorInputSizeScale1,gydF4y2Ba“NormalizationLayer”gydF4y2Ba,gydF4y2Ba“实例”gydF4y2Ba);gydF4y2Ba

指定第二个鉴别器的输入大小为图像大小的一半,然后创建第二个贴片GAN鉴别器。gydF4y2Ba

discriminatorInputSizeScale2 = [floor(imageSize)]。/ 2 numChannelsDiscriminator];dlnetDiscriminatorScale2 = patchGANDiscriminator(discriminatorInputSizeScale2,gydF4y2Ba“NormalizationLayer”gydF4y2Ba,gydF4y2Ba“实例”gydF4y2Ba);gydF4y2Ba

可视化网络。gydF4y2Ba

analyzeNetwork (dlnetDiscriminatorScale1);analyzeNetwork (dlnetDiscriminatorScale2);gydF4y2Ba

定义模型梯度和损失函数gydF4y2Ba

辅助函数gydF4y2BamodelGradientsgydF4y2Ba计算生成器和鉴别器的梯度和对抗损失。该函数还计算了生成器的特征匹配损耗和VGG损耗。这个函数定义在gydF4y2Ba万博1manbetx支持功能gydF4y2Ba节。gydF4y2Ba

发电机损失gydF4y2Ba

生成器的目标是生成鉴别器分类为实数(1)的图像。gydF4y2Ba.gydF4y2Ba发电机损耗包括三种损耗。gydF4y2Ba

  • 对抗损失计算为1的向量与生成图像上的鉴别器预测之间的平方差。gydF4y2Ba YgydF4y2Ba ˆgydF4y2Ba ggydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba egydF4y2Ba dgydF4y2Ba 是对生成器生成的图像的判别器预测。类的部分实现此丢失gydF4y2Bapix2pixhdAdversarialLossgydF4y2Ba类中定义的Helper函数gydF4y2Ba万博1manbetx支持功能gydF4y2Ba节。gydF4y2Ba

lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba 一个gydF4y2Ba dgydF4y2Ba vgydF4y2Ba egydF4y2Ba rgydF4y2Ba 年代gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba 我gydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba GgydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba ogydF4y2Ba rgydF4y2Ba =gydF4y2Ba (gydF4y2Ba 1gydF4y2Ba -gydF4y2Ba YgydF4y2Ba ˆgydF4y2Ba ggydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba egydF4y2Ba dgydF4y2Ba )gydF4y2Ba 2gydF4y2Ba

  • 特征匹配损失对gydF4y2Ba lgydF4y2Ba 1gydF4y2Ba 从鉴别器网络预测得到的真实和生成的特征映射之间的距离。gydF4y2Ba TgydF4y2Ba 是鉴别器特征层的总数。gydF4y2Ba YgydF4y2Ba rgydF4y2Ba egydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba 和gydF4y2Ba YgydF4y2Ba ˆgydF4y2Ba ggydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba egydF4y2Ba dgydF4y2Ba 分别为地面真实图像和生成图像。方法实现此丢失gydF4y2Bapix2pixhdFeatureMatchingLossgydF4y2Ba类中定义的Helper函数gydF4y2Ba万博1manbetx支持功能gydF4y2Ba本例的第一部分gydF4y2Ba

lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba FgydF4y2Ba egydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba ugydF4y2Ba rgydF4y2Ba egydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba cgydF4y2Ba hgydF4y2Ba 我gydF4y2Ba ngydF4y2Ba ggydF4y2Ba =gydF4y2Ba ∑gydF4y2Ba 我gydF4y2Ba =gydF4y2Ba 1gydF4y2Ba TgydF4y2Ba |gydF4y2Ba |gydF4y2Ba YgydF4y2Ba rgydF4y2Ba egydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba -gydF4y2Ba YgydF4y2Ba ˆgydF4y2Ba ggydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba egydF4y2Ba dgydF4y2Ba |gydF4y2Ba |gydF4y2Ba 1gydF4y2Ba

  • 知觉丧失惩罚了gydF4y2Ba lgydF4y2Ba 1gydF4y2Ba 从特征提取网络中作为预测获得的真实和生成的特征映射之间的距离。gydF4y2Ba TgydF4y2Ba 是特征层的总数。gydF4y2Ba YgydF4y2Ba VgydF4y2Ba ggydF4y2Ba ggydF4y2Ba RgydF4y2Ba egydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba 和gydF4y2Ba YgydF4y2Ba ˆgydF4y2Ba VgydF4y2Ba ggydF4y2Ba ggydF4y2Ba GgydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba egydF4y2Ba dgydF4y2Ba 分别是对地面真实图像和生成图像的网络预测。方法实现此丢失gydF4y2Bapix2pixhdVggLossgydF4y2Ba类中定义的Helper函数gydF4y2Ba万博1manbetx支持功能gydF4y2Ba节。特征提取网络在gydF4y2Ba负载特征提取网络gydF4y2Ba.gydF4y2Ba

lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba VgydF4y2Ba ggydF4y2Ba ggydF4y2Ba =gydF4y2Ba ∑gydF4y2Ba 我gydF4y2Ba =gydF4y2Ba 1gydF4y2Ba TgydF4y2Ba |gydF4y2Ba |gydF4y2Ba YgydF4y2Ba VgydF4y2Ba ggydF4y2Ba ggydF4y2Ba RgydF4y2Ba egydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba -gydF4y2Ba YgydF4y2Ba ˆgydF4y2Ba VgydF4y2Ba ggydF4y2Ba ggydF4y2Ba GgydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba egydF4y2Ba dgydF4y2Ba |gydF4y2Ba |gydF4y2Ba 1gydF4y2Ba

发电机的总损耗是这三种损耗的加权和。gydF4y2Ba λgydF4y2Ba 1gydF4y2Ba ,gydF4y2Ba λgydF4y2Ba 2gydF4y2Ba ,gydF4y2Ba λgydF4y2Ba 3.gydF4y2Ba 分别为对抗性损失、特征匹配损失和感知损失的权重因子。gydF4y2Ba

lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba GgydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba ogydF4y2Ba rgydF4y2Ba =gydF4y2Ba λgydF4y2Ba 1gydF4y2Ba *gydF4y2Ba lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba 一个gydF4y2Ba dgydF4y2Ba vgydF4y2Ba egydF4y2Ba rgydF4y2Ba 年代gydF4y2Ba 一个gydF4y2Ba rgydF4y2Ba 我gydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba GgydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba ogydF4y2Ba rgydF4y2Ba +gydF4y2Ba λgydF4y2Ba 2gydF4y2Ba *gydF4y2Ba lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba FgydF4y2Ba egydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba ugydF4y2Ba rgydF4y2Ba egydF4y2Ba 米gydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba cgydF4y2Ba hgydF4y2Ba 我gydF4y2Ba ngydF4y2Ba ggydF4y2Ba +gydF4y2Ba λgydF4y2Ba 3.gydF4y2Ba *gydF4y2Ba lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba PgydF4y2Ba egydF4y2Ba rgydF4y2Ba cgydF4y2Ba egydF4y2Ba pgydF4y2Ba tgydF4y2Ba ugydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba

注意,生成器的对抗损失和特征匹配损失是在两个不同的尺度上计算的。gydF4y2Ba

鉴频器的损失gydF4y2Ba

鉴别器的目标是正确区分真实图像和生成图像。鉴别器损失是两个分量的和:gydF4y2Ba

  • 一向量与鉴别器在真实图像上的预测值之间的平方差gydF4y2Ba

  • 零向量与鉴别器对生成图像的预测之间的平方差gydF4y2Ba

lgydF4y2Ba ogydF4y2Ba 年代gydF4y2Ba 年代gydF4y2Ba DgydF4y2Ba 我gydF4y2Ba 年代gydF4y2Ba cgydF4y2Ba rgydF4y2Ba 我gydF4y2Ba 米gydF4y2Ba 我gydF4y2Ba ngydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba ogydF4y2Ba rgydF4y2Ba =gydF4y2Ba (gydF4y2Ba 1gydF4y2Ba -gydF4y2Ba YgydF4y2Ba rgydF4y2Ba egydF4y2Ba 一个gydF4y2Ba lgydF4y2Ba )gydF4y2Ba 2gydF4y2Ba +gydF4y2Ba (gydF4y2Ba 0gydF4y2Ba -gydF4y2Ba YgydF4y2Ba ˆgydF4y2Ba ggydF4y2Ba egydF4y2Ba ngydF4y2Ba egydF4y2Ba rgydF4y2Ba 一个gydF4y2Ba tgydF4y2Ba egydF4y2Ba dgydF4y2Ba )gydF4y2Ba 2gydF4y2Ba

鉴别器损耗是利用部分gydF4y2Bapix2pixhdAdversarialLossgydF4y2Ba类中定义的Helper函数gydF4y2Ba万博1manbetx支持功能gydF4y2Ba节。注意,鉴别器的对抗损失是为两个不同的鉴别器尺度计算的。gydF4y2Ba

负载特征提取网络gydF4y2Ba

这个例子修改了一个预训练的VGG-19深度神经网络,以提取真实图像和生成图像在各个层的特征。这些多层特征被用来计算发生器的感知损失。gydF4y2Ba

要获得预训练的VGG-19网络,请安装gydF4y2Bavgg19gydF4y2Ba.如果您没有安装所需的支持包,则该软件提供下载链接。万博1manbetxgydF4y2Ba

netVGG = vgg19;gydF4y2Ba

可视化网络体系结构gydF4y2Ba深度网络设计器gydF4y2Ba应用程序。gydF4y2Ba

deepNetworkDesigner (netVGG)gydF4y2Ba

为了使VGG-19网络适合于特征提取,将层数保持在“pool5”,并从网络中删除所有完全连接的层。得到的网络是一个完全卷积的网络。gydF4y2Ba

netVGG = layerGraph(netVGG. layers (1:38));gydF4y2Ba

创建一个没有规范化的新图像输入层。用新图层替换原图像输入层。gydF4y2Ba

inp = imageInputLayer([imageSize 3],gydF4y2Ba“归一化”gydF4y2Ba,gydF4y2Ba“没有”gydF4y2Ba,gydF4y2Ba“名称”gydF4y2Ba,gydF4y2Ba“输入”gydF4y2Ba);netVGG = replaceLayer(netVGG,gydF4y2Ba“输入”gydF4y2Ba,输入);netVGG = dlnetwork(netVGG);gydF4y2Ba

指定培训方案gydF4y2Ba

指定Adam优化的选项。训练60次。为生成器和鉴别器网络指定相同的选项。gydF4y2Ba

  • 指定相同的学习速率为0.0002。gydF4y2Ba

  • 初始化尾平均梯度和尾平均梯度平方衰减率gydF4y2Ba[]gydF4y2Ba.gydF4y2Ba

  • 使用0.5的梯度衰减因子和0.999的平方梯度衰减因子。gydF4y2Ba

  • 使用1的小批大小进行训练。gydF4y2Ba

nummepochs = 60;learningRate = 0.0002;trailingAvgGenerator = [];trailingAvgSqGenerator = [];trailingAvgDiscriminatorScale1 = [];trailingAvgSqDiscriminatorScale1 = [];trailingAvgDiscriminatorScale2 = [];trailingAvgSqDiscriminatorScale2 = [];gradientDecayFactor = 0.5;squaredGradientDecayFactor = 0.999; miniBatchSize = 1;

创建一个gydF4y2BaminibatchqueuegydF4y2Ba对象,该对象管理自定义训练循环中的小批量观察值。gydF4y2Ba的gydF4y2BaminibatchqueuegydF4y2Ba对象也将数据强制转换为gydF4y2BadlarraygydF4y2Ba对象,可在深度学习应用程序中实现自动区分。gydF4y2Ba

指定小批量数据提取格式为gydF4y2BaSSCBgydF4y2Ba(空间、空间、通道、批量)。设置gydF4y2BaDispatchInBackgroundgydF4y2Ba返回的布尔值对参数gydF4y2BacanUseGPUgydF4y2Ba.如果支持的万博1manbetxGPU可用于计算,则gydF4y2BaminibatchqueuegydF4y2Ba在训练期间,对象在并行池中后台预处理小批量。gydF4y2Ba

mbqTrain = minibatchqueue(dsTrain)gydF4y2Ba“MiniBatchSize”gydF4y2BaminiBatchSize,gydF4y2Ba…gydF4y2Ba“MiniBatchFormat”gydF4y2Ba,gydF4y2Ba“SSCB”gydF4y2Ba,gydF4y2Ba“DispatchInBackground”gydF4y2Ba, canUseGPU);gydF4y2Ba

训练网络gydF4y2Ba

默认情况下,示例通过使用helper函数为CamVid数据集下载pix2pixHD生成器网络的预训练版本gydF4y2BadownloadTrainedPix2PixHDNetgydF4y2Ba.辅助函数作为支持文件附加到示例中。万博1manbetx预训练的网络使您无需等待训练完成就可以运行整个示例。gydF4y2Ba

要训练网络,请设置gydF4y2BadoTraininggydF4y2Ba变量的值为gydF4y2Ba真正的gydF4y2Ba.在自定义训练循环中训练模型。对于每次迭代:gydF4y2Ba

  • 方法读取当前小批处理的数据gydF4y2Ba下一个gydF4y2Ba函数。gydF4y2Ba

  • 计算模型梯度gydF4y2BadlfevalgydF4y2Ba功能和gydF4y2BamodelGradientsgydF4y2Bahelper函数。gydF4y2Ba

  • 更新网络参数gydF4y2BaadamupdategydF4y2Ba函数。gydF4y2Ba

  • 更新每次迭代的训练进度图,并显示各种计算损失。gydF4y2Ba

如果GPU可用,在GPU上进行训练。使用GPU需要Parallel Computing Toolbox™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见gydF4y2BaGPU计算要求gydF4y2Ba(并行计算工具箱)gydF4y2Ba.gydF4y2Ba

在NVIDIA™Titan RTX上训练大约需要22个小时,根据您的GPU硬件,可能需要更长的时间。如果您的GPU设备内存较少,请尝试通过指定gydF4y2Ba图象尺寸gydF4y2Ba变量为[480 640]gydF4y2Ba预处理训练数据gydF4y2Ba部分的示例。gydF4y2Ba

doTraining = false;gydF4y2Ba如果gydF4y2BadoTraining fig = figure;lossPlotter = configureTrainingProgressPlotter(图);迭代= 0;gydF4y2Ba%循环遍历gydF4y2Ba为gydF4y2Baepoch = 1: nummepochsgydF4y2Ba%重置和洗牌数据gydF4y2Ba重置(mbqTrain);洗牌(mbqTrain);gydF4y2Ba%在每个图像上循环gydF4y2Ba而gydF4y2Bahasdata(mbqTrain)迭代=迭代+ 1;gydF4y2Ba%从当前小批量中读取数据gydF4y2Ba[dlInputSegMap,dlRealImage] = next(mbqTrain);gydF4y2Ba计算模型梯度和生成器状态gydF4y2Ba% dlfeval和GANLoss函数在gydF4y2Ba%的例子gydF4y2Ba[gradParamsG,gradParamsDScale1,gradParamsDScale2,lossGGAN,lossGFM,lossGVGG,lossD] = dlfeval(gydF4y2Ba…gydF4y2Ba@modelGradients、dlInputSegMap dlRealImage, dlnetGenerator、dlnetDiscriminatorScale1 dlnetDiscriminatorScale2, netVGG);gydF4y2Ba%更新生成器参数gydF4y2Ba[dlnetGenerator,trailingAvgGenerator,trailingAvgSqGenerator] = adamupdate(gydF4y2Ba…gydF4y2BadlnetGenerator gradParamsG,gydF4y2Ba…gydF4y2BatrailingAvgGenerator trailingAvgSqGenerator,迭代,gydF4y2Ba…gydF4y2BalearningRate、gradientDecayFactor squaredGradientDecayFactor);gydF4y2Ba%更新鉴别器scale1参数gydF4y2Ba[dlnetDiscriminatorScale1,trailingAvgDiscriminatorScale1,trailingAvgSqDiscriminatorScale1] = adamupdate(gydF4y2Ba…gydF4y2BadlnetDiscriminatorScale1 gradParamsDScale1,gydF4y2Ba…gydF4y2BatrailingAvgDiscriminatorScale1 trailingAvgSqDiscriminatorScale1,迭代,gydF4y2Ba…gydF4y2BalearningRate、gradientDecayFactor squaredGradientDecayFactor);gydF4y2Ba%更新鉴别器scale2参数gydF4y2Ba[dlnetDiscriminatorScale2,trailingAvgDiscriminatorScale2,trailingAvgSqDiscriminatorScale2] = adamupdate(gydF4y2Ba…gydF4y2BadlnetDiscriminatorScale2 gradParamsDScale2,gydF4y2Ba…gydF4y2BatrailingAvgDiscriminatorScale2 trailingAvgSqDiscriminatorScale2,迭代,gydF4y2Ba…gydF4y2BalearningRate、gradientDecayFactor squaredGradientDecayFactor);gydF4y2Ba%绘制和显示各种损失gydF4y2BalossPlotter = updattrainingprogressplotter (lossPlotter,迭代;gydF4y2Ba…gydF4y2Ba时代,numEpochs、lossD lossGGAN、lossGFM lossGVGG);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba保存(gydF4y2Ba“trainedPix2PixHDNet.mat”gydF4y2Ba,gydF4y2Ba“dlnetGenerator”gydF4y2Ba);gydF4y2Ba其他的gydF4y2BatrainedPix2PixHDNet_url =gydF4y2Ba“https://ssd.mathworks.com/万博1manbetxsupportfiles/vision/data/trainedPix2PixHDv2.zip”gydF4y2Ba;netDir = fullfile(tempdir,gydF4y2Ba“CamVid”gydF4y2Ba);downloadTrainedPix2PixHDNet (trainedPix2PixHDNet_url netDir);负载(fullfile (netDirgydF4y2Ba“trainedPix2PixHDv2.mat”gydF4y2Ba));gydF4y2Ba结束gydF4y2Ba

评估从测试数据生成的图像gydF4y2Ba

由于CamVid训练图像的数量相对较少,这种训练后的Pix2PixHD网络的性能受到限制。此外,一些图像属于一个图像序列,因此与训练集中的其他图像相关。为了提高Pix2PixHD网络的有效性,使用不同的数据集训练网络,该数据集具有更多的无相关性的训练图像。gydF4y2Ba

由于局限性,这种Pix2PixHD网络对于某些测试图像生成的图像比其他测试图像生成的图像更逼真。为了演示结果的差异,比较第一个和第三个测试图像生成的图像。第一个测试图像的相机角度比典型的训练图像更垂直于道路,这是一个不寻常的有利位置。相比之下,第三个测试图像的相机角度具有典型的有利位置,面向道路并显示两条车道和车道标记。该网络为第三个测试图像生成逼真图像的性能明显优于为第一个测试图像生成逼真图像的性能。gydF4y2Ba

从测试数据中获得第一张地面真实场景图像。使用双三次插值调整图像大小。gydF4y2Ba

idxToTest = 1;gtImage = readimage(imdsTest,idxToTest);gtImage = imresize(gtImage,imageSize,gydF4y2Ba“双三次的”gydF4y2Ba);gydF4y2Ba

从测试数据中获取相应的像素标签图像。使用最近邻插值调整像素标签图像的大小。gydF4y2Ba

segMap = readimage(pxdsTest,idxToTest);segMap = imresize(segMap,imageSize,gydF4y2Ba“最近的”gydF4y2Ba);gydF4y2Ba

将像素标签图像转换为多通道单热分割映射gydF4y2BaonehotencodegydF4y2Ba函数。gydF4y2Ba

segMap,3,gydF4y2Ba“单一”gydF4y2Ba);gydF4y2Ba

创建gydF4y2BadlarraygydF4y2Ba对象,将数据输入到生成器。如果支持的万博1manbetxGPU可用于计算,则通过将数据转换为a来在GPU上执行推理gydF4y2BagpuArraygydF4y2Ba对象。gydF4y2Ba

dlSegMap = darray (segaponehot)gydF4y2Ba“SSCB”gydF4y2Ba);gydF4y2Ba如果gydF4y2BacanUseGPU dlSegMap = gpuArray(dlSegMap);gydF4y2Ba结束gydF4y2Ba

从生成器和单热分割映射中生成场景图像gydF4y2Ba预测gydF4y2Ba函数。gydF4y2Ba

dlgenerateimage = predict(dlnetGenerator,dlSegMap);generatedImage = extractdata(gather(dlGeneratedImage));gydF4y2Ba

生成器网络的最后一层产生的激活值在[- 1,1]范围内。为了显示,重新调整激活到[0,1]的范围。gydF4y2Ba

generatedImage = rescale(generatedImage);gydF4y2Ba

控件将标签从分类标签转换为RGB颜色gydF4y2Balabel2rgbgydF4y2Ba(图像处理工具箱)gydF4y2Ba函数。gydF4y2Ba

colordsegmap = label2rgb(segMap,cmap);gydF4y2Ba

在蒙太奇中显示RGB像素标签图像、生成的场景图像和地面真实场景图像。gydF4y2Ba

图蒙太奇({coloredSegMap generateimage gtImage},gydF4y2Ba“大小”gydF4y2Ba,[13]) title([gydF4y2Ba“测试像素标签图像”gydF4y2Banum2str (idxToTest),gydF4y2Ba“生成和地面真实场景图像”gydF4y2Ba])gydF4y2Ba

从测试数据中得到第三个ground truth场景图像。使用双三次插值调整图像大小。gydF4y2Ba

idxToTest = 3;gtImage = readimage(imdsTest,idxToTest);gtImage = imresize(gtImage,imageSize,gydF4y2Ba“双三次的”gydF4y2Ba);gydF4y2Ba

要从测试数据中获得第三个像素标签图像并生成相应的场景图像,可以使用辅助函数gydF4y2BaevaluatePix2PixHDgydF4y2Ba.这个辅助函数作为支持文件附加到示例中。万博1manbetxgydF4y2Ba

的gydF4y2BaevaluatePix2PixHDgydF4y2Ba函数执行与评估第一个测试图像相同的操作:gydF4y2Ba

  • 从测试数据中获取像素标签图像。使用最近邻插值调整像素标签图像的大小。gydF4y2Ba

  • 将像素标签图像转换为多通道单热分割映射gydF4y2BaonehotencodegydF4y2Ba函数。gydF4y2Ba

  • 创建一个gydF4y2BadlarraygydF4y2Ba对象将数据输入到生成器。对于GPU推理,将数据转换为agydF4y2BagpuArraygydF4y2Ba对象。gydF4y2Ba

  • 从生成器和单热分割映射中生成场景图像gydF4y2Ba预测gydF4y2Ba函数。gydF4y2Ba

  • 重新调整激活到[0,1]的范围。gydF4y2Ba

[generateimage,segMap] = evaluatePix2PixHD(pxdsTest,idxToTest,imageSize,dlnetGenerator);gydF4y2Ba

控件将标签从分类标签转换为RGB颜色gydF4y2Balabel2rgbgydF4y2Ba(图像处理工具箱)gydF4y2Ba函数。gydF4y2Ba

colordsegmap = label2rgb(segMap,cmap);gydF4y2Ba

在蒙太奇中显示RGB像素标签图像、生成的场景图像和地面真实场景图像。gydF4y2Ba

图蒙太奇({coloredSegMap generateimage gtImage},gydF4y2Ba“大小”gydF4y2Ba,[13]) title([gydF4y2Ba“测试像素标签图像”gydF4y2Banum2str (idxToTest),gydF4y2Ba“生成和地面真实场景图像”gydF4y2Ba])gydF4y2Ba

评估自定义像素标签图像生成的图像gydF4y2Ba

为了评估网络对CamVid数据集之外的像素标签图像的泛化程度,可以从自定义像素标签图像生成场景图像。方法创建的像素标签图像gydF4y2Ba图片标志gydF4y2Ba(计算机视觉工具箱)gydF4y2Ba像素标签图像作为支持文件附加到示例中。万博1manbetx没有地面真实图像可用。gydF4y2Ba

创建一个像素标签数据存储,用于读取和处理当前示例目录中的像素标签图像。gydF4y2Ba

cpxds = pixelLabelDatastore(pwd,classes,labelIDs);gydF4y2Ba

对于数据存储中的每个像素标签图像,使用辅助函数生成一个场景图像gydF4y2BaevaluatePix2PixHDgydF4y2Ba.gydF4y2Ba

为gydF4y2Baidx = 1:长度(cpxds.Files)gydF4y2Ba获取像素标签图像和生成的场景图像gydF4y2Ba[generateimage,segMap] = evaluatePix2PixHD(cpxds,idx,imageSize,dlnetGenerator);gydF4y2Ba要显示,请将标签从分类标签转换为RGB颜色gydF4y2Bacolordsegmap = label2rgb(segMap);gydF4y2Ba在蒙太奇中显示像素标签图像和生成的场景图像gydF4y2Ba图蒙太奇({coloredSegMap generateimage})标题([gydF4y2Ba“自定义像素标签图像”gydF4y2Banum2str (idx),gydF4y2Ba和生成的场景图像gydF4y2Ba])gydF4y2Ba结束gydF4y2Ba

万博1manbetx支持功能gydF4y2Ba

模型梯度函数gydF4y2Ba

的gydF4y2BamodelGradientsgydF4y2Ba辅助函数计算生成器和鉴别器的梯度和对抗损失。该函数还计算了生成器的特征匹配损耗和VGG损耗。gydF4y2Ba

函数gydF4y2Ba[gradParamsG,gradParamsDScale1,gradParamsDScale2,lossGGAN,lossGFM,lossGVGG,lossD] = modelGradients(inputSegMap,realImage,generator,discriminatorScale1,discriminatorScale2,netVGG)gydF4y2Ba给定输入语义,计算生成器生成的图像gydF4y2Ba%的地图。gydF4y2Bagenerateimage = forward(generator,inputSegMap);gydF4y2Ba定义损失权重gydF4y2BalambdaDiscriminator = 1;lambdaGenerator = 1;lambdfeaturematching = 5;lambdaVGG = 5;gydF4y2Ba%将要分类的图像和语义图连接起来gydF4y2BainpDiscriminatorReal = cat(3,inputSegMap,realImage);inpDiscriminatorGenerated = cat(3,inputSegMap, generateimage);gydF4y2Ba计算鉴别器和生成器的对抗损失gydF4y2Ba%表示第一个音阶。gydF4y2Ba[DLossScale1, glosscale1,realPredScale1D,fakePredScale1G] = pix2pixHDAdverserialLoss(inpDiscriminatorReal,inpDiscriminatorGenerated,discriminatorScale1);gydF4y2Ba缩放生成的图像,真实图像,和输入的语义映射到gydF4y2Ba%半尺寸gydF4y2Baresizerealimage = dlresize(realImage,gydF4y2Ba“规模”gydF4y2Ba, 0.5,gydF4y2Ba“方法”gydF4y2Ba,gydF4y2Ba“线性”gydF4y2Ba);resizedgenerateimage = dlresize(generateimage;gydF4y2Ba“规模”gydF4y2Ba, 0.5,gydF4y2Ba“方法”gydF4y2Ba,gydF4y2Ba“线性”gydF4y2Ba);resize = dlresize(inputSegMap,gydF4y2Ba“规模”gydF4y2Ba, 0.5,gydF4y2Ba“方法”gydF4y2Ba,gydF4y2Ba“最近的”gydF4y2Ba);gydF4y2Ba%将要分类的图像和语义图连接起来gydF4y2BainpDiscriminatorReal = cat(3,resizedinputSegMap,resizedRealImage);inpDiscriminatorGenerated = cat(3,resizedinputSegMap, resizedgenerateimage);gydF4y2Ba计算鉴别器和生成器的对抗损失gydF4y2Ba%为第二刻度。gydF4y2Ba[DLossScale2, glosscale2,realPredScale2D,fakePredScale2G] = pix2pixHDAdverserialLoss(inpDiscriminatorReal,inpDiscriminatorGenerated,discriminatorScale2);gydF4y2Ba%计算第一个尺度的特征匹配损失。gydF4y2BaFMLossScale1 = pix2pixHDFeatureMatchingLoss(realPredScale1D,fakePredScale1G);FMLossScale1 = FMLossScale1 * lambdfeature matching;gydF4y2Ba%计算第二尺度的特征匹配损失。gydF4y2BaFMLossScale2 = pix2pixHDFeatureMatchingLoss(realPredScale2D,fakePredScale2G);FMLossScale2 = FMLossScale2 * lambdfeature matching;gydF4y2Ba%计算VGG损失gydF4y2BaVGGLoss = pix2pixHDVGGLoss(realImage, generateimage,netVGG);VGGLoss = VGGLoss * lambdaVGG;gydF4y2Ba%计算综合发电机损耗gydF4y2BalossGCombined = gloscale1 + gloscale2 + FMLossScale1 + FMLossScale2 + VGGLoss;lossGCombined = lossGCombined * lambdaGenerator;gydF4y2Ba%计算生成器的梯度gydF4y2BagradParamsG = dlgradient(lossGCombined,generator)。可学的,gydF4y2Ba“RetainData”gydF4y2Ba,真正的);gydF4y2Ba%计算组合鉴别器损失gydF4y2BalossDCombined = (DLossScale1 + DLossScale2)/2 * lambdaddiscriminator;gydF4y2Ba%计算鉴别器刻度的梯度1gydF4y2BagradParamsDScale1 = dlgradient(lossDCombined,discriminatorScale1.)可学的,gydF4y2Ba“RetainData”gydF4y2Ba,真正的);gydF4y2Ba%计算鉴别器刻度的梯度2gydF4y2BagradParamsDScale2 = dlgradient(lossDCombined,discriminatorScale2.Learnables);gydF4y2Ba%记录值以便稍后显示gydF4y2BalossD = collect (extractdata(lossDCombined));lossGGAN = collect (extractdata(glosscale1 + glosscale2));lossGFM = collect (extractdata(FMLossScale1 + FMLossScale2));lossGVGG = collect (extractdata(VGGLoss));gydF4y2Ba结束gydF4y2Ba

对抗损失函数gydF4y2Ba

辅助函数gydF4y2Bapix2pixHDAdverserialLossgydF4y2Ba计算发生器和鉴别器的对抗损失梯度。该函数还返回真实图像和合成图像的特征映射。gydF4y2Ba

函数gydF4y2Ba[DLoss,GLoss,realPredFtrsD,genPredFtrsD] = pix2pixHDAdverserialLoss(inpReal,inpGenerated,discriminator)gydF4y2Ba%包含特征映射的鉴别器层名gydF4y2BafeatureNames = {gydF4y2Ba“act_top”gydF4y2Ba,gydF4y2Ba“act_mid_1”gydF4y2Ba,gydF4y2Ba“act_mid_2”gydF4y2Ba,gydF4y2Ba“act_tail”gydF4y2Ba,gydF4y2Ba“conv2d_final”gydF4y2Ba};gydF4y2Ba从鉴别器中获取真实图像的特征映射gydF4y2BarealPredFtrsD = cell(size(featureNames));[realPredFtrsD{:}] = forward(discriminator,inpReal,gydF4y2Ba“输出”gydF4y2Ba, featureNames);gydF4y2Ba从鉴别器中获取生成图像的特征映射gydF4y2BagenPredFtrsD = cell(size(featureNames));[genPredFtrsD{:}] = forward(discriminator,inpGenerated,)gydF4y2Ba“输出”gydF4y2Ba, featureNames);gydF4y2Ba%从最后一层获取特征图来计算损失gydF4y2BarealPredD = realPredFtrsD{end};genPredD = genPredFtrsD{end};gydF4y2Ba%计算鉴别器损失gydF4y2BaDLoss = (1 - realPredD)。^2 + (genPredD).^2;DLoss = mean(DLoss;gydF4y2Ba“所有”gydF4y2Ba);gydF4y2Ba%计算发电机损耗gydF4y2Ba(1 - genPredD).^2;光泽=平均(光泽;gydF4y2Ba“所有”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

特征匹配损失函数gydF4y2Ba

辅助函数gydF4y2Bapix2pixHDFeatureMatchingLossgydF4y2Ba计算由生成器生成的真实图像与合成图像之间的特征匹配损失。gydF4y2Ba

函数gydF4y2BafeatureMatchingLoss = pix2pixHDFeatureMatchingLoss(realPredFtrs,genPredFtrs)gydF4y2Ba%特性数gydF4y2BanumFtrsMaps = nummel (realPredFtrs);gydF4y2Ba%初始化特征匹配损失gydF4y2BafeatureMatchingLoss = 0;gydF4y2Ba为gydF4y2Bai = 1:numFtrsMapsgydF4y2Ba%获取真实图像的特征图gydF4y2Baa = extractdata(realPredFtrs{i});gydF4y2Ba%获取合成图像的特征图gydF4y2Bab = genPredFtrs{i};gydF4y2Ba%计算特征匹配损失gydF4y2BafeatureMatchingLoss = featureMatchingLoss + mean(abs(a - b)),gydF4y2Ba“所有”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

感知VGG损失函数gydF4y2Ba

辅助函数gydF4y2Bapix2pixHDVGGLossgydF4y2Ba计算由生成器生成的真实图像和合成图像之间的感知VGG损失。gydF4y2Ba

函数gydF4y2BavggLoss = pix2pixHDVGGLoss(realImage, generateimage,netVGG) featureWeights = [1.0/32 1.0/16 1.0/8 1.0/4 1.0];gydF4y2Ba%初始化VGG丢失gydF4y2BavggLoss = 0;gydF4y2Ba指定具有所需特征图的层的名称gydF4y2BafeatureNames = [gydF4y2Ba“relu1_1”gydF4y2Ba,gydF4y2Ba“relu2_1”gydF4y2Ba,gydF4y2Ba“relu3_1”gydF4y2Ba,gydF4y2Ba“relu4_1”gydF4y2Ba,gydF4y2Ba“relu5_1”gydF4y2Ba];gydF4y2Ba提取真实图像的特征图gydF4y2BaactivReal = cell(size(featureNames));[activReal{:}] = forward(netVGG,realImage,gydF4y2Ba“输出”gydF4y2Ba, featureNames);gydF4y2Ba提取合成图像的特征映射gydF4y2BaactivGenerated = cell(size(featurename));[activGenerated{:}] = forward(netVGG, generateimage,gydF4y2Ba“输出”gydF4y2Ba, featureNames);gydF4y2Ba%计算VGG损失gydF4y2Ba为gydF4y2Bai = 1:numel(featureNames) vggLoss = vggLoss + featureWeights(i)*mean(abs(activReal{i} - activGenerated{i}),gydF4y2Ba“所有”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

参考文献gydF4y2Ba

王婷春,刘明宇,朱俊彦,Andrew Tao, Jan Kautz, Bryan Catanzaro。“条件gan的高分辨率图像合成和语义操作”。在gydF4y2Ba2018 IEEE/CVF计算机视觉与模式识别大会gydF4y2Ba中文信息学报,8798-8807,2018。https://doi.org/10.1109/CVPR.2018.00917。gydF4y2Ba

[2] Brostow, Gabriel J., Julien Fauqueur和Roberto Cipolla。视频中的语义对象类:一个高清地面真相数据库。gydF4y2Ba模式识别字母gydF4y2Ba.第30卷,第2期,2009年,第88-97页。gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba(计算机视觉工具箱)gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的话题gydF4y2Ba