论文笔记 —— SRCNN

来源:互联网 发布:乌克兰胖爸 知乎 编辑:程序博客网 时间:2024/06/15 20:38

任何学习都应该从接口开始,而非实现

本文系论文 Learning a Deep Convolutional Network for Super-Resolution (ECCV 2014)的阅读笔记。

先讲讲传统方法。

以基于 Sparse Coding 的超像素算法为例。通常是学习两组字典——一组低分辨率字典和一组高分辨率字典,假设分别有 n1n2 个字典项。当重建图像时,先对图像密集地提取 patches,将每个 patch 在低分辨率字典上编码得到 n1 维的系数向量,再将其映射为 n2 维的编码向量,依据编码向量在高分辨率字典下重建每个 patch,最后对将重叠的 patches 求平均得到每个像素点的超像素值。

我们发现有三个过程:

  1. 密集采样 patches,并分别映射到一组基上得到编码向量;
  2. 编码向量的(非线性)映射;
  3. 在另一组基上重建 patches 并求平均以得到每个点的像素值。

第一个过程 patches 在基上的映射实际上是基在图像上的卷积,第二个过程可以看成是向量到向量的非线性映射,第三个过程中编码重建再 patch averaging 的过程其实等价于另一组基在 w×h×n2 的特征图上的卷积(这一点比较难理解,想象 n2 维的编码向量对 n2f×f 的基向量加权和以重建一个 patch,再将邻近的重建 patches 求平均,是不是等价于 f×f×n2 的滤波器在 w×h×n2 的编码图里的卷积操作?)。

所以很有意思的是,虽然概念不同,但这三个过程似乎都对应 CNN 中的神经网络层:第一个和第三个过程对应卷积层,第二个过程对应全连接层。

这就是 CNN for Super-Resolution 的基本思路,以下是其网络结构(来自论文配图):

这里写图片描述

其参数设置为 f1=9, f3=5, n1=64, n2=32,前两层的激活函数都是 ReLU,第三层只是线性卷积运算,未使用激活函数。文章使用均方误差(Mean Squared Error, MSE)作为损失函数。训练时间为 3 天左右,测试时间 0.39 秒/图(运行环境 3.10 GHz CPU 和 16 GB 内存,C++)。

以下是部分测试结果:

这里写图片描述

SRCNN 的网络结构比较简单,找时间用 Keras 实现一下,也会补充到本文的最后。

0 0
原创粉丝点击