主要内容

数据存储准备Image-to-Image回归

这个例子展示了如何准备训练的数据存储image-to-image回归网络使用变换结合的功能ImageDatastore

这个例子展示了如何使用管道适合训练去噪预处理数据网络。这个例子然后使用预处理噪声数据来训练一个简单的卷积autoencoder网络去除图像噪声。

使用预处理管道准备数据

这个示例使用盐和胡椒噪声模型的一小部分,将输入图像像素01(分别为黑色和白色)。嘈杂的图像作为网络的输入。原始图像作为预期的网络响应。网络学习检测和去除椒盐噪声。

加载原始图像作为数字数据集imageDatastore。10000合成图像数据存储包含从0到9的数字。生成的图像是随机变换应用到数字图像创建不同的字体。每个数字图像28-by-28像素。数据存储包含同等数量的图像每一类。

digitDatasetPath = fullfile (matlabroot,“工具箱”,“nnet”,“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (digitDatasetPath,IncludeSubfolders = true, LabelSource =“foldernames”);

指定一个大读大小文件I / O的成本降到最低。

洛桑国际管理发展学院。ReadSize = 500;

使用洗牌函数来随机数字数据前培训。

imd = shuffle (imd);

使用splitEachLabel功能划分洛桑国际管理发展学院分成三个培训包含了原始图像的图像数据存储,验证和测试。

[imdsTrain, imdsVal imdsTest] = splitEachLabel (imd, 0.95, 0.025);

使用变换每个输入图像的函数来创建的版本,这将作为网络的输入。的变换函数读取数据从一个底层数据存储和处理数据使用helper函数中定义的操作addNoise(在这个例子中定义)。的输出变换函数是一个TransformedDatastore

dsTrainNoisy =变换(imdsTrain @addNoise);dsValNoisy =变换(imdsVal @addNoise);dsTestNoisy =变换(imdsTest @addNoise);

使用结合函数相结合的图像和原始图像到一个数据存储提要数据trainNetwork。这个组合数据存储批次的数据读入一个两列单元阵列所预期的trainNetwork。的输出结合函数是一个CombinedDatastore

dsTrain =结合(dsTrainNoisy imdsTrain);dsVal =结合(dsValNoisy imdsVal);dst =结合(dsTestNoisy imdsTest);

使用变换函数执行额外的预处理操作常见的输入和响应数据存储。的commonPreprocessinghelper函数(在本例中定义)调整图像输入和响应大小32-by-32像素匹配输入网络,规模和规范数据在每一个图像的范围[0,1]。

dsTrain =变换(dsTrain @commonPreprocessing);dsVal =变换(dsVal @commonPreprocessing);dst =变换(dst, @commonPreprocessing);

最后,使用变换函数来添加随机扩展训练集。augmentImageshelper函数(在本例中定义)随机90度旋转适用于数据。相同的旋转被应用到网络输入和相应的预期响应。

dsTrain =变换(dsTrain @augmentImages);

增加减少过度拟合,增加鲁棒性旋转训练网络的存在。不需要随机扩增验证或测试数据集。

预览数据预处理

因为有几种预处理操作必要的准备训练数据,预处理数据预览确认之前看起来正确的培训。使用预览函数来预览数据。

想象成对嘈杂和原始图像使用的例子蒙太奇(图像处理工具箱)函数。训练数据是正确的。盐和胡椒噪声出现在左栏的输入图像。除了添加噪声,图像输入图像和响应都是相同的。随机的90度旋转应用于输入和响应图像以同样的方式。

exampleData =预览(dsTrain);输入= exampleData (: 1);反应= exampleData (:, 2);minibatch =猫(2输入反应);蒙太奇(minibatch ',大小= 2[8])标题(“输入”(左)和反应(右))

定义卷积Autoencoder网络

去噪图像卷积autoencoders是一种常见的体系结构。卷积autoencoders包括两个阶段:一个编码器和译码器。编码器压缩原始输入图像到一个潜在的表示,在宽度和高度较小,但更深层次的,有很多功能地图每比原始输入图像空间位置。压缩丧失了一些潜在的表示的空间分辨率的能力恢复原始图像的高频特性,但它也学会不包括在原始图像的编码中嘈杂的工件。编码的译码器反复upsamples信号将其移回原来的宽度,高度,和渠道的数量。自从解码编码器消除噪音,最终的图像噪音更少的工件。

这个例子定义了卷积autoencoder网络利用深度学习工具箱™的层,包括:

创建图像输入层。简化填充的担忧将采样和upsampling到两个因素,选择一个32-by-32输入大小,因为32清洁能被2整除,4,8。

imageLayer = imageInputLayer([32岁,32岁,1]);

创建编码层。将采样的编码器是通过max池的池大小2和2的步伐。

encodingLayers = [convolution2dLayer(3 8填充=“相同”),reluLayer,maxPooling2dLayer(2,填充=“相同”步= 2),convolution2dLayer(3、16、填充=“相同”),reluLayer,maxPooling2dLayer(2,填充=“相同”步= 2),convolution2dLayer(3、32、填充=“相同”),reluLayer,maxPooling2dLayer(2,填充=“相同”步= 2);

创建解码层。解码器upsamples使用转置卷积编码的信号层的步幅,upsamples的2倍。网络使用clippedReluLayer作为最后激活层力量输出的范围[0,1]。

decodingLayers = [transposedConv2dLayer(2 32步= 2),reluLayer,transposedConv2dLayer(2 16步= 2),reluLayer,transposedConv2dLayer(2, 8,跨步= 2),reluLayer,convolution2dLayer(1, - 1,填充=“相同”),clippedReluLayer (1.0),regressionLayer];

将图像输入层,层编码,解码层形成了卷积autoencoder网络体系结构。

层= [imageLayer、encodingLayers decodingLayers];

定义培训的选项

使用亚当列车网络优化。通过使用指定hyperparameter设置trainingOptions函数。火车50时代。

选择= trainingOptions (“亚当”,MaxEpochs = 50,MiniBatchSize = imds.ReadSize,ValidationData = dsVal,ValidationPatience = 5,情节=“训练进步”,OutputNetwork =“best-validation-loss”,Verbose = false);

培训网络

现在配置数据源和培训方案,培训卷积autoencoder网络使用trainNetwork函数。

火车在GPU如果一个是可用的。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见GPU计算的需求(并行计算工具箱)。培训大约需要15分钟的NVIDIA泰坦XP。

网= trainNetwork (dsTrain层,选项);modelDateTime =字符串(datetime (“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trainedImageToImageRegressionNet——”+ modelDateTime +“.mat”,“净”);

评价去噪性能的网络

获得测试集的输出图像通过使用预测函数。

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值高于嘈杂的输入图像,如预期。

金宝app支持功能

addNoisehelper函数添加盐和胡椒噪声图像通过使用imnoise(图像处理工具箱)函数。的addNoise函数需要的格式输入数据的单元阵列图像数据,匹配返回的数据的格式的函数ImageDatastore

函数dataOut = addNoise(数据)dataOut =数据;idx = 1:尺寸(数据,1)dataOut {idx} = imnoise(数据{idx},“盐和胡椒”);结束结束

commonPreprocessinghelper函数定义了预处理常见的训练,验证集和测试集。helper函数执行这些预处理的步骤。

  1. 将图像数据转换为数据类型

  2. 调整大小的图像数据来匹配输入层使用imresize函数。

  3. 规范化数据区间[0,1]使用重新调节函数。

helper函数需要输入数据的格式是一个两列单元阵列的图像数据,匹配返回的数据的格式的函数CombinedDatastore

函数dataOut = commonPreprocessing(数据)dataOut =细胞(大小(数据));坳= 1:尺寸(数据,2)idx = 1:尺寸(数据,1)temp =单(数据{idx,坳});temp = imresize (temp,[32岁,32]);temp =重新调节(临时);dataOut {idx,坳}= temp;结束结束结束

augmentImageshelper函数添加随机数据通过使用90度旋转rot90函数。相同的旋转被应用到网络输入和相应的预期响应。函数需要输入数据的格式是一个两列单元阵列的图像数据,匹配返回的数据的格式的函数CombinedDatastore

函数dataOut = augmentImages(数据)dataOut =细胞(大小(数据));idx = 1:尺寸(数据,1)rot90Val =兰迪(4 1 1)1;dataOut (idx:) = {rot90(数据{idx 1}, rot90Val),rot90(数据{idx 2}, rot90Val)};结束结束

另请参阅

||||

相关的例子

更多关于