主要内容

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

这个例子展示了如何训练非常深超分辨率(VDSR)神经网络,然后使用VDSR网络从单个低分辨率图像估计高分辨率图像。

该示例演示了如何训练VDSR网络,并提供了预先训练的VDSR网络。如果您选择训练VDSR网络,强烈推荐使用支持cuda的NVIDIA™GPU,其计算能力为3.0或更高。使用GPU需要使用并行计算工具箱™。

介绍

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

一些技术,包括深度学习算法,已经被提出执行SISR。这个例子探索了一种用于SISR的深度学习算法,称为非常深超分辨率(VDSR) [1].

VDSR网络

VDSR是一种卷积神经网络架构,旨在实现单图像超分辨率[1].VDSR网络了解低分辨率和高分辨率图像之间的映射。这种映射是可能的,因为低分辨率和高分辨率图像具有相似的图像内容并且主要在高频细节中不同。

VDSR采用剩余学习策略,这意味着网络学会估计剩余图像。在超分辨率的背景下,剩余图像是使用双向插值已经上升的高分辨率参考图像和低分辨率图像之间的差异以匹配参考图像的大小。剩余图像包含有关图像的高频细节的信息。

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

如果 Y 高的 res 是高分辨率图像的亮度和 Y lowres 亮度是一个低分辨率的图像,使用了双三次插值,那么输入到VDSR网络是 Y lowres 网络学会了预测 Y 剩余 Y highres - Y lowres 从训练数据。

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

比例因子将参考图像的大小与低分辨率图像的大小联系起来。随着尺度因子的增加,由于低分辨率图像丢失了更多高频图像内容的信息,SISR变得更加不适定。VDSR通过使用一个大的接收域来解决这个问题。本实例利用尺度增广训练了一个具有多尺度因子的VDSR网络。由于网络可以利用来自较小尺度因子的图像背景,尺度增强可以在较大尺度因子下提高结果。此外,VDSR网络还可以推广接受非整数尺度因子的图像。

下载培训和测试数据

下载IAPR TC-12基准,其中包括20,000个仍然自然图像[2].数据集包括人、动物、城市等的照片。数据文件大小为~1.8 GB。如果您不想下载训练数据集,那么您可以通过键入来加载预先训练的VDSR网络负载('trousovdsr-epoch-100-scalefactors-234.mat');在命令行。然后,直接去利用VDSR网络实现单图像超分辨率在这个例子中的部分。

使用辅助函数,downloadiaprtc12data.,下载资料。这个函数作为支持文件附加到示例中。金宝app

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

列出训练图像的数量。

numel(pristineimages.files)
ans = 616.

准备训练数据

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

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

upsampledDirName = [trainImagesDir filesep .“upsampledImages”];ResidualDirName = [TrainimagesDir FileSEP“residualImages”];

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

中的每个原始映像执行这些操作训练仿真

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

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

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

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

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

定义预处理管道用于培训集

在这个例子中,网络输入是使用双三次插值进行上采样的低分辨率图像。所需的网络响应是残差图像。创建一个名为upsampledImages从输入图像文件集合中提取。创建一个名为residualImages从收集的计算残差图像文件。这两个数据存储都需要一个辅助函数,matRead,从图像文件中读取图像数据。这个函数作为支持文件附加到示例中。金宝app

upsampledImages = imageDatastore (upsampledDirName,“FileExtensions”“.mat”“ReadFcn”, @matRead);residualImages = imageDatastore (residualDirName,“FileExtensions”“.mat”“ReadFcn”, @matRead);

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

增量= imageDataAugmenter (...'randroatation'@()兰迪([0,1],1)* 90,...“RandXReflection”,真正的);

创建一个randomPatchExtractionDatastore从上采样和残留图像数据存储中进行随机提取。Patch extraction是指从一幅更大的图像中提取大量的小图像Patch或tiles的过程。这种类型的数据增强经常用于图像到图像的回归问题,其中许多网络架构可以训练非常小的输入图像尺寸。这意味着可以从原始训练集中的每幅全尺寸图像中提取出大量的patch,大大增加了训练集的大小。

