之前主要研究现代信号处理的,深度学习嘛,一个大号深层的,现代的,黑箱的,信号图像处理器,所以,我刚才说了,作为一个研究现代信号处理的,顺便搞些深度学习也是顺理成章的。该算法可能在一维信号时频谱超分辨率重建方面有用,之前做过一些相关的东西。程序运行环境为MATLABR2018A。 代码下载链接 https:mianbaoduo。comobreadY5mXmp5x 进入正题,本文主要讲解如何训练一个所谓的VeryDeepSuperResolution(VDSR)深层网络,然后使用VDSR网络从单低分辨率图像中估计高分辨率图像。关于VDSR网络,见文章末尾参考文献。 超分辨率重建是从低分辨率图像创建高分辨率图像的过程,本例考虑单图像超分辨率(singleimagesuperresolution。SISR),其目标是从一张低分辨率图像中恢复为一张高分辨率图像。SISR具有一定的难度,因为高频图像内容通常无法从低分辨率图像中恢复。如果没有高频信息,高分辨率图像的质量就会受到限制。此外,SISR是一个所谓的病态问题,因为低分辨率图像可以产生几种可能的高分辨率图像。 VDSR网络 VDSR是一种卷积神经网络,旨在执行单图像超分辨率重建。VDSR网络学习低分辨率和高分辨率图像之间的映射。理论上这种映射是存在的,因为低分辨率和高分辨率图像具有相似的图像内容,并且主要在高频细节上有所不同。 VDSR采用残差学习策略,即网络通过学习估计残差图像。残差图像是高分辨率参考图像和低分辨率图像之间的差异,后者使用双三次插值进行升级以匹配参考图像的大小。残差图像包含有关图像的高频细节的信息。 VDSR网络根据彩色图像的亮度检测残差图像。图像的亮度通道Y通过红色、绿色和蓝色像素值的线性组合来表示每个像素的亮度。相比之下,图像的两个色度通道Cb和Cr是表示色差信息的红色、绿色和蓝色像素值的不同线性组合。VDSR仅使用亮度通道进行训练,因为人类的感知对亮度变化比对颜色变化更敏感。 如下用英文表述较为方便: 在VDSR网络通过学习估计残差图像后,可以将估计的残差图像添加到上采样的低分辨率图像,然后将图像转换回RGB色彩空间来重建高分辨率图像。 尺度因子将参考图像的大小与低分辨率图像的大小相关联。随着尺度因子的增加,SISR变得更加病态,因为低分辨率图像会丢失有关高频图像内容的更多信息。VDSR通过使用较大的感受野receptivefield来解决这个问题。下载训练数据和测试数据 下载IAPRTC12Benchmark,其中包含20000张自然图像,、包括人物,动物,城市等。可以使用downloadIAPRTC12Data函数来下载数据,数据文件的大小约为1。8GB。 本文将使用IAPRTC12Benchmark的一小部分数据来训练网络,所有图像均为32位JPEG彩色图像。定义用于训练的MiniBatchDatastore Minibatchdatastore用于将训练数据输送到网络,本文通过vdsrImagePatch类自定义实现。vdsrImagePatch从低分辨率图像中提取图像块,并以不同的尺度因子升级图像块。每个minibatch包含64个大小为41x41像素的图像块,在训练期间将从图像中的随机位置提取所有图像块。要训练多尺度因子网络,将尺度因子设置为〔234〕。miniBatchSize64;scaleFactors〔234〕;sourcevdsrImagePatchDatastore(trainImages,。。。MiniBatchSize,miniBatchSize,。。。PatchSize,41,。。。BatchesPerImage,1,。。。ScaleFactor,scaleFactors);vdsrImagePatchDatastore向网络提供小批量数据,对datastore执行读取操作以浏览数据inputBatchread(source);summary(inputBatch) 设置VDSR层 本例使用MATLAB神经网络工具箱中的41个层定义VDSR网络,包括: imageInputLayerImageinputlayer convolutional2dLayer2Dconvolutionlayerforconvolutionalneuralnetworks reluLayerRectifiedlinearunit(ReLU)layer regressionLayerRegressionoutputlayerforaneuralnetwork 第一层,图像输入层,对图像块进行操作,图像块的大小基于网络感受野,网络感受野是影响网络中最顶层响应的空间图像区域。对于深度为D的网络,感受野是(2D1)x(2D1)。由于VDSR是一个20层网络,因此感受野和图像块大小为41x41。图像输入层接受具有一个通道的图像,因为VDSR仅使用亮度通道进行训练。networkDepth20;firstLayerimageInputLayer(〔41411〕,Name,InputLayer,Normalization,none); 图像输入层后跟一个2D卷积层,其中包含64个大小为3x3的滤波器。minibatch大小决定了滤波器的数量。每个卷积层后面都有一个ReLU层,便于引入非线性。convolutionLayerconvolution2dLayer(3,64,Padding,1,。。。Name,Conv1);convolutionLayer。Weightssqrt(2(964))randn(3,3,1,64);convolutionLayer。Biaszeros(1,1,64); ReLU层relLayerreluLayer(Name,ReLU1); 中间层包含18个交替的卷积和ReLU层。每个卷积层包含64个大小为3x3x64的滤波器。middleLayers〔convolutionLayerrelLayer〕;forlayerNumber2:networkDepth1conv2dLayerconvolution2dLayer(3,64,。。。Padding,〔11〕,。。。Name,〔Convnum2str(layerNumber)〕); 权重初始化conv2dLayer。Weightssqrt(2(964))randn(3,3,64,64);conv2dLayer。Biaszeros(1,1,64);relLayerreluLayer(Name,〔ReLUnum2str(layerNumber)〕);middleLayers〔middleLayersconv2dLayerrelLayer〕;end 倒数第二层是一个卷积层,具有一个大小为3x3x64的滤波器,用于重建图像。conv2dLayerconvolution2dLayer(3,1,。。。NumChannels,64,。。。Padding,〔11〕,。。。Name,〔Convnum2str(networkDepth)〕);conv2dLayer。Weightssqrt(2(964))randn(3,3,64,1);conv2dLayer。Biaszeros(1,1,1); 最后一层是回归层,回归层计算残差图像和网络预测之间的均方误差。finalLayers〔conv2dLayerregressionLayer(Name,FinalRegressionLayer)〕; 连接所有层以形成VDSR网络layers〔firstLayermiddleLayersfinalLayers〕;指定训练参数 使用具有动量(SGDM)优化的随机梯度下降来训练网络,学习速率最初设置为0。1,然后每20个epoch降低10倍。maxEpochs100;epochIntervals1;initLearningRate0。1;learningRateFactor0。1;l2reg0。0001;optionstrainingOptions(sgdm,。。。Momentum,0。9,。。。InitialLearnRate,initLearningRate,。。。LearnRateSchedule,piecewise,。。。LearnRateDropPeriod,10,。。。LearnRateDropFactor,learningRateFactor,。。。L2Regularization,l2reg,。。。MaxEpochs,maxEpochs,。。。MiniBatchSize,miniBatchSize,。。。GradientThresholdMethod,l2norm,。。。GradientThreshold,0。01);训练网络 使用trainNetwork函数训练VDSR网络modelDateTimedatestr(now,ddmmmyyyyHHMMSS);nettrainNetwork(source,layers,options);save(〔trainedVDSRmodelDateTimeEpochnum2str(maxEpochsepochIntervals)ScaleFactorsnum2str(234)。mat〕,net,options); 使用VDSR网络执行单图像超分辨率重建 使用VDSR网络执行单图像超分辨率(SISR)重建的步骤如下: 从高分辨率参考图像创建采样的低分辨率图像。 使用双三次插值对低分辨率图像执行SISR,这是一种不依赖于深度学习的传统图像处理解决方案。 使用VDSR网络对低分辨率图像执行SISR。 使用双三次插值和VDSR直观地比较重建的高分辨率图像 评估超分辨率图像的质量。创建低分辨率图像 创建一个低分辨率图像,该图像将使用深度学习的超分辨率重建结果与使用传统图像处理技术(如双三次插值)重建的结果进行比较。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) 选择其中一个图像作为超分辨率的参考图像indx1;图像索引Ireferencereadimage(testImages,indx);Ireferenceim2double(Ireference);imshow(Ireference)title(HighResolutionReferenceImage) 设置尺度因子为0。25,创建高分辨率参考图像的低分辨率版本。scaleFactor0。25;Ilowresimresize(Ireference,scaleFactor,bicubic);imshow(Ilowres)title(LowResolutionImage) 使用双三次插值提高图像分辨率 在没有深度学习的情况下提高图像分辨率的标准方法是使用双三次插值。使用双三次插值放大低分辨率图像,以便生成的高分辨率图像与参考图像的大小相同。〔nrows,ncols,np〕size(Ireference);Ibicubicimresize(Ilowres,〔nrowsncols〕,bicubic);imshow(Ibicubic)title(HighResolutionImageObtainedUsingBicubicInterpolation) 使用VDSR网络提高图像的分辨率 回想一下,VDSR仅使用图像的亮度通道进行训练,因为人类感知对亮度变化比对颜色变化更敏感。 使用rgb2ycbr函数将低分辨率图像从RGB色彩空间转换为亮度(Iy)和色度(Icb和Icr)通道。Iycbcrrgb2ycbcr(Ilowres);IyIycbcr(:,:,1);IcbIycbcr(:,:,2);IcrIycbcr(:,:,3); 使用双三次插值放大亮度和两个色度通道。上采样色度通道(Icbbicubic和Icrbicubic)无需进一步处理。Iybicubicimresize(Iy,〔nrowsncols〕,bicubic);Icbbicubicimresize(Icb,〔nrowsncols〕,bicubic);Icrbicubicimresize(Icr,〔nrowsncols〕,bicubic); 将Iybicubic输入VDSR网络,观察最后一层(回归层)的激活。网络的输出是所需的残差图像。Iresidualactivations(net,Iybicubic,41);Iresidualdouble(Iresidual);imshow(Iresidual,〔〕)title(ResidualImagefromVDSR) 将残差图像加到亮度分量中,以获得高分辨率的VDSR亮度分量。IsrIybicubicI 将高分辨率VDSR亮度分量与颜色分量连接,并使用ycbcr2rgb函数将图像转换为RGB色彩空间,则得到VDSR的最终高分辨率彩色图像。Ivdsrycbcr2rgb(cat(3,Isr,Icbbicubic,Icrbicubic));imshow(Ivdsr)title(HighResolutionImageObtainedUsingVDSR) 定量比较 为了更直观的理解高分辨率图像,使用格式为〔xywidthheight〕的向量roi来指定感兴趣区域(ROI),x和y为ROI的坐标,width和height为ROI的宽度和高度。roi〔32030480400〕; 将高分辨率图像裁剪到此ROI区域,显示结果montage({imcrop(Ibicubic,roi),imcrop(Ivdsr,roi)})title(HighResolutionResultsUsingBicubicInterpolation(Left)vs。VDSR(Right)); 结果显示VDSR高分辨率图像具有更清晰的细节和更清晰的边缘。 利用图像质量度量定量比较双三次插值的高分辨率图像与VDSR高分辨率图像。 计算图像的峰值信噪比(PSNR),PNSR值越大,通常表示图像质量越好bicubicPSNRpsnr(Ibicubic,Ireference)vdsrPSNRpsnr(Ivdsr,Ireference) bicubicPSNR38。4747 vdsrPSNR39。4473 计算每图像的结构相似性指数(SSIM),SSIM评估图像的三个特征的视觉冲击:亮度、对比度和结构信息,SSIM值越接近1,测试图像与参考图像的一致性越好bicubicSSIMssim(Ibicubic,Ireference)vdsrSSIMssim(Ivdsr,Ireference) bicubicSSIM0。9861 vdsrSSIM0。9878 使用自然图像质量评估(NIQE),NIQE的设计思路是基于构建一系列的用于衡量图像质量的特征,并且将这些特征用于拟合一个多元的高斯模型,NIQE实际上是衡量一张待测图像在多元分布上的差异。NIQE评分越小,表示感知质量越好。bicubicNIQEniqe(Ibicubic)vdsrNIQEniqe(Ivdsr) bicubicNIQE5。1719 vdsrNIQE4。7463 计算尺度因子为2、3和4的整组测试图像的平均PSNR和SSIM值,可以使用辅助函数superResolutionMetric计算平均指标。superResolutionMetrics(net,testImages,scaleFactors); ResultsforScalefactor2 AveragePSNRforBicubic31。809683 AveragePSNRforVDSR32。915853 AverageSSIMforBicubic0。938194 AverageSSIMforVDSR0。953473 ResultsforScalefactor3 AveragePSNRforBicubic28。170441 AveragePSNRforVDSR28。802722 AverageSSIMforBicubic0。884381 AverageSSIMforVDSR0。898248 ResultsforScalefactor4 AveragePSNRforBicubic27。010839 AveragePSNRforVDSR28。087250 AverageSSIMforBicubic0。861604 AverageSSIMforVDSR0。882349 对于每个尺度因子,与双三次插值相比,VDSR具有更好的指标分数。 参考文献 〔1〕Kim,J。,J。K。Lee,andK。M。Lee。AccurateImageSuperResolutionUsingVeryDeepConvolutionalNetworks。ProceedingsoftheIEEEConferenceonComputerVisionandPatternRecognition。2016,pp。16461654。 〔2〕Grubinger,M。,P。Clough,H。Mller,andT。Deselaers。TheIAPRTC12Benchmark:ANewEvaluationResourceforVisualInformationSystems。ProceedingsoftheOntoImage2006LanguageResourcesForContentBasedImageRetrieval。Genoa,Italy。Vol。5,May2006,p。10。 〔3〕He,K。,X。Zhang,S。Ren,andJ。Sun。DelvingDeepintoRectifiers:SurpassingHumanLevelPerformanceonImageNetClassification。ProceedingsoftheIEEEInternationalConferenceonComputerVision,2015,pp。10261034。