主要内容

使用深度学习的图像处理操作员近似

此示例显示如何使用多尺度上下文聚合网络(CAN)近似图像过滤操作。

操作员近似发现处理图像的替代方式,使得结果类似于传统图像处理操作或管道的输出。操作员近似的目标通常是减少处理图像所需的时间。

一些经典和深度学习技术已经被提出执行算子近似。一些经典的技术提高了单个算法的效率,但不能推广到其他操作。另一种常见的技术通过将算子应用于图像的低分辨率副本来近似处理广泛的操作,但是高频内容的丢失限制了近似的准确性。

深度学习解决方案能够近似更一万博 尤文图斯般和复杂的操作。例如,Q. Chen提出的多尺度上下文聚合网络(CAN) [1]可以近似多尺度色调映射,摄影风格传输,非局部去吸附和铅笔画。MultiScale可以在全分辨率图像上进行培训,以便在处理高频细节方面提高准确性。在培训网络之后,网络可以直接绕过传统的处理操作和处理图像。

这个例子探讨了如何训练多尺度CAN近似双边图像滤波操作,降低图像噪声同时保持边缘锐度。该实例给出了完整的训练和推理工作流,包括创建训练数据存储、选择训练选项、训练网络和使用网络处理测试图像的过程。

操作员近似网络

多尺度可以接受培训以最小化 L. 2 使用多尺度上下文聚合处理输入图像后,传统图像处理操作的输出与网络响应之间的损失。多尺度上下文聚合从整个图像中寻找关于每个像素的信息,而不是将搜索限制在像素周围的一个小邻域。

为帮助网络学习全球图像属性,MultiScale Can Cranturemally具有大型接收字段。第一个和最后一层具有相同的大小,因为操作员不应改变图像的大小。通过指数增加的尺度因子来扩张连续的中间层(因此罐的“MultiScale”性质)。扩张使得网络能够在各种空间频率下寻找空间分离的特征,而不会降低图像的分辨率。在每个卷积层之后,网络使用自适应归一化来平衡批量归一化的影响和近似操作员上的身份映射。

下载培训和测试数据

下载由20,000张静态自然图像组成的IAPR TC-12基准[2].数据集包括人,动物,城市等照片。数据文件的大小为约1.8 GB。如果您不想下载培训网络所需的培训数据集,那么您可以通过键入加载预制途径加载('训练operatorlearning-epoch-181.mat');在命令行。然后,直接去利用多尺度CAN进行双边滤波逼近节。

imagesdir = tempdir;URL_1 =“http://www-i6.informatik.rwth-aachen.de/imageclef/resources/iaprtc12.tgz”;downloadIAPRTC12Data (url_1 imagesDir);

此示例列举了具有IAPRTC-12基准数据的小子集的网络。

trainImagesDir = fullfile (imagesDir,“iaprtc12”'图片'“39”);ext = {'.jpg'bmp格式的“使用”};pristineImages = imageDatastore (trainImagesDir,'fileextensions'ext);

列出训练图像的数量。

元素个数(pristineImages.Files)
ans = 916

准备训练数据

要创建一个训练数据集,读入原始图像,然后写出经过双边过滤的图像。过滤后的图像存储在磁盘上指定的目录中preprocessDataDir

preprocessdatadir = [trainimagesdir filesep'preprocesseddataset'];

使用助手函数Bilateralfilterdataset预处理培训数据。此函数附加到示例作为支持文件。万博1manbetx

辅助功能为每个原始图像执行这些操作inputImages

  • 计算双边滤波的平滑度。平滑滤波后的图像降低图像噪声。

  • 使用以下命令执行双边过滤imbilatfilt

  • 使用滤波图像将滤波图像保存到磁盘imwrite

Bilateralfilterdataset(PristineImages,Preprocessdatadir);

为训练定义随机补丁提取数据存储

使用一个随机的补丁提取数据存储将训练数据提供给网络。这个数据存储从包含网络输入和所需网络响应的两个映像数据存储中提取随机对应的补丁。

在这个例子中,网络输入是原始图像pristineImages..期望的网络响应是经过双边滤波处理后的图像。创建一个名为bilatFilteredImages从集合的双边过滤图像文件。

