主要内容

使用深度学习的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.,下载资料。此函数附加到示例作为支持文件。万博1manbetx

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”);exts = {“jpg”'.bmp''.png'};imdsPristine = imageDatastore (trainImagesDir,“FileExtensions”ext);

列出培训图像的数量。

numel(imdspristine.files)
ans = 251.

准备培训数据

要创建培训数据集,请在原始图像中读取,并以各种级别的压缩写出JPEG文件格式的图像。

指定用于呈现图像压缩伪影的JPEG图像质量值。质量值必须在范围内[0,100]。小质量值导致更压缩和更强的压缩伪影。使用更小质量值的密度采样,因此培训数据具有广泛的压缩伪影。

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

压缩图像存储在磁盘上作为目录中的MAT文件compressedImagesDir.计算的剩余图像存储在磁盘上作为目录中的MAT文件Residualimagesdir..垫文件存储为数据类型双倍的在培训网络时更精确。

comgressimagesdir = fullfile(imagesdir,'iaprtc12''jpegdebockingdata'“compressedImages”);ResidualImagesDir = FullFile(ImputeDir,'iaprtc12''jpegdebockingdata''reasualualimages');

使用辅助功能createJPEGDeblockingTrainingSet对训练数据进行预处理。此函数附加到示例作为支持文件。万博1manbetx

对于每个原始训练图像,辅助功能将图像的副本写入质量系数100,用作图像的参考图像和副本,每个质量因子用作网络输入。该功能根据数据类型计算参考和压缩图像的亮度(Y)通道双倍的以提高计算残差图像的精度。压缩映像以.MAT文件的形式存储在磁盘上的目录中compresseddirname..计算后的残留映像以.MAT文件的形式存储在磁盘上的目录中ResidualDirName.

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

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

使用随机修补程序提取数据存储来将培训数据送到网络。此数据存储区从包含网络输入和所需网络响应的两个图像数据存储中提取随机对应的补丁。

在该示例中,网络输入是压缩图像。所需的网络响应是剩余图像。创建一个调用的图像数据存储IMDScompress来自压缩图像文件的集合。创建一个调用的图像数据存储IMDSRESIADIAL.从收集的计算残差图像文件。这两个数据存储都需要一个辅助函数,基质,从图像文件中读取图像数据。此函数附加到示例作为支持文件。万博1manbetx

imdsCompressed = imageDatastore (compressedDirName,“FileExtensions”'。垫'“ReadFcn”,@ matread);imdsresidual = imageageataStore(ResidualDirName,“FileExtensions”'。垫'“ReadFcn”,@ matread);

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

upmmenter = imagedataAugmenter(......'randroatation',@()randi([0,1],1)* 90,......“RandXReflection”,真的);

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

patchsize = 50;patchesperimage = 128;dstrain = randompatchExtractionDataStore(IMDSCompress,IndSridual,Patchsize,......'patchesperimage'patchesPerImage,......“DataAugmentation”、增压器);dsTrain。MiniBatchSize = patchesPerImage;

随机补丁提取数据存储Dstrain.在Epoch的迭代中向网络提供迷你批次数据。预览从数据存储区读取的结果。

inputBatch =预览(dsTrain);disp (inputBatch)
InputImage ErneyImage ______________ ______________ {50×50 double} {50×50 double} {50×50 double} {50×50 double} {50×50 double} {50×50 double} {50×50 double} {50×50double} {50×50 double} {50×50 double} {50×50 double} {50×50 double} {50×50 double} {50×50 double} {50×50 double} {50×50 double} {50×50 double}

设置DNCNN层

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

