MATLAB环境下基于深度学习的JPEG图像去块(Image Deblocking)

之前主要研究现代信号处理,深度学习嘛,一个大号/深层的,现代的,黑箱的,信号/图像处理器,所以,作为一个研究现代信号处理的,顺便搞些深度学习也是顺理成章的。本文程序运行环境为MATLAB R2018A。

代码如下

🍞正在为您运送作品详情

本文简要讲解如何训练一个经典的降噪卷积神经网络 (DnCNN),并使用DnCNN网络减少JPEG压缩伪影(compresaion artifact)。

本文讲解如何从头开始训练一个 DnCNN 网络,建议使用计算能力为 3.0 或更高版本的支持 CUDA 的 NVIDIA GPU,同时需要并行计算工具箱)。

图像压缩可以减少图像内存,JPEG 图像格式采用了一种功能强大的压缩方法,该方法使用所谓的质量因子quality factor来指定压缩量。降低quality值会导致更高的压缩比和更小的内存占用,但会牺牲图像的视觉质量。JPEG 压缩是有损的,这意味着压缩过程会导致图像丢失信息。对于 JPEG 图像,信息丢失显示为图像中的所谓的块效应blocking artifacts 。如下图所示,高压缩比会导致更多的信息丢失和更强的块效应。具有高频的纹理区域(如草地和云)看起来模糊不清,而锐利的边缘,如房子的屋顶和灯塔顶部的护栏,表现出所谓的振铃效应(ringing artifacts)。

JPEG图像去块(deblocking )是减弱JPEG 图像中压缩伪影的过程,目前存在几种JPEG图像去块方法,包括深度学习。本例讲解一种基于深度学习的方法,尝试将 JPEG 压缩伪影的影响降至最低。

DnCNN网络

本例使用一种早已提出的深度前馈卷积神经网络DnCNN,DnCNN主要是为了消除图像中的噪声而设计的。但是,也可以训练 DnCNN 以消除 JPEG 压缩伪影或提高图像的分辨率。

DnCNN 网络经过训练,可根据彩色图像的亮度检测残差图像。图像的亮度通道 Y 通过红色、绿色和蓝色像素值的线性组合来表示每个像素的亮度。作为对比,图像的两个色度通道Cb和Cr是红色,绿色和蓝色像素值的不同线性组合。DnCNN仅使用亮度通道进行训练,因为人类感知对亮度变化比颜色变化更敏感。

为了描述方便,直接上英文

一旦DnCNN网络学会如何估计残差图像,就可以通过将残差图像加入到压缩后的亮度通道,然后将图像转换回RGB色彩空间以重建压缩JPEG图像的无失真版本。

训练数据

IAPR TC-12 数据集包含 20,000 张自然图像,包括人物,动物,城市等,约1.8 GB,本文为了简便,将使用 IAPR TC-12 数据集的一小部分数据来训练网络,所有图像均为 32 位 JPEG 彩色图像。

训练图像的数量

numel(trainImages.Files)

ans = 251

准备训练数据

读取原始图像,创建文件夹,以正确组织训练数据

指定用于渲染图像压缩伪影的quality值,quality值在 [0, 100] 范围内。较小的quality值将导致高压缩比和更强的压缩伪影,因此对较小的quality值使用更密集的采样。

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

写入原始和压缩后的训练图像。

files = dir([originalFileLocation filesep '*.jpg']);
imNumber = 1;
for fileIndex = 1:size(files,1)
 fname = [originalFileLocation filesep files(fileIndex).name];
 im = imread(fname);
 if size(im,3) == 3
 im = rgb2gray(im);
 end
 for index = 1:length(JPEGQuality)
 imwrite(im,[uncompressedFileLocation filesep num2str(imNumber) '.jpg'],'JPEG','Quality',100)
 imwrite(im,[compressedFileLocation filesep num2str(imNumber) '.jpg'],'JPEG','Quality',JPEGQuality(index))
 imNumber = imNumber + 1;
 end
end

定义用于训练的Mini-Batch Datastore

