Noise2Noise图像去噪

news2024/12/12 6:48:44


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

概述

算法原理

演示效果

核心逻辑

使用方式

系统及基础镜像

配置环境

不训练仅用已经训好的模型查看效果

训练集及验证集获取

简便获取

完整获取过程(想用全部数据集进行训练时推荐)

测试集获取

训练

用高斯噪声训练

用泊松噪声训练


 本文所有资源均可在该地址处获取。

概述

本文复现论文Noise2Noise: Learning Image Restoration without Clean Data中提出的图像去噪方法,并使用最广泛应用的高斯噪声与泊松噪声来做实验。原文连接https://arxiv.org/abs/1803.04189

该论文证明了,对于同一张干净图片,如果分两次污染它所用的噪声同分布且0均值的情况下,那么用这一对噪声图像进行网络训练即noise2noise的训练方法就能达到与用干净-噪声图像对即noise2clean的训练方法接近的去噪效果。

该方法在无监督与自监督方法中效果几乎达到了最好,相比ZS-Noise2Noise这样的方法效果要优秀非常多,与有监督方法的效果相近!

论文在多种噪声和测试数据集上进行了实验,本文只选取高斯噪声与泊松噪声并在官方测试数据集中选取了一个进行测试。

算法原理

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

xnoise=xclean+noisexnoise​=xclean​+noise

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

xclean=fθ(xnoise)xclean​=fθ​(xnoise​)

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

xclean≈fθ(xnoise)xclean​≈fθ​(xnoise​)

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

argmin⁡θE(xnoise,xclean){L(fθ(xnoise),xclean)}θargmin​E(xnoise​,xclean​)​{L(fθ​(xnoise​),xclean​)}

其中LL代表我们选取的损失函数,在图像训练中通常为L2L2​损失或L1L1​损失。

具体到某个数据集上,有监督学习的过程实际上就是如下过程:

argmin⁡θ∑iL(fθ(xnoisei),xcleani)θargmin​i∑​L(fθ​(xnoisei​),xcleani​)

其中i代表数据集中的样本标号。

当然,有监督学习的效果毋庸置疑,但是在现实生活中(xnoiseixnoisei​,xcleanixcleani​)这样的图像对获取并不容易,这也成为了制约有监督学习的一大因素。

本文算法的亮点就是不用传统有监督学习算法中使用的(xnoiseixnoisei​,xcleanixcleani​)图像对,而是改用(xnoise1ixnoise1i​,xnoise2ixnoise2i​)这样的图像对进行训练却能达到有监督方法的效果,该方法将有监督学习训练模型的过程改为了:

argmin⁡θ∑iL(fθ(xnoise1i),xnoise2i)θargmin​i∑​L(fθ​(xnoise1i​),xnoise2i​)

其中noise1noise1与noise2noise2代表独立同分布且都是0均值的噪声。xnoise1xnoise1​代表用noise1noise1污染xcleanxclean​后的图片,xnoise2xnoise2​代表用noise2noise2污染xcleanxclean​后的图片,在本文算法中noise1noise1于noise2noise2可选择高斯分布与泊松分布两种方案。

尽管对于noise1noise1与noise2noise2噪声分布的限制略显苛刻,但本文算法无疑为解决有监督学习的去噪任务中标签数据的难以获取问题提供了一种突破性的思路。

在模拟数据的实验结果上证明Noise2Noise的训练方法性能非常接近有监督的训练方法。

演示效果

核心逻辑

#获得噪声对
def get_noisePair(image, noise_type='gaussian', mode=None):
    # Convert tensor to numpy array
    image_np = image.numpy()

    # Determine noise parameters based on mode
    if mode == 'train':
        if noise_type == 'gaussian':
            std = np.random.randint(0, 51)  # Random standard deviation between 0 and 50
        elif noise_type == 'poisson':
            lam = np.random.randint(0, 51)  # Random λ between 0 and 50
    else:
        std = 25  # Default standard deviation for Gaussian noise
        lam = 30  # Default λ for Poisson noise

    # Add noise based on noise_type
    if noise_type == 'gaussian':
        noise = np.random.normal(0, std, size=image_np.shape)
        source = image_np + noise

        noise = np.random.normal(0, std, size=image_np.shape)
        target = image_np + noise
    elif noise_type == 'poisson':
        noise = np.random.poisson(lam, size=image_np.shape)
        source = image_np + noise

        noise = np.random.poisson(lam, size=image_np.shape)
        target = image_np + noise

    # Clip noisy image values to ensure they are within [0, 255] range
    source = np.clip(source, 0, 255)

    # Convert back to tensor
    source = 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 = 0

    for data in train_loader:

        source=data["source"]#噪声图像1
        source=source.cuda()

        target=data["target"]#噪声图像2
        target=target.cuda()

        pred=model(source)

        loss=mse(pred,target)
        # loss = 0.01 * loss1 + loss3

        loss_img.update(loss.item(), target.size(0))
        batch_time.update(time.time() - end)
        end = time.time()

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        step += 1

    writer.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))

