主要内容

基于深度学习的单幅图像超分辨率处理

此示例演示如何使用甚深超分辨率(VDSR)神经网络从低分辨率图像估计高分辨率图像。

超分辨率是指从低分辨率图像中生成高分辨率图像的过程。本例考虑的是单图像超分辨率(SISR),其目标是从一幅低分辨率图像恢复一幅高分辨率图像。SISR具有挑战性,因为高频图像内容通常无法从低分辨率图像中恢复。没有高频信息,高分辨率图像的质量受到限制。此外,SISR是一个不适定问题,因为一个低分辨率的图像可以产生多个可能的高分辨率图像。

一些技术,包括深度学习算法,已经被提出来执行SISR。本例探讨了SISR的一种深度学习算法,称为甚深超分辨率(VDSR)[1.].

VDSR网络

VDSR是一种卷积神经网络结构,设计用于实现单图像超分辨率[1.]。VDSR网络学习低分辨率图像和高分辨率图像之间的映射。这种映射是可能的,因为低分辨率图像和高分辨率图像具有相似的图像内容,并且主要在高频细节上有所不同。

VDSR采用残差学习策略,即网络学习估计残差图像。在超分辨率的上下文中,残差图像是高分辨率参考图像和低分辨率图像之间的差异,低分辨率图像已使用双三次插值放大以匹配参考图像的大小。残余图像包含关于图像的高频细节的信息。

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

如果 Y 物件 是高分辨率图像的亮度,并且 Y 洛尔斯 如果亮度是使用双三次插值放大的低分辨率图像,则VDSR网络的输入为 Y 洛尔斯 网络学会了预测 Y 残余物 = Y highres - Y 洛尔斯 从训练数据。

在VDSR网络学习估计残差图像后,将估计的残差图像添加到上采样的低分辨率图像中,重构高分辨率图像,然后将图像转换回RGB颜色空间。

比例因子将参考图像的大小与低分辨率图像的大小相关联。随着比例因子的增加,SISR变得更不适定,因为低分辨率图像丢失了更多关于高频图像内容的信息。VDSR通过使用一个大的感受野来解决这个问题。此示例使用比例增强来训练具有多个比例因子的VDSR网络。由于网络可以利用较小比例因子中的图像上下文,因此比例增强可以在较大比例因子下改善结果。此外,VDSR网络可以推广到接受具有非整数比例因子的图像。

下载培训和测试数据

下载IAPR TC-12基准,由20,000张静态自然图像组成[2.].数据集包括人、动物、城市等的照片。数据文件大小为~1.8 GB。如果您不想下载训练数据集,那么您可以通过键入来加载预先训练的VDSR网络荷载(“培训VDSR-Epoch-100-ScaleFactors-234.mat”);在命令行中。然后,直接转到使用VDSR网络执行单图像超分辨率本例中的第节。

使用辅助函数,下载IAPRTC12数据,下载资料。这个函数作为支持文件附加到示例中。万博1manbetx

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

本例将使用IAPR TC-12基准数据的一小部分对网络进行训练。加载imageCLEF训练数据。所有图像均为32位JPEG彩色图像。

trainImagesDir=完整文件(imagesDir,“iaprtc12”,“图片”,“2”);exts={“.jpg”,“.bmp”,“.png”};pristineImages = imageDatastore (trainImagesDir,“FileExtensions”ext);

列出训练图像的数量。

numel(pristineImages.Files)
ans=616

准备训练数据

为了创建训练数据集,生成由上采样图像和相应残差图像组成的图像对。

上采样的映像作为MAT文件存储在磁盘上的目录中upsampledDirName. 表示网络响应的计算剩余图像作为MAT文件存储在磁盘上的目录中剩余域名。MAT文件存储为数据类型为了在训练网络时获得更高的精度。

upsampledDirName=[trainImagesDir文件步骤“upsampledImages”];residualDirName=[trainImagesDir文件步骤“residualImages”];

