此示例显示如何使用多尺度上下文聚合网络(CAN)近似图像过滤操作。
操作员近似发现处理图像的替代方式,使得结果类似于传统图像处理操作或管道的输出。操作员近似的目标通常是减少处理图像所需的时间。
一些经典的和深度学习技术已经被提出执行算子逼近。一些经典的技术提高了单个算法的效率,但不能推广到其他运算。另一种常见的技术是将运算符应用到低分辨率的图像副本上,以近似大范围的运算,但高频内容的损失限制了近似的准确性。
深度学习解决方案能够近似更一金宝搏官方网站般和复杂的操作。例如,Q.Chen提出的多尺度上下文聚合网络(CAN)[1]可以近似多尺度色调映射,摄影风格传输,非局部去吸附和铅笔画。MultiScale可以在全分辨率图像上进行培训,以便在处理高频细节方面提高准确性。在培训网络之后,网络可以直接绕过传统的处理操作和处理图像。
这个例子探讨了如何训练多尺度CAN来近似双边图像滤波操作,在保持边缘清晰度的同时降低图像噪声。该实例给出了完整的训练和推理流程,包括创建训练数据存储、选择训练选项、训练网络以及使用网络处理测试图像的过程。
多尺度可以接受培训以最小化 使用多尺度上下文聚合处理输入图像后,图像处理操作的常规输出与网络响应之间的损失。多尺度上下文聚合查找整个图像中每个像素的信息,而不是将搜索限制在像素周围的小邻域。
为帮助网络学习全球图像属性,MultiScale Can Cranturemally具有大型接收字段。第一个和最后一层具有相同的大小,因为操作员不应改变图像的大小。通过指数增加的尺度因子来扩张连续的中间层(因此罐的“MultiScale”性质)。扩张使得网络能够在各种空间频率下寻找空间分离的特征,而不会降低图像的分辨率。在每个卷积层之后,网络使用自适应归一化来平衡批量归一化的影响和近似操作员上的身份映射。
下载IAPR TC-12基准,由20,000张静态自然图像组成[2].数据集包括人,动物,城市等照片。数据文件的大小为约1.8 GB。如果您不想下载培训网络所需的培训数据集,那么您可以通过键入加载预制途径加载('训练operatorlearning-epoch-181.mat');
在命令行。然后,直接去使用多尺度CAN执行双边滤波近似节。
imagesdir = tempdir;URL_1 =.'http://www-i6.informatik.rwth-aachen.de/imageclef/resources/iaprtc12.tgz';下载IAPRTC12数据(url_1,imagesDir);
此示例列举了具有IAPRTC-12基准数据的小子集的网络。
trainImagesDir = fullfile (imagesDir,“iaprtc12”那'图片'那'39');exts={'.jpg'那bmp格式的那“使用”};pristineImages=图像数据存储(trainImagesDir,'fileextensions'ext);
列出训练图像的数量。
元素个数(pristineImages.Files)
ans = 916
要创建一个训练数据集,读取原始图像并写出经过双边过滤的图像。将过滤后的映像存储在磁盘上指定的目录中preprocessDataDir
.
preprocessdatadir = [trainimagesdir filesep'preprocesseddataset'];
使用helper函数Bilateralfilterdataset
预处理培训数据。此函数附加到示例作为支持文件。金宝app
辅助功能为每个原始图像执行这些操作inputImages
:
Bilateralfilterdataset(PristineImages,Preprocessdatadir);
使用随机补丁提取数据存储将训练数据提供给网络。此数据存储从包含网络输入和所需网络响应的两个图像数据存储中提取随机对应补丁。
在本例中,网络输入是原始映像pristineImages.
.所需要的网络响应是经过双边滤波处理后的图像。创建一个名为双滤层图像
从双边过滤图像文件的集合。
BilatFilteredImages = ImageageAtastore(PreprocessDatadir,'fileextensions'ext);
创建一个随机抽取数据存储
(图像处理工具箱)从两个图像数据存储。指定256×256像素的面片大小。指定'patchesperimage.
在训练过程中,从每对图像中随机提取一个补丁。指定一个迷你批处理大小为1。
miniBatchSize = 1;patchSize = [256 256];dsTrain = randomPatchExtractionDatastore (pristineImages bilatFilteredImages patchSize,....“PatchesPerImage”,1);dsTrain.MiniBatchSize=MiniBatchSize;
这随机抽取数据存储
在每次迭代时向网络提供迷你批次数据。在数据存储区上执行读取操作以探索数据。
inputBatch =阅读(dsTrain);disp (inputBatch)
InputImage ResponseImage _________________ _________________ { 256×256×3 uint8}{256×256×3 uint8}
这个例子使用深度学习工具箱™中的层定义了多尺度CAN,包括:
imageInputLayer
- 图像输入层
convolution2dLayer
- 卷积神经网络的2D卷积层
batchNormalizationLayer
-批处理规范化层
漏滤网
-漏整流线性单元层
回归金属
-神经网络的回归输出层
添加两个自定义缩放层以实现自适应批量规范化层。这些层作为支持文件附加到此示例。金宝app
AdaptiveNormalizationMu.- 调整批量归一化分支强度的刻度层
AdaptivevenormalizationLambda.-调整标识分支强度的缩放图层
第一层,,imageInputLayer
,在图像修补程序上运行。补丁大小基于网络接收字段,其是影响网络中最顶层的响应的空间图像区域。理想情况下,网络接收字段与图像尺寸相同,以便它可以看到图像中的所有高级功能。对于双侧滤波器,近似图像贴片尺寸固定为256×256。
networkDepth = 10;numberOfFilters = 32;firstLayer = imageInputLayer([256 256 3],'姓名'那“输入层”那“正常化”那'没有任何');
图像输入层之后是一个二维卷积层,该层包含32个大小为3×3的过滤器。对每个卷积层的输入进行零填充,以便特征映射在每次卷积后保持与输入相同的大小。初始化身份矩阵的权重。
重量= 0 (3,3,3,numberOfFilters);为了II = 1:3 WGT(2,2,i,II)= 1;结尾卷积层=卷积层(3,过滤器数量,“填充”1....'重量',WGT,'姓名'那'conv1');
每个卷积层后跟批量归一化层和调整批量归一化分支的强度的自适应归一化刻度层。稍后,此示例将创建调整身份分支的强度的相应自适应标准化刻度图层。现在,跟随AdaptiveNormalizationMu.
层与加法层。最后,用标量乘法器指定泄漏的Relu层0.2
为负的输入。
batchNorm = batchNormalizationLayer ('姓名'那“BN1”);adaptiveMu = adaptiveNormalizationMu (numberOfFilters,'mu1');addLayer = additionLayer (2'姓名'那“add1”);leakyrelLayer=leakyrelLayer(0.2,'姓名'那“Leaky1”);
按照相同模式指定网络的中间层。连续的卷积层具有扩张因子,其呈指数与网络深度指数。
中间层=[RecolutionLayer batchNorm adaptiveMu addLayer leakyrelLayer];Wgts=零(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=leakyrelLayer(0.2,'姓名'那“Leaky9”);Middlelayers = [Middlayers Conv2Dlayer Batchnorm AdaptiveMu Addlayer Leacerullayer];
最后一个卷积层有一个大小为1×1×32×3的滤波器,用于重建图像。
Wgts=sqrt(2/(9*numberOfFilters))*randn(1,1,numberOfFilters,3);conv2dLayer=卷积2DLAYER(1,3,“NumChannels”,numperoffilters,...'重量',WGT,'姓名'那“Conv10”);
最后一层是回归层,而不是泄漏的ReLU层。回归层计算双边滤波图像和网络预测之间的均方误差。
最终层=[conv2dayer回归层('姓名'那'finallegressionlayer') ];
连接所有层。
层= [firstLayer middleLayers finalLayers'];lgraph = layerGraph(层);
创建跳过连接,它充当自适应归一化方程的标识分支。将跳过连接连接到添加层。
skipConv1 = adaptiveNormalizationLambda (numberOfFilters,“λ₁”);skipConv2=自适应规范化lambda(过滤器数量,“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.0001
因为L2调节
'(重量衰减)。指定常量学习率0.0001
.去181个时代的火车。
maxEpochs = 181;initLearningRate = 0.0001;miniBatchSize = 1;选择= trainingOptions (“亚当”那...“InitialLearnRate”initLearningRate,...“MaxEpochs”maxEpochs,...“MiniBatchSize”,小批量,...'plots'那“训练进步”那...“冗长”、假);
默认情况下,示例加载一个预训练的多尺度CAN,它近似于双边滤波器。预先训练的网络使您能够在不等待训练完成的情况下执行近似的双边滤波。
要训练网络,设置用圆形
变量为真正的
.多尺度CAN的训练trainNetwork
函数。
如果GPU可用,在GPU上训练。使用GPU需要并行计算工具箱™ 以及支持CUDA®的NVIDIA®GPU。有关更多信息,请参阅GPU版金宝app本支持(并行计算工具箱).培训大约需要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”),'网');其他的负载(“培训操作员学习-Epoch-181.mat”);结尾
要使用经过训练的近似双边滤波器的多尺度CAN网络处理图像,请遵循本示例的其余步骤。本示例的其余部分显示了如何:
从参考图像创建一个样本噪声输入图像。
对噪声图像进行传统的双边滤波嵌入层
(图像处理工具箱)函数。
使用CAN对带噪图像执行近似双边滤波。
将算子逼近去噪后的图像与传统的双边滤波图像进行视觉对比。
通过量化图像的相似性来评估去噪图像的质量来原始参考图像。
创建一个样本噪声图像,用于将算子近似结果与传统双边滤波结果进行比较。测试数据集,testimages.
,包含在图像处理工具箱™中运输的21个原始图像。将图像加载到imageageAtastore.
.
exts={'.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'那“火烈鸟,jpg”那'塞维利亚.jpg'那'llama.jpg'那'Parkvenue.jpg'那...'peacock.jpg'那“car1.jpg”那“strawberries.jpg”那'wagage.jpg'};filePath=[fullfile(matlabroot,“工具箱”那'图片'那'imdata')filesep];filePathNames=strcat(filePath,filename);testImages=imageDatastore(filePathNames,'fileextensions'ext);
以蒙太奇的形式显示测试图像。
蒙太奇(testImages)
选择其中一个图像用作双边滤波的参考图像。将图像转换为数据类型uint8
.
indx=3;%要从测试图像数据存储中读取的图像索引Ireference = readimage (testImages indx);Ireference = im2uint8 (Ireference);
您可以选择使用自己的图像作为参考图像。注意,测试图像的大小必须至少为256 × 256。如果测试图像小于256 × 256,则使用调整大小
函数。该网络还需要RGB测试图像。如果测试图像为灰度,则将图像转换为RGB猫
函数沿三维方向连接原始图像的三个副本。
显示参考图像。
imshow (Ireference)标题('原始参考图像')
使用加噪
(图像处理工具箱)函数将方差为0.00001的零均值高斯白噪声添加到参考图像。
Inoisy = imnoise(Irecerence,“高斯”, 0.00001);imshow (Inoisy)标题(“嘈杂的图像”)
传统的双侧滤波是在保持边缘清晰度的同时降低图像噪声的标准方法。使用嵌入层
(图像处理工具箱)函数将双边滤波器应用于嘈杂的图像。指定平滑度等于像素值的方差。
学位= var(Double(Inoisy(:)));ibilat = imbilatfilt(Inoisy,steetofoothing);imshow(ibilat)标题('使用双侧过滤获得的去噪图像')
将归一化后的输入图像通过训练后的网络进行观察激活
从最后一层(回归层)。网络的输出是需要去噪的图像。
Iapprox=激活(净、Inoisy、,'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值通常表示更好的图像质量。看到峰值信噪比
(图像处理工具箱)有关此指标的更多信息。
noisypsnr = psnr(Inoisy,Itriference);bilatpsnr = psnr(ibilat,i reference);大约= PSNR(IAPPROX,ISPERFERGE);DISP(['峰值信噪比:噪声图像/双边滤波图像/算子近似图像='那...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
与传统的双侧滤波相比,操作员近似产生更好的度量分数。
Chen Q. J. Xu, V. Koltun。使用全卷积网络进行快速图像处理。在2017年IEEE计算机视觉会议记录.威尼斯,意大利,2017年10月,第2516-2525。
[2] Grubinger,M.,P. Clough,H.Müller和T. Deselaers。“IAPR TC-12基准测试:用于视觉信息系统的新评估资源。”基于内容的图像检索的odimage 2006语言资源的程序.意大利热那亚。第五卷,2006年5月,第10页。
随机抽取数据存储
(图像处理工具箱)|trainNetwork
|trainingOptions
|layerGraph
|激活
|嵌入层
(图像处理工具箱)|imageageAtastore.