使用深度学习的图像处理算子逼近
这个例子展示了如何使用多尺度上下文聚合网络(CAN)来近似图像过滤操作。
算子近似找到了处理图像的替代方法,使结果类似于传统图像处理操作或管道的输出。算子逼近的目标通常是减少处理图像所需的时间。
已经提出了几种经典和深度学习技术来执行算子逼近。一些经典技术可以提高单个算法的效率,但不能推广到其他操作。另一种常见的技术通过将算子应用于图像的低分辨率副本来近似广泛的操作,但高频内容的损失限制了近似的准确性。
深度学习解决方案能够近似更一万博 尤文图斯般和复杂的操作。例如Q. Chen提出的多尺度上下文聚合网络(CAN) [1]可以近似多尺度色调映射、摄影风格转移、非局部去雾、铅笔画。在全分辨率图像上进行多尺度CAN训练,以提高处理高频细节的准确性。网络经过训练后,可以绕过常规的处理操作,直接对图像进行处理。
这个例子探讨了如何训练多尺度CAN来近似双边图像滤波操作,从而在保持边缘清晰度的同时降低图像噪声。该示例展示了完整的训练和推理工作流,其中包括创建训练数据存储、选择训练选项、训练网络以及使用网络处理测试图像的过程。
算子逼近网络
训练多尺度CAN算法,使误差最小化 图像处理操作的常规输出与使用多尺度上下文聚合处理输入图像后的网络响应之间的损失。多尺度上下文聚合从整个图像中查找关于每个像素的信息,而不是将搜索限制在像素周围的小邻域。
为了帮助网络学习全局图像属性,多尺度CAN架构具有较大的接受域。第一层和最后一层具有相同的大小,因为操作符不应该改变图像的大小。连续的中间层通过指数级增长的尺度因子而膨胀(因此CAN的“多尺度”性质)。膨胀使网络能够在不同的空间频率下寻找空间分离的特征,而不会降低图像的分辨率。在每个卷积层之后,网络使用自适应归一化来平衡批量归一化和恒等映射对近似算子的影响。
下载培训和测试数据
下载IAPR TC-12基准,其中包括2万张静止自然图像[2].数据集包括人物、动物、城市等的照片。数据文件的大小为~1.8 GB。如果你不想下载训练网络所需的训练数据集,那么你可以通过输入来加载预训练的can负载(“trainedBilateralFilterNet.mat”);
在命令行。然后,直接去使用多尺度CAN进行双边滤波逼近节。
使用helper函数,downloadIAPRTC12Data
下载资料。该函数作为支持文件附加到示例中。万博1manbetx指定dataDir
作为数据的期望位置。
dataDir =tempdir;downloadIAPRTC12Data (dataDir);
本例使用IAPRTC-12基准数据的一小部分来训练网络。
trainImagesDir = fullfile(dataDir,“iaprtc12”,“图片”,“39”);Exts = [“jpg”,“bmp格式”,“使用”];pristineImages = imageDatastore(trainImagesDir,FileExtensions=exts);
列出训练图像的数量。
元素个数(pristineImages.Files)
Ans = 916
准备培训数据
为了创建一个训练数据集,读入原始图像并写出已经过双边过滤的图像。过滤后的图像存储在磁盘上指定的目录中preprocessDataDir
。
preprocessDataDir = trainImagesDir+filesep+“preprocessedDataset”;
使用helper函数bilateralFilterDataset
对训练数据进行预处理。该函数作为支持文件附加到示例中。万博1manbetx中的每个原始图像,helper函数执行这些操作inputImages
:
计算双边滤波的平滑度。平滑滤波后的图像可以减少图像噪声。
使用
imbilatfilt
。使用将过滤后的图像保存到磁盘
imwrite
。
bilateralFilterDataset (pristineImages preprocessDataDir);
为训练定义随机补丁提取数据存储
使用随机补丁提取数据存储将训练数据输入网络。该数据存储从包含网络输入和所需网络响应的两个映像数据存储中提取随机对应的补丁。
在本例中,网络输入是中的原始图像pristineImages
。期望的网络响应是经过双边滤波处理后的图像。创建一个名为bilatFilteredImages
从双边过滤图像文件的集合。
bilatFilteredImages = imageDatastore(preprocessDataDir,FileExtensions=exts);
创建一个randomPatchExtractionDatastore
从两个映像数据存储。指定一个256 * 256像素的补丁大小。指定“PatchesPerImage”
在训练过程中,从每对图像中抽取一个随机定位的patch。指定一个小批大小为1。
miniBatchSize = 1;patchSize = [256];dsTrain = randompatchextracactiondatastore (pristineImages,bilatFilteredImages,patchSize,...。PatchesPerImage = 1);dsTrain。MiniBatchSize = MiniBatchSize;
的randomPatchExtractionDatastore
在历元的每个迭代中向网络提供小批量数据。在数据存储上执行读取操作以查看数据。
inputBatch = read(dsTrain);disp (inputBatch)
InputImage ResponseImage _________________ _________________ { 256×256×3 uint8}{256×256×3 uint8}
设置多尺度CAN层
这个例子使用来自深度学习工具箱™的层定义了多尺度CAN,包括:
imageInputLayer
(深度学习工具箱)-图像输入层convolution2dLayer
(深度学习工具箱)-用于卷积神经网络的二维卷积层batchNormalizationLayer
(深度学习工具箱)批处理归一化层leakyReluLayer
(深度学习工具箱)-漏整流线性单元层regressionLayer
(深度学习工具箱)神经网络的回归输出层
添加两个自定义标度层以实现自适应批处理规范化层。这些层作为支持文件附加到这个示例中。万博1manbetx
adaptiveNormalizationMu-缩放层,用于调整批处理规范化分支的强度
adaptiveNormalizationLambda-缩放层,用于调整身份分支的强度
第一层,imageInputLayer
,操作图像补丁。patch的大小基于网络的接受场,接受场是影响网络最顶层响应的空间图像区域。理想情况下,网络接受域与图像大小相同,这样它就可以看到图像中的所有高级特征。对于双边滤波器,近似图像补丁大小固定为256 × 256。
networkDepth = 10;numberOfFilters = 32;firstLayer = imageInputLayer([256 256 3],Name=“InputLayer”归一化=“没有”);
图像输入层后面是一个二维卷积层,其中包含32个大小为3 × 3的滤波器。对每个卷积层的输入进行零垫,使特征映射在每次卷积后保持与输入相同的大小。初始化单位矩阵的权值。
Wgts = 0 (3,3,3,numberOfFilters);为ii = 1:3 Wgts(2,2,ii,ii) = 1;结束卷积层=卷积2dlayer (3,numberOfFilters,Padding=1,...重量=重量,Name =“Conv1”);
每个卷积层后面是一个批处理归一化层和一个自适应归一化标度层,该标度层调整批处理归一化分支的强度。稍后,本例将创建相应的自适应规范化标度层,用于调整标识分支的强度。现在,遵循adaptiveNormalizationMu
再加一层。最后,用标量乘法器指定一个泄漏的ReLU层0.2
对于负输入。
batchNorm = batchNormalizationLayer“BN1”);adaptiveMu = adaptiveNormalizationMu(numberOfFilters,“Mu1”);addLayer = addtionlayer (2,Name=“add1”);leakyrelLayer = leakyrelullayer (0.2,Name=“Leaky1”);
按照相同的模式指定网络的中间层。连续的卷积层有一个膨胀因子,它随网络深度呈指数级增长。
middleLayers = [convolutionLayer batchNorm adaptiveMu addLayer leakyrelLayer];Wgts = 0 (3,3,numberOfFilters,numberOfFilters);为ii = 1:numberOfFilters Wgts(2,2,ii,ii) = 1;结束为layerNumber = 2:networkDepth-2 dilationFactor = 2^(layerNumber-1);padding = dilationFactor;conv2dLayer =卷积2dlayer (3,numberOfFilters,...填充=填充,DilationFactor = DilationFactor,...重量=重量,Name =“Conv”+ num2str (layerNumber));batchNorm = batchNormalizationLayer“BN”+ num2str (layerNumber));adaptiveMu = adaptiveNormalizationMu(numberOfFilters,“亩”+ num2str (layerNumber));addLayer = addtionlayer (2,Name=“添加”+ num2str (layerNumber));leakyrelLayer = leakyrelullayer (0.2,Name=“漏”+ num2str (layerNumber));middleLayers = [middleLayers conv2dLayer batchNorm adaptiveMu addLayer leakyrelLayer];结束
不要对倒数第二个卷积层应用膨胀因子。
conv2dLayer =卷积2dlayer (3,numberOfFilters,...填充= 1,重量=重量,Name =“Conv9”);batchNorm = batchNormalizationLayer“AN9”);adaptiveMu = adaptiveNormalizationMu(numberOfFilters,“Mu9”);addLayer = addtionlayer (2,Name=“add9”);leakyrelLayer = leakyrelullayer (0.2,Name=“Leaky9”);middleLayers = [middleLayers conv2dLayer batchNorm adaptiveMu addLayer leakyrelLayer];
最后一个卷积层有一个大小为1 × 1 × 32 × 3的过滤器,用于重建图像。
Wgts =√(2/(9*numberOfFilters))*randn(1,1,numberOfFilters,3);conv2dLayer =卷积2dlayer (1,3,NumChannels=numberOfFilters,...重量=重量,Name =“Conv10”);
最后一层是回归层,而不是泄漏的ReLU层。回归层计算双边过滤图像和网络预测之间的均方误差。
finalLayers = [conv2dLayer regressionLayer(Name=“FinalRegressionLayer”));
连接所有的层。
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(“Conv1”,“λ₁);lgraph = connectLayers(“λ₁,“add1 / in2”);lgraph = addLayers(lgraph,skipConv2);lgraph = connectLayers(“Conv2”,“Lambda2”);lgraph = connectLayers(“Lambda2”,“add2 / in2”);lgraph = addLayers(lgraph,skipConv3);lgraph = connectLayers(“Conv3”,“Lambda3”);lgraph = connectLayers(“Lambda3”,“add3 / in2”);lgraph = addLayers(lgraph,skipConv4);lgraph = connectLayers(“Conv4”,“Lambda4”);lgraph = connectLayers(“Lambda4”,“add4 / in2”);lgraph = addLayers(lgraph,skipConv5);lgraph = connectLayers(“Conv5”,“Lambda5”);lgraph = connectLayers(“Lambda5”,“折扣/ in2”);lgraph = addLayers(lgraph,skipConv6);lgraph = connectLayers(“Conv6”,“Lambda6”);lgraph = connectLayers(“Lambda6”,“add6 / in2”);lgraph = addLayers(lgraph,skipConv7);lgraph = connectLayers(“Conv7”,“Lambda7”);lgraph = connectLayers(“Lambda7”,“add7 / in2”);lgraph = addLayers(lgraph,skipConv8);lgraph = connectLayers(“Conv8”,“Lambda8”);lgraph = connectLayers(“Lambda8”,“add8 / in2”);lgraph = addLayers(lgraph,skipConv9);lgraph = connectLayers(“Conv9”,“Lambda9”);lgraph = connectLayers(“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 = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trainedBilateralFilterNet——”+ modelDateTime +“.mat”,“净”);其他的负载(“trainedBilateralFilterNet.mat”);结束
使用多尺度CAN进行双边滤波逼近
要使用近似于双边滤波器的训练过的多尺度CAN网络处理图像,请遵循本示例的其余步骤。该示例的其余部分展示了如何:
从参考图像创建一个样本噪声输入图像。
对噪声图像进行常规的双边滤波
imbilatfilt
函数。使用CAN对噪声图像进行近似双边滤波。
视觉比较去噪图像从算子近似和传统的双边滤波。
通过量化图像与原始参考图像的相似性来评估去噪图像的质量。
创建样本噪声图像
创建一个样本噪声图像,将用于比较算子逼近的结果与传统的双边滤波。
测试数据集,testImages
,包含20张在图像处理工具箱中提供的未失真图像。将图像加载到imageDatastore
并以蒙太奇的方式展示这些图像。
fileNames = [“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的零均值高斯白噪声。
无噪声=无噪声(参考,“高斯”, 0.00001);imshow (Inoisy)标题(“嘈杂的图像”)
使用双边滤波来过滤图像
传统的双边滤波是在保持边缘锐度的同时降低图像噪声的标准方法。使用imbilatfilt
函数对有噪声的图像应用双边滤波器。指定平滑程度等于像素值的方差。
degreeOfSmoothing = var(double(Inoisy(:)));Ibilat = imbilatfilt(噪音,degreeOfSmoothing);imshow (Ibilat)标题(“双边滤波降噪图像”)
利用训练过的网络处理图像
将归一化后的输入图像通过训练过的网络,并观察激活
(深度学习工具箱)最后一层(回归层)。网络的输出是所需要的去噪图像。
Iapprox =激活(净,噪声,“FinalRegressionLayer”);
图像处理工具箱™要求浮点图像的像素值范围为[0,1]。使用重新调节
函数将像素值缩放到此范围,然后将图像转换为uint8
。
Iapprox = rescale(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(噪声,Ireference);bilatPSNR = psnr(Ibilat,Ireference);approxPSNR = psnr(Iapprox,Ireference);PSNR_Score = [noisyPSNR bilatPSNR approxPSNR]';
测量每个图像的结构相似指数(SSIM)。SSIM评估图像的三个特征的视觉影响:亮度,对比度和结构,相对于参考图像。SSIM值越接近1,说明测试图像与参考图像的一致性越好。看到ssim
有关此指标的更多信息。
noisySSIM = ssim(噪音,Ireference);bilatSSIM = ssim(Ibilat,Ireference);approxSSIM = ssim(Iapprox,Ireference);SSIM_Score = [noisySSIM bilatSSIM approxSSIM]';
使用自然图像质量评估器(NIQE)测量感知图像质量。NIQE分数越小,知觉质量越好。看到niqe
有关此指标的更多信息。
noisyNIQE = niqe(噪音);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.科尔顿。全卷积网络快速图像处理在2017年IEEE计算机视觉会议论文集。意大利威尼斯,2017年10月,第2516-2525页。
[2]格鲁宾格,M. P.克拉夫,H. Müller和T.迪塞勒。IAPR TC-12基准:视觉信息系统的新评估资源基于内容的图像检索语言资源文集。意大利热那亚。第五卷,2006年5月,第10页
另请参阅
randomPatchExtractionDatastore
|trainNetwork
(深度学习工具箱)|trainingOptions
(深度学习工具箱)|layerGraph
(深度学习工具箱)|激活
(深度学习工具箱)|imbilatfilt
相关的话题
- 用于深度学习的图像预处理(深度学习工具箱)
- 用于深度学习的数据存储(深度学习工具箱)
- 深度学习层列表(深度学习工具箱)