BilatFilteredImages = ImageageAtastore(PreprocessDatadir,'fileextensions'ext);

创建一个randomPatchExtractionDatastore从两个映像数据存储中。指定一个256 * 256像素的补丁大小。指定的patchesperimage.在训练过程中,从每对图像中提取一个随机定位的补丁。指定一个迷你批处理大小。

miniBatchSize = 1;patchSize = [256 256];dsTrain = randomPatchExtractionDatastore (pristineImages bilatFilteredImages patchSize,...“PatchesPerImage”1);dsTrain。MiniBatchSize = MiniBatchSize;

randomPatchExtractionDatastore在每次迭代时向网络提供迷你批次数据。在数据存储区上执行读取操作以探索数据。

inputBatch =阅读(dsTrain);disp (inputBatch)
InputImage ResponseImage  _________________ _________________ { 256×256×3 uint8}{256×256×3 uint8}

设置多尺度CAN层

这个例子使用Deep Learning Toolbox™中的层定义了多尺度CAN,包括:

添加了两个自定义比例层,以实现自适应批量归一化层。这些层作为支持文件附加到这个示例中。万博1manbetx

  • AdaptiveNormalizationMu.- 调整批量归一化分支强度的刻度层

  • AdaptivevenormalizationLambda.-缩放层,调整身份分支的力量

第一层,imageInputLayer,在图像修补程序上运行。补丁大小基于网络接收字段,其是影响网络中最顶层的响应的空间图像区域。理想情况下,网络接收字段与图像尺寸相同,以便它可以看到图像中的所有高级功能。对于双侧滤波器,近似图像贴片尺寸固定为256×256。

networkDepth = 10;numberOfFilters = 32;firstLayer = imageInputLayer([256 256 3],'名称'“InputLayer”“归一化”“没有”);

图像输入层之后是一个包含32个3 × 3大小的滤波器的2-D卷积层。将每个卷积层的输入置零,以便feature maps在每次卷积后与输入保持相同的大小。将权值初始化为单位矩阵。

重量= 0 (3,3,3,numberOfFilters);为了II = 1:3 WGT(2,2,i,II)= 1;结尾numberOfFilters convolutionLayer = convolution2dLayer(3日,“填充”,1,...'重量',WGT,'名称'“Conv1”);

每个卷积层之后是一个批归一化层和一个调整批归一化分支的强度的自适应归一化尺度层。稍后,这个示例将创建相应的自适应归一化尺度层,用于调整标识分支的强度。现在,跟随AdaptiveNormalizationMu.层与加法层。最后,用标量乘法器指定泄漏的Relu层0.2为负的输入。

batchNorm = batchNormalizationLayer ('名称'“BN1”);adaptiveMu = adaptiveNormalizationMu (numberOfFilters,'mu1');addLayer = additionLayer (2'名称'“add1”);leakyrelLayer = leakyReluLayer (0.2,'名称'“Leaky1”);

按照相同模式指定网络的中间层。连续的卷积层具有扩张因子,其呈指数与网络深度指数。

middleelayers = [convolutionLayer batchNorm adaptiveMu addLayer leakyrelLayer];重量= 0 (3 3 numberOfFilters numberOfFilters);为了II = 1:Numberoffilters WGT(2,2,i,II)= 1;结尾为了layerNumber = 2:networkDepth-2 dilationFactor = 2^(layerNumber-1);填充= dilationFactor;conv2dlayer = Convolution2dlayer(3,Numberoffilters,...“填充”,填充,'膨胀因子',稀释物,...'重量',WGT,'名称', (“Conv”num2str (layerNumber)]);batchNorm = batchNormalizationLayer ('名称', ('bn'num2str (layerNumber)]);adaptiveMu = adaptiveNormalizationMu (numberOfFilters, (“亩”num2str (layerNumber)]);addLayer = additionLayer (2'名称', (“添加”num2str (layerNumber)]);leakyrelLayer = leakyReluLayer (0.2,'名称', (“漏”num2str (layerNumber)]);Middlelayers = [Middlayers Conv2Dlayer Batchnorm AdaptiveMu Addlayer Leacerullayer];结尾

