基于深度学习的图像处理算子逼近
这个例子展示了如何使用多尺度上下文聚合网络(CAN)来近似图像过滤操作。
运算符近似找到处理图像的替代方法,使结果类似于传统图像处理操作或管道的输出。算子近似的目标通常是减少处理图像所需的时间。
已经提出了几种经典的和深度学习技术来执行算子逼近。一些经典的技术提高了单一算法的效率,但不能推广到其他操作。另一种常见的技术是通过将运算符应用到图像的低分辨率副本上,从而实现大范围的近似运算,但高频内容的丢失限制了近似的准确性。
深度学习解决方案能够逼近更一般和复杂的操作。例如Q. Chen提出的多尺度上下文聚合网络(CAN) [1]可以近似多尺度色调映射、摄影风格转移、非局部去雾和铅笔画。多尺度CAN训练全分辨率图像,以提高处理高频细节的准确性。经过训练后,网络可以绕过传统的处理操作,直接对图像进行处理。
这个例子探讨了如何训练一个多尺度的CAN来近似一个双边图像滤波操作,从而在保持边缘清晰度的同时减少图像噪声。该示例展示了完整的训练和推理工作流,其中包括创建训练数据存储、选择训练选项、训练网络以及使用网络处理测试图像的过程。
算子逼近网络
训练多尺度的CAN,以减少 图像处理操作的常规输出与使用多尺度上下文聚合处理输入图像后的网络响应之间的损失。多尺度上下文聚合从整个图像中寻找关于每个像素的信息,而不是将搜索限制在像素周围的小邻域。
为了帮助网络学习全局图像属性,多尺度CAN体系结构具有较大的接受域。第一层和最后一层的大小相同,因为操作符不应该改变图像的大小。连续的中间层通过指数级增长的尺度因子膨胀(因此CAN具有“多尺度”的特性)。扩张使网络能够在不同的空间频率下寻找空间分离的特征,而不降低图像的分辨率。在每个卷积层之后,网络使用自适应归一化来平衡批归一化和恒等映射对近似算子的影响。
下载培训和测试数据
下载IAPR TC-12基准,由2万张静止自然图像组成[2].数据集包括人物、动物、城市等的照片。数据文件的大小为~1.8 GB。如果不希望下载训练网络所需的训练数据集,则可以通过输入加载预训练的can负载(“trainedBilateralFilterNet.mat”);
在命令行。然后,直接去使用多尺度CAN实现双边滤波逼近节。
使用助手函数,downloadIAPRTC12Data
,下载有关资料。该函数作为支持文件附加到示例中。指定dataDir
作为数据的期望位置。
dataDir =tempdir;downloadIAPRTC12Data (dataDir);
这个例子使用IAPRTC-12基准测试数据的一小部分来训练网络。
trainImagesDir = fullfile (dataDir,“iaprtc12”,“图片”,“39”);ext = [“jpg”,“bmp格式”,“使用”];pristineImages = imageDatastore (trainImagesDir FileExtensions = ext);
列出训练图像的数量。
元素个数(pristineImages.Files)
ans = 916
准备训练数据
为了创建一个训练数据集,读入原始图像,并写出经过双边过滤的图像。所指定的目录中存储经过过滤的图像preprocessDataDir
.
preprocessDataDir = trainImagesDir + filesep +“preprocessedDataset”;
使用helper函数bilateralFilterDataset
预处理训练数据。该函数作为支持文件附加到示例中。中的每个原始图像,助手函数执行这些操作inputImages
:
计算双边滤波的平滑度。平滑滤波后的图像可以减少图像噪声。
使用以下命令执行双边过滤
imbilatfilt
.使用将过滤后的图像保存到磁盘
imwrite
.
bilateralFilterDataset (pristineImages preprocessDataDir);
为训练定义随机补丁提取数据存储
使用随机补丁提取数据存储将训练数据提供给网络。该数据存储从包含网络输入和所需网络响应的两个图像数据存储中提取随机对应的补丁。
在本例中,网络输入是中的原始图像pristineImages
.所需要的网络响应是经过双边滤波处理后的图像。创建一个名为bilatFilteredImages
从双边过滤图像文件的集合。
bilatFilteredImages = imageDatastore (preprocessDataDir FileExtensions = ext);
创建一个randomPatchExtractionDatastore
从两个映像数据存储。指定一个256 × 256像素的补丁大小。指定“PatchesPerImage”
在训练过程中从每对图像中提取一个随机位置的patch。指定小批处理大小为1。
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层
此示例使用深度学习工具箱™中的层定义了多尺度CAN,包括:
imageInputLayer
(深度学习工具箱)-图像输入层convolution2dLayer
(深度学习工具箱)-用于卷积神经网络的二维卷积层batchNormalizationLayer
(深度学习工具箱)-批处理归一化层leakyReluLayer
(深度学习工具箱)-线性单元层漏修正regressionLayer
(深度学习工具箱)-神经网络的回归输出层
添加两个自定义规模层来实现自适应批处理规范化层。这些层作为支持文件附加到本示例中。
adaptiveNormalizationMu-缩放层,调整批量正常化分支的强度
adaptiveNormalizationLambda-缩放层,调整身份分支的强度
第一层,imageInputLayer
,操作图像补丁。patch的大小基于网络接受域,网络接受域是影响网络最顶层响应的空间图像区域。理想情况下,网络接受域与图像大小相同,以便它能看到图像中的所有高级特征。对于双边滤波器,近似图像补丁大小固定为256 × 256。
networkDepth = 10;numberOfFilters = 32;firstLayer = imageInputLayer([256 256 3],Name=“InputLayer”归一化=“没有”);
图像输入层后面是一个二维卷积层,其中包含32个大小为3乘3的滤波器。对每个卷积层的输入进行零填充,使特征映射在每次卷积后保持与输入相同的大小。初始化单位矩阵的权值。
重量= 0 (3,3,3,numberOfFilters);为ii = 1:3 Wgts(2,2,ii,ii) = 1;结束convolutionLayer = convolution2dLayer (3 numberOfFilters填充= 1,…重量=重量,Name =“Conv1”);
每个卷积层后面是一个批处理规范化层和一个自适应规范化刻度层,用于调整批处理规范化分支的强度。稍后,这个示例将创建相应的自适应规范化刻度层,以调整标识分支的强度。现在,请遵循adaptiveNormalizationMu
添加一层。最后,指定一个泄漏的ReLU层,其标量乘数为0.2
为负的输入。
batchNorm = batchNormalizationLayer (Name =“BN1”);adaptiveMu = adaptiveNormalizationMu (numberOfFilters,“Mu1”);addLayer = additionLayer (Name =“add1”);leakyrelLayer = leakyReluLayer (0.2, Name =“Leaky1”);
指定遵循相同模式的网络中间层。连续的卷积层有一个膨胀因子,它随网络深度呈指数级扩展。
middleayers = [convolutionLayer batchNorm adaptiveMu addLayer leakyrelLayer];重量= 0 (3 3 numberOfFilters numberOfFilters);为ii = 1:numberOfFilters Wgts(2,2,ii,ii) = 1;结束为dilationFactor = 2^(layerNumber-1);填充= dilationFactor;numberOfFilters conv2dLayer = convolution2dLayer(3日,…填充=填充,DilationFactor = DilationFactor,…重量=重量,Name =“Conv”+ num2str (layerNumber));batchNorm = batchNormalizationLayer (Name =“BN”+ num2str (layerNumber));adaptiveMu = adaptiveNormalizationMu (numberOfFilters,“亩”+ num2str (layerNumber));addLayer = additionLayer (Name =“添加”+ num2str (layerNumber));leakyrelLayer = leakyReluLayer (0.2, Name =“漏”+ num2str (layerNumber));middleelayers = [middleelayer conv2dLayer batchNorm adaptiveMu addLayer leakyrelLayer];结束
不要对倒数第二个卷积层应用膨胀因子。
numberOfFilters conv2dLayer = convolution2dLayer(3日,…填充= 1,重量=重量,Name =“Conv9”);batchNorm = batchNormalizationLayer (Name =“AN9”);adaptiveMu = adaptiveNormalizationMu (numberOfFilters,“Mu9”);addLayer = additionLayer (Name =“add9”);leakyrelLayer = leakyReluLayer (0.2, Name =“Leaky9”);middleelayers = [middleelayer conv2dLayer batchNorm adaptiveMu addLayer leakyrelLayer];
最后一个卷积层有一个大小为1 × 1 × 32 × 3的过滤器,用于重建图像。
重量=√2 / (9 * numberOfFilters)) * randn (1,1 numberOfFilters 3);conv2dLayer = convolution2dLayer(1、3、NumChannels = numberOfFilters,…重量=重量,Name =“Conv10”);
最后一层是回归层,而不是泄漏的ReLU层。回归层计算双边滤波图像与网络预测之间的均方误差。
finalLayers = [conv2dLayer regressionLayer(Name=“FinalRegressionLayer”));
连接所有的层。
layers = [firstLayer middleelayers 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)
指定培训选项
使用Adam优化器训练网络。方法指定超参数设置trainingOptions
(深度学习工具箱)函数。的默认值0.9
为“势头”
而且0.0001
为“L2Regularization”
(重量衰变)。指定恒定的学习率0.0001
.训练181个时代。
maxEpochs = 181;initLearningRate = 0.0001;miniBatchSize = 1;选择= trainingOptions (“亚当”,…InitialLearnRate = initLearningRate,…MaxEpochs = MaxEpochs,…MiniBatchSize = MiniBatchSize,…情节=“训练进步”,…Verbose = false);
培训网络
默认情况下,该示例加载一个预训练的多尺度CAN,近似于双边过滤器。预先训练的网络使您可以执行近似的双边过滤,而无需等待训练完成。
要训练网络,请设置doTraining
变量的真正的
.训练多尺度CAN使用trainNetwork
(深度学习工具箱)函数。
如果有GPU,请使用GPU进行训练。使用GPU需要并行计算工具箱™和CUDA®支持的NVIDIA®GPU。有关更多信息,请参见GPU计算的需求(并行计算工具箱).在NVIDIA™Titan X上进行训练大约需要15个小时。
doTraining =假;如果doTraining net = trainNetwork(dsTrain,lgraph,options);modelDateTime =字符串(datetime (“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trainedBilateralFilterNet——”+ modelDateTime +“.mat”,“净”);其他的负载(“trainedBilateralFilterNet.mat”);结束
使用多尺度CAN实现双边滤波逼近
要使用训练过的近似于双边滤波器的多尺度CAN网络处理图像,请遵循本示例的其余步骤。该示例的其余部分演示了如何:
从参考图像中创建一个样本噪声输入图像。
对噪声图像进行常规的双边滤波
imbilatfilt
函数。使用CAN对噪声图像进行近似双边滤波。
视觉上比较了算子近似和常规双边滤波降噪后的图像。
通过量化图像与原始参考图像的相似度来评估去噪图像的质量。
创建样本噪声图像
创建一个样本噪声图像,将用于比较算子近似的结果与传统的双边滤波。
测试数据集,testImages
,包含在图像处理工具箱™中附带的20张未失真图像。将图像加载到imageDatastore
并以蒙太奇的方式展示这些图像。
文件名= [“sherlock.jpg”,“peacock.jpg”,“fabric.png”,“greens.jpg”,…“hands1.jpg”,“kobi.png”,“lighthouse.png”,“office_4.jpg”,…“onion.png”,“pears.png”,“yellowlily.jpg”,“indiancorn.jpg”,…“flamingos.jpg”,“sevilla.jpg”,“llama.jpg”,“parkavenue.jpg”,…“strawberries.jpg”,“trailer.jpg”,“wagon.jpg”,“football.jpg”];filePath = fullfile (matlabroot,“工具箱”,“图片”,“imdata”) + filesep;filePathNames = strcat (filePath,文件名);testImages = imageDatastore (filePathNames);
以蒙太奇的方式显示测试图像。
蒙太奇(testImages)
选择一个图像作为双边过滤的参考图像。将图像转换为数据类型uint8
.
testImage =“fabric.png”;Ireference = imread (testImage);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,并将结果显示为蒙太奇。CAN比传统的双边滤波去除更多的噪声。这两种技术都能保持边缘的锐度。
蒙太奇({imcrop (Ireference roi), imcrop (Inoisy roi),…imcrop (Ibilat roi), imcrop (Iapprox roi)},…大小= [1 - 4]);标题(参考图像|噪声图像|双边滤波图像| CAN预测);
使用图像质量指标定量比较噪声输入图像,双边滤波图像和算子近似图像。参考图像是原始参考图像,Ireference
,然后添加噪音。
测量每个图像与参考图像的峰值信噪比(PSNR)。PSNR值越大,通常表示图像质量越好。看到psnr值
有关此指标的更多信息。
noisyPSNR = psnr (Inoisy Ireference);bilatPSNR = psnr (Ibilat Ireference);approxPSNR = psnr (Iapprox Ireference);PSNR_Score = [noisyPSNR bilatPSNR approxPSNR]';
测量每幅图像的结构相似指数(SSIM)。SSIM评估图像的三个特征对视觉的影响:亮度、对比度和结构,对比参考图像。SSIM值越接近1,则测试图像与参考图像的一致性越好。看到ssim
有关此指标的更多信息。
noisySSIM = ssim (Inoisy Ireference);bilatSSIM = ssim (Ibilat Ireference);approxSSIM = ssim (Iapprox Ireference);SSIM_Score = [noisySSIM bilatSSIM approxSSIM]';
使用自然图像质量评估器(NIQE)测量感知图像质量。NIQE分数越小,感知质量越好。看到niqe
有关此指标的更多信息。
noisyNIQE = niqe (Inoisy);bilatNIQE = niqe (Ibilat);approxNIQE = niqe (Iapprox);NIQE_Score = [noisyNIQE bilatNIQE approxNIQE]';
在表格中显示指标。
表(PSNR_Score SSIM_Score NIQE_Score,…RowNames = [“嘈杂的图像”,“双边滤波”,“运营商近似”])
ans =3×3表PSNR_Score SSIM_Score NIQE_Score __________ __________ __________噪声图像20.283 0.76238 11.611双边滤波25.774 0.91549 7.4163算子近似26.181 0.92601 6.1291
参考文献
[1]陈庆娟,徐庆娟,V. Koltun。"全卷积网络快速图像处理"在2017年IEEE计算机视觉会议论文集.意大利威尼斯,2017年10月,第2516-2525页。
[2]格鲁宾格,M., P.克拉夫,H. Müller,和T.德塞勒。IAPR TC-12基准:视觉信息系统的新评估资源。OntoImage 2006基于内容的图像检索语言资源.意大利热那亚。第五卷,2006年5月,第10页。
另请参阅
randomPatchExtractionDatastore
|trainNetwork
(深度学习工具箱)|trainingOptions
(深度学习工具箱)|layerGraph
(深度学习工具箱)|激活
(深度学习工具箱)|imbilatfilt
相关的话题
- 用于深度学习的图像预处理(深度学习工具箱)
- 用于深度学习的数据存储(深度学习工具箱)
- 深度学习层列表(深度学习工具箱)