这个例子展示了如何使用多尺度上下文聚合网络(CAN)来近似一个图像滤波操作。
运算符近似找到处理图像的替代方法,使结果类似于传统图像处理操作或管道的输出。运算符近似的目标通常是减少处理图像所需的时间。
一些经典的和深度学习技术已经被提出执行算子逼近。一些经典的技术提高了单个算法的效率,但不能推广到其他运算。另一种常见的技术是将运算符应用到低分辨率的图像副本上,以近似大范围的运算,但高频内容的损失限制了近似的准确性。
深度学习解决方案能够近似更一金宝搏官方网站般和复杂的操作。例如陈青提出的多尺度上下文聚合网络(CAN) [1可以近似多尺度色调映射、摄影风格转换、非局部去雾和铅笔画。多尺度CAN训练全分辨率图像,以提高处理高频细节的准确性。网络经过训练后,可以绕过常规的处理操作,直接对图像进行处理。
这个例子探讨了如何训练多尺度CAN来近似双边图像滤波操作,在保持边缘清晰度的同时降低图像噪声。该实例给出了完整的训练和推理流程,包括创建训练数据存储、选择训练选项、训练网络以及使用网络处理测试图像的过程。
对多尺度CAN进行训练,使其最小化 图像处理操作的常规输出与使用多尺度上下文聚合处理输入图像后的网络响应之间的损失。多尺度上下文聚合从整个图像中寻找关于每个像素的信息,而不是将搜索限制在像素周围的一个小邻域。
为了帮助网络学习全局图像特性,多尺度CAN结构具有较大的接收域。第一层和最后一层的大小相同,因为操作员不应该改变图像的大小。连续的中间层被指数增长的尺度因子所扩展(因此CAN的“多尺度”特性)。膨胀使网络能够在不同的空间频率上寻找空间分离的特征,而不会降低图像的分辨率。在每个卷积层之后,网络使用自适应归一化来平衡批处理归一化和身份映射对近似算子的影响。
下载IAPR TC-12基准,由20,000张静态自然图像组成[2].数据集包括人、动物、城市等的照片。数据文件大小为~1.8 GB。如果您不想下载训练网络所需的训练数据集,那么您可以通过键入来加载预训练的can负载(trainedoperatorlearning -时期- 181.垫);
在命令行。然后,直接去使用多尺度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”];
使用helper函数bilateralFilterDataset
对训练数据进行预处理。这个函数作为支持文件附加到示例中。金宝app
中的每个原始映像执行这些操作inputImages
:
计算双边滤波的平滑度。对滤波后的图像进行平滑处理可以降低图像噪声。
使用以下方法执行双边滤波imbilatfilt
.
保存过滤图像到磁盘使用imwrite
.
bilateralFilterDataset (pristineImages preprocessDataDir);
使用随机补丁提取数据存储将训练数据提供给网络。该数据存储从包含网络输入和所需网络响应的两个图像数据存储中提取随机对应的补丁。
在本例中,网络输入是原始映像pristineImages
.所需要的网络响应是经过双边滤波处理后的图像。创建一个名为bilatFilteredImages
从双边过滤的图像文件集合。
bilatFilteredImages = imageDatastore (preprocessDataDir,“FileExtensions”ext);
创建一个randomPatchExtractionDatastore
从两个映像数据存储。指定一个256 × 256像素的补丁大小。指定的PatchesPerImage
在训练过程中,从每对图像中随机提取一个补丁。指定一个迷你批处理大小为1。
miniBatchSize = 1;patchSize = [256 256];dsTrain = randomPatchExtractionDatastore (pristineImages bilatFilteredImages patchSize,....“PatchesPerImage”1);dsTrain。MiniBatchSize = MiniBatchSize;
的randomPatchExtractionDatastore
在epoch的每次迭代中向网络提供小批量的数据。在数据存储上执行读操作,查看数据。
inputBatch =阅读(dsTrain);disp (inputBatch)
InputImage ResponseImage _________________ _________________ { 256×256×3 uint8}{256×256×3 uint8}
这个例子使用深度学习工具箱™中的层定义了多尺度CAN,包括:
imageInputLayer
(深度学习工具箱)-图像输入层
convolution2dLayer
(深度学习工具箱)-用于卷积神经网络的2D卷积层
batchNormalizationLayer
(深度学习工具箱)-批处理规范化层
leakyReluLayer
(深度学习工具箱)-漏整流线性单元层
regressionLayer
(深度学习工具箱)-神经网络的回归输出层
添加了两个自定义比例层来实现自适应批处理规范化层。这些层作为支持文件附加到本示例中。金宝app
adaptiveNormalizationMu-调整批量标准化分支强度的缩放层
adaptiveNormalizationLambda—调整身份分支力量的缩放层
第一层,imageInputLayer
,对图像补丁进行操作。patch的大小基于网络接受域,接受域是影响网络最顶层响应的空间图像区域。理想情况下,网络接受域与图像大小相同,可以看到图像中的所有高阶特征。对于双边滤波器,近似图像补丁大小固定为256 × 256。
networkDepth = 10;numberOfFilters = 32;firstLayer = imageInputLayer([256 256 3],“名字”,“InputLayer”,“归一化”,“没有”);
图像输入层之后是一个包含32个大小为3 × 3的滤波器的2d卷积层。零填充每个卷积层的输入,以便特征图在每次卷积后与输入保持相同的大小。初始化单位矩阵的权值。
重量= 0 (3,3,3,numberOfFilters);为Wgts(2,2,ii,ii) = 1;结束numberOfFilters convolutionLayer = convolution2dLayer(3日,“填充”,1,...“重量”重量,“名字”,“Conv1”);
每个卷积层后面都有一个批处理归一化层和一个调整批处理归一化分支强度的自适应归一化尺度层。稍后,本示例将创建相应的自适应标准化比例层,以调整标识分支的强度。现在,跟随adaptiveNormalizationMu
层与一个附加层。最后,指定一个泄漏的ReLU层,其标量乘数为0.2
为负的输入。
batchNorm = batchNormalizationLayer (“名字”,“BN1”);adaptiveMu = adaptiveNormalizationMu (numberOfFilters,“Mu1”);addLayer = additionLayer (2“名字”,“add1”);leakyrelLayer = leakyReluLayer (0.2,“名字”,“Leaky1”);
按照相同的模式指定网络的中间层。逐次卷积层具有随网络深度呈指数级扩展的扩展因子。
middleLayers = [convolutionLayer batchNorm adaptiveMu addLayer leakyrelLayer];重量= 0 (3 3 numberOfFilters numberOfFilters);为ii = 1: numberfilters Wgts(2,2,ii,ii) = 1;结束为layerNumber = 2:networkDepth-2 dilationFactor = 2^(layerNumber-1);填充= dilationFactor;numberOfFilters conv2dLayer = convolution2dLayer(3日,...“填充”填充,“DilationFactor”dilationFactor,...“重量”重量,“名字”,[“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 = [middleLayers conv2dLayer batchNorm adaptiveMu addLayer leakyrelLayer];结束
不要对倒数第二卷积层应用膨胀因子。
numberOfFilters conv2dLayer = convolution2dLayer(3日,...“填充”,1,“重量”重量,“名字”,“Conv9”);batchNorm = batchNormalizationLayer (“名字”,“AN9”);adaptiveMu = adaptiveNormalizationMu (numberOfFilters,“Mu9”);addLayer = additionLayer (2“名字”,“add9”);leakyrelLayer = leakyReluLayer (0.2,“名字”,“Leaky9”);middleLayers = [middleLayers conv2dLayer batchNorm adaptiveMu addLayer leakyrelLayer];
最后一个卷积层有一个大小为1 × 1 × 32 × 3的过滤器来重建图像。
重量=√2 / (9 * numberOfFilters)) * randn (1,1 numberOfFilters 3);conv2dLayer = convolution2dLayer(1、3、“NumChannels”numberOfFilters,...“重量”重量,“名字”,“Conv10”);
最后一层是回归层,而不是泄漏的ReLU层。回归层计算双边滤波图像和网络预测之间的均方误差。
finalLayers = [conv2dLayer regressionLayer(“名字”,“FinalRegressionLayer”));
连接所有的层。
层= [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 (lgraph,“Conv1”,“λ₁”);lgraph = connectLayers (lgraph,“λ₁”,“add1 / in2”);lgraph = addLayers (lgraph skipConv2);lgraph = connectLayers (lgraph,“Conv2”,“Lambda2”);lgraph = connectLayers (lgraph,“Lambda2”,“add2 / in2”);lgraph = addLayers (lgraph skipConv3);lgraph = connectLayers (lgraph,“Conv3”,“Lambda3”);lgraph = connectLayers (lgraph,“Lambda3”,“add3 / in2”);lgraph = addLayers (lgraph skipConv4);lgraph = connectLayers (lgraph,“Conv4”,“Lambda4”);lgraph = connectLayers (lgraph,“Lambda4”,“add4 / in2”);lgraph = addLayers (lgraph skipConv5);lgraph = connectLayers (lgraph,“Conv5”,“Lambda5”);lgraph = connectLayers (lgraph,“Lambda5”,“折扣/ in2”);lgraph = addLayers (lgraph skipConv6);lgraph = connectLayers (lgraph,“Conv6”,“Lambda6”);lgraph = connectLayers (lgraph,“Lambda6”,“add6 / in2”);lgraph = addLayers (lgraph skipConv7);lgraph = connectLayers (lgraph,“Conv7”,“Lambda7”);lgraph = connectLayers (lgraph,“Lambda7”,“add7 / in2”);lgraph = addLayers (lgraph skipConv8);lgraph = connectLayers (lgraph,“Conv8”,“Lambda8”);lgraph = connectLayers (lgraph,“Lambda8”,“add8 / in2”);lgraph = addLayers (lgraph skipConv9);lgraph = connectLayers (lgraph,“Conv9”,“Lambda9”);lgraph = connectLayers (lgraph,“Lambda9”,“add9 / in2”);
绘制图层图。
情节(lgraph)
用亚当优化器训练网络。属性指定超参数设置trainingOptions
(深度学习工具箱)函数。的缺省值0.9
“动力
”,0.0001
“L2Regularization
”(重量衰变)。指定固定的学习速率为0.0001
.181时代列车。
maxEpochs = 181;initLearningRate = 0.0001;miniBatchSize = 1;选择= trainingOptions (“亚当”,...“InitialLearnRate”initLearningRate,...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“阴谋”,“训练进步”,...“详细”、假);
默认情况下,示例加载一个预训练的多尺度CAN,它近似于双边滤波器。预先训练的网络使您能够在不等待训练完成的情况下执行近似的双边滤波。
要训练网络,设置doTraining
变量为真正的
.多尺度CAN的训练trainNetwork
(深度学习工具箱)函数。
在可用的GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU支金宝app持情况(并行计算工具箱).在NVIDIA™Titan X上进行大约15个小时的培训。
doTraining = false;如果doTraining modelDateTime = string(datetime(“现在”,“格式”,“yyyy-MM-dd-HH-mm-ss”));网= trainNetwork (dsTrain、lgraph选项);保存(strcat (“trainedOperatorLearning——”modelDateTime,“时代——”num2str (maxEpochs),“.mat”),“净”);其他的负载(“trainedoperatorlearning -时期- 181.垫”);结束
要使用训练有素的多尺度CAN网络来处理图像,该网络近似于双边滤波器,请遵循本示例的其余步骤。示例的其余部分将展示如何:
从参考图像创建一个样本噪声输入图像。
对噪声图像进行传统的双边滤波imbilatfilt
函数。
使用CAN对噪声图像进行近似双边滤波。
将算子逼近去噪后的图像与传统的双边滤波图像进行视觉对比。
通过量化图像与原始参考图像的相似度来评价去噪图像的质量。
创建一个样本噪声图像,用于比较算子近似与传统双边滤波的结果。测试数据集,testImages
,包含在图像处理工具箱™中提供的21张原始图像。将图像加载到imageDatastore
.
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”,...“indiancorn.jpg”,“flamingos.jpg”,“sevilla.jpg”,“llama.jpg”,“parkavenue.jpg”,...“peacock.jpg”,“car1.jpg”,“strawberries.jpg”,“wagon.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测试图像。如果测试图像为灰度,则将图像转换为RGB猫
函数沿第三维连接原始图像的三个副本。
显示参考图像。
imshow (Ireference)标题(原始参考图像的)
使用imnoise
函数向参考图像添加方差为0.00001的零均值高斯白噪声。
Inoisy = imnoise (Ireference,“高斯”, 0.00001);imshow (Inoisy)标题(“嘈杂的图像”)
传统的双边滤波是一种降低图像噪声同时保持边缘清晰度的标准方法。使用imbilatfilt
函数对噪声图像应用双边滤波。指定一个平滑度等于像素值的方差。
degreeOfSmoothing = var(双(Inoisy (:)));Ibilat = imbilatfilt (Inoisy degreeOfSmoothing);imshow (Ibilat)标题(“使用双边滤波获得去噪图像”)
将归一化后的输入图像通过训练后的网络进行观察激活
(深度学习工具箱)从最后一层(回归层)。网络的输出是需要去噪的图像。
Inoisy Iapprox =激活(净,“FinalRegressionLayer”);
图像处理工具箱™要求浮点图像具有范围为[0,1]的像素值。使用重新调节
函数将像素值缩放到此范围,然后将图像转换为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 Ireference);bilatPSNR = psnr (Ibilat Ireference);approxPSNR = psnr (Iapprox Ireference);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
与传统的双边滤波相比,算子逼近产生了更好的度量分数。
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基准:一种新的视觉信息系统评估资源。基于内容的图像检索语言资源.意大利热那亚。第五卷,2006年5月,第10页。
randomPatchExtractionDatastore
|trainNetwork
(深度学习工具箱)|trainingOptions
(深度学习工具箱)|layerGraph
(深度学习工具箱)|激活
(深度学习工具箱)|imbilatfilt