不要将扩张因子施加到第二次卷积层。

conv2dlayer = Convolution2dlayer(3,Numberoffilters,...“填充”,1,'重量',WGT,'名称''conv9');batchNorm = batchNormalizationLayer ('名称'“AN9”);adaptiveMu = adaptiveNormalizationMu (numberOfFilters,“Mu9”);addLayer = additionLayer (2'名称''Add9');leakyrelLayer = leakyReluLayer (0.2,'名称'“Leaky9”);Middlelayers = [Middlayers Conv2Dlayer Batchnorm AdaptiveMu Addlayer Leacerullayer];

最后一个卷积层有一个大小为1 × 1 × 32 × 3的过滤器,可以重建图像。

重量=√2 / (9 * numberOfFilters)) * randn (1,1 numberOfFilters 3);conv2dLayer = convolution2dLayer(1、3、“NumChannels”,numperoffilters,...'重量',WGT,'名称'“Conv10”);

最后一层是回归层,而不是泄漏ReLU层。回归层计算双边滤波图像与网络预测之间的均方误差。

finalLayers = [conv2dLayer regressionLayer('名称''finallegressionlayer'));

连接所有层。

layers = [firstLayer middleLayers finalLayers'];lgraph = layerGraph(层);

创建跳过连接,它作为自适应规范化方程的标识分支。将跳过连接连接到添加层。

skipConv1 = adaptiveNormalizationLambda (numberOfFilters,“λ₁”);skipConv2 = adaptiveNormalizationLambda (numberOfFilters,“Lambda2”);skipConv3 = adaptiveNormalizationLambda (numberOfFilters,“Lambda3”);skipConv4 = adaptiveNormalizationLambda (numberOfFilters,“Lambda4”);skipConv5 = adaptiveNormalizationLambda (numberOfFilters,“Lambda5”);skipConv6 = adaptiveNormalizationLambda (numberOfFilters,“Lambda6”);skipConv7 = adaptiveNormalizationLambda (numberOfFilters,“Lambda7”);skipConv8 = adaptiveNormalizationLambda (numberOfFilters,“Lambda8”);skipConv9 = adaptiveNormalizationLambda (numberOfFilters,“Lambda9”);Lgraph = Addlayers(LGraph,Skipconv1);Lgraph = ConnectLayers(LAPHAGE,“Conv1”“λ₁”);Lgraph = ConnectLayers(LAPHAGE,“λ₁”“add1 / in2”);lgraph = addLayers (lgraph skipConv2);Lgraph = ConnectLayers(LAPHAGE,'conv2'“Lambda2”);Lgraph = ConnectLayers(LAPHAGE,“Lambda2”“add2 / in2”);lgraph = addLayers (lgraph skipConv3);Lgraph = ConnectLayers(LAPHAGE,'conv3'“Lambda3”);Lgraph = ConnectLayers(LAPHAGE,“Lambda3”“add3 / in2”);Lgraph = Addlayers(LGraph,Skipconv4);Lgraph = ConnectLayers(LAPHAGE,'conv4'“Lambda4”);Lgraph = ConnectLayers(LAPHAGE,“Lambda4”'Add4 / In2');Lgraph = AddLayers(LGraph,Skipconv5);Lgraph = ConnectLayers(LAPHAGE,'conv5'“Lambda5”);Lgraph = ConnectLayers(LAPHAGE,“Lambda5”'Add5 / In2');lgraph = addLayers (lgraph skipConv6);Lgraph = ConnectLayers(LAPHAGE,'conv6'“Lambda6”);Lgraph = ConnectLayers(LAPHAGE,“Lambda6”“add6 / in2”);lgraph = addLayers (lgraph skipConv7);Lgraph = ConnectLayers(LAPHAGE,'conv7'“Lambda7”);Lgraph = ConnectLayers(LAPHAGE,“Lambda7”“add7 / in2”);Lgraph = Addlayers(LGraph,Skipconv8);Lgraph = ConnectLayers(LAPHAGE,'conv8'“Lambda8”);Lgraph = ConnectLayers(LAPHAGE,“Lambda8”'Add8 / In2');lgraph = addLayers (lgraph skipConv9);Lgraph = ConnectLayers(LAPHAGE,'conv9'“Lambda9”);Lgraph = ConnectLayers(LAPHAGE,“Lambda9”“add9 / in2”);

绘制层图。

情节(lgraph)

指定培训选项

使用ADAM Optimizer培训网络。通过使用使用upperdameter设置trainingOptions(深度学习工具箱)函数。使用默认值0.9动力' 和0.0001L2Regularization'(重量衰减)。指定常量学习率0.0001.181个时代的火车。

maxEpochs = 181;initLearningRate = 0.0001;miniBatchSize = 1;选择= trainingOptions (“亚当”...“InitialLearnRate”initLearningRate,...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...'plots'“训练进步”...“详细”、假);

训练网络

默认情况下,该示例加载一个预训练的多尺度CAN,它近似于双边滤波器。预训练网络使您可以执行近似的双边过滤,而无需等待训练完成。

要训练网络,设置用圆形变量在以下代码中真正的.多尺度CAN训练trainNetwork(深度学习工具箱)函数。

如果GPU可用,训练它。使用GPU需要并行计算工具箱™和启用CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU支万博1manbetx持版本(并行计算工具箱).培训大约需要15个小时的NVIDIA™Titan X.

doTraining = false;如果doTraining modelDateTime = string(datetime()“现在”“格式”“yyyy-MM-dd-HH-mm-ss”));网= trainNetwork (dsTrain、lgraph选项);保存(strcat (“trainedOperatorLearning——”,modeldateTime,“时代——”num2str (maxEpochs),“.mat”),'网');其他的负载(“trainedoperatorlearning -时期- 181.垫”);结尾

