这个例子展示了如何使用非常深超分辨率(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
,下载资料。此函数附加到示例作为支持文件。万博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 = fullfile (imagesDir,“iaprtc12”那“图片”那“2”);ext = {'.jpg'那bmp格式的那“使用”};pristineImages = imageDatastore (trainImagesDir,“FileExtensions”ext);
列出训练图像的数量。
元素个数(pristineImages.Files)
ans = 616
为了创建训练数据集,生成由上采样图像和相应残差图像组成的图像对。
上采样的映像作为MAT文件存储在磁盘上的目录中upsampledDirName
.计算出的代表网络响应的残差图像以MAT文件的形式存储在磁盘上的目录中residualDirName
.MAT文件以数据类型存储双
以提高训练网络的精度。
upsampledDirName = [trainImagesDir filesep .“upsampledImages”];residualDirName = [trainImagesDir filesep .“residualImages”];
使用helper函数createVDSRTrainingSet
对训练数据进行预处理。此函数附加到示例作为支持文件。万博1manbetx
中的每个原始映像执行这些操作trainImages
:
将图像转换为YCBCR颜色空间
通过不同的比例因子缩小亮度(Y)通道,生成样本低分辨率图像,然后使用双三次插值将图像大小调整到原始大小
计算原始图像和调整大小的图像之间的差异。
保存调整大小和剩余图像到磁盘。
scaleFactors = [2 3 4];createVDSRTrainingSet (pristineImages scaleFactors、upsampledDirName residualDirName);
在该示例中,网络输入是使用双向插值追加采样的低分辨率图像。所需的网络响应是剩余图像。创建一个调用的图像数据存储upsampledimages
从输入图像文件的集合。创建一个调用的图像数据存储residualImages
来自计算的残差图像文件。两个数据存储都需要辅助功能,matRead
,从图像文件中读取图像数据。此函数附加到示例作为支持文件。万博1manbetx
Upsampledimages = imagedataStore(UpsampledDirname,“FileExtensions”那“.mat”那'readfcn', @matRead);residualImages = imageDatastore (residualDirName,“FileExtensions”那“.mat”那'readfcn', @matRead);
创建一个ImagedataAugmenter.
(深度学习工具箱)它指定数据扩充的参数。在训练过程中使用数据增强来改变训练数据,有效地增加了可用的训练数据量。在这里,增强器指定随机旋转90度和随机反射x -方向。
增量= imageDataAugmenter (...“RandRotation”@()兰迪([0,1],1)* 90,...“RandXReflection”,真正的);
创建一个randomPatchExtractionDatastore
从上采样和残差图像数据存储执行随机补丁提取。补丁提取是从单个较大图像提取大量小图像斑块或瓷砖的过程。这种类型的数据增强经常用于图像到图像回归问题,其中许多网络架构可以在非常小的输入图像大小上培训。这意味着可以从原始训练集中的每个全尺寸图像中提取大量补丁,这大大增加了训练集的大小。
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
(深度学习工具箱)-用于卷积神经网络的二维卷积层
抵押者
(深度学习工具箱)-整流线性单元(ReLU)层
regressionLayer
(深度学习工具箱)-神经网络的回归输出层
第一层,imageInputLayer
,对图像补丁进行操作。patch的大小是基于网络接受域的,接受域是影响网络最顶层响应的空间图像区域。理想情况下,网络接收域与图像大小相同,以便接收域能够看到图像中的所有高级特征。在这种情况下,网络D.卷积层,接受域为(2D.+ 1)————(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”那'zeros'那'名称'那“Conv1”);
指定Relu层。
relLayer = reluLayer ('名称'那“ReLU1”);
中间层包含18个交替卷积和整流线性单元层。每个卷积层包含64个尺寸为3 × 3 × 64的滤波器,其中一个滤波器在64个通道上的3 × 3空间区域上工作。和以前一样,ReLU层跟随每个卷积层。
middlelayer = [convLayer relLayer];为了layerNumber = 2:networkDepth-1 convLayer =卷积2dlayer (3,64,“填充”[1],...“WeightsInitializer”那“他”那“BiasInitializer”那'zeros'那...'名称', (“Conv”num2str (layerNumber)]);relLayer = reluLayer ('名称', (“ReLU”num2str (layerNumber)]);middlayers = [Middlayers Convlayer Rellayer];结束
倒数第二层是卷积层,其尺寸为3×3-64的单个滤波器,其重建图像。
convLayer = convolution2dLayer(3、1、“填充”[1],...“WeightsInitializer”那“他”那“BiasInitializer”那'zeros'那...“NumChannels”, 64,'名称', (“Conv”num2str (networkDepth)]);
最后一层是回归层而不是ReLU层。回归层计算残差图像与网络预测之间的均方误差。
finalLayers = [convLayer regressionLayer('名称'那'finallegressionlayer'));
将所有层连接起来形成VDSR网络。
层= [firstLayer middleLayers finalllayers];
或者,您可以使用vdsrLayers
帮助函数创建VDSR层。此函数附加到示例作为支持文件。万博1manbetx
层= vdsrLayers;
训练网络使用随机梯度下降与动量(SGDM)优化。方法指定SGDM的超参数设置trainingOptions
(深度学习工具箱)函数。学习率是初始的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”那“分段”那...“LearnRateDropPeriod”10...“LearnRateDropFactor”learningRateFactor,...“L2Regularization”l2reg,...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“GradientThresholdMethod”那'l2norm'那...“GradientThreshold”, 0.01,...'plots'那“训练进步”那...“详细”、假);
在默认情况下,该示例加载一个预先训练过的VDSR网络版本,该版本已经被训练为针对比例因子2、3和4的超分辨率图像。预先训练的网络使您能够在不等待训练完成的情况下执行测试图像的超分辨率。
训练VDSR网络,设置用圆形
变量为真正的
.训练网络使用trainNetwork
(深度学习工具箱)函数。
在可用的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. -垫”),'网');其他的负载(“trainedvdsr时代- 100 scalefactors - 234. -垫”);结束
要使用VDSR网络执行单个图像超分辨率(SISR),请按照此示例的其余步骤操作。剩下的例子显示了如何:
从高分辨率参考图像创建低分辨率图像样本。
采用不依赖深度学习的传统图像处理方法——双三次插值对低分辨率图像进行SISR。
利用VDSR神经网络对低分辨率图像进行SISR。
利用双三次插值和VDSR对重建的高分辨率图像进行直观比较。
通过量化图像与高分辨率参考图像的相似度来评价超分辨率图像的质量。
创建一个低分辨率的图像,用于比较使用深度学习的超分辨率结果和使用传统图像处理技术(如双三次插值)的结果。测试数据集,testimages
,包含在图像处理工具箱™中提供的21张未失真的图像。将图像加载到imageDatastore
.
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”那...“indiancorn.jpg”那“flamingos.jpg”那“sevilla.jpg”那'llama.jpg'那'Parkvenue.jpg'那...“peacock.jpg”那“car1.jpg”那“strawberries.jpg”那'wagage.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)标题(低分辨率图像的)
不需要深度学习就能提高图像分辨率的标准方法是使用双三次插值。使用双三次插值对低分辨率图像进行升级,使得到的高分辨率图像与参考图像大小相同。
(nrows, ncols, np) = (Ireference)大小;Ibicubic = imresize(Ilowres,[nrows ncols],)“双三次的”);imshow (Ibicubic)标题(“使用双三次插值获得高分辨率图像”)
回想一下,VDSR仅使用图像的亮度通道进行训练,因为人类的感知对亮度的变化比对颜色的变化更敏感。
将低分辨率图像从RGB颜色空间转换为亮度(Iy
)及色度(银行独立委员会
和只有几
)通过使用频道rgb2ycbcr
函数。
Iycbcr = rgb2ycbcr (Ilowres);Iy = Iycbcr (:: 1);银行独立委员会= Iycbcr (:: 2);Icr = Iycbcr (:: 3);
使用Bicubic插值高档亮度和两个色度通道。上采样的色度通道,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 + IRESIV;
将高分辨率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,IREREFERGE)
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函数,superResolutionMetrics
,计算平均指标。此函数附加到示例作为支持文件。万博1manbetx
scaleFactors = [2 3 4];SuperResolutionMetrics(网络,测试,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基准测试:用于视觉信息系统的新评估资源。”基于内容的图像检索语言资源.意大利热那亚。第五卷,2006年5月,第10页。
何凯,张旭东,任舜,孙杰。深入研究整流器:在图像网分类上超越人类水平的表现。IEEE计算机视觉国际会议论文集, 2015, pp. 1026-1034。
结合
|randomPatchExtractionDatastore
|rgb2ycbcr
|变换
|ycbcr2rgb
|trainingOptions
(深度学习工具箱)|trainNetwork
(深度学习工具箱)