这个例子展示了如何使用Deep Network Designer来构建和训练一个图像到图像的超分辨率回归网络。
空间分辨率是用来构建数字图像的像素数。高空间分辨率的图像由更多的像素组成,因此图像包含更多的细节。超分辨率是将低分辨率图像作为输入,并将其升级为高分辨率图像的过程。当您处理图像数据时,您可能会降低空间分辨率以减小数据的大小,但代价是丢失信息。为了恢复这些丢失的信息,你可以训练一个深度学习网络来预测图像丢失的细节。在本例中,从压缩到7 × 7像素的图像中恢复28 × 28像素的图像。
本示例使用数字数据集,该数据集由10,000个手写数字的合成灰度图像组成。每张图像都是28 × 28 × 1像素。
加载数据并创建一个图像数据存储。
dataFolder = fullfile (toolboxdir (“nnet”),“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (dataFolder,...“IncludeSubfolders”,真的,....“LabelSource”,“foldernames”);
使用洗牌
函数在训练前洗牌数据。
imd = shuffle (imd);
使用splitEachLabel
函数将图像数据存储划分为包含用于训练、验证和测试的图像的三个图像数据存储。
[imdsTrain, imdsVal imdsTest] = splitEachLabel (imd, 0.7, 0.15, 0.15,“随机”);
将每个图像中的数据归一化到范围[0,1]。归一化有助于使用梯度下降来稳定和加速网络训练。如果数据的伸缩性很差,那么损失可能会变成NaN,网络参数在训练期间可能会发散。
imdsTrain = transform(imdsTrain,@(x) rescale(x));imdsVal = transform(imdsVal,@(x) rescale(x));imdsTest = transform(imdsTest,@(x) resscale (x));
通过生成由上采样的低分辨率图像和相应的高分辨率图像组成的图像对来创建训练数据集。
为了训练网络执行图像到图像的回归,图像需要成对组成的输入和响应,其中两个图像是相同的大小。通过将每个图像向下采样到7 × 7像素,然后向上采样到28 × 28像素,生成训练数据。利用变换后的图像和原始图像对,网络可以学习如何在两种不同分辨率之间进行映射。金宝搏官方网站
使用helper函数生成输入数据upsampLowRes
,它使用imresize
以产生较低分辨率的图像。
imdsInputTrain =变换(imdsTrain @upsampLowRes);imdsInputVal =变换(imdsVal @upsampLowRes);imdsInputTest =变换(imdsTest @upsampLowRes);
使用结合
函数将低分辨率和高分辨率的图像合并到一个数据存储中。输出结合
函数是一个CombinedDatastore
对象。
dsTrain =结合(imdsInputTrain imdsTrain);dsVal =结合(imdsInputVal imdsVal);dst =结合(imdsInputTest imdsTest);
使用。创建网络架构unetLayers
功能从计算机视觉工具箱™。这个函数提供了一个适合于语义分割的网络,可以很容易地适应于图像到图像的回归。
创建一个输入尺寸为28 × 28 × 1像素的网络。
层= unetLayers([1] 28日28日2“encoderDepth”2);
使用深度网络设计器编辑图像到图像的回归网络。
deepNetworkDesigner(层);
在设计师面板中,用回归层替换softmax和像素分类层层的图书馆.
选择最后的卷积层并设置NumFilters
财产1
.
该网络现在已准备好接受培训。
将培训和验证数据导入深度网络设计器。
在数据选项卡上,单击导入数据>导入数据存储并选择dsTrain
作为培训数据和dsVal
作为验证数据。通过单击导入两个数据存储进口.
深度网络设计器显示合并数据存储中的图像对。左边是放大后的低分辨率输入图像,右边是原始的高分辨率响应图像。网络学习如何在输入和响应图像之间进行映射。
选择培训选项并对网络进行培训。
在培训选项卡上,选择培训方案.从解算器列表中,选择亚当
.集MaxEpochs来10
.单击确认培训选项关闭.
通过点击组合数据存储训练网络火车.
随着网络学习如何在两幅图像之间映射,验证均方根误差(RMSE)降低。
一旦培训完成,点击出口将训练过的网络导出到工作空间。训练后的网络存储在变量中trainedNetwork_1
.
使用测试数据评估网络的性能。
使用预测
,可以测试网络是否可以从训练集中没有包含的低分辨率输入图像生成高分辨率图像。
ypred =预测(trainedNetwork_1, dst);为i = 1:8 i (1:2,i) = read(dsTest);我(3)= {ypred (::,:, I)};结束
比较输入、预测和响应图像。
次要情节(1、3、1)imshow (imtile(我(1:)“GridSize”,[1]))标题(“输入”次要情节(1、3、2)imshow (imtile(我(3:)“GridSize”,[1]))标题(“预测”次要情节(1,3,3)imshow (imtile(我(2:)“GridSize”,[1]))标题(“响应”)
该网络成功地从低分辨率输入产生高分辨率图像。
本例中的网络非常简单,并且高度适合于数字数据集。有关如何为日常图像创建更复杂的图像到图像回归网络的示例,请参见基于深度学习的单图像超分辨率.
函数datanode = upsampLowRes(dataIn) temp = dataIn;temp = imresize (temp, [7],“方法”,双线性的);dataOut = {imresize (temp, 28日,28日,“方法”,双线性的)};结束