这个例子展示了如何使用非常深超分辨率(VDSR)神经网络从低分辨率图像中估计高分辨率图像。
超分辨率是指从低分辨率图像中生成高分辨率图像的过程。本例考虑的是单图像超分辨率(SISR),其目标是从一幅低分辨率图像恢复一幅高分辨率图像。SISR具有挑战性,因为高频图像内容通常无法从低分辨率图像中恢复。没有高频信息,高分辨率图像的质量受到限制。此外,SISR是一个不适定问题,因为一个低分辨率的图像可以产生多个可能的高分辨率图像。
一些技术,包括深度学习算法,已经被提出执行SISR。这个例子探索了一种用于SISR的深度学习算法,称为非常深超分辨率(VDSR) [1].
VDSR是一种卷积神经网络架构,旨在实现单图像超分辨率[1].VDSR网络学习低分辨率和高分辨率图像之间的映射。这种映射是可能的,因为低分辨率和高分辨率图像具有相似的图像内容,而高频细节主要不同。
VDSR采用残差学习策略,即网络学习来估计残差图像。在超分辨率背景下,残差图像是高分辨率参考图像和低分辨率图像之间的差异,低分辨率图像通过双三次插值来匹配参考图像的大小。残差图像包含图像高频细节的信息。
VDSR网络根据彩色图像的亮度检测残差图像。图像的亮度通道,Y
,通过红、绿、蓝像素值的线性组合表示每个像素的亮度。相比之下,图像的两个色度通道,Cb和Cr,是红色、绿色和蓝色像素值的不同线性组合,这些像素值表示颜色差异信息。VDSR仅使用亮度通道进行训练,因为人类的感知对亮度的变化比对颜色的变化更敏感。
如果 是高分辨率图像的亮度和 亮度是一个低分辨率的图像,使用了双三次插值,那么输入到VDSR网络是 网络学会了预测 从训练数据。
在VDSR网络学习估计残差图像后,将估计的残差图像添加到上采样的低分辨率图像中,重构高分辨率图像,然后将图像转换回RGB颜色空间。
比例因子将参考图像的大小与低分辨率图像的大小联系起来。随着尺度因子的增加,由于低分辨率图像丢失了更多高频图像内容的信息,SISR变得更加不适定。VDSR通过使用一个大的接收域来解决这个问题。本实例利用尺度增广训练了一个具有多尺度因子的VDSR网络。由于网络可以利用来自较小尺度因子的图像背景,尺度增强可以在较大尺度因子下提高结果。此外,VDSR网络还可以推广接受非整数尺度因子的图像。
下载IAPR TC-12基准,由20,000张静态自然图像组成[2].数据集包括人、动物、城市等的照片。数据文件大小为~1.8 GB。如果您不想下载训练数据集,那么您可以通过键入来加载预先训练的VDSR网络负载(“trainedvdsr时代- 100 scalefactors - 234. -垫”);
在命令行。然后,直接去利用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格式的,“使用”};PristineImages = ImageageAtastore(TrainimagesDir,'fileextensions'ext);
列出培训图像的数量。
元素个数(pristineImages.Files)
ans = 616
为了创建训练数据集,生成由上采样图像和相应残差图像组成的图像对。
将上采样的图像存储在磁盘上作为目录中的MAT文件upsampleddirname.
.计算出的代表网络响应的残差图像以MAT文件的形式存储在磁盘上的目录中residualDirName
.垫文件存储为数据类型双倍的
以提高训练网络的精度。
upsampledDirName = [trainImagesDir filesep .“upsampledImages”];residualDirName = [trainImagesDir filesep .“residualImages”];
使用helper函数createvdsrtrainingset.
预处理培训数据。这个函数作为支持文件附加到示例中。金宝app
辅助功能为每个原始图像执行这些操作trainImages
:
将图像转换为YCbCr颜色空间
通过不同的比例因子缩小亮度(Y)通道,生成样本低分辨率图像,然后使用双三次插值将图像大小调整到原始大小
计算原始图像和调整大小的图像之间的差异。
保存调整大小和剩余图像到磁盘。
scaleFactors = [2 3 4];createvdsrtrainingset(pristineImages,scalefactors,upsampleddirname,diredualdirname);
在这个例子中,网络输入是使用双三次插值进行上采样的低分辨率图像。所需的网络响应是残差图像。创建一个名为upsampledImages
从输入图像文件集合中提取。创建一个名为残留因素
从收集的计算残差图像文件。这两个数据存储都需要一个辅助函数,matRead
,从图像文件中读取图像数据。这个函数作为支持文件附加到示例中。金宝app
upsampledImages = imageDatastore (upsampledDirName,'fileextensions',“.mat”,“ReadFcn”, @matRead);ResidualImages = ImageageAtastore(ResidualDirName,'fileextensions',“.mat”,“ReadFcn”, @matRead);
创建一个imageDataAugmenter
这指定了数据增强的参数。在培训期间使用数据增强以改变培训数据,从而有效增加可用培训数据的数量。在这里,增强器指定随机旋转90度和随机反射x -方向。
增量= imageDataAugmenter (...“RandRotation”@()兰迪([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
,在epoch的每次迭代时向网络提供小批量的数据。预览从数据存储读取的结果。
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双}
本例使用深度学习工具箱™中的41个独立层定义了VDSR网络,包括:
imageInputLayer
- 图像输入层
convolution2dLayer
- 用于卷积神经网络的2-D卷积层
reluLayer
-整流线性单元(ReLU)层
regressionLayer
-神经网络的回归输出层
第一层,imageInputLayer
,对图像补丁进行操作。patch的大小是基于网络接受域的,接受域是影响网络最顶层响应的空间图像区域。理想情况下,网络接收域与图像大小相同,以便接收域能够看到图像中的所有高级特征。在这种情况下,网络D卷积层,接受域为(2D+1)--by-(2D+ 1)。
VDSR有20个卷积层,所以接收域和图像补丁的大小是41乘41。图像输入层用一个通道接收图像,因为VDSR只用亮度通道训练。
NetworkDepth = 20;firstlayer = imageInputlayer([41 41 1],“名字”,“InputLayer”,'正常化',“没有”);
图像输入层之后是一个包含64个大小为3 × 3的滤波器的2d卷积层。小批量的大小决定了过滤器的数量。零填充每个卷积层的输入,使特征映射在每次卷积后保持与输入相同的大小。他的方法3.初始化权值为随机值,这样在神经元学习中就存在不对称。每个卷积层后面都有一个ReLU层,它在网络中引入了非线性。
convLayer = convolution2dLayer (64,'填充',1,...“WeightsInitializer”,“他”,“BiasInitializer”,“零”,“名字”,“Conv1”);
指定一个ReLU层。
Rellayer = Rululayer(“名字”,“ReLU1”);
中间层包含18个交替卷积和整流线性单元层。每个卷积层包含64个尺寸为3 × 3 × 64的滤波器,其中一个滤波器在64个通道上的3 × 3空间区域上工作。和以前一样,ReLU层跟随每个卷积层。
middlelayer = [convLayer relLayer];为layerNumber = 2:networkDepth-1 convLayer =卷积2dlayer (3,64,'填充',[1 1],...“WeightsInitializer”,“他”,“BiasInitializer”,“零”,...“名字”,[“Conv”num2str (layerNumber)]);Rellayer = Rululayer(“名字”,[“ReLU”num2str (layerNumber)]);= [middleLayers convLayer relLayer];结束
倒数第二层是带有一个大小为3 × 3 × 64的过滤器的卷积层,用于重建图像。
convlayer = Convolution2dlayer(3,1,'填充',[1 1],...“WeightsInitializer”,“他”,“BiasInitializer”,“零”,...'numchannels', 64,“名字”,[“Conv”num2str (networkDepth)]);
最后一层是回归层而不是ReLU层。回归层计算残差图像与网络预测之间的均方误差。
finalLayers = [convLayer regressionLayer(“名字”,“FinalRegressionLayer”));
连接所有层以形成VDSR网络。
层= [firstLayer middleLayers finalllayers];
或者,您可以使用vdsrLayers
帮助函数创建VDSR层。这个函数作为支持文件附加到示例中。金宝app
层= vdsrLayers;
训练网络使用随机梯度下降与动量(SGDM)优化。方法指定SGDM的超参数设置trainingOptions
函数。学习率是初始的0.1
每10个纪元就减少10倍。为100个时代而训练。
培训深网络是耗时的。通过指定高学习率加速培训。但是,这可能导致网络的梯度无法控制地爆炸或增长,防止网络成功训练。要在有意义的范围内保持渐变,请通过指定启用渐变剪裁“GradientThreshold”
作为0.01
,并指定“GradientThresholdMethod”
使用梯度的l2范数。
maxepochs = 100;epochintervals = 1;initlearningrate = 0.1;学习活动= 0.1;l2reg = 0.0001;minibatchsize = 64;选项=培训选项('sgdm',...“动量”, 0.9,...“InitialLearnRate”initLearningRate,...'shownrateschedule',“分段”,...“LearnRateDropPeriod”10...“LearnRateDropFactor”learningRateFactor,...“L2Regularization”l2reg,...“MaxEpochs”maxEpochs,...“MiniBatchSize”,小匹马,...“GradientThresholdMethod”,“l2norm”,...“GradientThreshold”,0.01,...“阴谋”,“训练进步”,...'verbose'、假);
默认情况下,该示例将vdsr网络的预磨损版本加载到已培训到Super-Resolve Images的Super-Resolve Images,用于缩放因子2,3和4。预先训练的网络使您能够在不等待培训的情况下执行测试图像的超分辨率而不等待培训完成.
训练VDSR网络,设置doTraining
变量为真正的
.训练网络使用trainNetwork
函数。
在可用的GPU上进行训练。使用GPU需要并行计算工具箱™和支持CUDA®的NVIDIA®GPU。有关更多信息,请参见GPU通金宝app过发布支持(并行计算工具箱).在NVIDIA Titan X上训练大约需要6个小时。
doTraining = false;如果dotrainnet = trainnetwork(dstrain,图层,选项);modeldateTeme = string(DateTime(“现在”,“格式”,“yyyy-MM-dd-HH-mm-ss”));保存(strcat (“trainedVDSR——”,modeldateTime,“时代——”,num2str(maxepochs),“-scalefactors-234.mat”),“净”);其他的负载(“trainedvdsr时代- 100 scalefactors - 234. -垫”);结束
要使用VDSR网络执行单图像超分辨率(SISR),请执行本示例的其余步骤。示例的其余部分将展示如何:
从高分辨率参考图像创建低分辨率图像样本。
采用不依赖深度学习的传统图像处理方法——双三次插值对低分辨率图像进行SISR。
利用VDSR神经网络对低分辨率图像进行SISR。
利用双三次插值和VDSR对重建的高分辨率图像进行直观比较。
通过量化图像的相似性来评估超分辨图像的质量来高分辨率参考图像。
创建一个低分辨率的图像,用于比较使用深度学习的超分辨率结果和使用传统图像处理技术(如双三次插值)的结果。测试数据集,testImages
,包含在图像处理工具箱™中提供的21张未失真的图像。将图像加载到imageageAtastore.
.
ext = {“jpg”,“使用”};文件名= {“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',...'印第安纳州jpg','flamingos.jpg','塞维利亚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(启发,Scalefactor,“双三次的”);imshow (Ilowres)标题(低分辨率图像的)
不需要深度学习就能提高图像分辨率的标准方法是使用双三次插值。使用双三次插值对低分辨率图像进行升级,使得到的高分辨率图像与参考图像大小相同。
[nrows,ncols,np] =尺寸(启动);Ibicubic = Imresize(iLowres,[nrows ncols],“双三次的”);imshow(Ibicubic)标题(“使用双三次插值获得高分辨率图像”)
回想一下,VDSR仅使用图像的亮度通道进行训练,因为人类的感知对亮度的变化比对颜色的变化更敏感。
将低分辨率图像从RGB颜色空间转换为亮度(Iy
)及色度(银行独立委员会
和只有几
)通道rgb2ycbcr
(图像处理工具箱)函数。
Iycbcr = RGB2YCBCR(ILOWRES);IY = IYCBCR(:,:1);ICB = 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 Ireference)
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函数,超级大量媒体
,以计算平均指标。这个函数作为支持文件附加到示例中。金宝app
scaleFactors = [2 3 4];superResolutionMetrics(净testImages scaleFactors);
结果比例因子2双三次的平均PSNR值= 31.809683平均PSNR VDSR = 31.921784平均SSIM双三次的= 0.938194平均SSIM VDSR = 0.949404结果比例因子3双三次的平均PSNR值= 28.170441平均PSNR VDSR = 28.563952平均SSIM双三次的= 0.884381平均SSIM VDSR = 0.895830的结果标度因子4 Bicubic的平均PSNR = 27.010839 VDSR的平均PSNR = 27.837260 Bicubic的平均SSIM = 0.861604 VDSR的平均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基准:一种新的视觉信息系统评估资源。基于内容的图像检索的odimage 2006语言资源的程序.意大利热那亚。第五卷,2006年5月,第10页。
何凯,张旭东,任舜,孙杰。深入研究整流器:在图像网分类上超越人类水平的表现。IEEE计算机视觉国际会议论文集, 2015, pp. 1026-1034。
trainingOptions
|trainNetwork
|变换
|结合
|激活
|imageDataAugmenter
|imageageAtastore.