使用helper函数createVDSRTrainingSet对训练数据进行预处理。这个函数作为支持文件附加到示例中。万博1manbetx

中的每个原始映像执行这些操作火车图像:

  • 将图像转换为YCbCr颜色空间

  • 通过不同的比例因子缩小亮度(Y)通道,以创建低分辨率的采样图像,然后使用双三次插值将图像调整为原始大小

  • 计算原始图像和调整大小的图像之间的差异。

  • 保存调整大小和剩余图像到磁盘。

scaleFactors = [2 3 4];createVDSRTrainingSet (pristineImages scaleFactors、upsampledDirName residualDirName);

为训练集定义预处理管道

在本例中,网络输入是使用双三次插值进行上采样的低分辨率图像。所需的网络响应是剩余图像。创建一个名为上采样图像从输入图像文件的集合中创建一个名为residualImages从计算的剩余图像文件集合中。两个数据存储都需要一个帮助函数,matRead,从图像文件中读取图像数据。此函数作为支持文件附加到示例中。万博1manbetx

upsampledImages=图像数据存储(upsampledDirName,“FileExtensions”,“.mat”,“ReadFcn”, @matRead);residualImages = imageDatastore (residualDirName,“FileExtensions”,“.mat”,“ReadFcn”, @matRead);

创建一个图像数据增强器它指定数据扩充的参数。在训练过程中使用数据增强来改变训练数据,有效地增加了可用的训练数据量。在这里,增强器指定随机旋转90度和随机反射x-方向

增强器=图像数据增强器(...“随机轮换”@()兰迪([0,1],1)* 90,...“RandXReflection”,对);

创建一个随机抽取数据存储(图像处理工具箱)从上采样和残差图像数据存储中执行随机面片提取的过程。面片提取是从单个较大图像中提取一大组小图像面片或分片的过程。这种类型的数据扩充经常用于图像到图像的回归问题,其中可以训练许多网络体系结构在非常小的输入图像大小上。这意味着可以从原始训练集中的每个全尺寸图像中提取大量面片,这大大增加了训练集的大小。

patchSize=[41];patchesPerImage=64;dsTrain=randomPatchExtractionDatastore(上采样图像、剩余图像、patchSize、,...“数据扩充”,增强器,“PatchesPerImage”,斑贴图像);

由此产生的数据存储,dsTrain,在历元的每次迭代中向网络提供小批量数据。预览从数据存储读取的结果。

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

设置VDSR层

此示例使用深度学习工具箱中的41个单独层定义VDSR网络™, 包括:

第一层,图像输入层,在图像修补程序上运行。修补程序大小基于网络感受野,这是影响网络最顶层响应的空间图像区域。理想情况下,网络感受野与图像大小相同,以便该区域可以看到图像中的所有高级特征。在这种情况下,对于具有HD卷积层,感受野为(2D+ 1)————(2D+ 1)。

VDSR有20个卷积层,因此接收场和图像块大小为41×41。图像输入层通过一个通道接收图像,因为VDSR仅使用亮度通道进行训练。

networkDepth = 20;firstLayer = imageInputLayer([41 41 1],“姓名”,“输入层”,“归一化”,“没有”);

图像输入层之后是一个二维卷积层,包含64个大小为3×3的过滤器。最小批量大小决定过滤器的数量。对每个卷积层的输入进行零填充,以便特征映射在每次卷积后保持与输入相同的大小。他的方法[3.]将权值初始化为随机值,使神经元学习具有不对称性。每个卷积层后面都有一个ReLU层,这会在网络中引入非线性。

convLayer=卷积2dLayer(3,64,“填充”,1,...“增重剂”,“他”,“BiasInitializer”,“零”,“姓名”,“Conv1”);

指定一个ReLU图层。

relLayer = reluLayer (“姓名”,“ReLU1”);

