主要内容

使用深度学习的JPEG图像去块

这个例子展示了如何训练去噪卷积神经网络(DnCNN),然后使用网络来减少图像中的JPEG压缩伪影。

图像压缩用于减少图像的内存占用。JPEG图像格式采用了一种流行的、功能强大的压缩方法,它使用质量因子来指定压缩量。降低质量值会导致更高的压缩和更小的内存占用,以牺牲图像的视觉质量为代价。

JPEG压缩有损,即压缩过程导致图像信息丢失。对于JPEG图像,这种信息丢失在图像中显示为块伪影。如图所示,更多的压缩会导致更多的信息丢失和更强的工件。带有高频内容的纹理区域,如草和云,看起来很模糊。尖锐的边缘,如房屋的屋顶和灯塔顶上的护栏,展示了铃声。

JPEG去块是减少JPEG图像压缩伪影影响的过程。目前存在几种JPEG去块方法,包括使用深度学习的更有效的方法。这个例子实现了一种基于深度学习的方法,它试图最小化JPEG压缩工件的影响。

DnCNN网络

这个例子使用了内置的深度前馈卷积神经网络,称为DnCNN.该网络主要用于去除图像中的噪声。然而,DnCNN体系结构也可以经过训练来去除JPEG压缩伪影或提高图像分辨率。

参考文件[1]采用残差学习策略,即DnCNN网络学习来估计残差图像。残差图像是原始图像和该图像的失真副本之间的差值。残差图像包含图像畸变的信息。对于本例,失真显示为JPEG阻塞工件。

通过训练DnCNN网络,从彩色图像的亮度中检测出残差图像。图像的亮度通道,Y,通过红、绿、蓝像素值的线性组合表示每个像素的亮度。相比之下,图像的两个色度通道,CbCr,是红色、绿色和蓝色像素值的不同线性组合,这些像素值表示颜色差异信息。DnCNN仅使用亮度通道进行训练,因为人类的感知对亮度的变化比对颜色的变化更敏感。

如果 Y 原始 是原始图像的亮度和 Y 压缩 为包含JPEG压缩伪影的图像亮度,则DnCNN网络的输入为 Y 压缩 网络学会了预测 Y 剩余 Y 压缩 - Y 原始 从训练数据。

一旦DnCNN网络学习了如何估计残差图像,它就可以通过将残差图像添加到压缩的亮度通道中,然后将图像转换回RGB颜色空间,从而重建压缩后的JPEG图像的未失真版本。

训练数据下载

下载IAPR TC-12基准,由20,000张静态自然图像组成[2].数据集包括人、动物、城市等的照片。数据文件大小为~1.8 GB。如果您不想下载训练网络所需的训练数据集,那么您可以通过键入来加载预训练的DnCNN网络加载(“pretrainedJPEGDnCNN.mat”)在命令行。然后,直接去使用DnCNN网络执行JPEG块节。

使用辅助函数,downloadIAPRTC12Data,下载资料。这个函数作为支持文件附加到示例中。金宝app

imagesDir = tempdir;url =“http://www-i6.informatik.rwth-aachen.de/imageclef/resources/iaprtc12.tgz”;downloadIAPRTC12Data (url, imagesDir);

本例将使用IAPR TC-12 Benchmark数据的一小部分来训练网络。加载imageCLEF训练数据。所有图像都是32位JPEG彩色图像。

trainImagesDir = fullfile (imagesDir,“iaprtc12”“图片”“00”);ext = {“jpg”bmp格式的“使用”};imdsPristine = imageDatastore (trainImagesDir,“FileExtensions”ext);

列出训练图像的数量。

元素个数(imdsPristine.Files)
ans = 251

准备训练数据

要创建训练数据集,需要读入原始图像,并以不同压缩级别的JPEG文件格式写出图像。

