准备图像到图像回归的数据存储
方法为训练图像到图像回归网络准备一个数据存储变换
而且结合
的功能ImageDatastore
.
这个例子展示了如何使用适合训练去噪网络的管道对数据进行预处理。这个例子然后使用预处理的噪声数据来训练一个简单的卷积自编码器网络来去除图像噪声。
使用预处理管道准备数据
这个例子使用了一个椒盐噪声模型,其中输入图像像素的一部分被设置为椒盐噪声和椒盐噪声0
或1
(分别是黑色和白色)。噪声图像作为网络输入。原始图像作为预期的网络响应。网络学会了检测和去除椒盐噪声。
将数字数据集中的原始图像加载为imageDatastore
.数据存储包含10,000个从0到9的数字合成图像。这些图像是通过对使用不同字体创建的数字图像应用随机转换而生成的。每个数字图像是28乘28像素。每个类别的数据存储包含相同数量的图像。
digitDatasetPath = fullfile(matlabroot,“工具箱”,“nnet”,...“nndemos”,“nndatasets”,“DigitDataset”);imds = imageDatastore(digitDatasetPath,...IncludeSubfolders = true, LabelSource =“foldernames”);
请指定较大的读取大小,以减少文件I/O的开销。
洛桑国际管理发展学院。ReadSize = 500;
使用洗牌
在训练之前洗牌数字数据的函数。
Imds = shuffle(Imds);
使用splitEachLabel
划分函数洛桑国际管理发展学院
分为三个图像数据存储,其中包含用于训练、验证和测试的原始图像。
[imdsTrain,imdsVal,imdsTest] = splitEachLabel(imds,0.95,0.025);
使用变换
函数创建每个输入图像的噪声版本,这将作为网络输入。的变换
函数从底层数据存储中读取数据,并使用helper函数中定义的操作处理数据addNoise
(在本例末尾定义)。的输出。变换
函数是TransformedDatastore
.
dstrainnoise = transform(imdsTrain,@addNoise);dsvalnoise = transform(imdsVal,@addNoise);dstestnoise = transform(imdsTest,@addNoise);
使用结合
函数将有噪声的图像和原始图像组合到单个数据存储中,并将数据提供给trainNetwork
.该组合数据存储按照预期将数据批量读入两列单元格数组trainNetwork
.的输出。结合
函数是CombinedDatastore
.
dsTrain = combine(dstrainnoise,imdsTrain);dsVal = combine(dsvalnoise,imdsVal);dsTest = combine(dstestnoise,imdsTest);
使用变换
函数执行对输入和响应数据存储都通用的其他预处理操作。的commonPreprocessing
Helper函数(在本例末尾定义)将输入和响应图像的大小调整为32 × 32像素,以匹配网络的输入大小,并将每张图像中的数据归一化到范围[0,1]。
dsTrain = transform(dsTrain,@ common预处理);dsVal = transform(dsVal,@ common预处理);dsTest = transform(dsTest,@ common预处理);
最后,使用变换
函数向训练集添加随机增强。的augmentImages
Helper函数(在本例末尾定义)对数据应用随机90度旋转。同样的旋转应用于网络输入和相应的预期响应。
dsTrain = transform(dsTrain,@augmentImages);
增强减少了过拟合,并增加了训练网络中旋转存在的鲁棒性。验证或测试数据集不需要随机增强。
预览预处理数据
由于准备训练数据需要几个预处理操作,所以在训练之前预览预处理数据以确认它看起来正确。使用预览
函数预览数据。
方法可视化成对的噪声图像和原始图像的示例蒙太奇
(图像处理工具箱)函数。训练数据看起来是正确的。在左栏的输入图像中出现了盐和胡椒噪声。除了添加噪声外,输入图像和响应图像是相同的。随机90度旋转以同样的方式应用于输入图像和响应图像。
exampleData =预览(dsTrain);input = exampleData(:,1);responses = exampleData(:,2);Minibatch = cat(2,输入,响应);蒙太奇(minibatch',Size=[8 2])“输入(左)和响应(右)”)
定义卷积自编码器网络
卷积自编码器是一种常用的图像去噪架构。卷积自编码器由编码器和解码器两个阶段组成。编码器将原始输入图像压缩为一个潜在的表示形式,该表示形式在宽度和高度上都较小,但在每个空间位置都比原始输入图像有许多特征映射的意义上更深入。压缩的潜在表示在恢复原始图像中的高频特征的能力中失去了一些空间分辨率,但它也学会了在原始图像的编码中不包括噪声伪影。解码器反复对编码信号进行上采样,将其移回原始的宽度、高度和通道数。由于编码器去除了噪声,解码后的最终图像具有更少的噪声伪影。
这个例子使用来自深度学习工具箱™的层定义了卷积自编码器网络,包括:
imageInputLayer
-图像输入层convolution2dLayer
-卷积神经网络的卷积层reluLayer
-整流线性单元层maxPooling2dLayer
- 2d最大池化层transposedConv2dLayer
-转置卷积层clippedReluLayer
-剪切整流线性单元层regressionLayer
-回归输出层
创建图像输入层。为了简化与2倍的下采样和上采样相关的填充问题,请选择32 × 32的输入大小,因为32可以被2、4和8整除。
imageLayer = imageInputLayer([32,32,1]);
创建编码层。编码器中的下采样是通过池大小为2和步幅为2的最大池化来实现的。
encodingLayers = [...convolution2dLayer(3 8填充=“相同”),...reluLayer,...maxPooling2dLayer(2,填充=“相同”步= 2),...convolution2dLayer(3、16、填充=“相同”),...reluLayer,...maxPooling2dLayer(2,填充=“相同”步= 2),...convolution2dLayer(3、32、填充=“相同”),...reluLayer,...maxPooling2dLayer(2,填充=“相同”步= 2);
创建解码层。解码器使用步长为2的转置卷积层对编码信号进行上采样,该转置卷积层对编码信号进行上采样,上采样倍数为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];
将图像输入层、编码层和解码层连接起来,形成卷积自编码器网络架构。
layers = [imageLayer,encodingLayers,decodingLayers];
明确培训选择
使用Adam优化训练网络。属性指定超参数设置trainingOptions
函数。训练50个纪元。
选项= trainingOptions(“亚当”,...MaxEpochs = 50,...MiniBatchSize = imd。ReadSize,...ValidationData = dsVal,...ValidationPatience = 5,...情节=“训练进步”,...OutputNetwork =“best-validation-loss”,...Verbose = false);
培训网络
配置了数据源和训练选项之后,使用卷积自编码器网络进行训练trainNetwork
函数。
如果有GPU,可以在GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU计算要求(并行计算工具箱).在NVIDIA Titan XP上训练大约需要15分钟。
net = trainNetwork(dsTrain,layers,options);modelDateTime = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trainedImageToImageRegressionNet——”+ modelDateTime +“.mat”,“净”);
评价去噪网络的性能
方法从测试集中获取输出图像预测
函数。
ypred = predict(net,dsTest);
方法从测试集中获得噪声图像和原始图像对预览
函数。
testBatch =预览(dsTest);
可视化一个样本输入图像和来自网络的相关预测输出,以了解去噪的工作情况。正如预期的那样,来自网络的输出图像已经从输入图像中去除了大部分噪声伪影。由于编码和解码过程,去噪后的图像略显模糊。
Idx = 1;Y = ypred(:,:,:,idx);x = testBatch{idx,1};ref = testBatch{idx,2};蒙太奇({x, y})
通过分析峰值信噪比(PSNR)评估网络的性能。
psnrnoise = (x,ref)
psnrNoisy =单19.6457
psnrDenoised = psnr(y,ref)
psnrDenoised =单20.6994
输出图像的PSNR比有噪声的输入图像高,正如预期的那样。
金宝app支持功能
的addNoise
函数为图像添加盐和胡椒噪声imnoise
(图像处理工具箱)函数。的addNoise
函数要求输入数据的格式为图像数据的单元格数组,该单元格数组与方法返回的数据的格式相匹配读
的函数ImageDatastore
.
函数dataOut = addNoise(data);为idx = 1:size(data,1) dataOut{idx} = imnoise(data{idx},“盐和胡椒”);结束结束
的commonPreprocessing
Helper函数定义了训练集、验证集和测试集通用的预处理。helper函数执行这些预处理步骤。
辅助函数要求输入数据的格式为图像数据的两列单元格数组,该格式与方法返回的数据的格式相匹配读
的函数CombinedDatastore
.
函数dataOut = common预处理(数据)dataOut = cell(大小(数据));为Col = 1:size(data,2)为Idx = 1:size(data,1) temp = single(data{Idx,col});Temp = imresize(Temp,[32,32]);Temp = rescale(Temp);dataOut{idx,col} = temp;结束结束结束
的augmentImages
函数将随机90度旋转添加到数据中rot90
函数。同样的旋转应用于网络输入和相应的预期响应。函数要求输入数据的格式为图像数据的两列单元格数组,该格式与方法返回的数据的格式相匹配读
的函数CombinedDatastore
.
函数dataOut = augmentImages(数据)dataOut = cell(大小(数据));为idx = 1:size(data,1) rot90Val = randi(4,1,1)-1;dataOut(idx,:) = {rot90(data{idx,1},rot90Val),...rot90(数据{idx 2}, rot90Val)};结束结束
另请参阅
trainNetwork
|trainingOptions
|变换
|结合
|imageDatastore