主要内容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数据集。下载时间取决于您的Internet连接。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/labeledappoved_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);图像= [576 768];GydF4y2Ba

使用helper函数定义CamVid数据集中32个类的类名和像素标签idGydF4y2BadefineCamVid32ClassesAndPixelLabelIDsGydF4y2Ba.使用helper函数获取CamVid数据集的标准颜色映射GydF4y2Bacamvid32ColorMapGydF4y2Ba.GydF4y2Ba辅助功能将附加到示例作为支持文件。金宝appGydF4y2Ba

numClasses = 32;(类、labelIDs) = defineCamVid32ClassesAndPixelLabelIDs;提出= camvid32ColorMap;GydF4y2Ba

创建一个GydF4y2BapixelLabelDatastoreGydF4y2Ba(电脑视觉工具箱)GydF4y2Ba存储像素标签图像。GydF4y2Ba

pxds = pixelLabelDatastore (labelDir、类labelIDs);GydF4y2Ba

预览像素标签图像和相应的地面真实场景图像。控件将标签从分类标签转换为RGB颜色GydF4y2Balabel2rgbGydF4y2Ba(图像处理工具箱)GydF4y2Ba函数,然后以蒙太奇方式显示像素标签图像和地面真值图像。GydF4y2Ba

im=预览(imds);px=预览(pxds);px=label2rgb(px,cmap);蒙太奇({px,im})GydF4y2Ba

使用辅助函数将数据划分为训练集和测试集GydF4y2BapartitionCamVidForPix2PixHDGydF4y2Ba.这个函数作为支持文件附加到示例中。金宝apphelper函数将数据分割为648个训练文件和32个测试文件。GydF4y2Ba

[imdsTrain, imdsTest pxdsTrain pxdsTest] = partitionCamVidForPix2PixHD (imd, pxds、类labelIDs);GydF4y2Ba

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

dsTrain =结合(pxdsTrain imdsTrain);GydF4y2Ba

增强训练数据使用GydF4y2Ba变换GydF4y2Ba函数具有helper函数指定的自定义预处理操作GydF4y2BapreprocessCamVidForPix2PixHDGydF4y2Ba.这个helper函数作为支持文件附加到示例中。金宝appGydF4y2Ba

这GydF4y2BapreprocessCamVidForPix2PixHDGydF4y2BaFunction执行以下操作:GydF4y2Ba

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

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

  3. 将单通道分割映射转换为32通道的单热点编码分割映射GydF4y2BaonehotencodeGydF4y2Ba函数。GydF4y2Ba

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

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

在蒙太奇中预览一个热编码分割图的通道。每个通道代表一个与唯一类的像素相对应的一个热点地图。GydF4y2Ba

地图=预览(dsTrain);蒙太奇(地图{1},GydF4y2Ba“大小”GydF4y2Ba, 8 [4],GydF4y2Ba“Bordersize”GydF4y2Ba,5,GydF4y2Ba“写成BackgroundColor”GydF4y2Ba那GydF4y2Ba“b”GydF4y2Ba)GydF4y2Ba

创建生成器网络GydF4y2Ba

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

generatorInputSize = [imageSize numClasses];GydF4y2Ba

使用“创建PIX2PIXHD生成器网络”GydF4y2Bapix2pixHDGlobalGeneratorGydF4y2Ba(图像处理工具箱)GydF4y2Ba函数。GydF4y2Ba

dlnetGenerator = pix2pixHDGlobalGenerator (generatorInputSize);GydF4y2Ba

显示网络结构。GydF4y2Ba

分析网络(dlnetGenerator)GydF4y2Ba

请注意,此示例显示了PIX2PIXHD全局生成器的使用,用于生成大小576-×768像素的图像。要创建本地增强器网络,以更高的分辨率生成图像,例如1152-by-1536像素甚至更高,可以使用GydF4y2BaaddPix2PixHDLocalEnhancerGydF4y2Ba(图像处理工具箱)GydF4y2Ba函数。局部增强器网络有助于在非常高的分辨率上生成精细的级别细节。金宝搏官方网站GydF4y2Ba

创建鉴别器网络GydF4y2Ba

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

该鉴别器的输入是一次性热点编码分割图与待分类场景图像的深度级联。将输入到鉴别器的通道数指定为已标记类和图像颜色通道的总数。GydF4y2Ba

NumimageChannels = 3;numchannelsdiscriminator = numclasses + numimagechels;GydF4y2Ba

指定第一个鉴别器的输入大小。的实例归一化创建补丁GAN鉴别器GydF4y2BapatchGANDiscriminatorGydF4y2Ba(图像处理工具箱)GydF4y2Ba函数。GydF4y2Ba