中间层包含18个交替卷积和校正线性单元层。每个卷积层包含64个大小为3×3×64的滤波器,其中一个滤波器在跨越64个通道的3×3空间区域上工作。与之前一样,每个卷积层后面都有一个ReLU层。

中间层=[convLayer relLayer];layerNumber=2:networkDepth-1 convLayer=convolution2dLayer(3,64,“填充”[1],...“增重剂”,“他”,“BiasInitializer”,“零”,...“姓名”,[“Conv”num2str (layerNumber)]);relLayer = reluLayer (“姓名”,[“雷卢”num2str(layerNumber)];中间层=[middleLayers convLayer relLayer];结束

倒数第二层是卷积层,带有一个大小为3×3×64的滤波器,用于重建图像。

convLayer = convolution2dLayer(3、1、“填充”[1],...“增重剂”,“他”,“BiasInitializer”,“零”,...“NumChannels”,64,“姓名”,[“Conv”num2str (networkDepth)]);

最后一层是回归层,而不是ReLU层。回归层计算残差图像和网络预测之间的均方误差。

finalLayers=[convLayer回归层(“姓名”,“FinalRegressionLayer”));

将所有层连接起来形成VDSR网络。

层=[第一层中间层最终层];

或者,您可以使用vdsrLayers帮助函数创建VDSR层。这个函数作为支持文件附加到示例中。万博1manbetx

层=vdsrLayers;

指定培训选项

训练网络使用随机梯度下降与动量(SGDM)优化。方法指定SGDM的超参数设置培训选项函数。初始学习速率为0.1每10个纪元就减少10倍。为100个时代而训练。

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

maxEpochs = 100;epochIntervals = 1;initLearningRate = 0.1;learningRateFactor = 0.1;l2reg = 0.0001;miniBatchSize = 64;选择= trainingOptions (“个”,...“动量”, 0.9,...“InitialLearnRate”,初始学习率,...“LearnRateSchedule”,“分段”,...“LearnRateDropPeriod”,10,...“LearnRateDropFactor”,学习率因子,...“L2规范化”l2reg,...“MaxEpochs”,maxEpochs,...“MiniBatchSize”miniBatchSize,...“梯度阈值法”,“l2norm”,...“GradientThreshold”, 0.01,...“情节”,“培训进度”,...“详细”,假);

培训网络

在默认情况下,该示例加载一个预先训练过的VDSR网络版本,该版本已经被训练为针对比例因子2、3和4的超分辨率图像。预先训练的网络使您能够在不等待训练完成的情况下执行测试图像的超分辨率。

训练VDSR网络,设置溺爱变量为符合事实的.训练网络使用trainNetwork函数。

如果GPU可用,在GPU上训练。使用GPU需要并行计算工具箱™ 以及支持CUDA®的NVIDIA®GPU。有关更多信息,请参阅GPU支万博1manbetx持情况(并行计算工具箱).在NVIDIA Titan X上训练大约需要6小时。

doTraining=false;如果doTraining net = trainNetwork(dsTrain,layers,options);modelDateTime =字符串(datetime (“现在”,“格式”,“yyyy MM dd HH MM ss”));保存(strcat)(“trainedVDSR——”modelDateTime,“-纪元—num2str (maxEpochs),“scalefactors - 234. -垫”),“净”);其他的装载(“培训VDSR-Epoch-100-ScaleFactors-234.材料”);结束

使用VDSR网络执行单图像超分辨率

要使用VDSR网络执行单图像超分辨率(SISR),请遵循本示例的其余步骤。本示例的其余部分显示了如何:

  • 从高分辨率参考图像创建低分辨率示例图像。

  • 采用不依赖深度学习的传统图像处理方法——双三次插值对低分辨率图像进行SISR。

  • 使用VDSR神经网络对低分辨率图像执行SISR。

  • 利用双三次插值和VDSR对重建的高分辨率图像进行直观比较。

  • 通过量化图像与高分辨率参考图像的相似度来评价超分辨率图像的质量。