层= dncnlayers.
图层= 1x59层阵列,带图层:1'InputLayer'图像输入50x50x1图像2'Conv1'卷积64 3x3x1卷曲与步幅[1 1]和填充[1 1 1 1] 3'Relu1'Relu Relu 4'Conv2'卷积643x3x64卷绕升级[11]和填充[1 1 1 1] 5'BNORM2'批量归一化批量归一化,64个通道6'Relu2'Relu Relu 7'Conv3'卷积64 3x3x64卷绕卷曲[1 1]和填充[1 1 1 1] 8'BNORM3'批量归一化批量归一化与64个通道9'Relu3'Relu 10'Crom4'卷积64 3x3x64卷积与步幅[1 1]和填充[1 1 1 1] 11'Bnorm4'批量标准化批量归一化与64个通道12'Relu4'Relu Relu 13'Conv5'卷积64 3x3x64卷积与步幅[11]和填充[111 1] 14'Bnorm5'批量归一化批量归一化,具有64个通道15'Relu5'Relu Relu16'CONV6'卷积64 3x3x64卷曲的卷曲[1 1]和填充[1 1 1 1] 17'BNORM6'批量标准化具有64个通道18'Relu6'Relu Relu 19'Crom7'卷积64 3x3x64卷积的批量归一化[11]和填充[111 1] 20'Bnorm7'批量归一化批量归一化与64通道21'Relu7'Relu Relu22'CONV8'卷积64 3x3x64卷曲的卷程[11]和填充[1 1 1 1] 23'BNORM8'批量归一化批量归一化与64个通道24'Relu8'Relu 25'Conv9'卷积64 3x3x64卷积与步幅[1 1]和填充[1 1 1 1] 26'Bnorm9'批量归一化批量归一化,具有64个通道27'Relu9'Relu Relu 28'Conv10'卷积64 3x3x64卷积与步幅[1 1]和填充[1 1 1]29'BNORM10'批量归一化批量归一批标准化与64通道30'relu10'Relu Relu 31'Conv11'卷积64 3x3x64卷曲与步幅[11]和填充[111 1] 32'Bnorm11'批量归一化批量归一化批量归一化与64个通道33'Relu11'Relu Relu 34'Conv12'卷积64 3x3x64与str的卷曲IDE [1 1]和填充[111 1] 35'Bnorm12'批量归一化批量归一化,具有64个通道36'Relu12'Relu 37'Conv13'卷积64 3x3x64卷绕卷曲[111]和填充[1 1 11] 38'BNORM13'批量归一化批量归一化,具有64个通道39'Relu13'Relu 40'Conv14'卷积64 3x3x64卷积与步幅[11]和填充[111 1] 41'BNORM14'批量归一化批量标准化 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的超参数设置培训选项(深度学习工具箱)函数。

培训深网络是耗时的。通过指定高学习率加速培训。但是,这可能导致网络的梯度无法控制地爆炸或增长,防止网络成功训练。要将渐变保持在有意义的范围内,请通过设置启用渐变剪裁'gradientthreshold'0.005,并指定'GradientThresholdMethod'使用渐变的绝对值。

maxepochs = 30;initlearningrate = 0.1;l2reg = 0.0001;Batchsize = 64;选项=培训选项('sgdm'......'势头',0.9,......'italllearnrate',initlearningrate,......'shownrateschedule''分段'......'GradientThresholdMethod''绝对值'......'gradientthreshold',0.005,......'L2Regularization',l2reg,......'minibatchsize',批量化,......'maxepochs',maxepochs,......“阴谋”'培训 - 进步'......'verbose',错误的);

培训网络

默认情况下,该示例加载备用DNCNN网络。佩带的网络使您可以执行JPEG去块而不等待培训完成。

要训练网络,设置doTraining以下代码中的变量真的.使用该培训DNCNN网络Trainnetwork.(深度学习工具箱)函数。

在GPU上培训如果有一个可用的。使用GPU需要并行计算工具箱™和CUDA®的NVIDIA®GPU。有关更多信息,请参阅GPU通万博1manbetx过发布支持(并行计算工具箱).培训在NVIDIA™Titan X上大约需要40小时。

dotraining = false;如果dotrained modeldateTem = string(DateTime('现在''格式'“yyyy-mm-dd-hh-mm-ss”));(网络,信息)= trainNetwork (dsTrain层,选项);保存(strcat (“trousapegdncnn-”modelDateTime,“-时代-”,num2str(maxepochs),“。垫”),“净”);别的加载('pretratejpegdncnn.mat');结束

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

使用DnCNN网络执行JPEG块