mini-batch datastore 用于将训练数据输送到网络,本例自定义一个mini-batch datastore方法,称作JPEGimagePatchDatastore。 JPEGimagePatchDatastore从失真的输入图像中提取图形块,并从原始图像中的相应图形块中计算目标残差。图像块为网络输入,残差为网络输出。每个mini-batch包含 128 个大小为 50 x 50 像素的图形块。在训练期间,只会从每个图像中提取一个mini-batch,并且将从图像中的随机位置提取所有块。

batchSize = 128;
patchSize = 50;
batchesPerImage = 1;
exts = {'.jpg'};
imdsUncompressed = imageDatastore(uncompressedFileLocation,'FileExtensions',exts);
imdsCompressed = imageDatastore(compressedFileLocation,'FileExtensions',exts);
ds = JPEGimagePatchDatastore(imdsUncompressed,imdsCompressed,...
 'MiniBatchSize',batchSize,...
 'PatchSize',patchSize,...
 'BatchesPerImage',batchesPerImage);

执行读取操作

inputBatch = read(ds);
summary(inputBatch)

设置DnCNN层

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

layers = dnCNNLayers()

设置训练参数

使用具有动量 (SGDM) 优化的随机梯度下降训练网络,使用trainingOptions函数指定 SDGM 的超参数。

maxEpochs = 30;
initLearningRate = 0.1;
l2reg = 0.0001;
batchSize = 128;
options = trainingOptions('sgdm',...
 'Momentum',0.9,...
 'InitialLearnRate',initLearningRate,...
 'LearnRateSchedule','piecewise',...
 'GradientThresholdMethod','absolute-value',...
 'GradientThreshold',0.005,...
 'L2Regularization',l2reg,...
 'MiniBatchSize',batchSize,...
 'MaxEpochs',maxEpochs,...
 'Plots','training-progress');

训练网络

配置完训练参数后,使用trainNetwork函数训练DnCNN网络

在 NVIDIA Titan X 上进行训练大约需要 40 个小时。

 [net, info] = trainNetwork(ds,layers,options); 

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

使用 DnCNN 执行 JPEG图像去块的步骤如下:

· 创建具有三种不同quality值的 JPEG 压缩伪影的示例图像。

· 使用 DnCNN 网络去除压缩伪影。

· 直观地比较去块前后的图像。

· 通过量化压缩和去块后图像与未失真参考图像的相似性来评估其质量。

创建具有块效应Blocking Artifacts的示例图像

创建示例图像以评估DnCNN 网络的JPEG 图像去块的结果。测试数据集 testImages 包含21张未失真的图像。

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','sevilla.jpg','llama.jpg','parkavenue.jpg',...
    'peacock.jpg','car1.jpg','strawberries.jpg','wagon.jpg'};
filePath = [fullfile(matlabroot,'toolbox','images','imdata') filesep];
filePathNames = strcat(filePath,fileNames);
testImages = imageDatastore(filePathNames,'FileExtensions',exts);

显示测试图像

montage(testImages)

选择一张图像用于JPEG图像去块的参考图像

indx = 7; % 图像索引
Ireference = readimage(testImages,indx);
imshow(Ireference)
title('Uncompressed Reference Image')

创建三个JPEG quality值分别为 10、20 和 50 的压缩测试图像。

imwrite(Ireference,fullfile(tempdir,'testQuality10.jpg'),'Quality',10);
imwrite(Ireference,fullfile(tempdir,'testQuality20.jpg'),'Quality',20);
imwrite(Ireference,fullfile(tempdir,'testQuality50.jpg'),'Quality',50);

预处理压缩图像

将压缩图像读入工作区。

I10 = imread(fullfile(tempdir,'testQuality10.jpg'));
I20 = imread(fullfile(tempdir,'testQuality20.jpg'));
I50 = imread(fullfile(tempdir,'testQuality50.jpg'));

展示图像

montage({I50,I20,I10},'Size',[1 3])
title('JPEG-Compressed Images with Quality Factor: 50, 20 and 10 (left to right)')

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

I10ycbcr = rgb2ycbcr(I10);
I20ycbcr = rgb2ycbcr(I20);
I50ycbcr = rgb2ycbcr(I50);

应用DnCNN网络

为了执行网络的前向传播,使用 denoiseImage 函数,此函数使用完全相同的训练和测试过程对图像进行去噪。可将 JPEG 压缩伪影去看做一种图像噪声。

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

