ECCV 2014

SRCNN 论文精读
从 Sparse Coding
到端到端 CNN 超分

Single Image Super-Resolution
End-to-End Mapping
Fast Feed-Forward Inference
Dong et al. · ECCV 2014 · Image Restoration
Bicubic PSNR=38.85
Bicubic
ScSR PSNR=39.62
Sparse Coding
SRCNN PSNR=40.71
SRCNN ✦
02

Bicubic

$$\hat{p}=\sum_{i=-1}^{2}\sum_{j=-1}^{2}w_iw_jp_{ij}$$
数据处理不等式
X  →  Y  →  Z
I(X ; Y) ≥ I(X ; Z)
无论后续怎样处理数据,都不能添加原本不存在的信息。对应到 Bicubic:它只能重排、加权和平滑 LR 中已有的像素,不能凭空恢复降采样时丢失的高频细节。
03

Sparse Coding SR

那么,是否意味着超分辨率理论上不可能?
不一定
如果有其他信息来源,就可以用先验知识约束答案。这里引入机器学习的 Sparse Coding
额外信息来源:训练集图像库
free training sample 1 free training sample 2 free training sample 3 free training sample 4 free training sample 5 free training sample 6 free training sample 7 free training sample 8
学习 LR/HR patch 对应关系
D_l
D_h
+
不只靠几何插值,
还利用数据先验 补细节
LR
Patches
Dl
α*
Dh
Avg
HR
测试时逐 patch 求解(关键瓶颈)
\(\alpha^*=\arg\min_{\alpha}\|D_l\alpha-y\|_2^2+\lambda\|\alpha\|_1\)
\(x=D_h\alpha^*\quad(\text{HR patch 重建})\)
DlDh 离线训练好  ·  但 α* 必须在测试时对每个 patch 单独迭代求解
稀疏表示原理:同一 α* 连接 LR ↔ HR 空间
从单个 patch 到整图输出:SC 的实际推理流水线
字典离线训练;真正耗时的是对每个重叠 patch 在线求稀疏编码
1 Bicubic 先对齐尺寸
×2
LR/HR 都在目标分辨率比较
2 滑窗切重叠 patch
36
个 5×5 patch
3 去均值只保留细节
ỹ = y - μ
4 LR 字典编码求 α
argmin:重建误差 + 稀疏惩罚
5 HR 字典重建细节
=
x = D_h α + μ
6 重叠区域取平均
HR[p] = avg(...)
抹平 patch 边界误差
所以 SC 的瓶颈不是“不会重建”,而是:每个 patch 都要反复解一次稀疏优化问题
04

为何 CNN 此前没被用于超分?分类网络的架构全是"压缩"机制

2014 年之前,CNN 在图像分类上已非常成功(AlexNet 2012)。 但分类 CNN 的整套架构是"层层压缩"——专门设计来扔掉空间细节; 而超分恰恰需要"保留并恢复空间细节",需求完全相反。甚至可以说,在SRCNN之前,卷积核的滑动更多是用于模糊图片而非清晰图片
分类 CNN 的本质:层层压缩空间,最终输出 1 个类别标签
224×224×3
输入图像
112×112×64
conv + pool
56×56×128
conv + pool
28×28×256
继续缩
7×7×512
conv + pool
FC 层
压扁拉直
1000 类
输出
~15 万维像素表示  →  被层层压缩成 1 个类别标签
分类 CNN 中的"反超分"设计:三件事都在丢空间细节
池化(Pooling)
把 2×2 区域压成 1 个值
空间尺寸直接减半
作用:抓"语义",不管"猫耳朵在哪个像素"
大步长卷积
stride = 2 或更大
每两格才采样一次
作用:迅速缩小空间尺寸,扔掉局部细节
全连接层(FC)
把整张特征图压扁
变成一维向量
作用:融合所有空间信息,做出一个分类决策
这正是大家"想不到用 CNN 做 SR"的原因
分类 CNN 看上去和超分需求完全相反——超分需要"保留并恢复每一个像素的位置",而分类正在拼命扔掉它。
SRCNN 的转念:把卷积层"拆"出来重用
"压缩属性"全在池化和 FC,纯卷积层本身是保留尺寸的——只用卷积,不用池化和 FC,就成了一个低层视觉处理器。
05

论文 Fig. 3:把 Sparse Coding 从 CNN 视角重解释