discriminatorInputSizeScale1 = [imageSize numChannelsDiscriminator];dlnetDiscriminatorScale1 = patchGANDiscriminator (discriminatorInputSizeScale1,GydF4y2Ba“规范化层”GydF4y2Ba那GydF4y2Ba“实例”GydF4y2Ba);GydF4y2Ba

指定第二个甄别器的输入大小为图像大小的一半,然后创建第二个patch GAN甄别器。GydF4y2Ba

discriminatorInputSizeScale2 =[地板(图象尺寸)。/ 2 numChannelsDiscriminator];dlnetDiscriminatorScale2 = patchGANDiscriminator (discriminatorInputSizeScale2,GydF4y2Ba“规范化层”GydF4y2Ba那GydF4y2Ba“实例”GydF4y2Ba);GydF4y2Ba

可视化网络。GydF4y2Ba

analyzeNetwork (dlnetDiscriminatorScale1);analyzeNetwork (dlnetDiscriminatorScale2);GydF4y2Ba

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

辅助函数GydF4y2BamodelGradientsGydF4y2Ba计算生成器和鉴别器的梯度和对抗损失。该函数还计算生成器的特征匹配损失和VGG损失。该函数在中定义GydF4y2Ba金宝app支持功能GydF4y2Ba这个例子的一部分。GydF4y2Ba

发电机损失GydF4y2Ba

生成器的目标是生成鉴别器分类为真实(1)的图像。GydF4y2Ba.GydF4y2Ba发电机损耗由三个损耗组成。GydF4y2Ba

  • 对抗性损失是作为1的向量与生成图像上的鉴别器预测之间的平方差来计算的。GydF4y2Ba yGydF4y2Ba ˆGydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba E.GydF4y2Ba D.GydF4y2Ba 是鉴别器对由发生器生成的图像的预测。这种损失是使用部分GydF4y2Bapix2pixhdAdversarialLossGydF4y2Ba中定义的辅助函数GydF4y2Ba金宝app支持功能GydF4y2Ba这个例子的一部分。GydF4y2Ba

L.GydF4y2Ba O.GydF4y2Ba S.GydF4y2Ba S.GydF4y2Ba 一种GydF4y2Ba D.GydF4y2Ba V.GydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba S.GydF4y2Ba 一种GydF4y2Ba R.GydF4y2Ba 一世GydF4y2Ba 一种GydF4y2Ba L.GydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba O.GydF4y2Ba R.GydF4y2Ba =GydF4y2Ba (GydF4y2Ba 1GydF4y2Ba -GydF4y2Ba yGydF4y2Ba ˆGydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba E.GydF4y2Ba D.GydF4y2Ba )GydF4y2Ba 2GydF4y2Ba

  • 特征匹配的缺失使GydF4y2Ba L.GydF4y2Ba 1GydF4y2Ba 作为鉴别器网络的预测而获得的真实和生成的特征图之间的距离。GydF4y2Ba T.GydF4y2Ba 为鉴别器特征层总数。GydF4y2Ba yGydF4y2Ba R.GydF4y2Ba E.GydF4y2Ba 一种GydF4y2Ba L.GydF4y2Ba 和GydF4y2Ba yGydF4y2Ba ˆGydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba E.GydF4y2Ba D.GydF4y2Ba 分别为地面真像和生成的图像。这种损失是使用GydF4y2Bapix2pixhdFeatureMatchingLossGydF4y2Ba中定义的辅助函数GydF4y2Ba金宝app支持功能GydF4y2Ba这个例子的一部分GydF4y2Ba

L.GydF4y2Ba O.GydF4y2Ba S.GydF4y2Ba S.GydF4y2Ba FGydF4y2Ba E.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba 你GydF4y2Ba R.GydF4y2Ba E.GydF4y2Ba mGydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba CGydF4y2Ba HGydF4y2Ba 一世GydF4y2Ba NGydF4y2Ba GGydF4y2Ba =GydF4y2Ba ∑GydF4y2Ba 一世GydF4y2Ba =GydF4y2Ba 1GydF4y2Ba T.GydF4y2Ba |GydF4y2Ba |GydF4y2Ba yGydF4y2Ba R.GydF4y2Ba E.GydF4y2Ba 一种GydF4y2Ba L.GydF4y2Ba -GydF4y2Ba yGydF4y2Ba ˆGydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba E.GydF4y2Ba D.GydF4y2Ba |GydF4y2Ba |GydF4y2Ba 1GydF4y2Ba

  • 知觉上的损失GydF4y2Ba L.GydF4y2Ba 1GydF4y2Ba 从特征提取网络中作为预测获得的真实特征图与生成特征图之间的距离。GydF4y2Ba T.GydF4y2Ba 是要素图层的总数。GydF4y2Ba yGydF4y2Ba V.GydF4y2Ba GGydF4y2Ba GGydF4y2Ba R.GydF4y2Ba E.GydF4y2Ba 一种GydF4y2Ba L.GydF4y2Ba 和GydF4y2Ba yGydF4y2Ba ˆGydF4y2Ba V.GydF4y2Ba GGydF4y2Ba GGydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba E.GydF4y2Ba D.GydF4y2Ba 分别为地面真值图像和生成图像的网络预测。这种损失是使用GydF4y2Bapix2pixhdVggLossGydF4y2Ba中定义的辅助函数GydF4y2Ba金宝app支持功能GydF4y2Ba这个例子的一部分。特征提取网络创建于GydF4y2Ba负荷特征提取网络GydF4y2Ba.GydF4y2Ba