patchSize = [41 41];patchesPerImage = 64;dsTrain = randomPatchExtractionDatastore (upsampledImages residualImages patchSize,...“DataAugmentation”增压器,“PatchesPerImage”, 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网络,包括:

第一层,imageInputLayer,在图像修补程序上运行。补丁大小基于网络接收字段,其是影响网络中最顶层的响应的空间图像区域。理想情况下,网络接收字段与图像尺寸相同,以便该字段可以看到图像中的所有高级功能。在这种情况下,对于网络D卷积层,接收领域是(2D+ 1)————(2D+ 1)。

VDSR有20个卷积层,所以接收域和图像补丁的大小是41乘41。图像输入层用一个通道接收图像,因为VDSR只用亮度通道训练。

networkDepth = 20;firstLayer = imageInputLayer([41 41 1],“名字”“InputLayer”“归一化”“没有”);

图像输入层之后是2-D卷积层,其包含64个尺寸为3×3的滤波器。迷你批处理大小确定过滤器的数量。零焊接到每个卷积层的输入,使得特征贴图保持与每个卷积后的输入相同的大小。他的方法[3.初始化权值为随机值,这样在神经元学习中就存在不对称。每个卷积层后面都有一个ReLU层,它在网络中引入了非线性。

convLayer = convolution2dLayer (64,“填充”, 1...'掌控itializer'“他”“BiasInitializer”“零”“名字”“Conv1”);

指定一个ReLU层。

relLayer = reluLayer (“名字”'relu1');

中间层包含18个交替卷积和整流线性单元层。每个卷积层包含64个尺寸为3 × 3 × 64的滤波器,其中一个滤波器在64个通道上的3 × 3空间区域上工作。和以前一样,ReLU层跟随每个卷积层。

middlelayer = [convLayer relLayer];LayerNumber = 2:NetworkDepth-1 Convlayer = Convolution2Dlayer(3,64,“填充”[1],...'掌控itializer'“他”“BiasInitializer”“零”...“名字”,['conv'num2str (layerNumber)]);relLayer = reluLayer (“名字”,[“ReLU”num2str (layerNumber)]);= [middleLayers convLayer relLayer];结束

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

convLayer = convolution2dLayer(3、1、“填充”[1],...'掌控itializer'“他”“BiasInitializer”“零”...“NumChannels”,64,“名字”,['conv'num2str (networkDepth)]);

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

finalLayers = [convLayer regressionLayer(“名字”“FinalRegressionLayer”));

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

层= [firstLayer middleLayers finalllayers];

或者,您可以使用vdsrlayers.帮助函数创建VDSR层。这个函数作为支持文件附加到示例中。金宝app

层= vdsrLayers;

指定培训选项

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

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

maxEpochs = 100;epochIntervals = 1;initLearningRate = 0.1;learningRateFactor = 0.1;l2reg = 0.0001;miniBatchSize = 64;选择= trainingOptions (“个”...“动量”, 0.9,...“InitialLearnRate”initLearningRate,...“LearnRateSchedule”'分段'...'学习ropperiod'10...“LearnRateDropFactor”,学习活动,...“L2Regularization”l2reg,...'maxepochs',maxepochs,...“MiniBatchSize”miniBatchSize,...“GradientThresholdMethod”“l2norm”...“GradientThreshold”, 0.01,...“阴谋”“训练进步”...“详细”,错误的);

培训网络

配置训练选项和随机补丁提取数据存储后,使用trainNetwork(深度学习工具箱)函数。要训练网络,设置doTraining的参数真的.强烈建议使用支持cuda的NVIDIA™GPU,其计算能力为3.0或更高。

如果你保留doTraining参数以下代码为,然后该示例返回一个预先训练的VDSR网络,该网络已被训练为超分辨率图像的比例因子2、3和4。

注意:在NVIDIA™Titan X上的培训大约需要6个小时,根据你的GPU硬件可能需要更长的时间。

dotraining = false;如果doTraining modelDateTime = datestr“dd-mmm-yyyy-HH-MM-SS”);网= trainNetwork (dsTrain层,选项);保存([“trainedVDSR -”modelDateTime的时代,num2str (maxEpochs * epochIntervals)“-ScaleFactors -”num2str (234)“.mat”],“净”“选项”);其他的加载('TrousyVDSR-EPOCH-100-SCALEFACTORS-234.MAT');结束

利用VDSR网络实现单图像超分辨率

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

  • 从高分辨率参考图像创建低分辨率图像样本。

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

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

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

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

创建样本低分辨率图像

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

ext = {“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,'工具箱'“图片”“imdata”) filesep);filePathNames = strcat (filePath,文件名);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)标题('低分辨率图像'

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

增加没有深入学习的图像分辨率的标准方法是使用双向插值。使用Bicubic插值高度降低低分辨率图像,使得所得到的高分辨率图像与参考图像相同。

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

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

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

将低分辨率图像从RGB颜色空间转换为亮度(Iy)和色度(银行独立委员会只有几)通道rgb2ycbcr函数。

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

使用双三次插值提高亮度和两个色度通道。上采样的色度通道,ICB_BICUBIC.Icr_bicubic,不需要进一步处理。

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

通过升级的亮度组件,IY_BICUBIC.,通过训练有素的VDSR网络。观察激活(深度学习工具箱)从最后一层(回归层)。网络的输出是期望的残差图像。

Iresidual =激活(净、Iy_bicubic 41);Iresidual =双(Iresidual);imshow (Iresidual[])标题(“VDSR的残留图像”

将残差图像加入到放大的亮度分量中,得到高分辨率VDSR亮度分量。

Isr = Iy_bicubic + Iresidual;

将高分辨率VDSR亮度组件与彩色组件连接起来。将图像转换为RGB颜色空间使用ycbcr2rgb函数。最终的结果是使用VDSR获得的高分辨率彩色图像。

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

视觉和定量比较

为了更好地理解高分辨率图像,检查每幅图像中的一个小区域。使用向量指定感兴趣区域(ROI)ROI.格式[xy宽度高度].元素定义左上角的X和Y坐标,以及ROI的宽度和高度。

ROI = [320 30 480 400];

将高分辨率图像裁剪到此ROI,并将结果显示为蒙太奇。VDSR图像具有更清晰的细节和更清晰的边沿,而不是使用双向插值创建的高分辨率图像。

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

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

测量每幅图像与参考图像的峰值信噪比(PSNR)。PSNR值越大,图像质量越好。看到psnr值有关此度量标准的更多信息。

bicubicPSNR = psnr (Ibicubic Ireference)
bicubicPSNR = 38.4747
vdsrPSNR = psnr (Ivdsr Ireference)
vdsrPSNR = 39.2346

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

BICUBICSSIM = SSIM(IBICUBIC,IREREFERGE)
bicubicSSIM = 0.9861
VDSRSSIM = SSIM(IVDSR,IREREFERGE)
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,以计算平均指标。这个函数作为支持文件附加到示例中。金宝app

scaleFactors = [2 3 4];superResolutionMetrics(净testImages scaleFactors);
结果对于Bicubic = 31.809683平均PSNR的平均PSNR = 31.921784平均SSIM用于VDSR = 0.938194平均SSSIM = 0.949404,用于Bicubic的平均PSNR的平均PSNR = 28.563952平均SSIM的平均SSIM= 0.884381 VDSR = 0.895830的平均SSIM = 0.895830结果的比因子4平均PSNR用于双臂= 27.010839平均PSNR用于VDSR = 27.837260平均SSIM用于VDSR = 0.861604平均SSIM = 0.877132

对于每个尺度因子,VDSR比双三次插值有更好的度量得分。

参考文献

[1] Kim, J., J. K. Lee和K. M. Lee。“使用深度卷积网络的精确图像超分辨率。”IEEE论文集®计算机视觉与模式识别学术会议.2016年,页1646 - 1654。

[2] Grubinger, M., P. Clough, H. Müller, T. Deselaers。IAPR TC-12基准:一种新的视觉信息系统评估资源。基于内容的图像检索语言资源.热那亚,意大利。卷。5,2006年5月,p。10。

何凯,张旭东,任舜,孙杰。深入研究整流器:在图像网分类上超越人类水平的表现。IEEE计算机视觉国际会议论文集, 2015, pp. 1026-1034。

另请参阅

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

相关话题