基于Paddle复现《Neighbor2Neighbor: Self-Supervised Denoising from Single Noisy Images》降噪网络
论文地址:
https://arxiv.org/abs/2101.02824
原repo:
https://github.com/TaoHuang2018/Neighbor2Neighbor
Paddle复现Repo:
https://github.com/txyugood/Neighbor2Neighbor_Paddle
1.简介
近年来,由于神经网络的快速发展,图像降噪也从中获得了巨大的好处。然而,由于需要大量的噪声-干净的图像对来进行模型的监督训练,限制了这些模型的推广。虽然已经有一些尝试训练一个只有单个噪声图像的图像去噪模型,但现有的自监督去噪方法存在网络训练效率低、有用信息丢失或依赖于噪声建模等问题。在这篇论文中,作者提出了一种非常简单但有效的方法,可以训练仅含噪声图像的图像去噪模型,名为Neighbor2Neighbor。
首先,提出一种随机邻域子采样器来生成训练图像对。具体的说,用于训练的输入和输出是从同一噪声图像中的子采样图像,满足了成对图像的对应像素是相邻的,同时彼此是相似的。其次,在第一阶段生成的子图片对去训练网络,并使用正则化器作为额外的损失以获得更好的性能。
上图是Neighbor2Neighbor架构概述。(a)训练的完整视图。通过噪声图片使用相邻子采样器生成一对图片。降噪网络分别使用g1(y)和g2(y)作为输入和目标。损失包含两个部分,左边部分,计算网络输出和噪声目标之间的Lrec。右边部分,考虑到子采样噪声图像和真实值之间的差异,进一步添加了损失Lreg。应该提到的是,出现两次的邻域子采样器(绿色)代表的是同一个邻域子采样器。(b)使用训练后的网络进行推理。
2.复现精度
在BSD300测试集的测试效果如下表,达到验收指标,PSNR: 30.79, SSIM:0.873。
Network | opt | epoch | batch_size | dataset | PSNR | SSIM |
---|---|---|---|---|---|---|
N2N | Adam | 100 | 4 | BSD300 | 30.91 | 0.877 |
每一个epoch的精度可以在train.log或A_log_BSD300.csv中查看。
3.数据集
代码地址:
下载地址:
https://aistudio.baidu.com/aistudio/datasetdetail/137360
数据集下载解压后需要进行预处理。执行以下命令。
cd /home/aistudio/data/
tar xvf /home/aistudio/data/data137360/ILSVRC2012_img_val.tar
cd /home/aistudio/Neighbor2Neighbor_Paddle/
python dataset_tool.py --input_dir /home/aistudio/data/ILSVRC2012_img_val --save_dir /home/aistudio/data/Imagenet_val
4.环境依赖
PaddlePaddle == 2.2.0
5.快速开始
模型训练
运行一下命令进行模型训练,在训练过程中会对模型进行评估,同时训练日志保存在train.log中。训练过程中的每一次评估指标都保存在result/unet_gauss25_b4e100r02/目录中。
python -u train.py --data_dir=/home/aistudio/data/Imagenet_val/ \
--val_dirs=./validation --noisetype=gauss25 --save_model_path=./results \
--log_name=unet_gauss25_b4e100r02 --increase_ratio=2
参数介绍:
data_dir:数据集路径
val_dirs:测试集路径
noisetype:噪声类型,根据验收指标,目前只支持gauss25。
save_model_path:模型保存路径
log_name:验证结果保存路径
increase_ratio:损失函数中Lambda的系数
模型验证
除了可以再训练过程中验证模型精度,还可以是val.py脚本加载模型验证精度,执行以下命令。
python val.py --model_path best_model.pdparams
W0409 16:44:58.220067 32686 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0409 16:44:58.224027 32686 device_context.cc:465] device: 0, cuDNN Version: 7.6.
Loading pretrained model from best_model.pdparams
There are 50/50 variables loaded into UNet.
[EVAL] BSD300: psnr:30.910791861936413 ssim:0.8766264295802032
单张图片预测
本项目提供了单张图片的预测脚本,可生成降噪图片。使用方法如下:
cd /home/aistudio/Neighbor2Neighbor_Paddle/
python predict.py --image_path demo/42012_noise.png --model_path best_model.pdparams --save_dir ./demo/
参数说明:
image_path:需要预测的图片
model_path: 模型路径
save_dir: 输出图片保存路径
预测样例:
模型导出
模型导出可执行以下命令:
python export_model.py --model_path best_model.pdparams --save_dir ./output/
参数说明:
model_path: 模型路径
save_dir: 输出图片保存路径
Inference推理
可使用以下命令进行模型推理。该脚本依赖auto_log, 请参考下面TIPC部分先安装auto_log。infer命令运行如下:
cd /home/aistudio
git clone https://gitee.com/Double_V/AutoLog
cd /home/aistudio/AutoLog/
!pip3 install -r requirements.txt
!python3 setup.py bdist_wheel
!pip3 install ./dist/auto_log-1.2.0-py3-none-any.whl
python infer.py --use_gpu=False --enable_mkldnn=False --cpu_threads=2 \
--model_file=output/model.pdmodel --batch_size=2 \
--input_file=validation/BSD300/test --enable_benchmark=True \
--precision=fp32 --params_file=output/model.pdiparams \
--save_dir output/inference_img
参数说明:
use_gpu:是否使用GPU
enable_mkldnn:是否使用mkldnn
cpu_threads: cpu线程数
model_file: 模型路径
batch_size: 批次大小
input_file: 输入文件路径
enable_benchmark: 是否开启benchmark
precision: 运算精度
params_file: 模型权重文件,由export_model.py脚本导出。
save_dir: 保存推理预测图片的路径
TIPC基础链条测试
该部分依赖auto_log,需要进行安装,安装方式如下:
auto_log的详细介绍参考https://github.com/LDOUBLEV/AutoLog。
cd /home/aistudio/Neighbor2Neighbor_Paddle/
bash test_tipc/prepare.sh test_tipc/configs/N2N/train_infer_python.txt 'lite_train_lite_infer'bash test_tipc/test_train_inference_python.sh test_tipc/configs/N2N/train_infer_python.txt 'lite_train_lite_infer'
测试结果如截图所示:
6.代码结构与详细说明
Neighbor2Neighbor_Paddle
├── A_log_BSD300.csv # 验证模型日志
├── README.md # 说明文件
├── arch_unet.py # 模型架构
├── best_model.pdparams # 最优模型权重
├── dataset.py # 数据集代码
├── dataset_tool.py # 数据集转换文件
├── export_model.py # 模型导出代码
├── imgs # Readme中的图片资源文件
├── infer.py # 推理代码
├── param_init.py # 模型参数初始化方法
├── test_tipc # TIPC 测试
├── train.log # 训练日志
├── train.py # 训练脚本
├── utils.py # 工具
├── val.py #验证脚本
└── validation # 验证数据集
7.模型信息
信息 | 描述 |
---|---|
模型名称 | N2N |
框架版本 | PaddlePaddle==2.2.0 |
应用场景 | 降噪 |
基于Paddle复现《Neighbor2Neighbor: Self-Supervised Denoising from Single Noisy Images》降噪网络相关推荐
- Neighbor2Neighbor: Self-Supervised Denoising from Single Noisy Images
下面内容来自智源研究院CVPR2021预讲华为诺亚专场 1.深度学习的图像去噪方法面临的挑战 当前方法主要包括三类: 基于监督学习的方法:使用 noisy-clean 图像对进行训练(DnCNN, F ...
- 图像去噪——Neighbor2Neighbor: Self-Supervised Denoising from Single Noisy Images
一种用于图像降噪的自监督学习方法 Nb2Nb Neighbor2Neighbor Noise2Noise Revisit Proposed Method Generation of Training ...
- 仅需24小时,带你基于PaddleRec复现经典CTR预估算法
项目背景 偶然看到了[飞桨论文复现挑战赛],抱着 划水 提升自己的态度,报名了一个推荐赛道的赛题.因为本身已经参加工作了,实际空闲时间不是太多,只能晚上下班或者周末和各位参赛大佬卷上一卷,划划水- 工 ...
- paddle复现colorGAN(动漫黑白线条上色)
paddle复现colorGAN动漫黑白线条上色 前言 项目地址&运行结果 ColorGAN 文件目录 测试 训练自己的数据集 参考 前言 CGAN是生成对抗网络的一个重要的分支,至于CGAN ...
- 基于MindSpore复现Deeplabv3—语义分割
基于MindSpore复现Deeplabv3-语义分割 实验介绍 本实验主要介绍使用MindSpore深度学习框架在PASCAL VOC2012数据集上训练Deeplabv3网络模型.本实验使用了Mi ...
- 基于Paddle的计算机视觉入门教程——第7讲 实战:手写数字识别
B站教程地址 https://www.bilibili.com/video/BV18b4y1J7a6/ 任务介绍 手写数字识别是计算机视觉的一个经典项目,因为手写数字的随机性,使用传统的计算机视觉技术 ...
- 基于Paddle的截图OCR文字识别的实现
基于Paddle的截图&OCR文字识别的实现 一款截图识别文字的OCR工具主要涉及2个环境: 截图 OCR识别 前要 OCR的应用场景 根据OCR的应用场景而言,我们可以大致分成识别特定场景下 ...
- 【基于Paddle框架的行车环境下天气及时间分类】
目录 一.项目简介 二.数据来源及分析 2.1 解压训练数据集 三.数据读取 3.1 ImageNet数据集格式说明 3.1.1 数据文件夹格式 3.1.2 训练集.验证集列表和类别标签列表 3.2 ...
- 基于PYNQ-Z2复现yolov2
基于PYNQ-Z2复现Yolo_v2 参考资料:源项目工程 开发板配置 0 使用说明 0.1 简介 本文档主要分为三个部分: [1] 搭建HLS工程生成Yolo_v2的IP. [2] 在Vivado中 ...
最新文章
- Struts2文件上传
- 【Python】Python库之虚拟现实
- 使用reflux进行react组件之间的通信
- Nginx-配置https虚拟服务(访问http时自动跳转https)
- 如何打开SAR 文件
- 基于springboot的健身管理系统
- AM335x TP驱动解析
- sql server 日期条件-上月、年初、同期
- 分类与聚类的区别以及聚类的方法分类
- 逆向分析中加解密算法常用工具
- 项目四:学生信息管理系统
- 【转载】转别人写的HTMLCSS 详细笔记脉络--很详细
- 微信账号注销了能恢复吗
- PHP的抽象类和抽象方法 abstract
- CTF-Crypto-各种密码原理及解密方法
- TextView里的setText方法
- Python 面向对象 --- 多态
- hive建表报错 character ‘ ‘ not supported here
- 容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。编写程序,输出分油的操作过程。
- 小米电视怎么看电视直播?推荐好用的电视直播软件
热门文章
- Ubuntu 6.10 (Edgy) 黑体解决方案
- 【uni-app】微信开发者工具注意点(微信小程序)
- C++题目及答案(16)——小小课代表
- 计算机网络学习笔记(3.数据链路层 4.网络层)
- WIN10 DOS命令
- 5 爬虫 异步协程 梨视频
- markdown设置字体颜色、大小、背景
- 天蓝色在ps中的色值_天蓝色的cosmosdb文档中的字段级加密
- CCF之小明上学——2018.12 第一题 (java满分代码)
- 中国AI方法影响越来越大,天大等从大量文献中挖掘AI发展规律