指定用于渲染图像压缩工件的JPEG图像质量值。质量值必须在[0,100]范围内。小的质量值导致更多的压缩和更强的压缩伪影。对小质量值使用更密集的采样,这样训练数据就有更大范围的压缩伪影。

JPEGQuality = [5:5:40 50 60 70 80];

压缩映像以MAT文件的形式存储在磁盘上的目录中compressedImagesDir.计算出的残留图像以MAT文件的形式存储在磁盘上的目录中residualImagesDir.MAT文件以数据类型存储以提高训练网络的精度。

compressedImagesDir = fullfile (imagesDir,“iaprtc12”“JPEGDeblockingData”“compressedImages”);residualImagesDir = fullfile (imagesDir,“iaprtc12”“JPEGDeblockingData”“residualImages”);

使用helper函数createJPEGDeblockingTrainingSet对训练数据进行预处理。这个函数作为支持文件附加到示例中。金宝app

对于每个原始训练图像,helper函数写入具有质量因子100的图像副本作为参考图像,并写入具有每个质量因子的图像副本作为网络输入。该函数以数据类型计算参考和压缩图像的亮度(Y)通道以提高计算残差图像的精度。压缩映像以.MAT文件的形式存储在磁盘上的目录中compressedDirName.计算后的残留映像以.MAT文件的形式存储在磁盘上的目录中residualDirName

[compressedDirName, residualDirName] = createJPEGDeblockingTrainingSet (imdsPristine JPEGQuality);

创建用于训练的随机补丁提取数据存储

使用随机补丁提取数据存储将训练数据提供给网络。该数据存储从包含网络输入和所需网络响应的两个图像数据存储中提取随机对应的补丁。

在本例中,网络输入是压缩的图像。所需的网络响应是残差图像。创建一个名为imdsCompressed从压缩图像文件的集合。创建一个名为imdsResidual从收集的计算残差图像文件。这两个数据存储都需要一个辅助函数,matRead,从图像文件中读取图像数据。这个函数作为支持文件附加到示例中。金宝app

imdsCompressed = imageDatastore (compressedDirName,“FileExtensions”“.mat”“ReadFcn”, @matRead);imdsResidual = imageDatastore (residualDirName,“FileExtensions”“.mat”“ReadFcn”, @matRead);

创建一个imageDataAugmenter(深度学习工具箱)它指定数据扩充的参数。在训练过程中使用数据增强来改变训练数据,有效地增加了可用的训练数据量。在这里,增强器指定在x方向上随机旋转90度和随机反射。

增量= imageDataAugmenter (...“RandRotation”@()兰迪([0,1],1)* 90,...“RandXReflection”,真正的);

创建randomPatchExtractionDatastore从两个映像数据存储。指定一个50 × 50像素的补丁大小。每张图像产生128个大小为50 × 50像素的随机小块。指定一个迷你批处理大小为128。

patchSize = 50;patchesPerImage = 128;dsTrain = randomPatchExtractionDatastore (imdsCompressed imdsResidual patchSize,...“PatchesPerImage”patchesPerImage,...“DataAugmentation”、增压器);dsTrain。MiniBatchSize = patchesPerImage;

随机补丁提取数据存储dsTrain在纪元迭代时向网络提供小批量的数据。预览从数据存储读取的结果。

inputBatch =预览(dsTrain);disp (inputBatch)
InputImage ResponseImage  ______________ ______________ { 50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}{50×50双}

设置DnCNN图层

创建内置DnCNN网络的层使用dnCNNLayers函数。默认情况下,网络深度(卷积层的数量)是20。

层= dnCNNLayers
图层数组与图层:1“InputLayer”图像输入50 x50x1图片2 Conv1卷积64 3 x3x1旋转步[1]和填充[1 1 1 1]3‘ReLU1 ReLU ReLU 4 Conv2卷积64 3 x3x64旋转步[1]和填充[1 1 1 1]5‘BNorm2批量标准化批量标准化与64个频道6‘ReLU2 ReLU ReLU 7 Conv3卷积64 3 x3x64convolutions with stride [1 1] and padding [1 1 1 1] 8 'BNorm3' Batch Normalization Batch normalization with 64 channels 9 'ReLU3' ReLU ReLU 10 'Conv4' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 11 'BNorm4' Batch Normalization Batch normalization with 64 channels 12 'ReLU4' ReLU ReLU 13 'Conv5' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 14 'BNorm5' Batch Normalization Batch normalization with 64 channels 15 'ReLU5' ReLU ReLU 16 'Conv6' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 17 'BNorm6' Batch Normalization Batch normalization with 64 channels 18 'ReLU6' ReLU ReLU 19 'Conv7' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 20 'BNorm7' Batch Normalization Batch normalization with 64 channels 21 'ReLU7' ReLU ReLU 22 'Conv8' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 23 'BNorm8' Batch Normalization Batch normalization with 64 channels 24 'ReLU8' ReLU ReLU 25 'Conv9' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 26 'BNorm9' Batch Normalization Batch normalization with 64 channels 27 'ReLU9' ReLU ReLU 28 'Conv10' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 29 'BNorm10' Batch Normalization Batch normalization with 64 channels 30 'ReLU10' ReLU ReLU 31 'Conv11' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 32 'BNorm11' Batch Normalization Batch normalization with 64 channels 33 'ReLU11' ReLU ReLU 34 'Conv12' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 35 'BNorm12' Batch Normalization Batch normalization with 64 channels 36 'ReLU12' ReLU ReLU 37 'Conv13' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 38 'BNorm13' Batch Normalization Batch normalization with 64 channels 39 'ReLU13' ReLU ReLU 40 'Conv14' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 41 'BNorm14' Batch Normalization Batch normalization with 64 channels 42 'ReLU14' ReLU ReLU 43 'Conv15' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 44 'BNorm15' Batch Normalization Batch normalization with 64 channels 45 'ReLU15' ReLU ReLU 46 'Conv16' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 47 'BNorm16' Batch Normalization Batch normalization with 64 channels 48 'ReLU16' ReLU ReLU 49 'Conv17' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 50 'BNorm17' Batch Normalization Batch normalization with 64 channels 51 'ReLU17' ReLU ReLU 52 'Conv18' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 53 'BNorm18' Batch Normalization Batch normalization with 64 channels 54 'ReLU18' ReLU ReLU 55 'Conv19' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 56 'BNorm19' Batch Normalization Batch normalization with 64 channels 57 'ReLU19' ReLU ReLU 58 'Conv20' Convolution 1 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 59 'FinalRegressionLayer' Regression Output mean-squared-error

选择培训选项

训练网络使用随机梯度下降与动量(SGDM)优化。方法指定SGDM的超参数设置trainingOptions(深度学习工具箱)函数。

训练一个深度网络是非常耗时的。通过指定高学习率来加速训练。然而,这可能会导致网络的梯度发生爆炸或无法控制地增长,从而阻碍网络的成功训练。为了保持渐变在一个有意义的范围内,通过设置启用渐变剪辑“GradientThreshold”0.005,并指定“GradientThresholdMethod”使用梯度的绝对值。

maxEpochs = 30;initLearningRate = 0.1;l2reg = 0.0001;batchSize = 64;选择= trainingOptions (“个”...“动量”, 0.9,...“InitialLearnRate”initLearningRate,...“LearnRateSchedule”“分段”...“GradientThresholdMethod”“绝对值”...“GradientThreshold”, 0.005,...“L2Regularization”l2reg,...“MiniBatchSize”batchSize,...“MaxEpochs”maxEpochs,...“阴谋”“训练进步”...“详细”、假);

培训网络

默认情况下,该示例加载一个预先训练的DnCNN网络。预先训练的网络使您能够在不等待训练完成的情况下执行JPEG块。

要训练网络,设置doTraining变量为真正的.训练DnCNN网络使用trainNetwork(深度学习工具箱)函数。