色度通道不需要处理。将deblocked的亮度通道与原始色度通道连接起来,以获得YCbCr色彩空间中的deblocked图像。

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

利用 Ycbcr2rgb 函数将去块后的 YCbCr 图像转换到RGB 颜色空间。

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

展示去块后的图像

montage({I50_predicted,I20_predicted,I10_predicted},'Size',[1 3])
title('Deblocked Images with Quality Factor: 50, 20 and 10 (left to right)')

为了在视觉上更好地理解效果的提升,使用格式为 [x y width height]的向量roi来指定感兴趣区域 (ROI), x 和 y 为ROI的坐标,width和height为ROI的宽度和高度。

roi = [30 440 100 80];

显示结果

i10 = imcrop(I10,roi);
i20 = imcrop(I20,roi);
i50 = imcrop(I50,roi);
montage({i50 i20 i10},'Size',[1 3])
title('Patches from JPEG-Compressed Images with Quality Factor: 50, 20 and 10 (left to right)')

将去块后的图像裁剪到此 ROI,并显示结果

i10predicted = imcrop(I10_predicted,roi);
i20predicted = imcrop(I20_predicted,roi);
i50predicted = imcrop(I50_predicted,roi);
montage({i50predicted,i20predicted,i10predicted},'Size',[1 3])
title('Patches from Deblocked Images with Quality Factor: 50, 20 and 10 (left to right)')

定量比较

通过4个指标量化区块后的图像的质量,可以使用 displayJPEGResults 函数来计算quality值为 10、20 和 50 的压缩图像和去块后的图像指标。

· Structural Similarity Index (SSIM). SSIM assesses the visual impact of three characteristics of an image: luminance, contrast and structure, against a reference image. The closer the SSIM value is to 1, the better the test image agrees with the reference image. Here, the reference image is the undistorted original image, Ireference, before JPEG compression.

· Peak signal-to-noise ratio (PSNR). The larger the PNSR value, the stronger the signal compared to the distortion.

· Naturalness Image Quality Evaluator (NIQE). NIQE measures perceptual image quality using a model trained from natural scenes. Smaller NIQE scores indicate better perceptual quality.

· Blind/Referenceless Image Spatial Quality Evaluator (BRISQUE). BRISQUE measures perceptual image quality using a model trained from natural scenes with image distortion. Smaller BRISQUE scores indicate better perceptual quality.

displayJPEGResults(Ireference,I10,I20,I50,I10_predicted,I20_predicted,I50_predicted)

------------------------------------------

SSIM Comparison

===============

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.0989 I10_predicted: 3.9334

I20: 4.5065 I20_predicted: 3.0699

I50: 2.8866 I50_predicted: 2.4109

NOTE: Smaller NIQE score signifies better perceptual quality

------------------------------------------

BRISQUE Comparison

==================

I10: 52.2731 I10_predicted: 38.9688

I20: 45.5237 I20_predicted: 30.9583

I50: 27.7386 I50_predicted: 24.3889

NOTE: Smaller BRISQUE score signifies better perceptual quality

总结

本文演示如何构建和训练 DnCNN 网络,然后使用该网络减少图像中的 JPEG 压缩伪影,步骤如下:

1.准备训练数据。

2.通过以不同压缩比的JPEG文件创建训练图像。

3.定义 JPEGimagePatchDatastore数据存储,以从输入压缩图像中提取图像块,并从原始图像中的相应块中计算目标残差,JPEGimagePatchDatastore数据存储用于将训练数据输入到网络。

4.构建DnCNN 网络层。

5.设置训练参数。

6.使用 trainNetwork训练网络。

在训练 DnCNN 网络或加载预训练的 DnCNN 网络后,本例以3个不同的quality值压缩测试图像,然后使用该网络去除压缩伪影。

参考文献

[1] Zhang, K., W. Zuo, Y. Chen, D. Meng, and L. Zhang, "Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising." IEEE® Transactions on Image Processing. Feb 2017.

[2] Grubinger, M., P. Clough, H. Müller, and T. Deselaers. "The IAPR TC-12 Benchmark: A New Evaluation Resource for Visual Information Systems." Proceedings of the OntoImage 2006 Language Resources For Content-Based Image Retrieval. Genoa, Italy. Vol. 5, May 2006, p. 10.

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>