之前主要研究现代信号处理的,深度学习嘛,一个大号/深层的,现代的,黑箱的,信号/图像处理器,所以,我刚才说了,作为一个研究现代信号处理的,顺便搞些深度学习也是顺理成章的。该算法可能在一维信号时频谱超分辨率重建方面有用,之前做过一些相关的东西。程序运行环境为MATLAB R2018A。
面包多第三方下载链接
进入正题,本文主要讲解如何训练一个所谓的Very-Deep Super-Resolution (VDSR) 深层网络,然后使用 VDSR 网络从单低分辨率图像中估计高分辨率图像。关于VDSR网络,见文章末尾参考文献。
超分辨率重建是从低分辨率图像创建高分辨率图像的过程,本例考虑单图像超分辨率 (single image super-resolution。SISR),其目标是从一张低分辨率图像中恢复为一张高分辨率图像。SISR具有一定的难度,因为高频图像内容通常无法从低分辨率图像中恢复。如果没有高频信息,高分辨率图像的质量就会受到限制。此外,SISR是一个所谓的病态问题,因为低分辨率图像可以产生几种可能的高分辨率图像。
VDSR网络
VDSR是一种卷积神经网络,旨在执行单图像超分辨率重建。VDSR网络学习低分辨率和高分辨率图像之间的映射。理论上这种映射是存在的,因为低分辨率和高分辨率图像具有相似的图像内容,并且主要在高频细节上有所不同。
VDSR采用残差学习策略,即网络通过学习估计残差图像。残差图像是高分辨率参考图像和低分辨率图像之间的差异,后者使用双三次插值进行升级以匹配参考图像的大小。残差图像包含有关图像的高频细节的信息。
VDSR网络根据彩色图像的亮度检测残差图像。图像的亮度通道 Y 通过红色、绿色和蓝色像素值的线性组合来表示每个像素的亮度。相比之下,图像的两个色度通道 Cb 和 Cr 是表示色差信息的红色、绿色和蓝色像素值的不同线性组合。VDSR仅使用亮度通道进行训练,因为人类的感知对亮度变化比对颜色变化更敏感。
如下用英文表述较为方便:
在 VDSR 网络通过学习估计残差图像后,可以将估计的残差图像添加到上采样的低分辨率图像,然后将图像转换回 RGB 色彩空间来重建高分辨率图像。
尺度因子将参考图像的大小与低分辨率图像的大小相关联。随着尺度因子的增加,SISR变得更加病态,因为低分辨率图像会丢失有关高频图像内容的更多信息。VDSR通过使用较大的感受野receptive field来解决这个问题。
下载训练数据和测试数据
下载 IAPR TC-12 Benchmark,其中包含 20000 张自然图像,、包括人物,动物,城市等。可以使用downloadIAPRTC12Data函数来下载数据,数据文件的大小约为 1.8 GB。
本文将使用 IAPR TC-12 Benchmark的一小部分数据来训练网络,所有图像均为 32 位 JPEG 彩色图像。
定义用于训练的Mini-Batch Datastore
Mini-batch datastore 用于将训练数据输送到网络,本文通过vdsrImagePatch类自定义实现。vdsrImagePatch从低分辨率图像中提取图像块,并以不同的尺度因子升级图像块。每个mini-batch 包含 64 个大小为 41 x 41 像素的图像块,在训练期间将从图像中的随机位置提取所有图像块。要训练多尺度因子网络,将“尺度因子”设置为 [2 3 4]。
miniBatchSize = 64;
scaleFactors = [2 3 4];
source = vdsrImagePatchDatastore(trainImages,...
'MiniBatchSize',miniBatchSize,...
'PatchSize',41,...
'BatchesPerImage',1,...
'ScaleFactor',scaleFactors);
vdsrImagePatchDatastore向网络提供小批量数据,对datastore执行读取操作以浏览数据
inputBatch = read(source);
summary(inputBatch)