使用方式

系统及基础镜像

本代码于Ubuntu系统上编写与测试,在windows11系统上运行需要自行配置相应的版本的pytorch
基础镜像:python3.8.13

配置环境

进入noise2noise-pytorch-myown项目路径
运行以下命令:

pip install -r requirements.txt

不训练仅用已经训好的模型查看效果

可直接运行以下命令

python example.py

即可看到视频中演示的去噪效果

训练集及验证集获取

简便获取

百度云盘链接(下载后可在ReadMe文件同位置获得)
以上链接中存储了训练、验证、测试所需要的数据,下载后直接解压到项目根目录下,如下图所示即可

完整获取过程(想用全部数据集进行训练时推荐)

http://image-net.org/download
需认证资格并自行下载imagenet数据集,本次复现使用的是ILSVRC2012的验证集。
下载后解压到data路径下,解压完成后路径格式如下所示:

data/ILSVRC2012_img_val/...

…代表图片,格式为JPEG

为了简便训练,我们只用其中的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路径下

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/

如果您想在windows系统上使用,或是命令的方式觉得不太清楚,以上工作均可以手动完成,只要最终的结果保证训练集在./train路径下,验证集在./valid路径下,测试集在./test路径下即可

训练

如果您想自行训练模型

用高斯噪声训练

直接运行以下命令:

python train.py

用泊松噪声训练

需要修改train.py中下列的参数,将gaussian改为poisson即可


然后再运行如下命令:

python train.py

##测试
根据你要测试的模型,修改test.py中如下参数


然后根据你想要测试的高斯或泊松模型选择在runs/Noise2Noisegaussian/checkpoints或runs/Noise2Noisepoisson/checkpoints路径下存储的你的训练模型路径
将test.py下列的参数


替换为你的模型路径
最后,运行如下命令

python test.py

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

​​

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

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

相关文章

基于SpringBoot和PostGIS的全球城市信息管理实践

目录 前言 一、业务需求介绍 1、功能思维导图 二、业务系统后台实现 1、Model层实现 2、业务层的实现 3、控制层的实现 三、前端管理业务的实现 1、全球城市列表的实现 2、详情页面实现 3、实际城市定位 四、总结 前言 在全球化和信息化时代背景下,城市作…

Cocos Creator 开发微信小游戏分包

作为以后端选手,吭哧吭哧的好不容易用cocos开发了一款小游戏, 上传的时候发现包太大了,主包超过4M; 我不是选小游戏分包了吗? 怎么还超? 分包的方案: 功能裁剪资源压缩主包迁移WASM分离 1. 功能裁剪 项目设置中引擎管理器中 功能裁剪里面有很多个引擎,我们剔除掉没用的引…

计算机网络之NAT、代理服务、内网穿透、内网打洞

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之NAT、代理服务、内网穿透、内网打洞 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论…

【论文阅读】相似误差订正方法在风电短期风速预报中的应用研究

文章目录 概述:摘要1. 引言2. 相似误差订正算法(核心)3. 订正实验3.1 相似因子选取3.2 相似样本数试验3.3 时间窗时长实验 4. 订正结果分析4.1 评估指标对比4.2 风速曲线对比4.3 分风速段订正效果评估4.4 风速频率统计 5. 结论与讨论 概述&am…

【Rust 学习笔记】Rust 基础数据类型介绍——数组、向量和切片

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 博客内容主要围绕: 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 Rust 基础数据类型介绍——数组、向量和切片一、数组、向量和…

爬虫学习案例3

爬取美女图片 优美图库地址 一页图片 安装依赖库文件 pip install selenium requests beautifulsoup4import time import requests import random from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.service import Service fr…

ubuntu检测是否已安装nvidia驱动以及产品类型

nvidia-sminvidia-smi 是 NVIDIA 提供的一个命令行工具,用于查看和管理 NVIDIA GPU 的状态。当你运行 nvidia-smi 命令时,它会显示当前系统中所有 NVIDIA GPU 的状态信息,包括 GPU 的使用率、温度、内存使用情况等。 有8个GPU nvcc -V查看c…

使用pyinstaller打包pyqt的程序,运行后提示ModuleNotFoundError: No module named ‘Ui_main‘

环境:windowpython3.9pyqt6 使用pyqt UI编辑器生成了main.ui ,main.ui编译成了Ui_main.py main.py 使用当前目录下的Ui_main.py。 打包过程没报错,运行报错。 错误如下: 解决方法:pyinstaller -Fw main.py --paths. 使…

