之前主要研究现代信号处理,深度学习嘛,一个大号深层的,现代的,黑箱的,信号图像处理器,所以,作为一个研究现代信号处理的,顺便搞些深度学习也是顺理成章的。本文程序运行环境为MATLABR2018A。 面包多代码链接 https:mianbaoduo。comobreadmbdY5mYkplp 本文简要讲解如何训练一个经典的降噪卷积神经网络(DnCNN),并使用DnCNN网络减少JPEG压缩伪影(compresaionartifact)。 关于所谓的压缩伪影compresaionartifact,参考如下blog http:t。csdn。cnfcPtO 本文讲解如何从头开始训练一个DnCNN网络,建议使用计算能力为3。0或更高版本的支持CUDA的NVIDIAGPU,同时需要并行计算工具箱)。 图像压缩可以减少图像内存,JPEG图像格式采用了一种功能强大的压缩方法,该方法使用所谓的质量因子qualityfactor来指定压缩量。降低quality值会导致更高的压缩比和更小的内存占用,但会牺牲图像的视觉质量。JPEG压缩是有损的,这意味着压缩过程会导致图像丢失信息。对于JPEG图像,信息丢失显示为图像中的所谓的块效应blockingartifacts。如下图所示,高压缩比会导致更多的信息丢失和更强的块效应。具有高频的纹理区域(如草地和云)看起来模糊不清,而锐利的边缘,如房子的屋顶和灯塔顶部的护栏,表现出所谓的振铃效应(ringingartifacts)。 JPEG图像去块(deblocking)是减弱JPEG图像中压缩伪影的过程,目前存在几种JPEG图像去块方法,包括深度学习。本例讲解一种基于深度学习的方法,尝试将JPEG压缩伪影的影响降至最低。 DnCNN网络 本例使用一种早已提出的深度前馈卷积神经网络DnCNN,DnCNN主要是为了消除图像中的噪声而设计的。但是,也可以训练DnCNN以消除JPEG压缩伪影或提高图像的分辨率。 DnCNN网络经过训练,可根据彩色图像的亮度检测残差图像。图像的亮度通道Y通过红色、绿色和蓝色像素值的线性组合来表示每个像素的亮度。作为对比,图像的两个色度通道Cb和Cr是红色,绿色和蓝色像素值的不同线性组合。DnCNN仅使用亮度通道进行训练,因为人类感知对亮度变化比颜色变化更敏感。 为了描述方便,直接上英文 一旦DnCNN网络学会如何估计残差图像,就可以通过将残差图像加入到压缩后的亮度通道,然后将图像转换回RGB色彩空间以重建压缩JPEG图像的无失真版本。 训练数据 IAPRTC12数据集包含20,000张自然图像,包括人物,动物,城市等,约1。8GB,本文为了简便,将使用IAPRTC12数据集的一小部分数据来训练网络,所有图像均为32位JPEG彩色图像。 训练图像的数量numel(trainImages。Files) ans251 准备训练数据 读取原始图像,创建文件夹,以正确组织训练数据。 指定用于渲染图像压缩伪影的quality值,quality值在〔0,100〕范围内。较小的quality值将导致高压缩比和更强的压缩伪影,因此对较小的quality值使用更密集的采样。JPEGQuality〔5:5:4050607080〕; 写入原始和压缩后的训练图像。filesdir(〔originalFileLocationfilesep。jpg〕);imNumber1;forfileIndex1:size(files,1)fname〔originalFileLocationfilesepfiles(fileIndex)。name〕;imimread(fname);ifsize(im,3)3imrgb2gray(im);endforindex1:length(JPEGQuality)imwrite(im,〔uncompressedFileLocationfilesepnum2str(imNumber)。jpg〕,JPEG,Quality,100)imwrite(im,〔compressedFileLocationfilesepnum2str(imNumber)。jpg〕,JPEG,Quality,JPEGQuality(index))imNumberimNumber1;endend 定义用于训练的MiniBatchDatastore minibatchdatastore用于将训练数据输送到网络,本例自定义一个minibatchdatastore方法,称作JPEGimagePatchDatastore。JPEGimagePatchDatastore从失真的输入图像中提取图形块,并从原始图像中的相应图形块中计算目标残差。图像块为网络输入,残差为网络输出。每个minibatch包含128个大小为50x50像素的图形块。在训练期间,只会从每个图像中提取一个minibatch,并且将从图像中的随机位置提取所有块。batchSize128;patchSize50;batchesPerImage1;exts{。jpg};imdsUncompressedimageDatastore(uncompressedFileLocation,FileExtensions,exts);imdsCompressedimageDatastore(compressedFileLocation,FileExtensions,exts);dsJPEGimagePatchDatastore(imdsUncompressed,imdsCompressed,。。。MiniBatchSize,batchSize,。。。PatchSize,patchSize,。。。BatchesPerImage,batchesPerImage); 执行读取操作inputBatchread(ds);summary(inputBatch) 设置DnCNN层 使用dnCNNLayers函数创建DnCNN网络层,默认情况下,网络深度(卷积层数)为20。layersdnCNNLayers() 设置训练参数 使用具有动量(SGDM)优化的随机梯度下降训练网络,使用trainingOptions函数指定SDGM的超参数。maxEpochs30;initLearningRate0。1;l2reg0。0001;batchSize128;optionstrainingOptions(sgdm,。。。Momentum,0。9,。。。InitialLearnRate,initLearningRate,。。。LearnRateSchedule,piecewise,。。。GradientThresholdMethod,absolutevalue,。。。GradientThreshold,0。005,。。。L2Regularization,l2reg,。。。MiniBatchSize,batchSize,。。。MaxEpochs,maxEpochs,。。。Plots,trainingprogress); 训练网络 配置完训练参数后,使用trainNetwork函数训练DnCNN网络 在NVIDIATitanX上进行训练大约需要40个小时。〔net,info〕trainNetwork(ds,layers,options); 现在可以使用DnCNN网络从新图像中移除JPEG压缩伪影。 使用DnCNN执行JPEG图像去块的步骤如下: 创建具有三种不同quality值的JPEG压缩伪影的示例图像。 使用DnCNN网络去除压缩伪影。 直观地比较去块前后的图像。 通过量化压缩和去块后图像与未失真参考图像的相似性来评估其质量。 创建具有块效应BlockingArtifacts的示例图像 创建示例图像以评估DnCNN网络的JPEG图像去块的结果。测试数据集testImages包含21张未失真的图像。exts{。jpg,。png};fileNames{sherlock。jpg,car2。jpg,fabric。png,greens。jpg,hands1。jpg,kobi。png,。。。lighthouse。png,micromarket。jpg,office4。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〕;filePathNamesstrcat(filePath,fileNames);testImagesimageDatastore(filePathNames,FileExtensions,exts); 显示测试图像montage(testImages) 选择一张图像用于JPEG图像去块的参考图像indx7;图像索引Ireferencereadimage(testImages,indx);imshow(Ireference)title(UncompressedReferenceImage) 创建三个JPEGquality值分别为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); 预处理压缩图像 将压缩图像读入工作区。I10imread(fullfile(tempdir,testQuality10。jpg));I20imread(fullfile(tempdir,testQuality20。jpg));I50imread(fullfile(tempdir,testQuality50。jpg)); 展示图像montage({I50,I20,I10},Size,〔13〕)title(JPEGCompressedImageswithQualityFactor:50,20and10(lefttoright)) DnCNN仅使用图像的亮度通道进行训练,因为人类感知对亮度变化比颜色变化更敏感。使用rgb2ycbcr函数将JPEG压缩图像从RGB色彩空间转换为YCbCr色彩空间。I10ycbcrrgb2ycbcr(I10);I20ycbcrrgb2ycbcr(I20);I50ycbcrrgb2ycbcr(I50); 应用DnCNN网络 为了执行网络的前向传播,使用denoiseImage函数,此函数使用完全相同的训练和测试过程对图像进行去噪。可将JPEG压缩伪影去看做一种图像噪声。I10ypredicteddenoiseImage(I10ycbcr(:,:,1),net);I20ypredicteddenoiseImage(I20ycbcr(:,:,1),net);I50ypredicteddenoiseImage(I50ycbcr(:,:,1),net); 色度通道不需要处理。将deblocked的亮度通道与原始色度通道连接起来,以获得YCbCr色彩空间中的deblocked图像。I10ycbcrpredictedcat(3,I10ypredicted,I10ycbcr(:,:,2:3));I20ycbcrpredictedcat(3,I20ypredicted,I20ycbcr(:,:,2:3));I50ycbcrpredictedcat(3,I50ypredicted,I50ycbcr(:,:,2:3)); 利用Ycbcr2rgb函数将去块后的YCbCr图像转换到RGB颜色空间。I10predictedycbcr2rgb(I10ycbcrpredicted);I20predictedycbcr2rgb(I20ycbcrpredicted);I50predictedycbcr2rgb(I50ycbcrpredicted); 展示去块后的图像montage({I50predicted,I20predicted,I10predicted},Size,〔13〕)title(DeblockedImageswithQualityFactor:50,20and10(lefttoright)) 为了在视觉上更好地理解效果的提升,使用格式为〔xywidthheight〕的向量roi来指定感兴趣区域(ROI),x和y为ROI的坐标,width和height为ROI的宽度和高度。roi〔3044010080〕; 显示结果i10imcrop(I10,roi);i20imcrop(I20,roi);i50imcrop(I50,roi);montage({i50i20i10},Size,〔13〕)title(PatchesfromJPEGCompressedImageswithQualityFactor:50,20and10(lefttoright)) 将去块后的图像裁剪到此ROI,并显示结果i10predictedimcrop(I10predicted,roi);i20predictedimcrop(I20predicted,roi);i50predictedimcrop(I50predicted,roi);montage({i50predicted,i20predicted,i10predicted},Size,〔13〕)title(PatchesfromDeblockedImageswithQualityFactor:50,20and10(lefttoright)) 定量比较 通过4个指标量化区块后的图像的质量,可以使用displayJPEGResults函数来计算quality值为10、20和50的压缩图像和去块后的图像指标。 StructuralSimilarityIndex(SSIM)。SSIMassessesthevisualimpactofthreecharacteristicsofanimage:luminance,contrastandstructure,againstareferenceimage。TheclosertheSSIMvalueisto1,thebetterthetestimageagreeswiththereferenceimage。Here,thereferenceimageistheundistortedoriginalimage,Ireference,beforeJPEGcompression。 Peaksignaltonoiseratio(PSNR)。ThelargerthePNSRvalue,thestrongerthesignalcomparedtothedistortion。 NaturalnessImageQualityEvaluator(NIQE)。NIQEmeasuresperceptualimagequalityusingamodeltrainedfromnaturalscenes。SmallerNIQEscoresindicatebetterperceptualquality。 BlindReferencelessImageSpatialQualityEvaluator(BRISQUE)。BRISQUEmeasuresperceptualimagequalityusingamodeltrainedfromnaturalsceneswithimagedistortion。SmallerBRISQUEscoresindicatebetterperceptualquality。 displayJPEGResults(Ireference,I10,I20,I50,I10predicted,I20predicted,I50predicted) SSIMComparison I10:0。90624I10predicted:0。91286 I20:0。94904I20predicted:0。95444 I50:0。97238I50predicted:0。97482 PSNRComparison I10:26。6046I10predicted:27。0793 I20:28。8015I20predicted:29。3378 I50:31。4512I50predicted:31。8584 NIQEComparison I10:7。0989I10predicted:3。9334 I20:4。5065I20predicted:3。0699 I50:2。8866I50predicted:2。4109 NOTE:SmallerNIQEscoresignifiesbetterperceptualquality BRISQUEComparison I10:52。2731I10predicted:38。9688 I20:45。5237I20predicted:30。9583 I50:27。7386I50predicted:24。3889 NOTE:SmallerBRISQUEscoresignifiesbetterperceptualquality 总结 本文演示如何构建和训练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,andL。Zhang,BeyondaGaussianDenoiser:ResidualLearningofDeepCNNforImageDenoising。IEEETransactionsonImageProcessing。Feb2017。 〔2〕Grubinger,M。,P。Clough,H。Mller,andT。Deselaers。TheIAPRTC12Benchmark:ANewEvaluationResourceforVisualInformationSystems。ProceedingsoftheOntoImage2006LanguageResourcesForContentBasedImageRetrieval。Genoa,Italy。Vol。5,May2006,p。10。