使用深度学习提高图像分辨率
这个例子展示了如何创建一个高分辨率图像的低分辨率图像使用一个很深的超分辨率(VDSR)神经网络。
超分辨率从低分辨率图像创建高分辨率图像的过程。这个例子考虑单一图像超分辨率(SISR),目标是恢复一个高分辨率图像从一个低分辨率的图像。SISR高频图像内容通常是具有挑战性的,因为不能从低分辨率图像中恢复过来。没有高频信息,高分辨率图像的质量是有限的。此外,SISR是一个不适定问题,因为一个低分辨率的图像可以产生几个可能的高分辨率图像。
一些技术,包括深学习算法,提出了执行SISR。这个例子中探索一个深SISR学习算法,称为很深的超分辨率(VDSR) [1]。
VDSR网络
VDSR卷积神经网络架构设计执行单一的图像超分辨率(1]。VDSR网络学习低收入和高分辨率图像之间的映射。这种映射是有可能的,因为低分辨率和高分辨率图像相似的图像内容和不同主要在高频细节。
VDSR采用残余学习策略,这意味着网络学会估计剩余的形象。在超分辨率的情况下,残余图像高分辨率的区别参考图像和低分辨率图像,高档使用双立方插值匹配参考图像的大小。剩余的图像包含一个图像的高频细节信息。
VDSR网络检测残余图像亮度的彩色图像。图像的亮度通道,Y
,通过线性组合代表了每个像素的亮度的红色,绿色和蓝色的像素值。相比之下,两个图像的色度通道,Cb和Cr不同的线性组合,红色,绿色,蓝色代表色差信息的像素值。VDSR训练只使用亮度通道是因为人类感知亮度变化更敏感比颜色的变化。
如果 高分辨率图像的亮度和吗 是高档的亮度低分辨率图像使用双立方插值,然后输入到VDSR网络吗 和网络学会预测 从训练数据。
VDSR网络后学会估计剩余的图像,您可以通过添加估计剩余图像重建高分辨率图像的upsampled低分辨率的图像,然后把图像的RGB颜色空间。
大小的比例因子与参考图像的低分辨率图像的大小。随着比例因子的增加,SISR越来越不适定的,因为低分辨率图像失去对高频图像内容的更多信息。VDSR解决这个问题通过使用一个大的接受域。这个例子列车VDSR使用规模增大网络规模与多个因素。规模的增大提高了结果在更大的规模因素,因为网络可以利用规模较小的图像背景因素。此外,VDSR网络可以概括接受图像noninteger规模因素。
下载的培训和测试数据
下载IAPR TC-12基准,包括20000年仍然自然图像(2]。数据集包括照片的人、动物、城市、和更多。数据文件的大小是~ 1.8 GB。如果你不想下载的训练数据集,然后你可以加载pretrained VDSR网络通过输入负载(“trainedVDSRNet.mat”);
在命令行中。然后,直接进入使用VDSR网络执行单一的图像超分辨率在这个例子中部分。
使用helper函数,downloadIAPRTC12Data
下载数据。这个函数是附加到例子作为支持文件。金宝app指定dataDir
的期望位置数据。
dataDir =tempdir;downloadIAPRTC12Data (dataDir);
这个例子将列车网络的一个小子集IAPR TC-12基准数据。加载imageCLEF训练数据。所有图片都是32位的JPEG彩色图像。
trainImagesDir = fullfile (dataDir,“iaprtc12”,“图片”,“2”);ext = [“jpg”,“bmp格式”,“使用”];pristineImages = imageDatastore (trainImagesDir FileExtensions = ext);
训练图像的数量列表。
元素个数(pristineImages.Files)
ans = 616
准备训练数据
创建一个训练数据集,生成双图像upsampled组成的图像和相应的残余图像。
upsampled图像存储在磁盘上的垫子的目录中的文件upsampledDirName
。表示网络响应的计算残余图像作为垫文件存储在磁盘上的目录residualDirName
。垫文件存储为数据类型双
在培训时,为更精确的网络。
upsampledDirName = trainImagesDir + filesep +“upsampledImages”;residualDirName = trainImagesDir + filesep +“residualImages”;
使用辅助函数createVDSRTrainingSet
训练数据进行预处理。这个函数是附加到例子作为支持文件。金宝app
每个原始图像的helper函数执行这些操作trainImages
:
将图像转换为YCbCr颜色空间
缩减亮度(Y)通道由不同规模因素创建样本低分辨率的图像,然后使用双三次的调整原始大小的图像插值
计算原始和缩放图像之间的差异。
将大小和残余图像保存到磁盘。
scaleFactors = (2 3 4);createVDSRTrainingSet (pristineImages scaleFactors、upsampledDirName residualDirName);
为训练集定义预处理管道
在这个例子中,网络输入低分辨率图像,使用双立方插值upsampled。所需的网络响应残余图像。创建一个图像数据存储upsampledImages
从输入图像文件的集合。创建一个图像数据存储residualImages
从计算残余图像文件的集合。数据存储都需要一个helper函数,matRead
从图像文件,读取图像数据。这个函数是附加到例子作为支持文件。金宝app
upsampledImages = imageDatastore (upsampledDirName FileExtensions =“.mat”ReadFcn = @matRead);residualImages = imageDatastore (residualDirName FileExtensions =“.mat”ReadFcn = @matRead);
创建一个imageDataAugmenter
(深度学习工具箱)指定的参数数据增大。使用数据增加在不同训练数据训练,有效地增加训练数据可用的数量。在这里,增量指定随机旋转90度和随机的倒影x -方向。
增量= imageDataAugmenter (…randi RandRotatio = @ () ([0, 1], 1) * 90,…RandXReflection = true);
创建一个randomPatchExtractionDatastore
执行随机块提取upsampled和剩余的图像数据存储。补丁萃取提取的过程是一个大的小图像补丁,或瓦片,从一个更大的图像。这种类型的数据增加经常用于image-to-image回归问题,许多网络架构可以被训练在很小的输入图像的大小。这意味着大量的补丁可以从每一个全尺寸的图像中提取原始训练集,大大增加了训练集的大小。
patchSize = (41 41);patchesPerImage = 64;dsTrain = randomPatchExtractionDatastore (upsampledImages residualImages patchSize,…DataAugmentation =增压器,PatchesPerImage = PatchesPerImage);
由此产生的数据存储,dsTrain
的数据,提供mini-batches网络时代的每一次迭代。预览的结果读取数据存储。
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层
这个例子定义了VDSR网络利用深度学习工具箱™的41个人层,包括:
imageInputLayer
(深度学习工具箱)——图像输入层convolution2dLayer
(深度学习工具箱)——二维卷积为卷积神经网络层reluLayer
(深度学习工具箱)——纠正线性单元(ReLU)层regressionLayer
(深度学习工具箱)——回归神经网络输出层
第一层,imageInputLayer
作用于图像补丁。补丁的大小是基于网络接受域,即空间图像区域,影响网络中最顶层的反应。理想情况下,网络接受域是一样的图像大小,以便现场图像中可以看到所有的高级特性。在这种情况下,网络D卷积层,接受域(2D+ 1)————(2D+ 1)。
VDSR 20卷积层接受域和图像补丁41-by-41大小。图像输入层接受图像与一个频道因为VDSR训练只使用亮度通道。
networkDepth = 20;firstLayer = imageInputLayer (Name = [41 41 1]“InputLayer”归一化=“没有”);
图像输入层是紧随其后的是一个二维卷积层,包含64个大小3 x3的过滤器。mini-batch大小决定了过滤器的数量。在输入每个回旋的层,这样特征图是相同的大小每次卷积后作为输入。他的方法3)初始化权重随机值,以便在神经元有不对称的学习。每一个卷积层是紧随其后的是ReLU层,引入了非线性的网络。
convLayer = convolution2dLayer(64,填充= 1,…WeightsInitializer =“他”BiasInitializer =“零”、名称=“Conv1”);
指定一个ReLU层。
relLayer = reluLayer (Name =“ReLU1”);
中间层含有18交替卷积和修正线性单元层。每一个卷积层包含64过滤器的大小3 - - -,- 64,在一个过滤器3×3的空间作用于一个区域在64个频道。和之前一样,一层ReLU遵循每一个回旋的层。
middleLayers = [convLayer relLayer];为layerNumber = 2: networkDepth-1 convLayer = convolution2dLayer(64,填充= [1],…WeightsInitializer =“他”BiasInitializer =“零”,…Name =“Conv”+ num2str (layerNumber));relLayer = reluLayer (Name =“ReLU”+ num2str (layerNumber));middleLayers = [middleLayers convLayer relLayer];结束
倒数第二层是一个卷积层用一个过滤器的大小3 - - 3 - 64,塑造形象。
convLayer = convolution2dLayer(3、1、填充= [1],…WeightsInitializer =“他”BiasInitializer =“零”,…NumChannels = 64,名字=“Conv”+ num2str (networkDepth));
最后一层是回归层而不是ReLU层。回归层计算残余图像之间的均方误差和网络预测。
finalLayers = [convLayer regressionLayer (Name =“FinalRegressionLayer”));
连接所有的层形成VDSR网络。
层= [firstLayer middleLayers finalLayers];
指定培训选项
列车网络使用随机梯度下降法和动力(个)优化。个指定hyperparameter设置使用trainingOptions
(深度学习工具箱)函数。学习速率是最初0.1
和每10时期下降了10倍。火车100时代。
培训是深网络耗时。加快培训通过指定一个高的学习速率。然而,这可能会导致网络的梯度爆炸或肆意地生长,防止网络训练成功。保持梯度以一种有意义的范围内,通过指定“启用梯度剪切GradientThreshold”
作为0.01
”,并指定GradientThresholdMethod”
使用的L2-norm梯度。
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,…情节=“训练进步”,…Verbose = false);
培训网络
默认情况下,示例加载pretrained VDSR网络的版本已经训练super-resolve图像规模因素2、3和4。pretrained网络使您能够执行测试图像的超分辨率没有等待培训完成。
训练VDSR网络,设置doTraining
变量在下面的代码真正的
。列车网络使用trainNetwork
(深度学习工具箱)函数。
火车在GPU如果一个是可用的。使用GPU需要并行计算工具箱™和CUDA NVIDIA GPU®®启用。有关更多信息,请参见GPU计算的需求(并行计算工具箱)。培训大约需要6个小时的NVIDIA泰坦X。
doTraining =假;如果doTraining净= trainNetwork (dsTrain层,选项);modelDateTime =字符串(datetime (“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(“trainedVDSR——”+ modelDateTime +“.mat”,“净”);其他的负载(“trainedVDSRNet.mat”);结束
使用VDSR网络执行单一的图像超分辨率
执行单一的图像超分辨率(SISR)使用VDSR网络,按照剩余的步骤的这个例子:
创建一个示例低分辨率图像从一个高分辨率的参考图像。
使用双立方插值执行SISR低分辨率图像,传统的图像处理解决方案,不依赖深度学习。
对低分辨率图像进行SISR使用VDSR神经网络。
视觉上比较使用双立方插值和VDSR重建高分辨率图像。
评估的质量super-resolved图像相似度的量化图像高分辨率的参考图像。
创建样例低分辨率图像
测试数据集,testImages
,包含20无畸变的图像在图像处理工具箱™。图像加载到一个imageDatastore
蒙太奇和显示图像。
文件名= [“sherlock.jpg”,“peacock.jpg”,“fabric.png”,“greens.jpg”,…“hands1.jpg”,“kobi.png”,“lighthouse.png”,“office_4.jpg”,…“onion.png”,“pears.png”,“yellowlily.jpg”,“indiancorn.jpg”,…“flamingos.jpg”,“sevilla.jpg”,“llama.jpg”,“parkavenue.jpg”,…“strawberries.jpg”,“trailer.jpg”,“wagon.jpg”,“football.jpg”];filePath = fullfile (matlabroot,“工具箱”,“图片”,“imdata”)+ filesep;filePathNames = strcat (filePath,文件名);testImages = imageDatastore (filePathNames);
显示测试图像的蒙太奇。
蒙太奇(testImages)
选择一个测试图像的超分辨率网络用于测试。
testImage =“sherlock.jpg”;Ireference = imread (testImage);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)标题(“使用双立方插值获得高分辨率的图像”)
提高图像分辨率使用Pretrained VDSR网络
记得VDSR是训练只使用一个图像的亮度通道,因为人类感知亮度变化更敏感比颜色的变化。
低分辨率的图像从RGB颜色空间转换成亮度(Iy
)和色度(银行独立委员会
和只有几
)通过使用渠道rgb2ycbcr
函数。
Iycbcr = rgb2ycbcr (Ilowres);Iy = Iycbcr (:: 1);银行独立委员会= Iycbcr (:: 2);Icr = Iycbcr (:: 3);
高档的亮度和两个色度通道使用双立方插值。的upsampled色度通道,Icb_bicubic
和Icr_bicubic
,不需要进一步的处理。
Iy_bicubic = imresize (Iy [nrows ncols],“双三次的”);Icb_bicubic = imresize(银行独立委员会(nrows ncols),“双三次的”);Icr_bicubic = imresize(只有[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的宽度和高度。
投资回报率= (360 400 350);
作物的高分辨率图像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.7612
计算平均PSNR和SSIM的整个测试集图像的尺度因子2,3,4。为简单起见,您可以使用helper函数,vdsrMetrics
为了计算平均指标。这个函数是附加到例子作为支持文件。金宝app
scaleFactors = (2 3 4);vdsrMetrics(净testImages scaleFactors);
结果比例因子2双三次的平均PSNR值= 31.467070平均PSNR VDSR = 31.481973平均SSIM双三次的= 0.935820平均SSIM VDSR = 0.947057结果比例因子3双三次的平均PSNR值= 28.107057平均PSNR VDSR = 28.430546平均SSIM双三次的= 0.883927平均SSIM VDSR = 0.894634结果比例因子4双三次的平均PSNR值= 27.066129平均PSNR VDSR = 27.846590平均SSIM双三次的= 0.863270平均SSIM VDSR = 0.878101
VDSR具有更好的为每一个比例因子指标得分比双立方插值。
引用
[1],J。,J. K. Lee, and K. M. Lee. "Accurate Image Super-Resolution Using Very Deep Convolutional Networks."IEEE学报》®计算机视觉与模式识别会议。2016年,页1646 - 1654。
[2]Grubinger, M。,P. Clough, H. Müller, and T. Deselaers. "The IAPR TC-12 Benchmark: A New Evaluation Resource for Visual Information Systems."诉讼OntoImage 2006语言资源的基于内容的图像检索。意大利热那亚。5卷,2006年5月,p。10。
他[3],K。,X. Zhang, S. Ren, and J. Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification."《IEEE计算机视觉国际会议,2015年,页1026 - 1034。
另请参阅
randomPatchExtractionDatastore
|rgb2ycbcr
|ycbcr2rgb
|trainingOptions
(深度学习工具箱)|trainNetwork
(深度学习工具箱)|变换
|结合