SRCNN paper Fig. 3
Sparse-coding-based SR in the view of CNN
Sparse coding based super-resolution viewed as a convolutional neural network
KEY POINT
SC 流程可以被 CNN 化。
红点表示我们追踪的一个最终 HR 像素:它来自一个输入 patch、一次非线性编码,以及周围多个重叠 patch 的聚合。
01 / PATCH EXTRACTION
看一个 \(f_1\times f_1\) LR patch
SC:抽 patch,再投影到 LR dictionary 得到 \(n_1\) 个响应。
SRCNN:第一层 \(9\times9\) Conv 产生 64 张 feature maps。
02 / NON-LINEAR MAPPING
\(n_1\rightarrow n_2\):稀疏求解器
传统 SC 每个 patch 都要现场求:
$$\alpha^*=\arg\min_\alpha \lVert D_l\alpha-y\rVert_2^2+\lambda\lVert\alpha\rVert_1$$
SRCNN:用 \(1\times1\) Conv + ReLU 直接前馈近似这个非线性映射。
03 / RECONSTRUCTION
\(f_3\times f_3\) neighbouring patches
一个输出红点会被多个重叠 HR patch 同时预测;SC 最后做 HR dictionary projection + averaging。
SRCNN:第三层 \(5\times5\) Conv 学会如何融合邻域预测。
Fig. 3 的作用:SC 的 patch 提取、稀疏求解、HR 重建和重叠平均,都能被卷积层吸收。
SRCNN 进一步把这些模块变成 \(W_1,W_2,W_3\),端到端一起训练。
$$Y\rightarrow F_1(Y)\rightarrow F_2(Y)\rightarrow F(Y)$$ $$\hat X(i,j)=W_3\cdot\mathrm{vec}(N_{5\times5}(F_2,i,j))+B_3$$
06

SRCNN:一个轻量级三层前馈网络

SRCNN paper Figure 2 architecture
Layer 1 — Patch Extraction
$$F_1(Y)=\max(0,W_1*Y+B_1)$$
Layer 2 — Nonlinear Mapping
$$F_2(Y)=\max(0,W_2*F_1(Y)+B_2)$$
Layer 3 — Reconstruction
$$F(Y)=W_3*F_2(Y)+B_3$$
Layer 1:一个位置的 64 维响应
f₁[p] =
横向边缘强度 纵向边缘强度 45° 边缘强度 纹理响应 平滑区域响应
f₁[p] ∈ R⁶⁴:同一像素位置的一列特征响应
Layer 2:把 64 维响应重新组合
f₂[p] = ReLU(W₂ f₁[p] + b₂), W₂ ∈ R³²ˣ⁶⁴
需要锐化的边缘成分 需要补的斜线细节 某种纹理原子
从“检测到什么”变成“该补什么”。
Layer 3:邻域聚合成最终像素
把周围位置的 32 维表示一起看,输出最终 HR 像素;相当于把 SC 的重建和重叠平均变成可学习卷积。
07

第一层:用 9×9 卷积高效扫描所有 patch

滑窗扫描原理
Patch Extraction and Representation
输入图像 Y 9×9 64个核 64 Feature Maps n₁ = 64 每位置:1×1×64 像素柱 空间 9×9 信息 → 通道 64 维特征表达 第一层学到的 64 个 9×9 卷积核(论文 Figure 5) 真实 filter 可视化:边缘、纹理、斑点检测器 实现细节 Valid Conv: H×W → (H−8)×(W−8)×64 边界各裁 4 px
公式与参数
$$F_1(Y)=\max(0,W_1*Y+B_1)$$
$$W_1:\underbrace{c}_{通道}\times\underbrace{f_1}_{核高}\times\underbrace{f_1}_{核宽}\times\underbrace{n_1}_{特征数}$$ $$c=1,\quad f_1=9,\quad n_1=64$$
直觉理解
  • 每个位置看一个 9×9 局部 patch
  • 输出一个 64 维特征向量
  • 卷积核 = 学出来的局部特征检测器
  • 等价于"切 patch + 线性变换 + ReLU"
参数量
5,184 weights + 64 biases
= 5,248 trainable params
08

第二层:1×1 卷积不是看空间,而是混合通道

通道混合原理
Non-linear Mapping(非线性映射)
第一层输出 1×1×64 1×1 Conv W₂: 64→32 ReLU 第二层输出 1×1×32 空间位置不变:(i,j) → (i,j),只在通道维做 64 → 32 的非线性混合
公式与含义
$$F_2(Y)=\max(0,W_2*F_1(Y)+B_2)$$ $$W_2:n_1\times1\times1\times n_2 \quad (64\to32)$$
$$B_2\in\mathbb{R}^{32}$$
每个输出通道一个偏置,控制 ReLU 激活门槛
直觉理解
  • 不混合邻居像素(1×1 无空间感知)
  • 只混合同位置 64 个通道
  • 等价于对每个像素独立应用一个小 MLP
  • 近似 SC 中的 sparse coding solver
  • 把 LR patch 特征翻译成 HR patch 表示
09

第三层:5×5×32 聚合邻域表示,重建最终像素