在可用的GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU支金宝app持情况(并行计算工具箱).在NVIDIA™Titan X上进行大约40个小时的培训。

doTraining = false;如果doTraining modelDateTime = string(datetime(“现在”“格式”“yyyy-MM-dd-HH-mm-ss”));(网络,信息)= trainNetwork (dsTrain层,选项);保存(strcat (“trainedJPEGDnCNN——”modelDateTime,“时代——”num2str (maxEpochs),“.mat”),“净”);其他的负载(“pretrainedJPEGDnCNN.mat”);结束

您现在可以使用DnCNN网络从图像中删除JPEG压缩伪影。

使用DnCNN网络执行JPEG块

要使用DnCNN执行JPEG去块,请遵循本例的其余步骤。示例的其余部分将展示如何:

  • 在三个不同的质量级别创建带有JPEG压缩伪影的样本测试图像。

  • 使用DnCNN网络删除压缩伪影。

  • 视觉上比较图像之前和之后的块。

  • 通过量化图像与未失真参考图像的相似度来评估压缩和去锁图像的质量。

创建带有阻塞工件的样本图像

使用DnCNN网络创建样本图像来评估JPEG图像块的结果。测试数据集,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)

选择其中一个图像作为JPEG去块的参考图像。您可以选择使用自己的未压缩图像作为参考图像。

