此示例显示如何使用该示例说明用于培训图像到图像回归网络的数据存储转换
和结合
函数imageageAtastore.
。
此示例显示如何使用适合培训去噪网络的管道进行预处理数据。然后,该示例使用预处理的噪声数据来训练简单的卷积AutoEncoder网络以去除图像噪声。
该示例使用盐和辣椒噪声模型,其中输入图像像素的一部分设置为0.
或者1
(分别为黑色和白色)。嘈杂的图像充当网络输入。原始图像充当预期的网络响应。网络学会检测和去除盐和辣椒噪声。
将数字数据中的原始图像加载为imageageAtastore.
。数据存储区包含从0到9的数字的10,000个合成图像。通过将随机变换应用于以不同字体创建的数字图像来生成图像。每个数字图像是28×28像素。数据存储区每个类别包含相同数量的图像。
digitdatasetpath = fullfile(matlabroot,'工具箱'那'nnet'那......'nndemos'那'nndatasets'那'digitdataset');imds = imageageataStore(DigitDatasetPath,......'insertumbfolders',真的,......'labelsource'那'foldernames');
指定大的读取大小,以最小化文件I / O的成本。
imds.readsize = 500;
设置全局随机数发生器的种子,以帮助结果的再现性。
RNG(0)
使用洗牌
在培训之前将数字数据进行洗牌。
IMDS = Shuffle(IMDS);
使用spliteachlabel.
分裂的功能IMDS.
进入包含原始图像的三个图像数据存储,用于训练,验证和测试。
[IMDStrain,IMDSVAL,IMDSTEST] = SpliteachLabel(IMDS,0.95,0.025);
使用转换
功能要创建每个输入图像的噪声版本,这将作为网络输入。这转换
函数从底层数据存储读取数据,并使用帮助函数中定义的操作来处理数据addnoise.
(在本例的末尾定义)。输出转换
功能是A.变换adatastore.
。
dstrainnoisy =变换(Imdstrain,@ addnoise);dsvalnoisy =变换(IMDSVAL,@ AddNoise);dstestnoisy =变换(IMDSTEST,@ AddNoise);
使用结合
将嘈杂图像和原始图像组合成单个数据存储的功能,这些数据存储Trainnetwork.
。此组合数据存储将数据批量读入两列小区阵列(预期)Trainnetwork.
。输出结合
功能是A.ConventDatastore.
。
dstrain =联合(Dstrainnoisy,Imdstrain);dsval =组合(Dsvalnoisy,IMDSVal);DSTEST =联合(DSTESTNOISY,IMDSTEST);
使用转换
执行额外的预处理操作,该操作对于输入和响应数据存储共同。这commonpreprocessing.
辅助功能(在该示例的末尾定义)调整输入输入和响应图像到32×32像素以匹配网络的输入大小,并将每个图像中的数据归一成到范围[0,1]。
dstrain =变换(dstrain,@ commonprepessing);DSVAL =变换(DSVAL,@ CommonPrepessing);dstest =变换(dstest,@ commonprepessing);
最后,使用转换
功能为培训集添加随机增强。这Augmentimages.
帮助函数(在此示例结尾定义)将随机90度旋转应用于数据。相同的旋转被应用于网络输入和相应的预期响应。
dstrain =变换(Dstrain,@ Augmentimages);
增强减少过度装备,并在培训的网络中增加了旋转的稳健性。验证或测试数据集不需要随机增强。
由于在准备培训数据时需要进行几种预处理操作,因此预处理预处理数据以确认在培训之前看起来正确。使用预习
用于预览数据的功能。
使用该方法可视化配对嘈杂和原始图像的示例剪辑
(图像处理工具箱)功能。培训数据看起来正确。盐和辣椒噪声出现在左栏的输入图像中。除了添加噪声之外,输入图像和响应图像是相同的。随机90度旋转以相同的方式应用于两个输入和响应图像。
exampledata =预览(Dstrain);输入= exampledata(:,1);响应= exampledata(:,2);minibatch = cat(2,输入,响应);蒙太奇(小纤维','尺寸',[8 2])标题('输入(左)和响应(右)')
卷积式的AutoEncoders是用于去噪图像的常见架构。卷积式AutoEncoders由两个阶段组成:编码器和解码器。编码器将原始输入图像压缩为宽度和高度较小的潜在表示,但是在感觉中更深入地,比原始输入图像的每个空间位置有许多特征映射。压缩潜在表示失去了一些空间分辨率,其能够在原始图像中恢复高频特征,但它还学会在原始图像的编码中没有包括噪声的伪像。解码器反复将编码信号颠覆以将其移回其原始宽度,高度和通道数。由于编码器去除噪声,解码的最终图像具有较少的噪声伪影。
此示例使用深度学习工具箱™的图层定义卷积AutoEncoder网络,包括:
imageInputlayer.
- 图像输入层
Convolution2Dlayer.
- 卷积神经网络的卷积层
抵押者
- 整流线性单元层
maxpooling2dlayer.
- 2-D MAX池层
TransposedConv2dlayer.
- 转置卷积层
思考
- 剪裁整流线性单元层
回归金属
- 回归输出层
创建图像输入层。为了简化与次采样相关的填充问题和通过两种因素的ups采样,选择32×32的输入大小,因为32被2,4和8的干净地无线。
ImageLayer = ImageInputLayer([32,32,1]);
创建编码层。通过Max汇集,池大小为2和2的步伐,可以实现编码器中的下采样。
EncodingLayers = [......卷积2dlayer(3,16,'填充'那'相同的'),......剥离,......maxpooling2dlayer(2,'填充'那'相同的'那'走吧',2),......卷积2dlayer(3,8,'填充'那'相同的'),......剥离,......maxpooling2dlayer(2,'填充'那'相同的'那'走吧',2),......卷积2dlayer(3,8,'填充'那'相同的'),......剥离,......maxpooling2dlayer(2,'填充'那'相同的'那'走吧',2)];
创建解码图层。解码器使用转置的卷积层来上置编码信号。使用正确的上采样系数创建转置卷积层createupsampletransponseconvlayer.
帮手功能。此函数在此示例的末尾定义。
网络使用一个思考
作为最终的激活层强制输出在范围内[0,1]。
解码层= [......createupsampletransponseconvlayer(2,8),......剥离,......createupsampletransponseconvlayer(2,8),......剥离,......createupsampletransponseconvlayer(2,16),......剥离,......卷积2dlayer(3,1,'填充'那'相同的'),......丛林制水器(1.0),......回归层];
连接图像输入层,编码层和解码层以形成卷积AutoEncoder网络架构。
图层= [ImageLayer,EncodingLayers,DecodingLayers];
使用ADAM Optimizer培训网络。通过使用使用upperdameter设置培训选项
功能。火车100时代。
选项=培训选项('亚当'那......'maxepochs',100,......'minibatchsize',imds.readsize,......'vightationdata',dsval,......'plots'那'培训 - 进步'那......'verbose',错误的);
既然数据源和培训选项配置了,请使用该数据源和培训选项使用卷积AutoEncoder网络Trainnetwork.
功能。
在GPU上培训如果有一个可用的。使用GPU需要并行计算工具箱™和CUDA®的NVIDIA®GPU。有关更多信息,请参阅GPU通万博1manbetx过发布支持(并行计算工具箱)。在NVIDIA Titan XP上培训大约需要25分钟。
net = trainnetwork(dstrain,图层,选项);
modeldateTeme = string(DateTime('现在'那'格式'那“yyyy-mm-dd-hh-mm-ss”));保存(strcat(“TrounimageToImageregressionnet-”,modeldateTime,“。垫”),'网');
通过使用测试集获取输出图像预测
功能。
ypred =预测(网,dstest);
可视化采样输入图像和网络相关的预测输出,以获得越野如何工作的感觉。正如预期的那样,来自网络的输出图像已经从输入图像中删除了大多数噪声伪影。由于编码和解码过程,去噪图像略微模糊。
InputImageExamples =预览(DSTEST);蒙太奇({InputImageSexamples {1},YPRED(:,:,:,1)});
通过分析峰值信噪比(PSNR)来评估网络的性能。
Ref = InputImageExamples {1,2};OriginalNoisyImage = InputImageExamples {1,1};PSNRNOISY = PSNR(OricallNoisyImage,REF)
psnrnoisy =单身的17.8455
psnrdenoised = psnr(Ypred(:::::,1),参考)
psnrdenoised =.单身的21.8439.
如预期的那样,输出图像的PSNR高于噪声输入图像。
这addnoise.
辅助功能通过使用盐和辣椒噪声将盐和辣椒噪声添加到图像上imnoise.
(图像处理工具箱)功能。这addnoise.
函数要求输入数据的格式为图像数据的单元格数组,它与返回的数据格式匹配读
功能imageageAtastore.
。
功能dataout = addnoise(数据)dataout = data;为了idx = 1:大小(数据,1)dataout {idx} = imnoise(数据{idx},'椒盐');结尾结尾
这commonpreprocessing.
Helper函数定义了培训,验证和测试集共有的预处理。辅助功能执行这些预处理步骤。
辅助功能要求输入数据的格式为图像数据的两列小区阵列,它与返回的数据格式匹配读
功能ConventDatastore.
。
功能dataout = commonpreprocessing(data)dataout = cell(大小(数据));为了COL = 1:大小(数据,2)为了idx = 1:大小(数据,1)temp = sing(数据{idx,col});temp = imresize(temp,[32,32]);temp = Rescale(Temp);dataout {idx,col} = temp;结尾结尾结尾
这Augmentimages.
辅助功能通过使用随机添加到数据的随机90度旋转rot90.
功能。相同的旋转被应用于网络输入和相应的预期响应。该功能要求输入数据的格式为图像数据的两列小区阵列,它与返回的数据格式匹配读
功能ConventDatastore.
。
功能dataout = augmentimages(数据)dataout = cell(大小(数据));为了IDX = 1:大小(数据,1)ROT90VAL = RANDI(4,1,1)-1;DataOut(IDX,:) = {ROT90(数据{IDX,1},ROT90VAL),ROT90(数据{IDX,2},ROT90VAL)};结尾结尾
这createupsampletransposeconvlayer.
辅助功能定义了一个转置的卷积层,该层上置了指定系数的图层。
功能OUT = CreatePsampletransponseConvlayer(因子,NumFilters)Filtersize = 2 *因子 - Mod(因子,2);裁剪=(因子 - mod(因子,2))/ 2;numchannels = 1;OUT = TransPOSECONV2DLAYER(过滤,NUMFILTERS,......'numchannels',numchannels,'走吧',因素,'裁剪',裁剪);结尾
结合
|imageageAtastore.
|培训选项
|Trainnetwork.
|转换