要使用DNCNN执行JPEG去块,请遵循该示例的其余步骤。剩下的例子显示了如何:

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

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

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

  • 通过量化它们与未变形的参考图像的相似性来评估压缩和解块图像的质量。

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

使用DnCNN网络创建样本图像来评估JPEG图像块的结果。测试数据集,testImages,包含在图像处理工具箱™中提供的21张未失真的图像。将图像加载到imageDatastore

exts = {“jpg”'.png'};filenames = {'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''塞维利亚jpg'“llama.jpg”“parkavenue.jpg”......“peacock.jpg”'car1.jpg''strawberries.jpg'“wagon.jpg”};filepath = [fullfile(matlabroot,'工具箱'“图片”“imdata”)FILESEP];filepathnames = strcat(filepath,文件名);testimages = imageageataStore(FilePathnames,“FileExtensions”ext);

显示测试图像作为蒙太奇。

蒙太奇(Testimages)

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

indx = 7;从测试图像数据存储读取的图像索引Ireference = ReadImage(testimages,Indx);imshow(启发)标题('未压缩的参考图像'

使用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);

压缩图像进行预处理

将图像的压缩版本读入Workspace。

i10 = 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 = cat(3,i10y_preedicted,i10ycbcr(:,:,2:3));i20ycbcr_predicted = cat(3,i20y_preedicted,i20ycbcr(:,:,2:3));i50ycbcr_predicted = cat(3,i50y_preedette,i50ycbcr(:,:,2:3));

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

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

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

蒙太奇({i50_preedette,i20_preedette,i10_predictice},'尺寸'3[1])标题(“从左到右,以50、20和10的质量因数屏蔽图像”

为了更好地了解改进,检查每个图像内的较小区域。使用载体指定感兴趣区域(ROI)ROI.格式[xy宽度高度]。元素定义左上角的X和Y坐标,以及ROI的宽度和高度。

ROI = [30 440 100 80];

将压缩图像裁剪到此ROI,并将结果显示为蒙太奇。

I10 = IMCrop(I10,ROI);I20 = IMCrop(I20,ROI);i50 = IMCrop(I50,ROI);蒙太奇({I50 I20 I10},'尺寸'3[1])标题('来自JPEG压缩图像的补丁,具有质量因子50,20和10(左右)'

将解块图像裁剪到此ROI,并将结果显示为蒙太奇。

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处计算用于压缩和解块图像的这些度量。此功能附加到示例作为支持文件。万博1manbetx

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

  • 峰值信噪比(PSNR)。PSNR值越大,信号与失真相比越强。看到PSNR.有关此度量标准的更多信息。

  • 自然图像质量评估员(NIQE)。NIQE使用从自然场景训练的模型测量感知图像质量。较小的NIQE评分表示更好的感知质量。看到Niqe.有关此度量标准的更多信息。

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

DisplayJogrecreS(Ireference,I10,I20,I50,I10_PreedInge,I20_preedInge,I50_Preedette)
--------------------------------------------------------  -  SSIM比较===============I10: 0.90624 I10_predicted: 0.91286 I20: 0.94904 I20_predicted: 0.95444 I50: 0.97238 I50_predicted: 0.97482 ------------------------------------------ PSNR Comparison =============== I10: 26.6046 I10_predicted: 27.0793 I20: 28.8015 I20_predicted: 29.3378 I50: 31.4512 I50_predicted: 31.8584 ------------------------------------------ NIQE Comparison =============== I10: 7.2194 I10_predicted: 3.9478 I20: 4.5158 I20_predicted: 3.0685 I50: 2.8874 I50_predicted: 2.4106 NOTE: Smaller NIQE score signifies better perceptual quality ------------------------------------------ BRISQUE Comparison ================== I10: 52.372 I10_predicted: 38.9271 I20: 45.3772 I20_predicted: 30.8991 I50: 27.7093 I50_predicted: 24.3845 NOTE: Smaller BRISQUE score signifies better perceptual quality

参考文献

[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基准:一种新的视觉信息系统评估资源。基于内容的图像检索语言资源.热那亚,意大利。卷。5,2006年5月,p。10。

另请参阅

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

相关话题