【传知代码】Noise2Noise图像去噪(论文复现)

前言:在数字时代,图像已成为我们记录生活、传达信息、探索世界的重要媒介。然而,随着摄影技术的飞速发展,图像噪声——这一影响图像质量的顽疾,始终困扰着我们。Noise2Noise图像去噪技术为我们提供了一种全新的解决方案。不同于传统的去噪方法,Noise2Noise技术凭借其独特的思路和高效的性能,在图像处理领域引起了广泛关注。它不仅能够帮助我们恢复被噪声污染的图像,还能在保持图像细节的同时,提高图像的整体质量。

本文所涉及所有资源均在传知代码平台可获取

目录

概述

演示效果

核心代码

写在最后


概述

本文复现论文Noise2Noise: Learning Image Restoration without Clean Data中提出的图像去噪方法,并使用最广泛应用的高斯噪声与泊松噪声来做实验,原文连接 地址 ,具体如下:

        该论文证明了,对于同一张干净图片,如果分两次污染它所用的噪声同分布且0均值的情况下,那么用这一对噪声图像进行网络训练即noise2noise的训练方法就能达到与用干净-噪声图像对即noise2clean的训练方法接近的去噪效果,该方法在无监督与自监督方法中效果几乎达到了最好,相比ZS-Noise2Noise这样的方法效果要优秀非常多,与有监督方法的效果相近!  论文在多种噪声和测试数据集上进行了实验,本文只选取高斯噪声与泊松噪声并在官方测试数据集中选取了一个进行测试。

        对于干净的图片分布,我们用xcleanxclean​表示。在现实的生产生活中,干净的图片经常会被噪声所污染,变为xnoisexnoise​,污染的过程我们可以使用如下过程表示:

其中noisenoise最常见的分布便是高斯分布与泊松分布,在深度学习中,图像的去噪任务就是尽可能学习到一个模型使得:

其中f为模型,θ为训练过程中学习到的模型参数。当然在现实中是不可能的,我们只能使我们的模型尽可能去逼近理想效果,即:

为了达到以上效果,有监督学习采取的方法是是最小化训练数据与标签的损失函数来学习模型参数即:

其中L代表我们选取的损失函数,在图像训练中通常为L2​损失或L1损失,具体到某个数据集上,有监督学习的过程实际上就是如下过程:

其中i代表数据集中的样本标号,当然,有监督学习的效果毋庸置疑,但是在现实生活中这样的图像对获取并不容易,这也成为了制约有监督学习的一大因素。本文算法的亮点就是不用传统有监督学习算法中使用的图像对,而是改用下面这样的图像对进行训练却能达到有监督方法的效果,该方法将有监督学习训练模型的过程改为了:

尽管对于noise1与noise2噪声分布的限制略显苛刻,但本文算法无疑为解决有监督学习的去噪任务中标签数据的难以获取问题提供了一种突破性的思路,在模拟数据的实验结果上证明Noise2Noise的训练方法性能非常接近有监督的训练方法。

演示效果

本代码于Ubuntu系统上编写与测试,在windows11系统上运行需要自行配置相应的版本的pytorch
基础镜像:python3.8.13,进入noise2noise-pytorch-myown项目路径运行以下命令:

pip install -r requirements.txt

不训练仅用已经训好的模型查看效果,可直接运行以下命令:

python example.py

为了简便训练,我们只用其中的5000张做训练集,1000张做验证集即可。完成解压后,运行下列命令即可获得训练集与验证集,分别存储在train与valid路径下:

mkdir train && mkdir valid
find data/ILSVRC2012_img_val/ -maxdepth 1 -type f | head -n 5000 | xargs -I {} mv {} ./train/
find data/ILSVRC2012_img_val/ -maxdepth 1 -type f | tail -n +5001 | head -n 1000 | xargs -I {} mv {} ./valid/

运行下列命令可直接获取BSD300数据集,并将其测试集放在我们项目的test路径下,如果您想在windows系统上使用,或是命令的方式觉得不太清楚,以上工作均可以手动完成,只要最终的结果保证训练集在./train路径下,验证集在./valid路径下,测试集在./test路径下即可:

wget https://www2.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/segbench/BSDS300-images.tgz
tar -zxvf BSDS300-images.tgz
mkdir test
mv BSDS300/images/test/* ./test/

如果您想自行训练模型,用高斯噪声训练直接运行以下命令,需要修改train.py中下列的参数,将gaussian改为poisson即可,然后再运行如下命令:

python train.py

根据你要测试的模型,修改test.py中如下参数,后根据你想要测试的高斯或泊松模型选择在runs/Noise2Noisegaussian/checkpoints或runs/Noise2Noisepoisson/checkpoints路径下存储的你的训练模型路径,将test.py下列的参数替换为你的模型路径,最后,运行如下命令:

python test.py

即可得到测试结果,且会将你的测试集的第一张图的训练与输出结果放到result路径下,如下图所示

最终实现的效果如下所示:

核心代码

下面这段代码实现了对图像进行噪声注入,然后使用注入噪声的图像对去噪模型进行训练的过程。

具体来说,代码中的 get_noisePair 函数用于生成一对噪声图像,其中 noise_type 参数指定噪声类型,可以是高斯噪声或泊松噪声;mode 参数指定模式,可以是训练模式或测试模式。在训练模式下,函数会随机生成噪声参数,包括高斯噪声的标准差和泊松噪声的 λ;在测试模式下,函数会使用默认的噪声参数。生成的噪声图像会被剪裁到 [0, 255] 的范围内,并转换为 PyTorch 的张量。

代码中的 train 函数用于对去噪模型进行训练。它使用了一个数据加载器 train_loader,用于加载训练数据集中的图像。对于每个批次的数据,函数会从中获取一对噪声图像,然后将其中一个作为输入,另一个作为目标输出,对去噪模型进行训练。训练过程中使用了均方误差(MSE)作为损失函数,并使用随机梯度下降(SGD)优化器进行模型优化。在训练过程中,函数会计算平均损失,并将其写入 TensorBoard 中。每个 epoch 结束后,函数会调整学习率,并输出训练过程中的损失:

#获得噪声对
def get_noisePair(image, noise_type='gaussian', mode=None):# Convert tensor to numpy arrayimage_np = image.numpy()# Determine noise parameters based on modeif mode == 'train':if noise_type == 'gaussian':std = np.random.randint(0, 51)  # Random standard deviation between 0 and 50elif noise_type == 'poisson':lam = np.random.randint(0, 51)  # Random λ between 0 and 50else:std = 25  # Default standard deviation for Gaussian noiselam = 30  # Default λ for Poisson noise# Add noise based on noise_typeif noise_type == 'gaussian':noise = np.random.normal(0, std, size=image_np.shape)source = image_np + noisenoise = np.random.normal(0, std, size=image_np.shape)target = image_np + noiseelif noise_type == 'poisson':noise = np.random.poisson(lam, size=image_np.shape)source = image_np + noisenoise = np.random.poisson(lam, size=image_np.shape)target = image_np + noise# Clip noisy image values to ensure they are within [0, 255] rangesource = np.clip(source, 0, 255)# Convert back to tensorsource = torch.tensor(source, dtype=torch.float32)target = np.clip(target, 0, 255)target = torch.tensor(target, dtype=torch.float32)return source, target#用噪声对训练以获取去噪模型
def train(train_loader, model, optimizer, scheduler, writer, epoch):batch_time = AverageMeter()loss_img = AverageMeter()model.train()end = time.time()step = 0for data in train_loader:source=data["source"]#噪声图像1source=source.cuda()target=data["target"]#噪声图像2target=target.cuda()pred=model(source)loss=mse(pred,target)# loss = 0.01 * loss1 + loss3loss_img.update(loss.item(), target.size(0))batch_time.update(time.time() - end)end = time.time()optimizer.zero_grad()loss.backward()optimizer.step()step += 1writer.add_scalars('train_loss', {'loss_img': loss_img.avg}, epoch + 1)scheduler.step()print('Train Epoch: {}\t train_loss: {:.6f}\t'.format(epoch + 1, loss_img.avg))

写在最后

        在深入探讨了Noise2Noise图像去噪技术的原理、应用以及其在图像处理领域的广阔前景后,我们不禁为这一技术的强大潜力所折服。Noise2Noise不仅为我们提供了一种全新的图像去噪思路,更为图像处理领域带来了新的变革,回顾整篇文章,我们不难发现,Noise2Noise技术的核心优势在于其能够在无需清洁图像样本的情况下,仅通过多张含噪声图像的训练,实现对图像噪声的有效去除。这一特点使得Noise2Noise技术在实际应用中具有极高的灵活性和适应性,能够在各种复杂环境下保持稳定的去噪效果。

        随着人工智能和深度学习技术的不断发展,Noise2Noise图像去噪技术将迎来更多的发展机遇。我们有理由相信,在不远的将来,Noise2Noise技术将在医疗影像、遥感监测、安防监控等领域发挥更加重要的作用,为我们的生活带来更多便利和美好。

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二十七章HTML.CSS综合案例

1.产品介绍 效果图如下&#xff1a; 代码部分如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Elastic Search (ES)Java 入门实操(1)下载安装、概念

实现数据查询代码&#xff1a;Elastic Search&#xff08;ES&#xff09;Java 入门实操&#xff08;2&#xff09;搜索代码-CSDN博客 Elastic Search&#xff08;ES&#xff09;Java 入门实操&#xff08;3&#xff09;数据同步-CSDN博客 Elastic Search 官方描述&#xff0c…

Python下载库

注&#xff1a;本文一律使用windows讲解。 一、使用cmd下载 先用快捷键win R打开"运行"窗口&#xff0c;如下图。 在输入框中输入cmd并按回车Enter或点确定键&#xff0c;随后会出现这个画面&#xff1a; 输入pip install 你想下载的库名&#xff0c;并按回车&…

贰[2],VisionMaster/.NetCore的WPF应用程序调用控件

1&#xff0c;环境 VisionMaster4.2 VisualStudio2022 WPF/.Net6.0 2&#xff0c;记录原因 .NetFrameWork的WPF应用程序调用添加例程.NetFrameWork的Winform应用程序相应的库&#xff0c;不会出现报错&#xff0c;界面也能正常显示操作&#xff0c;但是.NetCore的程序却总是…

JavaScript入门宝典:核心知识全攻略(下)

文章目录 前言一、获取标签元素二、操作标签元素属性1. 属性的操作2. innerHTML 三、数组及操作方法1. 数组的定义2. 数组的操作 四、循环语句五、字符串拼接六、定时器1. 定时器的使用3. 清除定时器 七、ajax1. ajax的介绍2. ajax的使用 前言 JavaScript是前端开发不可或缺的技…

Typescript 中 tsconfig.json 无法写入文件,因为它会覆盖输入文件

先来看看问题 在开发ts项目的时候&#xff0c;包错提示无法写入文件 tsconfig.json无法写入文件"url"因为它会覆盖输入文件 这是tsconfig.json文件配置问题&#xff0c;需要加入下面的配置就好了&#xff1a; {"compilerOptions": {"outDir": …

【MySQL数据库】:MySQL索引特性

目录 索引的概念 磁盘 磁盘的基本特征 MySQL与磁盘交互的基本单位 索引的理解 建立测试表 理解单个Page 理解多个Page 页目录 单页情况 多页情况 索引的数据结构 聚簇索引 VS 非聚簇索引 索引操作 创建主键索引 创建唯一索引 创建普通索引 创建全文索引 查询…

海宁代理记账公司-专业的会计服务

随着中国经济的飞速发展&#xff0c;企业的规模和数量日益扩大&#xff0c;在这个过程中&#xff0c;如何保证企业的财务活动合规、准确无误地进行&#xff0c;成为了每个企业面临的重要问题&#xff0c;专业、可靠的代理记账公司应运而生。 海宁代理记账公司的主要职责就是为各…

Prism 入门06,发布订阅(入门完结)

本章节介绍使用 Prism 框架的消息聚合器 IEventAggregator ,实现如何进行消息发布,订阅,取消订阅的功能 继续使用上一章节使用的 Prism WPF 空模板项目 BlankApp1 1.首先,在使用 Prism 框架当中,进行事件消息的发布和订阅之前,需要定义发布事件的事件消息模型。如下所示:…

端午节景区视频监控方案:智慧景区EasyCVR视频监控系统构建与运用

端午节&#xff0c;作为中国传统节日之一&#xff0c;每年吸引着大量游客前往各地景区参观游览&#xff0c;感受浓厚的文化氛围。然而&#xff0c;随着游客数量的增多&#xff0c;景区管理也面临着越来越多的挑战&#xff0c;其中安全问题尤为突出。因此&#xff0c;实施端午节…

使用 ESPCN 模型进行超分辨率图像处理

前言 使用 ESPCN (Efficient Sub-Pixel CNN) 模型对低分辨率的图像&#xff0c;进行超分辨率处理。 效果展示 lowres 表示低分辨率图像&#xff0c;highres 表示高分辨率图像&#xff0c;prediction 表示模型预测的高分辨率图像&#xff0c;可以看出模型在生成高分辨率图像过…

力扣hot100:155. 最小栈(栈,辅助栈存储相关信息)

LeetCode&#xff1a;155. 最小栈 1、尝试单调栈 看到这题说&#xff0c;要常数时间内检索最小元素的栈&#xff0c;想到了单调栈&#xff0c;递增单调栈确实能维护最小值&#xff0c;但是这个最小值是存在一定意义的&#xff0c;即如果后面出现了最小值&#xff0c;那么前面…

光电管道液位传感器与电容式液位开关相比

如今&#xff0c;随着检测液位技术的不断发展&#xff0c;检测液位的方法也越来越多&#xff0c;比如浮球开关、电容式液位传感器、管道式液位传感器等等&#xff0c;那么光电管道液位传感器与电容式液位开关相比&#xff0c;有哪些优势&#xff1f; 光电管道液位传感器采用先…

论文高级图表绘制(Python语言,局部放大图)

本文将通过一个具体的示例,展示如何使用Python语言和Matplotlib库来绘制高级图表,包括局部放大图的制作。适用于多条曲线绘制在同一个图表中,但由于数据量过大,导致曲线的细节看不清,需要对细节进行局部放大。如下图: 环境准备 首先,确保你的Python环境中已经安装了以…

基于SSM+Jsp的高校信息资源共享平台

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

基于STM32开发的智能家居监控系统

目录 引言环境准备智能家居监控系统基础代码实现&#xff1a;实现智能家居监控系统 4.1 传感器数据读取4.2 电器设备控制4.3 实时数据监控与分析4.4 用户界面与数据可视化应用场景&#xff1a;家庭安全监控与管理问题解决方案与优化收尾与总结 1. 引言 随着智能家居技术的发…

FM151A,FM171B和利时工控

FM151A,FM171B和利时工控&#xff0c;DCS系统应该具备以下特点&#xff1a;1.系统具备开放的体系结构&#xff0c;可以提供多层的开放数据接口&#xff1b;FM151A,FM171B和利时工控。2.系统应具备强大的处理功能&#xff0c;中型分布式控制系统大型数据采集监控系统功能。FM151…

[数据集][目标检测]室内积水检测数据集VOC+YOLO格式761张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;761 标注数量(xml文件个数)&#xff1a;761 标注数量(txt文件个数)&#xff1a;761 标注类别…

使用小黄鸟(HttpCanary)、VMOS Pro虚拟机对手机APP进行抓包(附带软件)

老规矩先看&#xff0c;效果图&#xff1a; 文章很详细&#xff0c;希望可以耐心看完&#xff0c;保证可以学会抓包&#xff0c;不再走冤枉路&#xff0c;小编在之前看过太多类似文章&#xff0c;折腾了太久才搞懂的&#xff0c;写这篇文章就是不想希望你们像小编一样再花时间…

mac无法读取windows分区怎么办 苹果硬盘怎么读取

对于Mac电脑用户但有Windows系统使用需求的&#xff0c;我们可以通过Boot Camp启动转换助理安装Windows分区这个方案来解决&#xff0c;不过因为两个系统的磁盘格式不同&#xff0c;相应的也会产生一些问题&#xff0c;例如无法正常读取windows分区。下面本文就详细说明mac无法…