利用多尺度CAN进行双边滤波逼近

要使用近似双边滤波器的训练过的多尺度CAN网络来处理图像,请遵循本例的其余步骤。示例的其余部分展示了如何:

  • 创建一个样本噪声输入图像从参考图像。

  • 对带噪图像进行常规双边滤波imbilatfilt函数。

  • 利用CAN对噪声图像进行近似双边滤波。

  • 从视觉上比较算子近似和传统双边滤波去噪后的图像。

  • 通过量化图像的相似性来评估去噪图像的质量来原始参考图像。

创建样本噪声图像

创建一个样本噪声图像,将用于比较算子近似的结果,以传统双边滤波。测试数据集,testimages,包含在图像处理工具箱™中运输的21个原始图像。将图像加载到imageageAtastore.

ext = {'.jpg'“使用”};文件名= {“sherlock.jpg”“car2.jpg”“fabric.png”“greens.jpg”'hands1.jpg'“kobi.png”...'lighthouse.png''micromarket.jpg'“office_4.jpg”“onion.png”'pears.png''YellowLily.jpg'...'印第安纳州jpg'“flamingos.jpg”“sevilla.jpg”'llama.jpg''Parkvenue.jpg'...'peacock.jpg'“car1.jpg”“strawberries.jpg”'wagage.jpg'};filePath = [fullfile matlabroot,“工具箱”'图片''imdata') filesep);filePathNames = strcat (filePath,文件名);testImages = imageDatastore (filePathNames,'fileextensions'ext);

以蒙太奇的形式显示测试图像。

蒙太奇(testImages)

选择其中一个图像用作双边滤波的参考图像。将图像转换为数据类型uint8

indx = 3;%要从测试镜像数据存储中读取的镜像索引Ireference = readimage (testImages indx);Ireference = im2uint8 (Ireference);

您可以选择使用自己的图像作为参考图像。注意,测试图像的大小必须至少是256 * 256。如果测试图像小于256 * 256,则使用imresize函数。网络还要求RGB测试图像。如果测试图像是灰度图像,则使用函数连接三个副本的原始图像沿第三维。

显示参考图像。