indx = 7;%要从测试映像数据存储中读取的映像索引Ireference = readimage (testImages indx);imshow (Ireference)标题(未压缩的参考图像的

用JPEG创建三个压缩测试图像质量取值为10、20和50。

imwrite (Ireference fullfile (tempdir“testQuality10.jpg”),“质量”10);imwrite (Ireference fullfile (tempdir“testQuality20.jpg”),“质量”, 20);imwrite (Ireference fullfile (tempdir“testQuality50.jpg”),“质量”, 50);

压缩图像进行预处理

将图像的压缩版本读入工作空间。

一块= imread (fullfile (tempdir“testQuality10.jpg”));I20 = imread (fullfile (tempdir“testQuality20.jpg”));I50 = imread (fullfile (tempdir“testQuality50.jpg”));

显示压缩图像作为蒙太奇。

蒙太奇({I50、I20 I10},“大小”3[1])标题(“jpeg压缩图像的质量因数:50,20和10(从左到右)”

回想一下,DnCNN仅使用图像的亮度通道进行训练,因为人类的感知对亮度的变化比对颜色的变化更敏感。将jpeg压缩的图像从RGB颜色空间转换为YCbCr颜色空间使用rgb2ycbcr函数。

I10ycbcr = rgb2ycbcr(一块);I20ycbcr = rgb2ycbcr (I20);I50ycbcr = rgb2ycbcr (I50);

应用DnCNN网络

为了执行网络的前向传递,使用denoiseImage函数。这个函数使用完全相同的训练和测试程序去噪图像。您可以将JPEG压缩伪影视为一种图像噪声。

I10y_predicted = denoiseImage (I10ycbcr(:,: 1),净);I20y_predicted = denoiseImage (I20ycbcr(:,: 1),净);I50y_predicted = denoiseImage (I50ycbcr(:,: 1),净);

色度通道不需要处理。将消去的亮度通道与原始的色度通道连接,得到YCbCr颜色空间中的消去图像。

I10ycbcr_predicted =猫(3 I10y_predicted I10ycbcr (:,: 2:3));I20ycbcr_predicted =猫(3 I20y_predicted I20ycbcr (:,: 2:3));I50ycbcr_predicted =猫(3 I50y_predicted I50ycbcr (:,: 2:3));

将解封后的YCbCr图像转换为RGB颜色空间ycbcr2rgb函数。

I10_predicted = ycbcr2rgb (I10ycbcr_predicted);I20_predicted = ycbcr2rgb (I20ycbcr_predicted);I50_predicted = ycbcr2rgb (I50ycbcr_predicted);

以蒙太奇的方式显示被屏蔽的图像。

蒙太奇({I50_predicted、I20_predicted I10_predicted},“大小”3[1])标题(“从左到右,以50、20和10的质量因数屏蔽图像”

为了更好地从视觉上理解这些改进,请检查每张图像中较小的区域。使用向量指定感兴趣区域(ROI)roi格式[xy宽度高度].这些元素定义了左上角的x坐标和y坐标,以及ROI的宽度和高度。

ROI = [30 440 100 80];

将压缩后的图像裁剪到这个感兴趣区域,并以蒙太奇的形式显示结果。

一块= imcrop(一块,roi);i20 = imcrop (i20 roi);i50 = imcrop (i50 roi);蒙太奇({i50 i20 i10},“大小”3[1])标题(“从50、20和10质量因数的jpeg压缩图像的补丁(从左到右)”

将解禁后的图像裁剪到这个感兴趣区域,并以蒙太奇的形式显示结果。

i10predicted = imcrop (I10_predicted roi);i20predicted = imcrop (I20_predicted roi);i50predicted = imcrop (I50_predicted roi);蒙太奇({i50predicted、i20predicted i10predicted},“大小”3[1])标题(“质量因子为50、20和10的断块图像的补丁(从左到右)”

定量比较

通过四项指标量化图像的质量。你可以使用displayJPEGResults辅助函数,以在质量因子10、20和50处计算压缩和解锁图像的这些度量。这个函数作为支持文件附加到示例中。金宝app

  • 结构相似性指数(SSIM)。SSIM评估图像的三个特征的视觉影响:亮度,对比度和结构,与参考图像。SSIM值越接近1,测试图像与参考图像的一致性越好。这里,参考图像是未变形的原始图像,Ireference,在JPEG压缩之前。看到ssim有关此指标的更多信息。

  • 峰值信噪比(PSNR)。PSNR值越大,信号相对失真越强。看到psnr值有关此指标的更多信息。

  • 自然图像质量评估(NIQE)。NIQE使用从自然场景训练出来的模型来衡量感知图像的质量。NIQE分数越低,感知质量越好。看到niqe有关此指标的更多信息。

  • 盲/无参考图像空间质量评估(BRISQUE)。BRISQUE使用从图像失真的自然场景训练出来的模型来衡量感知图像质量。BRISQUE得分越小,感知质量越好。看到brisque有关此指标的更多信息。

displayJPEGResults (Ireference、I10 I20、I50 I10_predicted, I20_predicted, I50_predicted)
------------------------------------------ SSIM比较  =============== 一块:0.90624 I10_predicted: 0.91286 I20: 0.94904 I20_predicted: 0.95444 I50: 0.97238 I50_predicted: 0.97482  ------------------------------------------ PSNR值比较  =============== 一块:26.6046 I10_predicted: 27.0793 I20: 28.8015 I20_predicted: 29.3378 I50:31.4512 I50_predicted: 31.8584  ------------------------------------------ NIQE比较  =============== 一块:7.2194 I10_predicted: 3.9478 I20: 4.5158 I20_predicted: 3.0685 I50: 2.8874 I50_predicted: 2.4106注:------------------------------------------ BRISQUE比较================== I10: 52.372 I10_predicted: 38.9271 I20: 45.3772 I20_predicted: 30.8991 I50: 27.7093 I50_predicted: 24.3845注:BRISQUE分数越小,感知质量越好

参考文献

[1] Zhang, K., W. Zuo, Y. Chen, D.孟,and L. Zhang, "Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising."IEEE®图像处理学报.2017年2月。

[2] Grubinger, M., P. Clough, H. Müller, T. Deselaers。IAPR TC-12基准:一种新的视觉信息系统评估资源。基于内容的图像检索语言资源.意大利热那亚。第五卷,2006年5月,第10页。

另请参阅

|||||(深度学习工具箱)|(深度学习工具箱)

相关的话题