卷积神经网络 (CNN) 正成为计算机视觉的主流。CNN 在高级视觉任务中的应用尤其广泛,如包括 AlexNet* 在内的图像分类。本文(及相关教程)介绍了一个面向图像超高分辨率 (SR) 的 CNN 示例(低级视觉任务)以及如何使用英特尔® Caffe* 分发包框架和英特尔® Python* 分发包进行实施。该 CNN 基于 Chao Dong、Chen Change Loy、Kaiming He 和 Xiaoou Tang1,2的成果,提供了使用 CNN 执行单图像 SR 的新方法。
简介
现代摄像头传感器在数码相机、手机、平板电脑等日常电子设备中无处不在,这些设备能产生高分辨率 (HR) 图像和视频。这些图像和视频的分辨率多数情况下可满足普通用途。
但是,在以下情况下,这些图像和视频被视作低分辨率 (LR):
- 设备不生成 HR 图像或视频(某些监控系统中的设备)。
- 查看的对象占整个图像或视频帧的一小部分,如距离摄像头较远的人脸或车牌。
- 模糊或噪声图像。
- 使用图像或视频的应用要求高于摄像头显示的分辨率。
- 在预处理阶段改善分辨率有助于提升利用这些图像的其他算法的性能,如面部检测。
超高分辨率是从 LR 图像中获取 HR 图像的一种方法。SR 可基于单张图像或视频序列的某几帧。
单图像(或单帧)SR 使用 LR 和 HR 图像对学习两者间的映射。为此创建了包含 LR 和 HR 对的图像数据库3,并用作训练集。经过学习的映射可预测新图像中的 HR 详细信息。
另一方面,多帧 SR 基于在同一场景中选取的几张图像,但是环境略有差别(如角度、照明和位置)。这一方法使用多张图像(或图像序列中的帧)中的非冗余信息改善 SR 性能。
本文将重点介绍单图像 SR 方法。
使用卷积神经网络实现单图像超高分辨率
该方法利用训练集训练神经网络 (NN),以学习训练集中 LR 和 HR 图像的映射。文献中有许多关于 SR 的参考资料。30 年以来,各种方法被提出并采纳。使用深度 CNN 的方法是最近几年发展起来的。第一批方法的创建者1描述了一个三层 CNN,并把它命名为超高分辨率卷积神经网络 (SRCNN)。他们对该领域的开创性贡献除了证明从 LR 到 HR 的映射可以被配置为 CNN 之外,还在于创建了一个通常被用作参考的模型。新方法比较它的性能与 SRCNN 结果。这些创建者最近根据原始 SRCNN 开发了一个修改版本,并将其命名为快速超高分辨率卷积神经网络 (FSRCNN),恢复质量和运行速度2得以显著改善。
在本文中,我们将详细介绍 SRCNN 和 FSRCNN,在另一个单独教程中,我们将展示改进后的 FSRCNN 的实施。SRCNN 和 FSRCNN 均可和其他已发布的网络架构(或读者想要尝试的其他架构)结合使用,成为深入实验的基础。尽管 FSRCNN(及面向 SR 的其他新型网络架构)相比 SRCNN 有明显改善,本文仍介绍了原始 SRCNN,以展示这款开创性网络如何由创建之处发展为可利用不同拓扑优化结果的新网络。在本教程中,我们将使用英特尔 Caffe 分发包深度学习框架和英特尔 Python 分发包实施 FSRCNN 网络,然后充分利用英特尔® 至强® 处理器、英特尔® 至强融核™ 处理器和英特尔® 库加快训练和测试该网络的速度。
超高分辨率卷积神经网络 (SRCNN) 结构
SRCNN 的创建者介绍了他们的网络,指出他们的方法等同于稀疏编码方法4,后者是一种广泛应用于图像 SR 的学习方法。由于基于示例的学习方法可以在 CNN 模型中调整与推广,可见他们的工作非常重要,而且具有教育意义。
SRCNN 包含以下操作1:
- 预处理:将 LR 图像放大到所需的 HR 尺寸。
- 特性提取:从放大的 LR 图像中提取一系列特性图。
- 非线性映射:将代表 LR 的特性图映射到 HR 块。
- 重构:从 HR 块中产生 HR 图像。
操作 2–4 可被配置为 CNN 中的卷积层,输入第 1 步的预处理图像,输出 HR 图像。该 SRCNN 结构包含 3 个卷积层:
- 输入图像:上采样 LR 图像,得到所需的高分辨率和 c 通道(图像的色彩成分)
- 卷积层 1:补丁提取
- n1个过滤器,尺寸为 c× f1× f1
- 激活函数:ReLU(修正线性单元)
- 输出:n1个特性图
- 优化参数:c× f1× f1× n1个权重和 n1个偏差
- 卷积层 2:非线性映射
- n2个过滤器,尺寸为 n1× f2× f2
- 激活函数:ReLU
- 输出:n2个特性图
- 优化参数:n1× f1× f1× n2个权重和 n2个偏差
- 卷积层 3:重构
- 1 个过滤器,尺寸为 n2× f3× f3
- 激活函数:身份
- 输出:HR 图像
- 优化参数:n2× f3× f3× c个权重和 c 个偏差
- 损失函数:训练集中 N 个重构的 HR 图像和 N 个原始真实 HR 图像之间的均方误差 (MSE)(N 是训练集中图像的数量)。
在本文中,SRCNN 的创建者改变了过滤器的数量,在若干设置中实施并测试了 SRCNN。他们增加了参过滤器的数量,提升了 SR 性能,但是优化参数的增加(权重和偏差)导致计算成本升高。下图是他们的参考模型,在准确性/性能方面显示了出色的整体结果(图 1):
- 输入图像:LR 单通道图像上采样为所需的高分辨率
- 卷积层 1:补丁提取
- 64 个过滤器,尺寸为 1 x 9 x 9
- 激活函数:ReLU
- 输出:64 个特性图
- 优化参数:1 x 9 x 9 x 64 = 5184 个权重和 64 个偏差
- 卷积层 2:非线性映射
- 32 个过滤器,尺寸为 64 x 1 x 1
- 激活函数:ReLU
- 输出:32 个特性图
- 优化参数:64 x 1 x 1 x 32 = 2048 个权重和 32 个偏差
- 卷积层 3:重建
- 1 个过滤器,尺寸为 32 x 5 x 5
- 激活函数:身份
- 输出:HR 图像
- 优化参数:32 x 5 x 5 x 1 = 800 个权重和 1 个偏差
图 1. 显示参考模型参数的 SRCNN 结构。
快速超高分辨率卷积神经网络 (FSRCNN) 结构
SRCNN 创建者最近开发了一款全新 CNN,可加快训练和预测任务,同时获得与 SRCNN 不相上下甚至更出色的性能。新 FSRCNN 包含以下操作2:
- 特性提取:直接从 LR 图像中提取一系列特性图。
- 缩小:通过使用少量的过滤器(相比特性提取使用的过滤器数量),减小特性向量的维度(因此降低参数数量)。
- 非线性映射:将代表 LR 的特性图映射至 HR 补丁。使用若干映射层执行该步骤,小于 SCRNN 中使用的过滤器尺寸。
- 扩大:增大特性向量的维度。为了更准确地生成 HR 图像,该操作执行与缩小层相反的操作。
- 去卷积:根据 HR 特性生成 HR 图像。
创建者详细介绍了 SRCNN 和 FSRCNN 的差别,与快速实施和实验(在本文和相关教程讨论范围内)最为相关的信息如下所示:
- FSRCNN 在非线性映射操作中使用了多个卷积层(SRCNN 中仅有一层)。可针对实验更改层数(相比创建者的版本)。重构后的性能和准确性可能根据上述更改而有所差异。它也是调整 CNN 的最佳示例,具体方法是将一定比例的 FSRCNN 固定在非线性映射层,然后添加或改变这些层,在非线性 LR-HR 映射操作中试验各种长度。
- 输入图像直接是 LR 图像。和 SRCNN 不同的是,不需要对它进行上采样,也能达到预期的 HR 图像尺寸。这就是网络速度变快的部分原因,和 SRCNN 相比,特性提取阶段使用的参数数量更少。
如图 2 所示,之前显示的 5 个操作可以被配置为 CNN,利用卷积层配置操作 1–4,利用去卷积层配置操作 5。通过参数修正线性单元 (PReLU) 层(请参见5)引入非线性,该模型的创建者选择了该层,这是因为它的性能比修正线性单元 (ReLU) 层更卓越、更稳定。请参阅附录 1,了解关于 ReLU 和 PReLU 的简要说明。
图 2. FSRCNN(56, 12, 4) 的结构。
根据创建者的反馈,整体性能最佳的模型是 FSRCNN (56, 12, 4)(图 2),该网络的 LR 特性维度为 56(第一层卷积层和去卷积层的过滤器数量),包含 12 个缩小过滤器(网络中间层的过滤器数量,执行映射操作),映射深度为 4(在 LR 和 HR 特性空间内执行映射的卷积层数量)。因此,该网络看上去像一个沙漏;两端粗(参数多),中间细(参数少)。该参考模型的整体形状对称,结构如下所示:
- 输入图像:LR 单通道。
- 卷积层 1:特性提取
- 56 个过滤器,尺寸为 1 x 5 x 5
- 激活函数:PReLU
- 输出:56 个特性图
- 参数:1 x 5 x 5 x 56 = 1400 个权重和 56 个偏差
- 卷积层 2:缩小
- 12 个过滤器,尺寸为 56 x 1 x 1
- 激活函数:PReLU
- 输出:12 个特性图
- 参数:56 x 1 x 1 x 12 = 672 个权重和 12 个偏差
- 卷积层 3–6:映射
- 4 x 12 个过滤器,尺寸为 12 x 3 x 3
- 激活函数:PReLU
- 输出:HR 特性图
- 参数:4 x 12 x 3 x 3 x 12 = 5184 个权重和 48 个偏差
- 卷积层 7:扩大
- 56 个过滤器,尺寸为 12 x 1 x 1
- 激活函数:PReLU
- 输出:12 个特性图
- 参数:12 x 1 x 1 x 56 = 672 个权重和 56 个偏差
- 去卷积层 8:去卷积
- 1 个过滤器,尺寸为 56 x 9 x 9
- 激活函数:PReLU
- 输出:12 个特性图
- 参数:56 x 9 x 9 x 1 = 4536 个权重和 1 个偏差
权重总数:12464(PReLU 层中还有少量参数)
图 3 显示在某个测试图像上使用经过训练的 FSRCNN 的示例。描述该网络的 protobuf 文件、训练和测试数据准备以及实施详情将在相关教程中详细探讨。
图 3. 使用经过训练的 FSRCNN 进行推断的示例。左图为原始图像。中图显示对原始图像进行下采样和模糊处理。右图是使用该网络重构后的 HR 图像。
总结
本文简要介绍了面向单图像超高分辨率的两个新型 CNN。我们选取的网络代表了实现 SR 的一流方法,也是首批发布的基于 CNN 的方法,提供了关于非 CNN 方法(稀疏编码)如何启发基于 CNN 的方法的有趣见解。在本教程中,借助英特尔® Caffe* 分发包框架和英特尔® Python* 分发包框架显示了 FSRCNN 的实施。该参考实施可以用作对该网络的变化进行试验,也是实施最近发布的新网络(以实现超高分辨率)的基础。它是调整网络的绝佳示例。最近发布了配备不同架构的新网络,这些网络改善了重构或训练/推断速度,某些网络试图解决多帧 SR 问题。鼓励读者对新网络进行实验。
附录 1:修正线性单元(整流器)
神经网络中的修正线性单元(整流器)是一种在网络中引入非线性的方法。非线性层(也称作激活层)在防止 NN 变成学习功能有限的纯线性模型方面必不可少。其他可能出现的激活层包括 sigmoid 函数或双曲正切 (tanh) 层。但是,整流器的计算效率更高,有助于改善 CNN 的整体训练。
传统修正线性单元 (ReLU) 的最常用的整流器,它执行以下数学运算:
xi是 i-th 通道上的输入。
参数修正线性单元 (PReLU) 是最近发布的另一个整流器5,被定义为:
其中,参数 pi控制代表负输入的直线斜率。这些参数将在训练阶段和模型共同学习。为了减少参数数量,pi参数可被压缩为面向所有通道的可学习参数。
leaky ReLU (LReLU) 是 PReLU 的一个特例,它的 pi被定义为面向所有输入通道的小常量 k。
在 Caffe 中,PReLU 层可以被定义为(在 protobuf 文件中)
layer { name:"reluXX" type:"PReLU" bottom:"convXX" top:"convXX" prelu_param { channel_shared:1 } }
在这种情况下,跨多个通道共享负斜率。也可以使用固定斜率的 LReLU:
layer { name:"reluXX" type:"PReLU" bottom:"convXX" top:"convXX" prelu_param { filler:0.1 } }
参考资料
1. C.Dong,C. C. Loy,K. He 和 X. Tang,“学习面向图像超高分辨率的深度卷积网络”,2014 年。
2. C.Dong,C. C. Loy 和 X. Tang,“加速超高分辨率卷积神经网络”,2016 年。
3. P.B. Chopade 和 P. M. Patil,“单帧和多帧图像超高分辨率及其性能分析:综合调查”,2015 年 2 月。
4. J.Yang,J. Wright,T. Huang 和 Y. Ma,“通过稀疏表示实现图像超高分辨率”,《IEEE图像处理汇刊》,第 2861-2873 页,2010 年。
5. K.He,X. Zhang,S. Ren 和 J. Sun,“深入探讨整流器:ImageNet 分类性能超越人类水平”,arxiv.org,2015 年。
6. A.Greaves 和 H. Winter,“借助卷积神经网络实现多帧视频超高分辨率”,2016 年。
7. J.Kim,J. K. Lee 和 K. M. Lee,“使用深度卷积网络的准确的图像超高分辨率”,2016 年。