参考文献:(CVPR19)Noise2Void-Learning Denoising from Single Noisy Images
知乎同名账号同步发布
目录
一、基础和背景介绍
在noise2noise的基础上,甚至不需要pair就能训练。作者说虽然不能期望所提方法优于在训练期间具有额外可用信息的方法,但去噪性能仅略有下降,且仍然优于BM3D。用于3个生物医学数据集时,发现由于缺乏ground-truth,传统方法无法训练;noise2noise只适用于一些情况。作者证明了N2V具有巨大的实用性。
二、所提方法和架构
方法的核心思想是patch-based view和噪声独立性假设(给定信号s,不同position的噪声 n i n_i ni和 n j n_j nj之间相互独立)。
2.1,☆patch-based view
2.1.1,patch-based有监督学习
给定一个全卷积网络FCN,传统的观点认为网络在做的事情是:
f
(
x
;
θ
)
=
s
^
f(x;\theta)=\hat{s}
f(x;θ)=s^
即输入noisy image x,输出去噪结果(也就是预测的原始图像信号)
s
^
\hat{s}
s^,
θ
\theta
θ是网络的参数。
现在作者给了一个新的观点,作者认为输出结果s中的每一个像素,由于感受野的限制,其实只取决于输入x中的一部分区域。所以作者用了一个新的公式:
f
(
x
R
F
(
i
)
;
θ
)
=
s
i
^
f(x_{RF(i)};\theta)=\hat{s_i}
f(xRF(i);θ)=si^
上式右端的
s
i
^
\hat{s_i}
si^表示预测的去噪结果中第i个像素,受限于感受野大小,这个像素其实取决于输入x中的一个patch
x
R
F
(
i
)
x_{RF(i)}
xRF(i),这个patch是以位置i为中心的。
这样一来,传统的监督学习就可以表示为:给定一堆训练的pairs
(
x
j
,
s
j
)
(x^j,s^j)
(xj,sj),可以将pairs重新视为
(
x
R
F
(
i
)
j
,
s
i
j
)
(x^j_{RF(i)},s^j_i)
(xRF(i)j,sij)。上标表示这是第j个样本,下标表示这是第i个位置的像素。然后传统的监督学习就可以表示为:
2.2.2,patch-based noise2noise
同样地,noise2noise也能用上述观点来阐述,本来训练的pairs是
(
x
j
,
x
′
j
)
(x^j, x^{'j})
(xj,x′j),其中:
x
j
=
s
j
+
n
j
a
n
d
x
′
j
=
s
j
+
n
′
j
x^j=s^j+n^j\ and\ x^{'j}=s^j+n^{'j}
xj=sj+nj and x′j=sj+n′j
即同一场景下的两次noisy observation。
现在可以将pairs视为 ( x R F ( i ) j , x i ′ j ) (x^j_{RF(i)},x^{'j}_i) (xRF(i)j,xi′j),也就是说target是原目标中位置i的像素,input是原输入中以位置i为中心的patch(patch大小取决于网络感受野)。
2.2.3,patch-based view in single image
现在,带着patch view的观点,noise2void要横空出世了。作者认为,如果对于一个single image,以其中的一个patch作为网络的input,以这个patch中心位置的像素作为target,那么网络将会学习到直接将输入patch中心的像素映射到网络的输出。作者认为可以在这个基础上改进一点,将输入的patch的中心像素抹去,那么网络说不定会表现得更好,如下图所示:
上图左边是将一个patch作为输入,target是这个patch中心位置的像素,这时感受野是整个patch;右边是将patch的中心像素先抹去再输入,这样感受野就缺失了中心位置的像素。现在需要思考的就是,抹掉中心位置的像素后,网络会怎么进行学习呢?
⚠️接下来要先讲述作者说的噪声独立假设,才能思考上述问题
2.2,噪声独立假设和其他假设
所谓噪声独立假设,作者给出了一个公式来说明:
p
(
n
∣
s
)
=
∏
i
p
(
n
i
∣
s
i
)
p(n|s)=\prod_i p(n_i|s_i)
p(n∣s)=i∏p(ni∣si)
也就是说,给定信号s(s指的就是clean target),不同位置的噪声像素之间是相互独立的。
作者对信号也做了假设,也就是不同位置的信号像素不是相互独立的:
p
(
s
i
∣
s
j
)
≠
p
(
s
i
)
p(s_i|s_j)\neq p(s_i)
p(si∣sj)=p(si)
当然也和noise2noise一样,作者也做了噪声零均值假设:
E
[
n
i
]
=
0
E[n_i]=0
E[ni]=0
即:
E
[
x
i
]
=
s
i
E[x_i]=s_i
E[xi]=si
意义自明,如有不理解建议先学习noise2noise。
有了这几个假设,就可以开始愉快的分析了。
2.3,noise2void
现在,我们重新开始考虑一个问题:
这是刚才没有讨论的架构,即输入的patch抹去中心位置的像素,网络的target为这个patch中心位置的像素。
换句话说,输入缺失了中心位置的信息,但要求预测中心位置的信息。
⚠️中心位置i的信息指的是:i位置的信号像素 s i s_i si和i位置的噪声像素 n i n_i ni。
还记得刚才的假设吗?不同位置的噪声像素是独立的,不同位置的信号像素不是独立的。也就是说,input缺失了中心位置的噪声像素,那么它不可能通过i位置周围的像素来预测中心位置的噪声像素;input缺失了中心位置的信号像素,由于信号不是相互独立,所以它可以通过i周围的像素预测中心位置的信号像素。
上面这句话十分令人眼熟,还记得noise2noise的思想:由于网络不可能学到将一个随机噪声观测映射到另一个随机噪声观测,所以随着训练的进行,网络会倾向去输出“随机的期望”,如果噪声是零均值的,那么随机的期望就是clean target,即信号本身。那么noise2void也同理,网络不可能学会将输入的patch(缺失了中心像素的信息)映射到输出(中心像素),因为噪声是相互独立的,i周围的像素没有i位置的噪声信息,换句话说,输入和输出都可视为随机且相互独立的noise observation,它们的noise是相互独立的,那么在这种情况下,网络会倾向于输出什么呢?
聪明的你可能想到了,网络会输出中心像素的期望,也就是:
E
(
x
i
)
E(x_i)
E(xi)
而它在满足之前所说的噪声零均值假设的时候,就等于信号的第i个像素
s
i
s_i
si,等于这个clean target。
三、实现细节和实验结果
3.1,实验细节
实现细节大概是这样:随机选取一个64×64的patch(这个大小是大于网络感受野的)。然后从中随机选取N个点,对于每一个点,以它为中心、以网络感受野为大小的小patch,即上图的(b),用随机一个pixel(上图b的蓝色块)替换掉中心的pixel(上图b的红色块),然后这个小patch就是网络的input(它已经被抹掉了中心位置的像素信息)。然后以上图©为对应的target,它只保留了中心位置的像素信息。这样一来,输入一个64×64的patch做训练,一次就能够计算N个点对应的梯度,作者说这句话是想表达:如果不用这个trick,那么就需要处理整个patch才能计算一个点的梯度,计算成本就比较高。
(注意采样N个点的时候采用stratified sampling以避免clustering)
3.2,实验结果
以下部分内容参考:
知乎用户seniusen的回答(https://zhuanlan.zhihu.com/p/133961768)
比如下图所示,红色箭头所指的位置是一个孤立的亮点,而其周围比较暗,这样 N2V 就不能从周围像素中正确地预测出中间像素:
如果噪声不满足相互独立的假设,那么也不能获得良好的效果: