使用深度学习图像处理算子逼近
这个例子展示了如何使用一个多尺度近似图像过滤操作上下文聚合网络(可以)。
算子逼近找到替代方式处理图像,这样的结果就像传统的图像处理操作的输出或管道。算子逼近的目标通常是减少所需的时间来处理图像。
提出了一些古典和深度学习技术来执行运营商近似。一些经典技术提高单个算法的效率但不能推广到其他操作。另一个常见的技术接近范围广泛的操作由操作符应用到低分辨率图像的复制,但高频内容的损失限制近似的准确性。
深度学习解决方案使近似更普遍金宝搏官方网站和复杂的操作。例如,多尺度上下文聚合网络(可以)提出的问:陈(1)可以近似多尺度色调映射,摄影风格转移,外地dehazing,铅笔绘图。多尺度可以火车全分辨率图像处理更大的准确性的高频细节。网络训练后,网络可以绕过传统的处理操作和直接处理图像。
这个案例探讨了如何训练一个多尺度近似图像双边滤波操作,从而降低图像噪声,同时保留边缘锐度。示例给出了完整的培训和推理工作流程,其中包括创建一个训练数据存储的过程中,选择训练选项,训练网络,使用网络来处理测试图像。
算子逼近网络
多尺度可以最小化训练 损失之间的传统输出的图像处理操作和网络响应处理后输入图像使用多尺度上下文聚合。多尺度背景下聚合查找信息从整个图像每个像素,而不是限制搜索到周围的一个小邻域内像素。
帮助网络学习全球形象属性,多尺度可以架构有一个很大的接受域。第一个和最后一个层具有相同的大小,因为运营商不应改变图像的大小。连续过渡层由成倍增加的规模扩张因素(因此“多尺度”的本质)。扩张使网络寻找空间分离特性在不同空间频率,而不降低图像的分辨率。每个卷积层后,网络使用自适应标准化平衡的影响批规范化和近似算子上的标识映射。
下载的培训和测试数据
下载IAPR TC-12基准,包括20000年仍然自然图像(2]。数据集包括照片的人、动物、城市、和更多。数据文件的大小是~ 1.8 GB。如果你不想下载所需的训练数据集训练网络,然后你可以加载pretrained可以通过输入负载(“trainedBilateralFilterNet.mat”);
在命令行中。然后,直接进入使用多尺度可以执行双边滤波近似在这个例子中部分。
使用helper函数,downloadIAPRTC12Data
下载数据。这个函数是附加到例子作为支持文件。金宝app指定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”;
使用辅助函数bilateralFilterDataset
训练数据进行预处理。这个函数是附加到例子作为支持文件。金宝app每个原始图像的helper函数执行这些操作inputImages
:
计算双边滤波的平滑程度。平滑过滤后的图像可以减少图像噪声。
执行双边滤波使用
imbilatfilt
。将过滤后的图像保存到磁盘使用
imwrite
。
bilateralFilterDataset (pristineImages preprocessDataDir);
定义随机块提取数据存储进行训练
使用一个随机块提取数据存储网络的训练数据。从两个图像数据存储该数据存储中提取随机相应补丁包含网络输入和期望的网络响应。
在这个例子中,网络输入的原始图像pristineImages
。所需的网络响应处理双边滤波后图像。创建一个图像数据存储bilatFilteredImages
从双边过滤图像文件的集合。
bilatFilteredImages = imageDatastore (preprocessDataDir FileExtensions = ext);
创建一个randomPatchExtractionDatastore
从这两个图像数据存储。指定一个补丁256————256像素的大小。指定“PatchesPerImage”
从每一对图像中提取一个随机的补丁在训练。指定一个mini-batch大小。
miniBatchSize = 1;patchSize = (256 - 256);dsTrain = randomPatchExtractionDatastore (pristineImages bilatFilteredImages patchSize,…。PatchesPerImage = 1);dsTrain。MiniBatchSize = MiniBatchSize;
的randomPatchExtractionDatastore
提供mini-batches数据到网络时代的每一次迭代。执行一个读操作探索数据的数据存储。
inputBatch =阅读(dsTrain);disp (inputBatch)
InputImage ResponseImage _________________ _________________ {256×256×3 uint8} {256×256×3 uint8}
建立多尺度层
这个例子定义了多尺度可以从深度学习工具箱™使用层,包括:
imageInputLayer
(深度学习工具箱)——图像输入层convolution2dLayer
(深度学习工具箱)——二维卷积为卷积神经网络层batchNormalizationLayer
(深度学习工具箱)——批量标准化层leakyReluLayer
(深度学习工具箱)漏水的解决线性单元层regressionLayer
(深度学习工具箱)——回归神经网络输出层
两个自定义扩展层被添加到实现一批自适应归一化层。这些层连接这个例子的支持文件。金宝app
adaptiveNormalizationMu——规模层调整batch-normalization分支的优势
adaptiveNormalizationLambda——层规模调整的优势单位分支机构
第一层,imageInputLayer
作用于图像补丁。补丁的大小是基于网络接受域,即空间图像区域网络中影响顶部的层的响应。理想情况下,网络接受域图像的大小是一样的,这样就可以看到所有的高水平特色的形象。双边滤波器的近似图像补丁的大小是固定的,256 - 256。
networkDepth = 10;numberOfFilters = 32;firstLayer = imageInputLayer ([256 256 3), Name =“InputLayer”归一化=“没有”);
图像输入层是紧随其后的是一个二维卷积层包含32 3 x3的过滤器的大小。在每个卷积的输入层,这样特征图是相同的大小每次卷积后作为输入。初始化权值的单位矩阵。
重量= 0 (3,3,3,numberOfFilters);为2 = 1:3重量(2,2,二世ii) = 1;结束convolutionLayer = convolution2dLayer (3 numberOfFilters填充= 1,…重量=重量,Name =“Conv1”);
每个卷积层是紧随其后的是一批归一化层和一层自适应标准化规模调整的优势batch-normalization分支。之后,这个示例将创建相应的自适应归一化层,调整规模单位分支机构的力量。现在,跟随adaptiveNormalizationMu
层和附加层。最后,指定一个漏水的ReLU层的标量乘法器0.2
为负的输入。
batchNorm = batchNormalizationLayer (Name =“BN1”);adaptiveMu = adaptiveNormalizationMu (numberOfFilters,“Mu1”);addLayer = additionLayer (Name =“add1”);leakyrelLayer = leakyReluLayer (0.2, Name =“Leaky1”);
指定网络的中间层遵循相同的模式。连续卷积鳞片层有一个扩张因素指数与网络深度。
middleLayers = [convolutionLayer batchNorm adaptiveMu addLayer leakyrelLayer];重量= 0 (3 3 numberOfFilters numberOfFilters);为2 = 1:numberOfFilters重量(2,2,二世ii) = 1;结束为layerNumber = 2: networkDepth-2 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));middleLayers = [middleLayers 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”);middleLayers = [middleLayers conv2dLayer batchNorm adaptiveMu addLayer leakyrelLayer);
最后卷积层有一个过滤器的大小1-by-1-by-32-by-3塑造形象。
重量=√2 / (9 * numberOfFilters)) * randn (1,1 numberOfFilters 3);conv2dLayer = convolution2dLayer (1、3、NumChannels = numberOfFilters,…重量=重量,Name =“Conv10”);
最后一层是回归层而不是漏水的ReLU层。回归层计算bilateral-filtered形象和网络之间的均方误差的预测。
finalLayers = [conv2dLayer regressionLayer (Name =“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)
指定培训选项
列车网络优化器使用亚当。通过使用指定hyperparameter设置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);
培训网络
默认情况下,示例加载pretrained多尺度可以接近一个双边滤波器。pretrained网络使您能够执行一个近似的双边滤波没有等待培训完成。
训练网络,设置doTraining
变量在下面的代码真正的
。训练多尺度可以使用trainNetwork
(深度学习工具箱)函数。
火车在GPU如果一个是可用的。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见GPU的金宝app支持版本(并行计算工具箱)。培训大约需要15个小时在一个NVIDIA™泰坦X。
doTraining =假;如果doTraining净= trainNetwork (dsTrain、lgraph选项);modelDateTime =字符串(datetime (“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trainedBilateralFilterNet——”+ modelDateTime +“.mat”,“净”);其他的负载(“trainedBilateralFilterNet.mat”);结束
使用多尺度可以执行双边滤波近似
使用训练过程图像多尺度网络接近双边滤波器,按照剩余的步骤的例子。剩余的示例展示了如何:
创建一个示例的输入图像从一个参考图像。
执行传统的双边滤波的噪声图像使用
imbilatfilt
函数。执行一个近似双边滤波的图像使用。
视觉上比较去噪图像双边滤波算子逼近和传统。
评价去噪图像的质量通过量化原始参考图像相似的图像。
创建示例嘈杂的图像
创建一个示例嘈杂的图像将被用来比较传统的双边滤波算子近似的结果。
测试数据集,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)标题(“使用多尺度可以获得去噪图像”)
可视化和定量比较
获得更好的去噪图像的视觉理解,检查一个小区域内每个图像。指定感兴趣区域(ROI)使用向量roi
的格式(xy宽度高度]。元素定义了左上角的x和y坐标,和ROI的宽度和高度。
投资回报率= [300 30 50 50];
作物图像ROI,蒙太奇和显示结果。比传统的双边滤波可以消除更多的噪音。这两种技术保存边缘锐度。
蒙太奇({imcrop (Ireference roi), imcrop (Inoisy roi),…imcrop (Ibilat roi), imcrop (Iapprox roi)},…大小= [1 - 4]);标题(“参考图像|嘈杂的图像| | Bilateral-Filtered图像可以预测”);
使用图像质量指标定量比较嘈杂的输入图像,bilateral-filtered形象,operator-approximated形象。参考图像是原始的参考图像,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 26.181 0.92601 6.1291 0.91549 - 7.4163算子近似
引用
问:[1]Chen j .徐和诉Koltun。“快速图像处理与Fully-Convolutional网络。”In学报2017年IEEE计算机视觉。威尼斯,意大利,2017年10月,页2516 - 2525。
[2]Grubinger, M。,P. Clough, H. Müller, and T. Deselaers. "The IAPR TC-12 Benchmark: A New Evaluation Resource for Visual Information Systems."诉讼OntoImage 2006语言资源的基于内容的图像检索。意大利热那亚。5卷,2006年5月,p。10。
另请参阅
randomPatchExtractionDatastore
|trainNetwork
(深度学习工具箱)|trainingOptions
(深度学习工具箱)|layerGraph
(深度学习工具箱)|激活
(深度学习工具箱)|imbilatfilt