邻域聚合重建
Reconstruction(HR 重建与重叠区平均)
32 Feature Maps 5×5 ×32 channels W₃ 卷积聚合 32×5×5 → 1 pixel HR Image 最终画出一个像素点 单像素计算:5×5 邻域 × 32 通道加权求和 X̂(i,j)=ΣₖΣᵤΣᵥ W₃,k,u,v · F₂,k(i+u,j+v)+b₃ 对应 SC 的 HR patch projection + averaging
公式与参数
$$F(Y)=W_3*F_2(Y)+B_3$$ $$W_3:n_2\times f_3\times f_3\times c$$ $$n_2=32,\quad f_3=5,\quad c=1$$
Linear Output / 无激活函数
$$B_3\in\mathbb{R}^{c}$$
c=1(亮度图),B₃ 是一个标量偏置
对应 SC 中的操作
  • 融合邻近 patch 的预测(5×5 邻域)
  • HR 字典投影 + patch averaging → 可学习聚合
  • 无 ReLU:最后一层保留正负残差,直接输出像素值
参数量
32 × 5 × 5 × 1 = 800 weights
+ 1 scalar bias B₃
10

训练过程:SRCNN 如何学出三层参数?

训练样本对:从真实 HR 图像 X 构造输入 Y,再用 X 监督 F(Y;Θ)
实际训练通常裁剪大量 sub-images 作为样本
X
真实 HR
Blur
Downsample
Bicubic
Y
输入
SRCNN: F(Y;Θ)
forward with current parameters
F(Y)
预测 HR
X
GT
Loss / Compare
F(Y;Θ)-X
训练到底得到哪些参数?
≈ 8.1K params
$$\Theta=\{W_1,W_2,W_3,b_1,b_2,b_3\}$$
LAYER 1
θ₁={W₁,b₁}
W₁: 1×9×9×64
b₁: 64
学习 LR patch 的局部特征检测器
= 5,248
LAYER 2
θ₂={W₂,b₂}
W₂: 64×1×1×32
b₂: 32
学习 64 → 32 的非线性通道映射
= 2,080
LAYER 3
θ₃={W₃,b₃}
W₃: 32×5×5×1
b₃: 1
聚合 5×5 邻域的 32 维特征
= 801
训练循环:误差如何变成参数更新?
1 Initialize
随机初始化参数
Wᵢ~N(0,0.001²), bᵢ=0
2 Forward
当前参数生成预测
Y→F₁→F₂→F(Y)
3 Loss
计算与真实 HR 的误差
||F(Yᵢ;Θ)-Xᵢ||²
4 Backward
∇W₁ L, ∇W₂ L, ∇W₃ L
∇b₁ L, ∇b₂ L, ∇b₃ L
计算每层卷积核与 bias 的梯度
5 Update
Θ ← Θ − η∇_Θ L
论文使用 SGD + momentum
Repeat:一次次根据误差微调卷积核和 bias
MSE
\(\displaystyle L(\Theta)=\frac{1}{n}\sum_{i=1}^{n}\|F(Y_i;\Theta)-X_i\|^2\)
让 F(Y) 尽量接近 X
反向传播从哪里开始?
∂L/∂F(Y) = 2/n · (F(Y)-X)
预测结果和真实 HR 的差值,就是误差往回传的起点。
训练的本质:通过 X 与 F(Y) 的误差,反向更新 W₁,W₂,W₃,b₁,b₂,b₃。
11

生成结果对比:AnimeTest ×2 超分复现

主样本:006.jpeg
Bicubic / ScSR / SRCNN / HR
006 AnimeTest Bicubic ScSR SRCNN HR comparison
AVERAGE PSNR
32.76 dB
SRCNN 平均比 Bicubic 高 +1.71 dB,比 ScSR 高 +1.05 dB
测试集 7 images
SRCNN 胜出 7 / 7
平均推理 372 ms
补充样本:所有对比图均来自 uploads/test
Y 通道 PSNR,边界裁掉 scale=2 像素
000 comparison
001 comparison
002 comparison
003 comparison
004 comparison
005 comparison
视觉上,SRCNN 的边缘和纹理更接近 HR;量化上,7 张图全部超过 Bicubic 与 ScSR。
12

实验分析:质量收益稳定,速度来自前馈卷积

MEAN PSNR
32.76dB SRCNN
Bicubic 31.05 · ScSR 31.71
QUALITY GAIN
+1.71dB vs Bicubic
+1.05 dB vs ScSR,且 7/7 样本领先。
SPEED
≈1600×faster
SRCNN 372 ms vs ScSR 614 s / image。
PSNR by image
灰:Bicubic · 橙:ScSR · 蓝:SRCNN
imgBicubicScSRSRCNN
00026.5426.9327.71
00129.7530.6932.08
00226.5827.0127.66
00327.3627.7528.64
00430.6631.5132.67
00537.6138.4439.84
00638.8539.6240.71
平均推理耗时
Bicubic58 ms
SRCNN372 ms
ScSR614 s
条形为非线性缩放;重点是数量级差异。
为什么 ScSR 慢?
  • 每张图几十万 patch
  • 每个 patch 要解 L1 稀疏优化
  • SRCNN 只做一次全图前向卷积
Bicubic
无训练、毫秒级,但细节主要靠插值,PSNR 最低。
ScSR
字典学习有历史意义,但推理时逐 patch Lasso 成为瓶颈。
SRCNN
把复杂映射放到训练阶段,测试阶段只保留快速前向卷积。