论文介绍

–> 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 路径。

环境依赖

框架:

项目使用

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.6132.1632.35
PSNR(gaussian-clean)31.6332.2132.19

结果展示

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