imshow (Ireference)标题('原始参考图像'

使用imnoise函数向参考图像添加方差为0.00001的零均值高斯白噪声。

Inoisy = imnoise(Irecerence,“高斯”, 0.00001);imshow (Inoisy)标题(“嘈杂的图像”

使用双边滤波滤波图像

传统的双侧滤波是在保持边缘清晰度的同时降低图像噪声的标准方法。使用imbilatfilt函数将双边滤波器应用于嘈杂的图像。指定平滑度等于像素值的方差。

学位= var(Double(Inoisy(:)));ibilat = imbilatfilt(Inoisy,steetofoothing);imshow(ibilat)标题('使用双侧过滤获得的去噪图像'

使用培训的网络处理图像

将归一化后的输入图像经过训练的网络,观察激活(深度学习工具箱)从最后一层(回归层)。该网络的输出是期望的去噪图像。

Inoisy Iapprox =激活(净,'finallegressionlayer');

图像处理工具箱™要求浮点图像的像素值在[0,1]范围内。使用rescale.函数将像素值缩放到此范围,然后将图像转换为uint8

Iapprox =重新调节(Iapprox);Iapprox = im2uint8 (Iapprox);imshow (Iapprox)标题(“利用多尺度CAN获取去噪图像”

视觉和定量比较

为了更好地理解去噪后的图像,检查每幅图像内部的一个小区域。使用向量指定感兴趣的区域(ROI)roi格式[Xy宽度高度].这些元素定义了左上角的x和y坐标,以及ROI的宽度和高度。

ROI = [300 30 50 50];

将图像裁剪到此ROI,并将结果显示为蒙太奇。

蒙太奇({imcrop (Ireference roi), imcrop (Inoisy roi),...imcrop (Ibilat roi), imcrop (Iapprox roi)},...“大小”[1 - 4]);标题(参考图像|噪声图像|双边滤波图像| CAN预测);

CAN比传统的双边滤波去噪更多。这两种技术都能保持边缘的清晰度。

使用图像质量指标来定量地比较嘈杂的输入图像,双边滤波图像和操作员近似图像。参考图像是原始参考图像,Ireference,然后再添加噪声。

根据参考图像测量每个图像的峰值信噪比(PSNR)。较大的PSNR值通常表示更好的图像质量。看到psnr值有关此指标的更多信息。

noisypsnr = psnr(Inoisy,Itriference);bilatpsnr = psnr(ibilat,i reference);大约= PSNR(IAPPROX,ISPERFERGE);DISP([的PSNR为:噪声图像/双边滤波图像/算子近似图像= '...num2str ([noisyPSNR bilatPSNR approxPSNR))))
的PSNR:噪声图像/双边滤波图像/算子近似图像= 20.2857 25.7978 26.2011

度量每幅图像的结构相似度指数(SSIM)。SSIM对参考图像的亮度、对比度和结构三个特征的视觉影响进行评估。SSIM值越接近1,测试图像与参考图像的一致性越好。看到SSIM有关此指标的更多信息。

noisySSIM = ssim (Inoisy Ireference);bilatSSIM = ssim (Ibilat Ireference);approxSSIM = ssim (Iapprox Ireference);DISP(['SSIM:嘈杂的图像/双边滤波图像/操作员近似图像='...num2str ([noisySSIM bilatSSIM approxSSIM))))
的SSIM:噪声图像/双边滤波图像/算子近似图像= 0.76251 0.91576 0.92663

使用自然图像质量评价器(NIQE)测量感知图像质量。NIQE分数越小,感知质量越好。看到niqe有关此指标的更多信息。

noisyNIQE = niqe (Inoisy);bilatNIQE = niqe (Ibilat);approxNIQE = niqe (Iapprox);DISP(['NIQE得分:嘈杂的图像/双边过滤图像/操作员近似图像='...num2str ([noisyNIQE bilatNIQE approxNIQE))))
NIQE评分:噪声图像/双侧过滤图像/操作员近似图像= 12.1865 7.22606 6.18105

与传统的双侧滤波相比,操作员近似产生更好的度量分数。

参考

陈秋江,徐秋江,柯尔敦。“全卷积网络的快速图像处理。”在2017年IEEE计算机视觉会议论文集.威尼斯,意大利,2017年10月,第2516-2525。

[2] Grubinger,M.,P. Clough,H.Müller和T. Deselaers。“IAPR TC-12基准测试:用于视觉信息系统的新评估资源。”基于内容的图像检索的odimage 2006语言资源的程序.意大利热那亚。第五卷,2006年5月,第10页。

也可以看看

||(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)

相关的话题