创建示例低分辨率图像

创建一个低分辨率图像,用于将使用深度学习的超分辨率结果与使用传统图像处理技术(如双三次插值)的结果进行比较。测试数据集,测试图像,包含在图像处理工具箱™中提供的21张未失真的图像。将图像加载到imageDatastore

exts={“.jpg”,“.png”};文件名={“sherlock.jpg”,“car2.jpg”,'fabric.png',“greens.jpg”,“hands1.jpg”,“kobi.png”,...“lighthouse.png”,“micromarket.jpg”,“office_4.jpg”,'洋葱.png',“pears.png”,“yellowlily.jpg”,...“indiancorn.jpg”,“flamingos.jpg”,“sevilla.jpg”,“骆驼,jpg”,“帕克大道,jpg”,...“peacock.jpg”,“car1.jpg”,“草莓,jpg”,“wagon.jpg”};filePath=[fullfile(matlabroot,“工具箱”,“图片”,“imdata”)filesep];filePathNames=strcat(filePath,filename);testImages=imageDatastore(filePathNames,“FileExtensions”ext);

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

蒙太奇(testImages)

选择其中一个图像作为超分辨率的参考图像。您可以选择使用自己的高分辨率图像作为参考图像。

indx = 1;%要从测试图像数据存储中读取的图像索引Ireference = readimage (testImages indx);Ireference = im2double (Ireference);imshow (Ireference)标题(高分辨率的参考图像的)

创建一个低分辨率版本的高分辨率参考图像使用imresize缩放因子为0.25。图像的高频分量在降尺度过程中丢失。

scaleFactor = 0.25;Ilowres = imresize (Ireference scaleFactor,“双三次”);imshow(Ilowres)标题(“低分辨率图像”)

使用双三次插值提高图像分辨率

无需深入学习即可提高图像分辨率的标准方法是使用双三次插值。使用双三次插值对低分辨率图像进行放大,从而生成与参考图像大小相同的高分辨率图像。

(nrows, ncols, np) = (Ireference)大小;Ibicubic = imresize(Ilowres,[nrows ncols],)“双三次”);imshow (Ibicubic)标题(“使用双三次插值获得的高分辨率图像”)

利用预先训练的VDSR网络提高图像分辨率

回想一下,VDSR仅使用图像的亮度通道进行训练,因为人类感知对亮度变化比颜色变化更敏感。

将低分辨率图像从RGB颜色空间转换为亮度(Iy)和色度(IcbIcr)使用rgb2ycbcr(图像处理工具箱)函数。

Iycbcr = rgb2ycbcr (Ilowres);Iy = Iycbcr (:: 1);银行独立委员会= Iycbcr (:: 2);Icr = Iycbcr (:: 3);

使用双三次插值放大亮度和两个色度通道。上采样的色度通道,Icb_双三次曲线Icr_bicubic,无需进一步处理。

Iy_bicubic = imresize(Iy,[nrows ncols],“双三次”);Icb_bicubic = imresize(Icb,[nrows ncols],“双三次”);Icr_双三次=imresize(Icr,[nrows ncols],“双三次”);

通过升级的亮度组件,双三次的,通过经过培训的VDSR网络。观察激活从最后一层(回归层)开始。网络的输出是期望的残余图像。

Iresidual=激活(净,Iy_双三次,41);Iresidual=双(Iresidual);iShow(Iresidual,[])标题(“来自VDSR的残余图像”)

将剩余图像添加到放大的亮度分量,以获得高分辨率VDSR亮度分量。

Isr=Iy_双三次+i剩余;

将高分辨率VDSR亮度分量与放大的颜色分量连接起来。使用ycbcr2rgb(图像处理工具箱)函数。最终的结果是使用VDSR获得的高分辨率彩色图像。

