此示例显示了如何使用该示例说明如何准备用于培训图像到图像回归网络的数据存储转变
和结合
的功能ImageDatastore
.
这个例子展示了如何使用适合训练去噪网络的管道对数据进行预处理。这个例子然后使用预处理的噪声数据来训练一个简单的卷积自动编码器网络来去除图像噪声。
这个例子使用了盐和胡椒噪声模型,其中一部分输入图像像素被设置为任意0
或者1
(分别是黑色和白色)。噪声图像作为网络输入。原始图像作为预期的网络响应。网络学习检测和去除盐和胡椒噪声。
将数字数据集中的原始图像加载为ImageageAtastore.
.该数据存储包含10,000个从0到9的合成图像。这些图像是通过对使用不同字体创建的数字图像应用随机转换生成的。每个数字图像是28 × 28像素。数据存储中每个类别包含相同数量的图像。
digitDatasetPath = fullfile (matlabroot,“工具箱”,“nnet”,...“nndemos”,“nndatasets”,“DigitDataset”);imds = imagedataStore(DigitDatasetPath,...IncludeSubfolders = true, LabelSource =“foldernames”);
请指定较大的读大小,以最小化文件I/O的开销。
imds.readsize = 500;
使用洗牌
函数在训练前洗牌数字数据。
IMDS = Shuffle(IMDS);
使用splitEachLabel
功能划分洛桑国际管理发展学院
三个图像数据存储中包含用于训练、验证和测试的原始图像。
[IMDStrain,IMDSVAL,IMDSTEST] = SplitheachLabel(IMDS,0.95,0.025);
使用转变
函数创建每个输入图像的噪声版本,作为网络输入。的转变
函数从底层数据存储读取数据,并使用helper函数中定义的操作处理数据addnoise.
(在本例的最后定义)。输出转变
函数是一个变换adatastore.
.
dsTrainNoisy =变换(imdsTrain @addNoise);dsValNoisy =变换(imdsVal @addNoise);dsTestNoisy =变换(imdsTest @addNoise);
使用结合
将嘈杂图像和原始图像组合成单个数据存储的功能,以提供数据trainNetwork
.该组合数据存储按预期将数据批量读入两列单元格数组trainNetwork
.输出结合
函数是一个CombinedDatastore
.
dsTrain =结合(dsTrainNoisy imdsTrain);dsVal =结合(dsValNoisy imdsVal);dst =结合(dsTestNoisy imdsTest);
使用转变
执行额外的预处理操作,该操作对于输入和响应数据存储共同。的commonpreprocessing.
辅助功能(在本示例末尾定义)将输入和响应图像调整为32×32像素以匹配网络的输入大小,并将每个图像中的数据归一成到范围[0,1]。
dsTrain =变换(dsTrain @commonPreprocessing);dsVal =变换(dsVal @commonPreprocessing);dst =变换(dst, @commonPreprocessing);
最后,使用转变
函数向训练集添加随机增广。的Augmentimages
Helper函数(在本例的最后定义)对数据应用随机的90度旋转。对网络输入和相应的期望响应施加相同的旋转。
dsTrain =变换(dsTrain @augmentImages);
增强降低了过拟合,增加了训练网络中旋转存在的鲁棒性。验证或测试数据集不需要随机增广。
由于准备训练数据需要进行一些预处理操作,因此在训练前预览预处理数据以确认其正确性。使用预览
功能,预览数据。
可视化的例子成对噪声和原始图像使用蒙太奇
(图像处理工具箱)函数。培训数据看起来正确。盐和胡椒噪声出现在左列的输入图像中。除了添加噪声之外,输入图像和响应图像是相同的。随机90度旋转以相同的方式应用于两个输入和响应图像。
exampledata =预览(Dstrain);输入= exampledata(:,1);响应= exampledata(:,2);minibatch = cat(2,输入,响应);montage(minibatch',size = [8 2])标题(“输入(左)及回应(右)”)
卷积自动编码器是图像去噪的常用架构。卷积自动编码器由两个阶段组成:编码器和解码器。编码器将原始输入图像压缩成一个潜在的表示,其宽度和高度更小,但更深,因为每个空间位置都有比原始输入图像更多的特征图。压缩的潜在表示在恢复原始图像中的高频特征的能力上损失了一些空间分辨率,但它也学会了在原始图像的编码中不包含噪声伪影。解码器重复对编码信号进行采样,将其移回原来的宽度、高度和通道数。由于编码器消除了噪声,解码后的最终图像有更少的噪声伪影。
这个例子使用深度学习工具箱™中的层定义了卷积自动编码器网络,包括:
imageInputLayer
- 图像输入图层
Convolution2Dlayer.
-卷积层用于卷积神经网络
reluLayer
-修正线性单位层
maxPooling2dLayer
- 2-D MAX池池层
transposedconv2dlayer.
- 转置卷积层
clippedReluLayer
- 剪裁整流线性单元层
regressionLayer
- 回归输出层
创建图像输入层。为了简化与以2为因数的下采样和上采样相关的填充问题,请选择32 * 32的输入大小,因为32可以被2,4,8整除。
imageLayer = imageInputLayer([32岁,32岁,1]);
创建编码层。编码器中的下采样是通过池大小为2和步幅为2的最大池来实现的。
encodingLayers = [...convolution2dLayer(3 8填充=“相同”),...reluLayer,...maxpooling2dlayer(2,padding =“相同”步= 2),...convolution2dLayer(3、16、填充=“相同”),...reluLayer,...maxpooling2dlayer(2,padding =“相同”步= 2),...convolution2dLayer(3、32、填充=“相同”),...reluLayer,...maxpooling2dlayer(2,padding =“相同”步= 2);
创建解码层。解码器使用步长为2的转置卷积层对编码信号进行上采样,上采样倍数为2。网络使用clippedReluLayer
作为最终激活层迫使输出在[0,1]范围内。
解码层= [...TransposedConv2dlayer(2,32,stride = 2),...reluLayer,...TranspositConv2dlayer(2,16,stride = 2),...reluLayer,...TranspositConv2dlayer(2,8,stride = 2),...reluLayer,...convolution2dLayer(1, - 1,填充=“相同”),...clippedReluLayer (1.0),...回归];
将图像输入层、编码层和解码层连接起来,形成卷积自编码器网络结构。
层= [imageLayer、encodingLayers decodingLayers];
使用亚当优化训练网络。属性指定超参数设置培训选项
函数。训练50个时代。
选项=培训选项(“亚当”,...MaxEpochs = 50,...MiniBatchSize = imd。ReadSize,...ValidationData = DSVAL,...ValidationPatience = 5,...情节=“训练进步”,...OutputNetwork =“最佳验证损失”,...verbose = false);
现在,数据源和训练选项已经配置好了,使用trainNetwork
函数。
在可用的GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU支金宝app持情况(并行计算工具箱).在NVIDIA Titan XP上进行15分钟的培训。
网= trainNetwork (dsTrain层,选项);
modelDateTime =字符串(datetime (“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trainedImageToImageRegressionNet——”+ modelDateTime +“。垫”,“净”);
方法从测试集获取输出图像预测
函数。
ypred =预测(净,dst);
方法从测试集中获取一对噪声图像和原始图像预览
函数。
testBatch =预览(dst);
可视化采样输入图像和网络相关的预测输出,以获得更良好的工作方式。如所预期的,来自网络的输出图像已从输入图像中删除了大多数噪声伪影。由于编码和解码过程,去噪图像略微模糊。
idx = 1;y = ypred (:,:,:, idx);x = testBatch {idx 1};ref = testBatch {idx 2};蒙太奇({x, y})
通过分析峰值信噪比(PSNR)来评估网络的性能。
psnrNoisy = psnr (x,裁判)
psnrNoisy =单19.6457
psnrDenoised = psnr (y,裁判)
psnrDenoised =单20.6994
如预期的那样,输出图像的PSNR高于噪声输入图像。
的addnoise.
辅助功能添加盐和胡椒噪声的图像使用imnoise
(图像处理工具箱)函数。的addnoise.
函数要求输入数据的格式为图像数据的小区数组,它与返回的数据格式匹配读
的函数ImageDatastore
.
功能dataOut = addNoise(data) dataOut = data;为idx = 1:大小(数据,1)dataout {idx} = imnoise(数据{idx},“椒盐”);结束结束
的commonpreprocessing.
Helper函数定义了培训,验证和测试集共有的预处理。辅助功能执行这些预处理步骤。
助手函数要求输入数据的格式为图像数据的两列单元格数组,它与读
的函数CombinedDatastore
.
功能dataout = commonpreprocessing(数据)dataout = cell(大小(数据));为COL = 1:大小(数据,2)为Idx = 1:size(data,1) temp = single(data{Idx,col});temp = imresize (temp,[32岁,32]);temp =重新调节(临时);dataOut {idx,坳}= temp;结束结束结束
的Augmentimages
助手函数通过使用rot90
函数。对网络输入和相应的期望响应施加相同的旋转。函数要求输入数据的格式为图像数据的两列单元格数组,它与读
的函数CombinedDatastore
.
功能dataout = augmentimages(数据)dataout = cell(大小(数据));为idx = 1:size(data,1)dataOut (idx:) = {rot90(数据{idx 1}, rot90Val),...ROT90(数据{IDX,2},ROT90VAL)};结束结束
trainNetwork
|培训选项
|转变
|结合
|ImageageAtastore.