MySQL | 尚硅谷 | 第16章_变量、流程控制与游标

MySQL笔记:第16章_变量、流程控制与游标 文章目录 MySQL笔记:第16章_变量、流程控制与游标第16章_变量、流程控制与游标 1. 变量1.1 系统变量1.1.1 系统变量分类1.1.2 查看系统变量 1.2 用户变量1.2.1 用户变量分类1.2.2 会话用户变量 1.2.3 局部变量1.2…

【环境搭建】Jeecg-Boot v3.5.0 Docker搭建

前言 最近需要复现JeecgBoot的SQL注入漏洞,必须要搭建JeecgBoot v3.5.0这个版本才行,DockerHub没人push这个版本的,相关博客也比较少,所以自己来搭建,记录一下过程。 前置环境 Ubuntu 20.04Docker version 27.3.1do…

Certimate自动化SSL证书部署至IIS服务器

前言:笔者上一篇内容已经部署好了Certimate开源系统,于是开始搭建部署至Linux和Windows服务器,Linux服务器十分的顺利,申请证书-部署证书很快的完成了,但是部署至Windows Server的IIS服务时,遇到一些阻碍&a…

【学一点儿前端】本地或jenkins打包报错:getaddrinfo ENOTFOUND registry.nlark.com

问题 今天jenkins打包一个项目,发现报错了 error An unexpected error occurred: “https://registry.nlark.com/xxxxxxxxxx.tgz: getaddrinfo ENOTFOUND registry.nlark.com”. 先写解决方案 把yarn.lock文件里面的registry.nlark.com替换为registry.npmmirror.…

Linux:软硬链接

目录 一、概念 软链接 硬链接 二、原理 硬链接 软链接 三、使用场景 硬链接 软链接 一、概念 软链接 在当前目录下,有一个普通文件a.txt。 ln -s a.txt a_soft.link结论: 软链接是一个文件。 观察inode_id,发现软链接有着独立…

Java 实现给pdf文件指定位置盖章功能

Java 实现给pdf文件指定位置盖章功能 开发中遇到一个需求, 需要给用户上传的的pdf文件, 指定位置上盖公章的功能, 经过调研和对比, 最终确定实现思路. 这里是使用pdf文件中的关键字进行章子的定位, 之所以这样考虑是因为如果直接写死坐标的话, 可能会出现因pdf大小, 缩放, 盖章…

SparkSQL与Hive的整合

文章目录 SparkSQL与Hive的整合1.1. Spark On Hive1.1.1. Hive的准备工作1.1.2. Spark的准备工作1.1.3. Spark代码开发1.1.4. Spark On Hive案例 1.2. Hive On Spark1.3. SparkSQL命令行1.4. SparkSQL分布式查询引擎1.4.1. 开启ThriftServer服务1.4.2. beeline连接ThriftServer…

借助Dynamsoft的批量条码扫描,推动无人机仓储管理新高度

随着企业规模扩大和供应链变得越来越复杂,库存管理已成为仓库运营商面临的一项重大挑战。传统技术主要依赖于人工,而现在正被无人机和条形码识别等先进技术所取代。这些创新可以提高库存跟踪的准确性和效率,同时最大限度地减少人为错误并优化…

web网页连接MQTT,显示数据与下发控制命令

web网页连接MQTT,显示数据与下发控制命令 零、前言 在完成一些设备作品后,常常会因为没有一个上位机用来实时检测数据和下发命令而苦恼,在上一篇文章中提到了怎么白嫖阿里云服务器,并且在上面搭建了属于自己的web网站。那么现在…

数学学院项目开发总结

数学学院项目开发总结 学生成长平台 后端:技术栈gogingorm 负责内容:入团申请审核后端部分 前台 学生入团申请表单的提交根据审核状态判断不同的跳转页面 后台 活动的创建和关闭和信息提交和审核时间的管理 表单的审核流转: 班级审批基本信息审批 - > 学生会纪权部道…

flutter编译e: Daemon compilation failed: null java.lang.Exception错误解决

文章目录 错误描述解决方法修复步骤1. 清理项目缓存2. 检查项目路径一致性3. 强制禁用增量编译4. 更新依赖项5. 检查 Kotlin 和 Gradle 插件版本6. 删除 Kotlin 编译器守护进程7. 重新编译项目 错误描述 flutter应用编译时报如下错误e: Daemon compilation failed: null java.…

如何通过看板进行跨境电商的圣诞商品数据分析与优化选品流程?

引言 随着圣诞季的临近,跨境电商迎来了重要的销售时机。选品工作对于跨境电商的成功至关重要,直接关系到销售业绩和利润。本文结合相关网页信息,深入探讨跨境电商在圣诞期间如何利用信息整合工具展开选品工作,并优化选品流程。同…