L.GydF4y2Ba O.GydF4y2Ba S.GydF4y2Ba S.GydF4y2Ba V.GydF4y2Ba GGydF4y2Ba GGydF4y2Ba =GydF4y2Ba ∑GydF4y2Ba 一世GydF4y2Ba =GydF4y2Ba 1GydF4y2Ba T.GydF4y2Ba |GydF4y2Ba |GydF4y2Ba yGydF4y2Ba V.GydF4y2Ba GGydF4y2Ba GGydF4y2Ba R.GydF4y2Ba E.GydF4y2Ba 一种GydF4y2Ba L.GydF4y2Ba -GydF4y2Ba yGydF4y2Ba ˆGydF4y2Ba V.GydF4y2Ba GGydF4y2Ba GGydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba E.GydF4y2Ba D.GydF4y2Ba |GydF4y2Ba |GydF4y2Ba 1GydF4y2Ba

发电机总损耗是所有三个损耗的加权和。GydF4y2Ba λGydF4y2Ba 1GydF4y2Ba 那GydF4y2Ba λGydF4y2Ba 2GydF4y2Ba ,GydF4y2Ba λGydF4y2Ba 3.GydF4y2Ba 是对抗性损失,特征匹配损失和感知损失的重量因素。GydF4y2Ba

L.GydF4y2Ba O.GydF4y2Ba S.GydF4y2Ba S.GydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba O.GydF4y2Ba R.GydF4y2Ba =GydF4y2Ba λGydF4y2Ba 1GydF4y2Ba *GydF4y2Ba L.GydF4y2Ba O.GydF4y2Ba S.GydF4y2Ba S.GydF4y2Ba 一种GydF4y2Ba D.GydF4y2Ba V.GydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba S.GydF4y2Ba 一种GydF4y2Ba R.GydF4y2Ba 一世GydF4y2Ba 一种GydF4y2Ba L.GydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba O.GydF4y2Ba R.GydF4y2Ba +GydF4y2Ba λGydF4y2Ba 2GydF4y2Ba *GydF4y2Ba L.GydF4y2Ba O.GydF4y2Ba S.GydF4y2Ba S.GydF4y2Ba FGydF4y2Ba E.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba 你GydF4y2Ba R.GydF4y2Ba E.GydF4y2Ba mGydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba CGydF4y2Ba HGydF4y2Ba 一世GydF4y2Ba NGydF4y2Ba GGydF4y2Ba +GydF4y2Ba λGydF4y2Ba 3.GydF4y2Ba *GydF4y2Ba L.GydF4y2Ba O.GydF4y2Ba S.GydF4y2Ba S.GydF4y2Ba P.GydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba CGydF4y2Ba E.GydF4y2Ba P.GydF4y2Ba T.GydF4y2Ba 你GydF4y2Ba 一种GydF4y2Ba L.GydF4y2Ba

注意,生成器的对抗损失和特征匹配损失是针对两种不同的尺度计算的。GydF4y2Ba

鉴频器的损失GydF4y2Ba

鉴别器的目的是正确地区分地面真实图像和生成的图像。鉴别器损耗是两个分量的和:GydF4y2Ba

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

  • 在生成的图像上,零向量与鉴别器的预测值之间的平方差GydF4y2Ba