Ivdsr = ycbcr2rgb(猫(3 Isr Icb_bicubic Icr_bicubic));imshow (Ivdsr)标题(“使用VDSR获得高分辨率图像”)

视觉和定量比较

为了更好地理解高分辨率图像,请检查每个图像中的一个小区域。使用向量指定感兴趣区域(ROI)投资回报率格式[xY宽度身高].这些元素定义了左上角的x坐标和y坐标,以及ROI的宽度和高度。

投资回报率=[320 30 480 400];

将高分辨率图像裁剪到此ROI,并将结果显示为蒙太奇。VDSR图像比使用双三次插值创建的高分辨率图像具有更清晰的细节和更锐利的边缘。

蒙太奇({imcrop (Ibicubic roi), imcrop (Ivdsr roi)})标题(“使用双三次插值(左)与VDSR(右)的高分辨率结果”);

使用图像质量度量来定量比较使用双三次插值的高分辨率图像与VDSR图像。参考图像为原始高分辨率图像,Ireference,在准备样品低分辨率图像之前。

测量每幅图像与参考图像的峰值信噪比(PSNR)。PSNR值越大,图像质量越好。看到psnr值(图像处理工具箱)有关此度量的详细信息。

双立方CPSNR=峰值信噪比(立方,i参考)
bicubicPSNR = 38.4747
vdsrPSNR=峰值信噪比(Ivdsr,i参考)
vdsrPSNR = 39.2346

测量每幅图像的结构相似度指数(SSIM)。SSIM评估图像的三个特征的视觉影响:亮度,对比度和结构,与参考图像。SSIM值越接近1,测试图像与参考图像的一致性越好。看到ssim(图像处理工具箱)有关此度量的详细信息。

bicubicSSIM=ssim(Ibicubic,i参考)
bicubicSSIM = 0.9861
vdsrSSIM = ssim (Ivdsr Ireference)
vdsrSSIM=0.9874

使用自然度图像质量评估器(NIQE)测量感知图像质量。NIQE分数越低,感知质量越好。看到niqe(图像处理工具箱)有关此度量的详细信息。

bicubicNIQE = niqe (Ibicubic)
bicubicNIQE = 5.1721
vdsrNIQE=niqe(Ivdsr)
vdsrNIQE = 4.7611

计算整组测试图像在比例因子2、3、4下的平均PSNR和SSIM。为简单起见,您可以使用helper函数,superResolutionMetrics,以计算平均指标。此函数作为支持文件附加到示例中。万博1manbetx

scaleFactors=[2 3 4];超级分辨率度量(净、测试图像、scaleFactors);
比例因子2的结果双三次平均PSNR=31.809683 VDSR的平均PSNR=31.921784双三次平均SSIM=0.938194 VDSR的平均SSIM=0.949404比例因子3的结果双三次平均PSNR=28.170441 VDSR的平均PSNR=28.563952双三次平均SSIM=0.884381 VDSR的平均SSIM=0.895830 Sca的结果le系数4双三次平均PSNR=27.010839 VDSR的平均PSNR=27.837260双三次平均SSIM=0.861604 VDSR的平均SSIM=0.877132

VDSR在每个尺度因子上都比双三次插值具有更好的度量分数。

参考文献

[1] Kim,J.,J.K.Lee和K.M.Lee,“使用非常深的卷积网络实现精确的图像超分辨率。”IEEE会议录®计算机视觉和模式识别会议. 2016年,第1646-1654页。

[2] 格鲁宾格,M.,P.克劳夫,H.Müller和T.德塞勒斯。“IAPR TC-12基准:视觉信息系统的新评估资源。”基于内容的图像检索语言资源《意大利热那亚》,第5卷,2006年5月,第10页。

[3] 深入研究整流器:在ImageNet分类上超越人类水平的性能IEEE计算机视觉国际会议记录, 2015, pp. 1026-1034。

另见

||||||

相关话题