基于PaddlePaddle复现Noise2Noise
本项目在参与【飞桨启航菁英计划】过程中完成,所属方向:计算机视觉图像处理。项目基于PaddlePaddle复现Noise2Noise,使得Denoised与clear image PSNR持平。
论文介绍
–> Noise2Noise: Learning Image Restoration without Clean Data
内容介绍
本文亮点是输入图像和目标图像都是有噪声的图像,而不是clean的图像,网络可以利用有噪声的图像学习到将有噪声的图像转化为无噪声的clean图像。文章解释了在使用l2 loss时,网络对于一对多的映射关系学习到的是映射值的均值,基于此idea,将clean的图像加上0均值的噪声作为target,数据量足够多时,网络就能学习到预测clean图;作者也探究了使用l1 loss的影响,即利用l1 loss的稀疏性,事先如果知道噪声的分布,且该分布下图片中的像素为噪声的概率较低时,使用l1 loss要优于l2 loss,其他情况根据噪声分布的实际情况设计相应的loss。
理论背景
在高分辨率算法中,由低分辨率到高分辨率图的对应是一对多的,也就是说,一张低分辨率图是可以对应多张高分辨率图的,网络直接使用l2 loss去回归高分辨率的结果,实际上会倾向于回归可能对应的高分辨率图像的均值,因此预测的高分辨率图会倾向于模糊。
也就是说,对于任务
,其最小值在𝑧=𝔼{𝑦}取得。
同样地,L1 loss取得最小值时在target的中位数处取得。
这样的一对多的回归任务用神经网络拟合可以写成:
由于一张图对应对个target,所以上式优化时同时对x、y两个变量优化。
如果输入变量x之间相互独立,那么上式又可写成:
可见优化过程可以分成两步优化。这有什么好处呢?如果一张图对应的target足够多,并且target的噪声满足0均值分布,那么𝑦|𝑥的优化结果理应就是clean的target,然后再对每张输入图片进行第二步优化。
用公式表达就是:
上式𝑦𝑖表示clean data,只要近似满足噪声是0均值分布的,优化的结果就可以将噪声均值化从而达到去噪的目的。
应用实例
本文列举了很多去噪的例子,现在列举个别案例进行展示。
1.加性高斯白噪声
一般加性高斯白噪声是零均值的,所以文章采用一般加性高斯白噪声是零均值的,所以文章采用L2损失训练网络。
文章使用开源图像库的图像,对每张图像随机添加方差为σ∈[0,50]的噪声,网络在去噪过程中需要估计噪声幅度,整个过程是盲去噪过程。
从去噪结果可以看出,使用“干净”的目标和使用有噪声的目标有相似的收敛速度和去噪质量。如果进一步使用不同大小的高斯滤波器模糊有噪声的目标图像,可以观察到低频噪声会更顽固,需要更多的迭代次数,但是对于所有情况来说,网络都收敛于相似的去噪质量。
2.乘性伯努利噪声
即相当于对图像进行随机采样,未采样到的点像素值为0。被污染像素的可能性记为 p p p,在文章训练过程中,变化 p∈[0.0,0.95],而在测试中 p=0.5。而得到的结果是使用被污染的目标比“干净”目标得到PSNR值还要高一点,这可能是由于被污染的目标在网络输出中有效地应用了dropout技术的结果。
3.文字去除
网络使用独立的被污染输入和目标对进行训练,被污染像素的可能性p在训练过程中为[0.0,0.5],而在测试中p=0.25。且在训练中使用L1损失作为损失函数,从而去除异常值。
4.随机值脉冲噪声
即对于每一个位置的像素都有可能性p被[0,1]的值随机替代。在这种情况下,平均值和中值都能产生好的结果,其理想的输出应该是像素值分布的众数。为了近似寻找众数,文章使用退火版本的“L0损失”函数,其定义为(|fθ(x)−y|+ϵ)γ,其中ϵ=10−8,在训练时γ从2到0线性下降。训练时输入和目标图像被污染像素的可能性为[0,0.95]。
项目介绍
–> 论文 github 地址
–> 复现 github 地址
数据集
本项目使用COCO 2017的验证集(1 GB),并将该数据集划分为本程序的训练集和验证集。
将测试图片放到 data/test
路径。
环境依赖
框架:
- PaddlePaddle (2.1.2)
- NumPy (1.14.2)
- Matplotlib (2.2.3)
- Pillow (5.2.0)
项目使用
step1: clone
# clone this repo
git clone https://github.com/Paddle-Team-7/noise2noise-paddle
step2: 下载数据
下载COCO验证集数据并划分为4200/8000的训练集/测试集。
cd data
mkdir train valid test
wget http://images.cocodataset.org/zips/val2017.zip
unzip val2017.zip && cd val2017
mv `ls | head -4200` ../train
mv `ls | head -800` ../valid
step3: 训练
Gaussian噪声
python3 train.py \
--train-dir ../data/train --train-size 2000 \
--valid-dir ../data/valid --valid-size 400 \
--ckpt-save-path ../ckpts \
--nb-epochs 100 \
--batch-size 4 \
--loss l2 \
--noise-type gaussian \
--noise-param 25 \
--crop-size 64 \
--plot-stats \
--cuda
Clean targets
python3 train.py \
--train-dir ../data/train --train-size 2000 \
--valid-dir ../data/valid --valid-size 400 \
--ckpt-save-path ../ckpts \
--nb-epochs 100 \
--batch-size 4 \
--loss l2 \
--noise-type gaussian \
--noise-param 25 \
--crop-size 64 \
--plot-stats \
--cuda \
--clean-targets
step4: 测试与评估
python3 test.py \
--data ../data/test \
--load-ckpt ../ckpts/gaussian/n2n.pdparams \
--noise-type gaussian \
--noise-param 25 \
--crop-size 0 \
--show-output 3 \
--seed 1 \
--cuda
python3 test.py \
--data ../data/test \
--load-ckpt ../ckpts/gaussian/n2n-clean.pdparams \
--noise-type gaussian \
--noise-param 25 \
--crop-size 0 \
--show-output 3 \
--seed 1 \
--cuda
复现精度
指标 | 原论文 | 参考代码 | 复现 |
---|---|---|---|
PSNR(gaussian-denoised) | 31.61 | 32.16 | 32.35 |
PSNR(gaussian-clean) | 31.63 | 32.21 | 32.19 |
结果展示
更多推荐
所有评论(0)