L.GydF4y2Ba O.GydF4y2Ba S.GydF4y2Ba S.GydF4y2Ba D.GydF4y2Ba 一世GydF4y2Ba S.GydF4y2Ba CGydF4y2Ba R.GydF4y2Ba 一世GydF4y2Ba mGydF4y2Ba 一世GydF4y2Ba NGydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba O.GydF4y2Ba R.GydF4y2Ba =GydF4y2Ba (GydF4y2Ba 1GydF4y2Ba -GydF4y2Ba yGydF4y2Ba R.GydF4y2Ba E.GydF4y2Ba 一种GydF4y2Ba L.GydF4y2Ba )GydF4y2Ba 2GydF4y2Ba +GydF4y2Ba (GydF4y2Ba 0.GydF4y2Ba -GydF4y2Ba yGydF4y2Ba ˆGydF4y2Ba GGydF4y2Ba E.GydF4y2Ba NGydF4y2Ba E.GydF4y2Ba R.GydF4y2Ba 一种GydF4y2Ba T.GydF4y2Ba E.GydF4y2Ba D.GydF4y2Ba )GydF4y2Ba 2GydF4y2Ba

鉴别器损耗是使用部分GydF4y2Bapix2pixhdAdversarialLossGydF4y2Ba中定义的辅助函数GydF4y2Ba金宝app支持功能GydF4y2Ba此示例的第节。请注意,鉴别器的对抗性损失是针对两种不同的鉴别器标度计算的。GydF4y2Ba

负荷特征提取网络GydF4y2Ba

这个例子修改了一个预先训练的vgg19深度神经网络来提取真实和生成的图像在不同层的特征。这些多层特征被用来计算感知损失的发生器。GydF4y2Ba

为了得到一个预先训练的vgg19网络,安装GydF4y2Bavgg19GydF4y2Ba.如果您没有安装所需的支持包,那么该软件将提供下载链接。金宝appGydF4y2Ba

netVGG = vgg19;GydF4y2Ba

使用GydF4y2Ba深层网络设计师GydF4y2Ba应用程序。GydF4y2Ba

deepNetworkDesigner (netVGG)GydF4y2Ba

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

netVGG = layerGraph (netVGG.Layers(1) 38分到来);GydF4y2Ba

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

INP = ImageInputLayer([象限3],GydF4y2Ba“正常化”GydF4y2Ba那GydF4y2Ba“没有”GydF4y2Ba那GydF4y2Ba“名称”GydF4y2Ba那GydF4y2Ba“输入”GydF4y2Ba);netVGG = replaceLayer (netVGG,GydF4y2Ba“输入”GydF4y2Ba,inp);netVGG=dlnetwork(netVGG);GydF4y2Ba

指定培训选项GydF4y2Ba

指定Adam优化的选项。为60个时代而训练。为生成器和鉴别器网络指定相同的选项。GydF4y2Ba

  • 指定平等的学习率为0.0002。GydF4y2Ba

  • 使用初始化尾部平均梯度和尾部平均梯度平方衰减率GydF4y2Ba[]GydF4y2Ba.GydF4y2Ba

  • 使用梯度衰减系数为0.5和平方梯度衰减系数为0.999。GydF4y2Ba

  • 使用最小批量1进行培训。GydF4y2Ba

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

创建一个GydF4y2BaminibatchqueueGydF4y2Ba对象,该对象在自定义训练循环中管理观察的小批处理。GydF4y2Ba这GydF4y2BaminibatchqueueGydF4y2Ba对象还将数据强制转换到GydF4y2BadlarrayGydF4y2Ba对象,使深度学习应用程序中的自动区分。GydF4y2Ba

指定小批量数据提取格式为GydF4y2BaSSCBGydF4y2Ba(spatial, spatial, channel, batch)。设置GydF4y2BaDispatchInBackgroundGydF4y2Ba作为返回的布尔值的名称-值对参数GydF4y2BacanUseGPUGydF4y2Ba.如果支持的金宝appGPU可用来进行计算,则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。助手功能作为支持文件附加到示例。预训练网络使您无需等待培训完成即可运行整个示例。金宝appGydF4y2Ba

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

  • 属性读取当前小批处理的数据GydF4y2Ba下一个GydF4y2Ba函数。GydF4y2Ba

  • 方法评估模型梯度GydF4y2BadlfevalGydF4y2Ba函数和GydF4y2BamodelGradientsGydF4y2Ba帮手功能。GydF4y2Ba

  • 使用以下命令更新网络参数:GydF4y2BaadamupdateGydF4y2Ba函数。GydF4y2Ba

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

在可用的GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GydF4y2BaGPU支金宝app持情况GydF4y2Ba(并行计算工具箱)GydF4y2Ba.GydF4y2Ba

在NVIDIA上训练大约需要22小时™ Titan RTX,可能需要更长的时间,具体取决于您的GPU硬件。如果您的GPU设备内存较少,请尝试通过指定GydF4y2Ba图片尺寸GydF4y2Ba中的变量为[480 640]GydF4y2Ba训练数据进行预处理GydF4y2Ba这个例子的一部分。GydF4y2Ba

doTraining = false;GydF4y2Ba如果GydF4y2Badotrain nutrained fig =图;WordPlotter = ConfiguretringProgressplotter(图);迭代= 0;GydF4y2Ba%循环跨越时代GydF4y2Ba对于GydF4y2Ba时代= 1:numEpochsGydF4y2Ba重置并洗牌数据GydF4y2Ba重置(mbqTrain);洗牌(mbqTrain);GydF4y2Ba%在每个图像上循环GydF4y2Ba而GydF4y2Bahasdata(mbqTrain) iteration = iteration + 1;GydF4y2Ba从当前的小批读取数据GydF4y2Ba[dlInputSegMap, dlRealImage] =下一个(mbqTrain);GydF4y2Ba%使用Model梯度和发电机状态进行评估GydF4y2Ba文件末尾列出的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%更新鉴别器刻度1参数GydF4y2Ba[dlnetDiscriminatorScale1, trailingAvgDiscriminatorScale1 trailingAvgSqDiscriminatorScale1] = adamupdate (GydF4y2Ba...GydF4y2Badlnetdiscriminatorscale1,gradparamsdscale1,GydF4y2Ba...GydF4y2BatrailingAvgDiscriminatorScale1 trailingAvgSqDiscriminatorScale1,迭代,GydF4y2Ba...GydF4y2BalearningRate、gradientDecayFactor squaredGradientDecayFactor);GydF4y2Ba%更新鉴别器刻度2参数GydF4y2Ba[dlnetDiscriminatorScale2, trailingAvgDiscriminatorScale2 trailingAvgSqDiscriminatorScale2] = adamupdate (GydF4y2Ba...GydF4y2BadlnetDiscriminatorScale2,GradParamsScale2,GydF4y2Ba...GydF4y2BatrailingAvgDiscriminatorScale2 trailingAvgSqDiscriminatorScale2,迭代,GydF4y2Ba...GydF4y2BalearningRate、gradientDecayFactor squaredGradientDecayFactor);GydF4y2Ba%绘制和显示各种损失GydF4y2BalossPlotter = updateTrainingProgressPlotter (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/金宝appsupportfiles/vision/data/trainedPix2PixHDv2.zip”GydF4y2Ba;netdir = fullfile(tempdir,GydF4y2Ba“CamVid”GydF4y2Ba);DownloadTroundPix2PixHDNET(TroutaPix2Pixhdnet_URL,Netdir);加载(FullFile(Netdir,GydF4y2Ba“trainedPix2PixHDv2.mat”GydF4y2Ba));GydF4y2Ba结束GydF4y2Ba

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

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

由于限制,该PIX2PIXHD网络为某些测试图像产生比其他特定图像更现实的图像。为了展示结果的差异,比较第一和第三测试图像的所生成的图像。第一测试图像的相机角度具有罕见的有利位置,其面上比典型的训练图像更垂直于道路。相反,第三种测试图像的相机角度具有沿着道路面向的典型的有利点,并显示两个带有车道标记的车道。该网络具有显着更好的性能,为第三测试图像产生比对于第一测试图像的现实图像。GydF4y2Ba

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

idxToTest = 1;gtImage = readimage (imdsTest idxToTest);gtImage = imresize (gtImage图象尺寸,GydF4y2Ba“双方”GydF4y2Ba);GydF4y2Ba

从测试数据获取相应的像素标签图像。使用最近邻插插调节像素标签图像。GydF4y2Ba

segmap = ReadImage(PXDSTEST,IDXTOTEST);segmap = imresize(segmap,imagesize,GydF4y2Ba“最近的”GydF4y2Ba);GydF4y2Ba

将像素标签图像转换为多通道单热点分割图使用GydF4y2BaonehotencodeGydF4y2Ba函数。GydF4y2Ba

segMapOneHot = onehotencode (segMap 3GydF4y2Ba“单一”GydF4y2Ba);GydF4y2Ba

创建GydF4y2BadlarrayGydF4y2Ba对象,该对象向生成器输入数据。如果支持的金宝appGPU可用来进行计算,则在GPU上通过将数据转换为GydF4y2BagpuArrayGydF4y2Ba对象。GydF4y2Ba

dlSegMap = dlarray (segMapOneHot,GydF4y2Ba“SSCB”GydF4y2Ba);GydF4y2Ba如果GydF4y2Bacanusegpu dlsegmap = gpuarray(dlsegmap);GydF4y2Ba结束GydF4y2Ba

从生成器生成场景图像,并使用GydF4y2Ba预测GydF4y2Ba函数。GydF4y2Ba

dlgeneratedImage =预测(Dlnetgenerator,Dlsegmap);ConsigationImage = ExtractData(收集(DLGeneratedImage));GydF4y2Ba

生成器网络的最后一层生成范围为[-1,1]的激活。要显示,请将激活重新缩放到范围[0,1]。GydF4y2Ba

generatedImage =重新调节(generatedImage);GydF4y2Ba

为显示,将标签从分类标签转换为RGB颜色GydF4y2Balabel2rgbGydF4y2Ba(图像处理工具箱)GydF4y2Ba函数。GydF4y2Ba

COMORYSEGMAP = LABEL2RGB(SEGMAP,CMAP);GydF4y2Ba

以蒙太奇方式显示RGB像素标签图像、生成的场景图像和地面真实场景图像。GydF4y2Ba

图蒙太奇({coloredSegMap generatedImage gtImage},GydF4y2Ba“大小”GydF4y2Ba,[1 3])标题([GydF4y2Ba“测试像素标签图像”GydF4y2Ba,num2str(iDxtotest),GydF4y2Ba“与生成和地面真实场景图像”GydF4y2Ba])GydF4y2Ba

从测试数据中得到第三幅地面真实场景图像。使用双三次插值调整图像的大小。GydF4y2Ba

idxToTest = 3;gtImage = readimage (imdsTest idxToTest);gtImage = imresize (gtImage图象尺寸,GydF4y2Ba“双方”GydF4y2Ba);GydF4y2Ba

要从测试数据中获取第三个像素标签图像并生成相应的场景图像,可以使用helper函数GydF4y2BaevaluatePix2PixHDGydF4y2Ba.这个helper函数作为支持文件附加到示例中。金宝appGydF4y2Ba

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

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

  • 将像素标签图像转换为多通道单热点分割地图使用GydF4y2BaonehotencodeGydF4y2Ba函数。GydF4y2Ba

  • 创建一个GydF4y2BadlarrayGydF4y2Ba对象以将数据输入到生成器。对于GPU推理,将数据转换为GydF4y2BagpuArrayGydF4y2Ba对象。GydF4y2Ba

  • 从生成器生成场景图像,并使用GydF4y2Ba预测GydF4y2Ba函数。GydF4y2Ba

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

[ConsigationImage,SegMap] = EvaluePix2PixHD(PXDSTEST,IDXTOT,ImageIze,DLNETGENERATOR);GydF4y2Ba

为显示,将标签从分类标签转换为RGB颜色GydF4y2Balabel2rgbGydF4y2Ba(图像处理工具箱)GydF4y2Ba函数。GydF4y2Ba

COMORYSEGMAP = LABEL2RGB(SEGMAP,CMAP);GydF4y2Ba

以蒙太奇方式显示RGB像素标签图像、生成的场景图像和地面真实场景图像。GydF4y2Ba

图蒙太奇({coloredSegMap generatedImage gtImage},GydF4y2Ba“大小”GydF4y2Ba,[1 3])标题([GydF4y2Ba“测试像素标签图像”GydF4y2Ba,num2str(iDxtotest),GydF4y2Ba“与生成和地面真实场景图像”GydF4y2Ba])GydF4y2Ba

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

要评估网络对CamVid数据集之外的像素标签图像的概括程度,请从自定义像素标签图像生成场景图像。此示例使用使用创建的像素标签图像GydF4y2Ba图像贴标器GydF4y2Ba(电脑视觉工具箱)GydF4y2Ba应用程序。像素标签图像作为支持文件附加到示例。没有地面真实图像可用。金宝appGydF4y2Ba

创建像素标签数据存储,该数据存储读取和处理当前示例目录中的像素标签图像。GydF4y2Ba

cpxds = pixelLabelDatastore (pwd、类labelIDs);GydF4y2Ba

对于数据存储中的每个像素标签图像,使用helper函数生成一个场景图像GydF4y2BaevaluatePix2PixHDGydF4y2Ba.GydF4y2Ba

对于GydF4y2Baidx = 1:长度(cpxds.Files)GydF4y2Ba%获取像素标签图像并生成场景图像GydF4y2Ba[generatedImage, segMap] = evaluatePix2PixHD (cpxds idx,图象尺寸,dlnetGenerator);GydF4y2Ba%对于显示,请将标签从分类标签转换为RGB颜色GydF4y2BacoloredSegMap = label2rgb (segMap);GydF4y2Ba%显示像素标签图像并在蒙太奇中生成的场景图像GydF4y2Ba图蒙太奇({coloredSegMap generatedImage})标题([GydF4y2Ba“自定义像素标签图像”GydF4y2Banum2str (idx),GydF4y2Ba“和生成的场景图像”GydF4y2Ba])GydF4y2Ba结束GydF4y2Ba

金宝app支持功能GydF4y2Ba

模型梯度函数GydF4y2Ba

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

函数GydF4y2Ba[gradParamsG, gradParamsDScale1 gradParamsDScale2、lossGGAN lossGFM, lossGVGG, lossD] = modelGradients (inputSegMap realImage,发电机,discriminatorScale1 discriminatorScale2, netVGG)GydF4y2Ba%计算由给定输入语义的生成器生成的图像GydF4y2Ba% 地图。GydF4y2BageneratedImage =前进(发电机、inputSegMap);GydF4y2Ba%定义损失权重GydF4y2BalambdaDiscriminator=1;lambdaGenerator=1;lambdaFeatureMatching=5;lambdaVGG=5;GydF4y2Ba%将待分类的图像与语义映射连接GydF4y2BainpDiscriminatorReal =猫(3 inputSegMap realImage);inpDiscriminatorGenerated =猫(3 inputSegMap generatedImage);GydF4y2Ba%计算鉴别器和生成器的对抗损失GydF4y2Ba百分比百分比。GydF4y2Ba[DLossScale1, GLossScale1 realPredScale1D fakePredScale1G] = pix2pixHDAdverserialLoss (inpDiscriminatorReal, inpDiscriminatorGenerated discriminatorScale1);GydF4y2Ba%将生成的图像、真实图像和输入的语义映射缩放到GydF4y2Ba%的一半大小GydF4y2BaresizedRealImage = dlresize (realImage,GydF4y2Ba“规模”GydF4y2Ba, 0.5,GydF4y2Ba“方法”GydF4y2Ba那GydF4y2Ba“线性”GydF4y2Ba);resizedGeneratedImage = dlresize (generatedImage,GydF4y2Ba“规模”GydF4y2Ba, 0.5,GydF4y2Ba“方法”GydF4y2Ba那GydF4y2Ba“线性”GydF4y2Ba);resizedinputSegMap = dlresize (inputSegMap,GydF4y2Ba“规模”GydF4y2Ba, 0.5,GydF4y2Ba“方法”GydF4y2Ba那GydF4y2Ba“最近的”GydF4y2Ba);GydF4y2Ba%将待分类的图像与语义映射连接GydF4y2BainpDiscriminatorReal =猫(3 resizedinputSegMap resizedRealImage);inpDiscriminatorGenerated =猫(3 resizedinputSegMap resizedGeneratedImage);GydF4y2Ba%计算鉴别器和生成器的对抗损失GydF4y2Ba%为第二刻度。GydF4y2Ba[DLossScale2、GLossScale2、realPredScale2D、fakePredScale2G]=pix2PixhdVerserialLoss(inpDiscriminatorReal、inpDiscriminatorGenerated、discriminatorScale2);GydF4y2Ba%计算第一刻度的特征匹配丢失。GydF4y2Bafmlossscale1 = PIX2PIXHDFEATUREMATCHINGLOSS(RealPredscale1d,fakepredscale1g);fmlossscale1 = fmlossscale1 * lambdafeaturematching;GydF4y2Ba%计算第二次尺度的特征匹配损失。GydF4y2BaFMLossScale2 = pix2pixHDFeatureMatchingLoss (realPredScale2D fakePredScale2G);FMLossScale2 = FMLossScale2 * lambdaFeatureMatching;GydF4y2Ba%计算VGG损耗GydF4y2BaVGGLoss=pix2pixHDVGGLoss(realImage、GenerateImage、netVGG);VGGLoss=VGGLoss*lambdaVGG;GydF4y2Ba%计算发电机综合损耗GydF4y2BalossGCombined=GLossScale1+GLossScale2+FMLossScale1+FMLossScale2+VGGLoss;lossGCombined=lossGCombined*lambdaGenerator;GydF4y2Ba%计算生成器的渐变GydF4y2BaGradParamsg = Dlgradient(Lockgcombined,Gen​​erator.Learnable,GydF4y2Ba“RetainData”GydF4y2Ba,真正的);GydF4y2Ba%计算组合鉴别器损耗GydF4y2BaLOSTDCOMBINED =(DLOSSSCALE1 + DLOSSSCALE2)/ 2 * LambdAdiscriminator;GydF4y2Ba鉴别器秤的%计算梯度1GydF4y2BagradParamsDScale1 = dlgradient (lossDCombined discriminatorScale1。可学的,GydF4y2Ba“RetainData”GydF4y2Ba,真正的);GydF4y2Ba鉴别器秤的%计算梯度2GydF4y2BagradParamsDScale2 = dlgradient (lossDCombined discriminatorScale2.Learnables);GydF4y2Ba%记录这些值以便以后显示GydF4y2BalossD=聚集(提取数据(lossDCombined));lossGGAN=gather(提取数据(GLossScale1+GLossScale2));lossGFM=聚集(提取数据(fmlosscale1+fmlosscale2));lossGVGG=收集(提取数据(VGGLoss));GydF4y2Ba结束GydF4y2Ba

对抗损失函数GydF4y2Ba

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

函数GydF4y2Ba[DLoss,光泽,realPredFtrsD genPredFtrsD] = pix2pixHDAdverserialLoss (inpReal inpGenerated,鉴频器)GydF4y2Ba%包含要素地图的鉴别器图层名称GydF4y2BafeatureNames = {GydF4y2Ba“第一幕”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 {:}] =前进(鉴别器,inpreal,GydF4y2Ba“产出”GydF4y2Ba,特征名称);GydF4y2Ba%从鉴别器中得到生成图像的特征图GydF4y2BaGenpredFtrsd = Cell(大小(特色名称));[GenpredFtrsd {:}] =前进(鉴别器,inpenerated,GydF4y2Ba“产出”GydF4y2Ba,特征名称);GydF4y2Ba%从最后一层得到feature map来计算损失GydF4y2BarealPredD = realPredFtrsD{}结束;genPredD = genPredFtrsD{}结束;GydF4y2Ba%计算鉴别器损耗GydF4y2BaDLoss = (1 - realPredD)。^ 2 + (genPredD)。^ 2;DLoss =意味着(DLoss,GydF4y2Ba“所有”GydF4y2Ba);GydF4y2Ba%计算发电机损耗GydF4y2Ba光泽度=(1-genPredD)。^2;光泽度=平均值(光泽度,GydF4y2Ba“所有”GydF4y2Ba);GydF4y2Ba结束GydF4y2Ba

特征匹配损失函数GydF4y2Ba

辅助函数GydF4y2Bapix2pixHDFeatureMatchingLossGydF4y2Ba计算真实图像和发电机生成的合成图像之间的特征匹配丢失。GydF4y2Ba

函数GydF4y2Bafeaturematchingloss = pix2pixhdfeaturematchingloss(realpredftrs,genpredftrs)GydF4y2Ba%特征数量GydF4y2Banumftrsmaps = numel(realpredftrs);GydF4y2Ba%初始化特征匹配丢失GydF4y2BafeatureMatchingLoss = 0;GydF4y2Ba对于GydF4y2Ba我= 1:numFtrsMapsGydF4y2Ba%获取真实图像的特征映射GydF4y2Ba一个= extractdata (realPredFtrs{我});GydF4y2Ba%得到合成图像的特征图GydF4y2Bab = genPredFtrs {};GydF4y2Ba%计算特征匹配损失GydF4y2BafeatureMatchingLoss = featureMatchingLoss + mean(abs(a - b),GydF4y2Ba“所有”GydF4y2Ba);GydF4y2Ba结束GydF4y2Ba结束GydF4y2Ba

感知VGG丢失功能GydF4y2Ba

辅助函数GydF4y2Bapix2pixHDVGGLossGydF4y2Ba计算真实图像和由发电机生成的合成图像之间的感知VGG丢失。GydF4y2Ba

函数GydF4y2BavggLoss = pix2pixHDVGGLoss(realImage,generatedImage,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 {:}] =前进(netvgg,treemage,GydF4y2Ba“产出”GydF4y2Ba,特征名称);GydF4y2Ba%提取合成图像的特征图GydF4y2BaactivGenerated =细胞(大小(featureNames));[activGenerated{}): =前进(netVGG generatedImage,GydF4y2Ba“产出”GydF4y2Ba,特征名称);GydF4y2Ba%计算VGG损耗GydF4y2Ba对于GydF4y2BavggLoss = vggLoss + featureWeights(i)*mean(abs(activReal{i} - activGenerated{i}),GydF4y2Ba“所有”GydF4y2Ba);GydF4y2Ba结束GydF4y2Ba结束GydF4y2Ba

参考文献GydF4y2Ba

[1] Wang Ting-Chun, Ming-Yu Liu, junyan Zhu, Andrew Tao, Jan Kautz, Bryan Catanzaro使用条件gan的高分辨率图像合成和语义操作在GydF4y2Ba2018年IEEE / CVF计算机视觉和模式识别GydF4y2Ba,8798-8807,2018。https://doi.org/10.1109/cvpr.2018.00917。GydF4y2Ba

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

另见GydF4y2Ba

|GydF4y2Ba|GydF4y2Ba(电脑视觉工具箱)GydF4y2Ba|GydF4y2Ba|GydF4y2Ba|GydF4y2Ba|GydF4y2Ba|GydF4y2Ba|GydF4y2Ba|GydF4y2Ba

相关的话题GydF4y2Ba