深度学习

理解和使用深度学习网络

Image-to-Image回归

今天我想谈谈建立一个网络来训练图像到图像回归问题的基本概念。这个演示的出现有两个原因:
  1. 有相当多的问题MATLAB的答案关于图像到图像的深度学习问题。
  2. 我计划在未来与一位图像处理/深度学习专家一起发表一篇深入的文章,在那里我们将进入回归的杂草,了解基础知识以跟上他的步伐将是很好的。
那么,让我们在MATLAB中深入研究图像对图像深度学习问题的概念。
通常,深度学习问题可以分为分类问题和回归问题。分类是大多数人都熟悉的问题,我们也经常写。

给定一张图像,预测一个物体属于哪个类别。

在回归问题中,不再有离散的类别。输出可以是非离散的值:例如,给定一个图像,输出旋转值
同样的,给定一个图像,预测一个新的图像!

来了解更多的概念对于图像到图像深度学习,我们可以从文档中的一个简单示例开始://www.tatmou.com/help/deeplearning/examples/remove-noise-from-color-image-using-pretrained-neural-network.html
这是对示例中解释得很好的主题的一个很好的介绍。另外,如果你试图去噪图像,这个例子解决了问题,所以你完成了!
然而,这篇文章的目标是了解如何创建我们的自定义深度学习算法从头开始.最难的部分是设置数据。其他的都应该是合理的简单。

关于数据存储

数据存储值得一篇文章,但我只想说,如果你能欣赏并掌握数据存储,你就可以征服世界。
在高层次上,数据存储是有意义的:它们是为深度学习(和其他)应用程序引入数据的有效方式。你不需要处理内存管理,深度学习函数知道如何将数据存储作为函数的输入来处理。这一切都很好。“我如何让数据存储为图像到图像的深度学习训练数据工作?”好问题! !

randomPatchExtractionDatastore

我将推荐使用这个方便的函数随机补丁提取数据存储,这就是我在下面的例子中使用的。
这里的命名约定并不简短,但您可以很好地了解使用这个函数可以得到什么!
提取图像的随机补丁是培养更多输入图像的好方法,特别是在数据不足的情况下。该算法需要足够的数据样本来准确地训练,因此我们可以将图像切割成更小的片段,并提供更多的示例供网络学习。
该函数将使用一个输入数据存储、一个相应的输出数据存储和一个补丁大小。

代码:

我们的问题是图像去模糊。我们要从头开始。
我有一个完美的最终图像:
我模糊了图像:
我把所有的数据都放在单独的文件夹里。
blurredDir = createTrainingSet(trainImages);blurredImages = imageDatastore(blurredDir,'FileExtensions','.mat','ReadFcn',@matRead);imagesDir = '.';trainImagesDir = fullfile(imagesDir,'iaprtc12','images','02');Exts = {'.jpg','.bmp','.png'};trainImages = imageDatastore(trainImagesDir,'FileExtensions',exts);
模糊的图像是我的输入,完美/原始的图像是我的输出。这感觉有点倒退,但我提醒自己:我想让网络看到一个模糊的图像,并输出干净的图像作为最终结果。
可视化输入和输出图像
im_orig = trainImages.readimage(ii);im_blur = blurredimage .readimage(ii);imshow (im_orig);title(“干净图像-最终结果”);图;imshow (im_blurred);title('模糊图像-输入');
为更多种类的训练图像设置数据增强。
imageDataAugmenter(…randi RandRotation, @()([0, 1], 1) * 90,……“RandXReflection”,真正的);
这将随机旋转输入图像,并允许在X轴上反射。
然后使用随机补丁提取数据存储以trainNetwork命令能够理解的方式编译输入和输出图像。
miniBatchSize = 64;patchSize = [40 40];patchds = randompatchextracactiondatastore (blurredImages,trainImages,patchSize, ....“PatchesPerImage”,64年,…DataAugmentation,增压器);patchds。MiniBatchSize = MiniBatchSize;

网络层

为了建立一个图像到图像的回归网络,让我们从一组层开始几乎正适合我们的例子。
计算机视觉工具箱功能unetLayers它可以让你快速建立一个语义分割网络(U-Net)的层。
lgraph = unetLayers([40 40 3],3,'encoderDepth',3);
我们必须通过添加L2损耗层来稍微改变它以适应我们的网络。删除最后2层,用回归层代替它们。
lgraph = lgraph. removelayers ('Softmax-Layer');lgraph = lgraph. removelayers (' segment - layer ');lgraph = lgraph. addlayers (regressionLayer('name','regressionLayer'));lgraph = lgraph. connectlayers ('Final-ConvolutionLayer','regressionLayer');
deepNetworkDesigner应用程序还将为您删除和连接新的层,如下所示。
设置培训参数
maxEpochs = 100;epochIntervals = 1;initLearningRate = 0.1;learningRateFactor = 0.1;L2reg = 0.0001;options = trainingOptions('sgdm',…“动量”、0.9……InitialLearnRate, initLearningRate,……“LearnRateSchedule”、“分段”,…“LearnRateDropPeriod”10… 'LearnRateDropFactor',learningRateFactor, ... 'L2Regularization',l2reg, ... 'MaxEpochs',maxEpochs ,... 'MiniBatchSize',miniBatchSize, ... 'GradientThresholdMethod','l2norm', ... 'Plots','training-progress', ... 'GradientThreshold',0.01);
和培训
modelDateTime = datestr(现在,'dd-mm -yyyy- hh -mm - ss ');net = trainNetwork(patchds,lgraph,options);save(['trainedNet-' modelDateTime '- epoch -' num2str(maxEpochs*epochIntervals)…“ScaleFactors——”num2str (234)“.mat”),“净”、“选项”);
(…8小时后……)
我今天早上回来,我有一个训练有素的网络!
现在质量可能不是最好的去模糊图像,因为我的主要目的是展示训练图像和网络的设置。但我有一个努力尝试的网络。
显示原始图像和模糊图像。
testImage = testImages.readimage(randi(400));Len = 21;Theta = 11;PSF = fspecial('运动',LEN, THETA);blurredImage = imfilter(testImage, PSF, 'conv', 'circular');标题(“模糊的图像”);图;imshow (testImage);标题(“原始图像”);
...并从网络中创建一个“去模糊”的图像:
ideblur =激活(net,blurredImage,'regressionoutput');图;imshow(ideblur) Iapprox = rescale(ideblur);Iapprox = im2uint8(Iapprox);imshow(Iapprox) title('去噪图像')
更新:我知道它说去噪,而不是去模糊,我从另一个例子复制了代码,忘记切换标题。
请记住,网络的质量不是重点,尽管现在我很好奇继续工作和改进这个网络。这就是今天的全部内容!我希望你觉得这对你有用-我玩MATLAB玩得很开心,我希望你也一样。
更新:我改变了一些训练参数,并再次运行网络。如果你计划运行这段代码,我强烈建议使用这些参数进行训练:
options = trainingOptions('adam','InitialLearnRate',1e-4,'MiniBatchSize',64,…“洗牌”,“从来没有”,“MaxEpochs”,50岁,…“阴谋”,“训练进步”);
结果要好得多:

版权所有2018 The MathWorks, Inc.
获取MATLAB代码


|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。