目录
Deep K-SVD Denoising
一、预备知识
1.1 Iterative Shrinkage Thresholding Algorithm(ISTA)
这个可以看这篇文章:ISTA
1.2 K-SVD
对于模型:
min D , X ∥ Y − D X ∥ F 2 , s.t. ∀ i , ∥ x i ∥ 0 ≤ ε \min _{{D}, {X}}\|{Y}-{D} {X}\|_{F}^{2}, \quad \text { s.t. } \forall i,\left\|{x}_{i}\right\|_{0} \leq \varepsilon D,Xmin∥Y−DX∥F2, s.t. ∀i,∥xi∥0≤ε
首先随机初始化一个字典 D D D,利用OMP算法,计算得到稀疏编码矩阵 X X X。模型可以简化为:
min D ∥ Y − D X ∥ F 2 \min_D\|Y-DX\|_{F}^{2} Dmin∥Y−DX∥F2
逐列更新字典。下面以更新字典的第 k k k列为例,记 d k d_k dk为字典 D D D的第 k k k列向量,记 x T k x^k_T xTk为稀疏矩阵 X X X的第 k k k行向量,所以有:
∥ Y − D X ∥ F 2 = ∥ Y − ∑ j = 1 K d j x T j ∥ F 2 = ∥ ( Y − ∑ j ≠ k d j x T j ) − d k x T k ∥ F 2 = ∥ E k − d k x T k ∥ F 2 \begin{aligned} \|{Y}-{D} {X}\|_{F}^{2} &=\left\|{Y}-\sum_{j=1}^{K} {d}_{j} {x}_{T}^{j}\right\|_{F}^{2} =\left\|\left({Y}-\sum_{j \neq k} {d}_{j} {x}_{T}^{j}\right)-{d}_{k} {x}_{T}^{k}\right\|_{F}^{2}=\left\|{E}_{k}-{d}_{k} {x}_{T}^{k}\right\|_{F}^{2} \end{aligned} ∥Y−DX∥F2=∥∥∥∥∥Y−j=1∑KdjxTj∥∥∥∥∥F2=∥∥∥∥∥∥⎝⎛Y−j=k∑djxTj⎠⎞−dkxTk∥∥∥∥∥∥F2=∥∥Ek−dkxTk∥∥F2
上式中残差 E k = Y − ∑ j ≠ k d j x T j {E}_{k}={Y}-\sum_{j \neq k} {d}_{j} {x}_{T}^{j} Ek=Y−∑j=kdjxTj。
此时优化问题可描述为:
min d k , x T k ∥ E k − d k x T k ∥ F 2 \min _{{d}_{k}, {x}_{T}^{k}}\left\|{E}_{k}-{d}_{k} {x}_{T}^{k}\right\|_{F}^{2} dk,xTkmin∥∥Ek−dkxTk∥∥F2
因此我们需要求出最优的 d k d_k dk, x T k x^k_T xTk,这里利用SVD的方式求解出两个优化变量。
但是,在这里需要注意的是,不能直接利用 E k E_k Ek进行求解,否则求得的新的 x T k x^k_T xTk不稀疏。因此我们需要将 E k E_k Ek中对应的 x T k x^k_T xTk不为0的位置提取出来,得到新的 E k ′ E'_k Ek′。
上图很好的说明了如何求得 x T ′ k x'^k_T xT′k和 E k ′ E'_k Ek′。其实也很容易理解,这样求解出来的 x T ′ k x'^k_T xT′k和 E k ′ E'_k Ek′只会越来越稀疏,因为每次都是取非0的数进行计算的!
此时优化问题可描述为:
min d k , x T k ∥ E k ′ − d k x T ′ k ∥ F 2 \min _{{d}_{k,} {x}_{T}^{k}}\left\|{E}_{k}^{\prime}-{d}_{k} {x}_{T}^{\prime k}\right\|_{F}^{2} dk,xTkmin∥∥Ek′−dkxT′k∥∥F2
因此我们需要求出最优的 d k d_k dk, x T ′ k x'^k_T xT′k,根据SVD分解,可得到:
E k ′ = U Σ V T {E}_{k}^{\prime}=U \Sigma V^{T} Ek′=UΣVT
取左奇异矩阵 U U U的第1个列向量作为 d k d_k dk,取右奇异矩阵的第1个行向量与第1个奇异值的乘积作为 x T ′ k x'^k_T xT′k,然后将其对应地更新到 x T k x^k_T xTk。
这样迭代一定数目之后,算法就可以训练出一个性能比较好的字典了。K-SVD算法的流程图如下:
1.3 Conv2d: Unfold and Fold
平时使用卷积操作时,既卷积核滑动窗口操作,调用nn.Conv2d就能完成对输入的卷积操作。但有时,可能要探究卷积核对应的某一通道的单个窗口的卷积操作,或显式地进行卷积操作。此时,就需要nn.Unfold和nn.Fold。
一般来说,Conv2d = Unfold + matmul + Fold
。
- nn.Unfold按照官方的说法,就是从一个batch样本中,提取出滑动的局部区域块,也就是卷积操作中的提取Filter对应的滑动窗口。
- nn.Fold的操作与nn.Unfold相反,将提取出的滑动局部区域块还原成batch的张量形式。
下图很清晰的说明了nn.Unfold是如何工作的。
nn.Unfold的参数如下:
torch.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1)
nn.Unfold的输入为 ( N , C , H , W ) (N , C , H , W ) (N,C,H,W),那么nn.Unfold的输出为 ( N , K , L ) (N , K, L) (N,K,L),计算公式如下:
K = C × ∏ ( k e r n e l _ s i z e ) K = C\times \prod(kernel\_size) K=C×∏(kernel_size)
L = ∏ d ⌊ spatial_size [ d ] + 2 ⋅ padding [ d ] − dilation [ d ] ⋅ ( kernel_size [ d ] − 1 ) − 1 stride [ d ] + 1 ⌋ L=\prod_{d}\left\lfloor\frac{\text{spatial\_size}[d]+2\cdot\text{padding}[d]-\text{dilation}[d]\cdot(\text{kernel\_size}[d]-1)-1}{\text{stride}[d]}+1\right\rfloor L=d∏⌊stride[d]spatial_size[d]+2⋅padding[d]−dilation[d]⋅(kernel_size[d]−1)−1+1⌋
其中,spatial_size表示输入张量的空间维度。
Example: input:(1,2,4,4)+kernel_size:(3,3)–>output:(1,18,4)
二、论文解读
这篇paper主要的贡献是提出了一个端到端的深度学习算法框架(LKSVD)。这个框架保留K-SVD算法原来的计算路径的同时,重新设计了一个基于监督学习的架构。这套架构需要学习的参数量少,并且保留了K-SVD算法的本质,其性能大大优于经典的K-SVD算法,并且非常接近最先进的基于深度学习的去噪方法。
LKSVD的框架如下:
在这个框架中,首先利用前面讲的Unfold的方式,将图片展开成很多重叠的小块,然后对每一小块做之后的处理。图中Patch Decomposition就是负责这一块的。再之后,在Patch Denoiser中,就是求解sparse coding的过程。也就是已知 y y y和字典 D D D求解稀疏向量 x x x。这里采用的是ISTA算法。由于ISTA算法中的 λ \lambda λ极大的影响算法的性能,这个框架中,专门使用一个神经网络来估计 λ \lambda λ,其他的和ISTA算法一致。最后,采用平均的方式,用Fold将各个子块恢复为图片。整个架构的损失函数就是MSE。
下面分别说明每一部分。
2.1 Patch Denoiser:Sparse Coding
将 ℓ 0 \ell_0 ℓ0范数换为 ℓ 1 \ell_1 ℓ1范数,稀疏编码问题可以转换为如下:
α ^ = arg min α 1 2 ∥ D α − y ∥ 2 2 + λ ∥ α ∥ 1 \hat{\alpha}=\arg \min _{\alpha} \frac{1}{2}\|\mathbf{D} \alpha-\mathbf{y}\|_{2}^{2}+\lambda\|\alpha\|_{1} α^=argαmin21∥Dα−y∥22+λ∥α∥1
其中, λ > 0 \lambda>0 λ>0是正则化系数。利用ISTA算法来学习稀疏编码矩阵 α \alpha α,其迭代式如下:
α ^ t + 1 = S λ / c ( α t ^ − 1 c D T ( D α ^ t − y ) ) ; α ^ 0 = 0 \hat{\alpha}_{t+1}=S_{\lambda / c}\left(\hat{\alpha_{t}}-\frac{1}{c} \mathbf{D}^{T}\left(\mathbf{D} \hat{\alpha}_{t}-\mathbf{y}\right)\right) ; \quad \hat{\alpha}_{0}=0 α^t+1=Sλ/c(αt^−c1DT(Dα^t−y));α^0=0
其中, c c c 是 D D D的平方谱范数, S λ / c S_{\lambda/c} Sλ/c是软阈值操作函数:
[ S θ ( v ) ] i = sign ( v i ) ( ∣ v i ∣ − θ ) + \left[S_{\theta}(\mathbf{v})\right]_{i}=\operatorname{sign}\left(v_{i}\right)\left(\left|v_{i}\right|-\theta\right)_{+} [Sθ(v)]i=sign(vi)(∣vi∣−θ)+
通过近端梯度下降方法,将稀疏编码部分变成一个可学习的版本,其中 c c c和 D D D是可学习的参数。
2.2 Patch Denoiser: λ \lambda λ Evaluation
为了让误差可控,对每个 y k y_k yk都学习一个 λ k \lambda_k λk。利用神经网络学习一个回归函数,也就是做如下映射:
λ = f θ ( y ) \lambda = f_{\theta}(y) λ=fθ(y)
其中, θ \theta θ为神经网络的参数。
具体网络架构如下:
M L P : y → [ p × 2 p ] → R e L U → [ 2 p × p ] → R e L U → [ p × 1 2 p ] → R e L U → [ 1 2 p × 1 ] → λ \begin{aligned} MLP:y &\rightarrow [p\times 2p] \rightarrow ReLU \\ &\rightarrow [2p\times p] \rightarrow ReLU\\ &\rightarrow [p\times \frac{1}{2}p] \rightarrow ReLU\\ &\rightarrow [\frac{1}{2}p\times 1] \rightarrow \lambda \end{aligned} MLP:y→[p×2p]→ReLU→[2p×p]→ReLU→[p×21p]→ReLU→[21p×1]→λ
其中, p p p为字典 D D D的行数。在整个网络中,一共也只有 4 p 2 4p^2 4p2个参数。
2.3 Patch Denoiser: Patch Reconstruction
y ^ \hat y y^是经过降噪后得到的图片矩阵,根据已经求得的字典 D D D和稀疏向量 α ^ \hat \alpha α^就可以得到降噪后的图片:
y ^ = D α ^ \hat y = D \hat\alpha y^=Dα^
在神经网络里面, D D D是一组可学习的参数。
整个Patch Denoising和Patch Reconstruction过程与Convolutional Sparse Coding方法高度相关。
2.4 End-to-End Architecture
这个完整的端到端的算法架构可以描述如下:
- 将输入图像分割成完全重叠的patch;
- 通过上述Patch Denoising阶段对每个损坏的patch进行处理;
- 对这些patch的干净版本取平均来重构图像。
在最后一步中,舍弃原始的K-SVD,设计一个可学习的方法来重构图像。令 w ∈ R p × p \mathbf{w} \in \mathbb{R}^{\sqrt{p} \times \sqrt{p}} w∈Rp×p为每一块的权重系数,通过下式得到重构后的图像:
Y ^ = ∑ k R k T ( w ⊙ y ^ k ) ∑ k R k T w \hat{\mathbf{Y}}=\frac{\sum_{k} \mathbf{R}_{k}^{T}\left(\mathbf{w} \odot \hat{{y}}_{k}\right)}{\sum_{k} \mathbf{R}_{k}^{T} \mathbf{w}} Y^=∑kRkTw∑kRkT(w⊙y^k)
在整个算法中,可学习的参数有: θ \theta θ, c c c, D D D, w \mathbf{w} w。
三、参考文献
Scetbon M, Elad M, Milanfar P. Deep k-svd denoising[J]. IEEE Transactions on Image Processing, 2021, 30: 5944-5955.
Aharon M, Elad M, Bruckstein A. K-SVD: An algorithm for designing overcomplete dictionaries for sparse representation[J]. IEEE Transactions on signal processing, 2006, 54(11): 4311-4322.
Beck A, Teboulle M. A fast iterative shrinkage-thresholding algorithm for linear inverse problems[J]. SIAM journal on imaging sciences, 2009, 2(1): 183-202.