【传知代码】自监督高效图像去噪(论文复现)

前言:在数字化时代,图像已成为我们生活、工作和学习的重要组成部分。然而,随着图像获取方式的多样化,图像质量问题也逐渐凸显出来。噪声,作为影响图像质量的关键因素之一,不仅会降低图像的视觉效果,还可能影响图像分析、处理和识别的准确性。因此,图像去噪技术一直是计算机视觉领域的研究热点。

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

目录

概述

演示效果

核心代码

写在最后


概述

        随着深度学习的发展,各种图像去噪方法的性能不断提升。然而,目前的工作大多需要高昂的计算成本或对噪声模型的假设。为解决这个问题,该论文提出了一种自监督学习方法。该方法使用一个简单的两层卷积神经网络和噪声到噪声损失(Noise to Noise Loss),在只使用一张测试图像作为训练样本的情况下,实现了低成本高质量的图像去噪,本文复现一篇 论文 相关内容,该论文提出的方法主要包含三个部分:成对下采样、残差损失、一致性损失。

        该成对下采样器将原始图像下采样为长宽只有原先一半的子图。具体地,其通过将图像分割为大小为 2 × 2 的非重叠补丁,并将每个补丁的对角线像素取平均值并分配给第一个子图,然后将反对角线像素取平均值并分配给第二个子图像。该成对下采样器的示意图如下所示:

在非自监督的情况下,损失函数一般采用噪声图像与干净图像之间平方差的形式:

在自监督的情况下,没有干净图像作为训练目标,则可以将两张噪声图像子图互为训练目标,即噪声到噪声损失:

基于噪声独立性假设,可以证明这两种损失的期望值相同。

考虑到残差损失只使用了噪声图像子图训练模型,而测试时需要整张噪声图像作为输入,为了使网络对子图的噪声估计与对原图的噪声估计保持一致,作者还引入了一个一致性损失函数:

总的损失如下所示:

演示效果

进入工作目录。如果是Linux系统,请使用如下命令:

unzip Image_Denoising.zip
cd Image_Denoising

代码的运行环境可通过如下命令进行配置:

pip install -r requirements.txt

如果希望在本地运行程序,请运行如下命令:

python main.py

如果希望在线部署,请运行如下命令:

python main-flask.py

如果希望使用自己的文件路径或改动其他实验设置,请在文件config.json中修改对应参数。以下是参数含义对照表:

参数名含义
image输入的原始图像路径,默认为"dog.jpg",即我提供的样例
learning_rate学习率
epoch_count训练轮数
step_size学习率衰减周期
gamma学习率衰减比
degree噪声程度,默认为0.2,范围是0~1
max_bytes输入文件大小限制,默认为10240,即10KB,仅用于在线部署限制输入

配置环境并运行main.py脚本,效果如下:

核心代码

这段代码实现了一个用于图像去噪的神经网络模型的训练过程,主要包括以下几个部分:

1)下采样函数 diag_sample:该函数用于将输入的图像下采样成两张长宽只有原先一半的子图。首先将输入图像分割成2x2的补丁,然后对每个补丁提取出对角线元素平均值作为第一个子图,提取出反对角线元素平均值作为第二个子图。

2)噪声估计网络 NoisePredictor:这是一个用于估计图像噪声的神经网络模型。它包括若干个卷积层和激活函数,最终输出与输入图像通道数相同的图像,用于表示估计的图像噪声。

3)训练函数 train_once:该函数用于对噪声估计网络进行一轮训练。在训练过程中,通过下采样函数得到噪声图像的子图,然后利用噪声估计网络估计子图的干净图像,计算残差损失和一致性损失,并根据总损失进行梯度反向传播和模型参数更新。

4)加噪函数 add_noise:该函数接受一个图像和噪声程度,输出加入噪声后的图像。在这里使用了正态分布生成随机噪声,并将噪声加到输入图像上,最后通过 clip 函数将像素值限制在 0 到 1 之间。

这些部分共同构成了图像去噪神经网络模型的训练流程,代码如下:

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np

def diag_sample(image):
    '''下采样函数,输入图像,输出两张长宽只有原先一半的子图'''
    # 分割成2x2的补丁
    height = int(image.shape[2] / 2)
    width = int(image.shape[3] / 2)
    image_patch = image[:, :, 0: height * 2, 0: width * 2].view(image.shape[0], image.shape[1], height, 2, width, 2).permute(0, 1, 2, 4, 3, 5)
    # 对角线元素取平均作为第一个子图
    image_sub1 = (image_patch[:, :, :, :, 0, 0] +image_patch[:, :, :, :, 1, 1]) / 2
    # 反对角线元素取平均作为第二个子图
    image_sub2 = (image_patch[:, :, :, :, 0, 1] +image_patch[:, :, :, :, 1, 0]) / 2
    return image_sub1, image_sub2

class NoisePredictor(nn.Module):
    '''噪声估计网络,输入图像,输出估计的图像噪声'''
    def __init__(self, channels=3):
        super(NoisePredictor, self).__init__()
        self.net = nn.Sequential(
            nn.Conv2d(channels, 52, 3, padding=1),
            nn.LeakyReLU(negative_slope=0.2, inplace=True),
            nn.Conv2d(52, 52, 3, padding = 1),
            nn.LeakyReLU(negative_slope=0.2, inplace=True),
            nn.Conv2d(52, channels, 1)
        )
    
    def forward(self, x):
        return self.net(x)

def train_once(image_noise, model, optimizer):
    '''对模型进行一轮训练'''
    # 用于计算差方和
    mse_loss = nn.MSELoss(reduction='sum')
    
    model.train()
    optimizer.zero_grad()
    # 生成噪声的子图
    image_noise_s1, image_noise_s2 = diag_sample(image_noise)
    # 估计噪声图像子图的干净图像
    image_s1_clean = image_noise_s1 - model(image_noise_s1)
    image_s2_clean = image_noise_s2 - model(image_noise_s2)
    # 估计噪声图像的干净图像
    image_clean = image_noise - model(image_noise)
    # 生成噪声图像的干净图像的子图
    image_clean_s1, image_clean_s2 = diag_sample(image_clean)
    # 残差损失
    loss_res = (mse_loss(image_s1_clean, image_noise_s2) + mse_loss(image_s2_clean, image_noise_s1)) / 2
    # 一致性损失
    loss_con = (mse_loss(image_s1_clean, image_clean_s1) + mse_loss(image_s2_clean, image_clean_s2)) / 2
    # 总损失
    loss = loss_res + loss_con
    # 梯度反向传播
    loss.backward()
    # 更新模型参数
    optimizer.step()

def add_noise(image, degree):
    '''输入图像和噪声程度(0~1),输出加入噪声的图像'''
    noise = np.random.normal(0, degree, image.shape)
    noisy_image = np.clip(image + noise, 0, 1)
    return noisy_image

写在最后

        在探索自监督高效图像去噪的旅程中,我们见证了技术的飞速进步与无限潜力。通过深度学习技术的赋能,自监督学习在图像去噪领域展现出了卓越的成效。这种方法不仅避免了大量标记数据的依赖,还通过内部生成的信息进行训练,大幅提高了模型的学习效率和泛化能力,随着技术的不断发展和优化,我们有理由相信自监督高效图像去噪将在更多领域展现出其独特的价值。我们期待看到更多创新性的研究和应用,让这项技术为人类社会带来更多的福祉和进步。在这个充满挑战和机遇的时代,让我们共同期待并见证这一技术的美好未来。

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

【传知科技】关注有礼     公众号、抖音号、视频号

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python基础知识总结(第一节)

一、python简介: Python是一种解释型,面向对象的高级语言。 Pyhton的语法和动态类型,以及解释性语言的本质,使它一跃成为多数平台上写脚本和快速开发应用的编程语言。 python语言百度百科介绍 二、Python基础语法:…

【busybox记录】【shell指令】mkfifo

目录 内容来源: 【GUN】【mkfifo】指令介绍 【busybox】【mkfifo】指令介绍 【linux】【mkfifo】指令介绍 使用示例: 创建管道文件 - 创建的时候同时指定文件权限 常用组合指令: 指令不常用/组合用法还需继续挖掘: 内容来…

月赚2万佣金的AI数字人,已成为新型带货神器,完整制作教程分享

大家好,我是设计师阿威 今天和大家分享一下用AI绘画制作数字人带货的副业创收教程,目前数字人类型的账号在短视频平台上,数字人带货能力非常强! 今天我会分享4个爆款数字人账号案例,深度讲解目前数字人的最新玩法。 …

开源代码分享(31)-计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度

参考文献: [1]孙惠娟,刘昀,彭春华,等.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度[J].电网技术,2021,45(09):3534-3545.DOI:10.13335/j.1000-3673.pst.2020.1720. 1.摘要 为了促进多能源互补及能源低碳化,提出了计及电转气协同的含碳捕集与垃…

三十三、openlayers官网示例Drawing Features Style——在地图上绘制图形,并修改绘制过程中的颜色

这篇讲的是使用Draw绘制图形时根据绘制形状设置不同颜色。 根据下拉框中的值在styles对象中取对应的颜色对象,new Draw的时候将其设置为style参数。 const styles {Point: {"circle-radius": 5,"circle-fill-color": "red",},LineS…

Web会话管理

一、会话管理的概念: 在人机交互时,会话管理是保持用户的整个会话活动的互动与计算机系统跟踪过程会话管理分类: 桌面会话管理、浏览器会话管理、Web服务器的会话管理。 二、为什么需要会话管理? HTTP是一种无状态协议,一次请…

day12

第一题 本题我们可以使用以下方法&#xff1a; 方法一&#xff1a; 使用hash表<元素&#xff0c;出现次数>来统计字符串中不同元素分别出现的次数&#xff0c;当某一个元素的次数大于1时&#xff0c;返回false&#xff0c;如果每个元素的出现次数都为1&#xff0c;则返回…

ABB 控制柜

1,主计算机:相当于电脑的主机,用于存放系统和数据,需要24V直流电才能工作。执行用户编写的程序,控制机器人进行响应的动作。主计算机有很多接口,比如与编程PC连接的服务网口、用于连接示教器的网口、连接轴计算机板的接口、连接安全面板的接口、不同的现场总线卡接口(比…

web刷题记录(1)

[GXYCTF 2019]Ping Ping Ping 进入页面&#xff0c;发现有一个传入参数的框&#xff0c;目的就是为了让我们通过参数传入内容来执行代码。这里先传入本地ip&#xff0c;方便后面的ping命令运行 ls命令来查看&#xff0c;目录中的文件 传入后&#xff0c;发现目录下有flag.php,…

Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式

启动容器时&#xff0c;通过-p 宿主机端口:容器端口&#xff0c;就可以通过访问宿主机端口访问到容器&#xff0c;这种原理机制是啥&#xff0c;有没有其它方式可以让宿主机和容器通信&#xff0c;以及容器与容器之间如何通信。带着这几个问题开始学习Docker的网络知识。 文章…

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作&#xff0c;实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂&#xff1a;机器狗上岗&#xff0c;可“嗅探”故障隐患。 3.ChatGPT&#xff1a;macOS 开始公测。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

攀爬二叉树,发现新的美

二叉树 什么是二叉树? 二叉树的基础概念? 性质? 问题? 文章目录 二叉树一、二叉树的概念(一)认识二叉树(二)二叉树的性质 二、遍历二叉树1.前序遍历2.中序遍历3.后序遍历4.层序遍历 三丶创建二叉树总结 一、二叉树的概念 (一)认识二叉树 二叉树是一种非线性的数据结构,…

NSSCTF-Web题目4

[SWPUCTF 2021 新生赛]hardrce 1、题目 2、知识点 rce&#xff1a;远程代码执行、url取反编码 3、解题思路 打开题目 出现一段代码&#xff0c;审计源代码 题目需要我们通过get方式输入变量wllm的值 但是变量的值被过滤了&#xff0c;不能输入字母和\t、\n等值 所以我们需…

目标检测 | R-CNN、Fast R-CNN与Faster R-CNN理论讲解

☀️教程&#xff1a;霹雳吧啦Wz ☀️链接&#xff1a;https://www.bilibili.com/video/BV1af4y1m7iL?p1&vd_sourcec7e390079ff3e10b79e23fb333bea49d 一、R-CNN R-CNN&#xff08;Region with CNN feature&#xff09;是由Ross Girshick在2014年提出的&#xff0c;在PAS…

mysql中InnoDB的统计数据

大家好。我们知道&#xff0c;mysql中存在许多的统计数据&#xff0c;比如通过SHOW TABLE STATUS 可以看到关于表的统计数据&#xff0c;通过SHOW INDEX可以看到关于索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方式收集的呢&#xff1f;今…

未在计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序和未在本地计算机上注册“microsoft.ACE.OLEDB.12.0”提供程序

程序运行出现下图的错误&#xff0c; 或者下图的错误&#xff0c; 首先看一下是不是运行的程序的位数&#xff08;32/64&#xff09;不对&#xff1b; 查看系统位数的方法如下图&#xff1b;下图显示是64位操作系统&#xff1b; 如果运行的程序的位数没有问题&#xff1b; 则需…

Matlab|基于PMU相量测量单元进行电力系统电压幅值和相角状态估计

主要内容 程序采用三种方法对14节点和30节点电力系统状态进行评估&#xff1a; ①PMU同步相量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; ②并采用牛顿-拉夫逊方法进行系统潮流计算&#xff0c;结果作为理论分…

数学建模--LaTex插入表格详细介绍

目录 1.插入普通的边线表格 3.三线表的插入和空格说明 3.基于复杂情况下表格的插入 1.插入普通的边线表格 &#xff08;1&#xff09;像这个右边的生成的这个比较普通的表格&#xff0c;我们是使用下面的代码实现的&#xff1a; &#xff08;2&#xff09;和插入一个一个图片…

【STL】C++ stack(栈) 基本使用

目录 一 stack常见构造 1 空容器构造函数&#xff08;默认构造函数&#xff09; 2. 使用指定容器构造 3 拷贝构造函数 二 其他操作 1 empty 2 size 3 top 4 push && pop 5 emplace 6 swap 三 总结 一 stack常见构造 1 空容器构造函数&#xff08;默认构造…

2024年四川省三支一扶报名流程图解✅

2024年四川省三支一扶报名流程图解✅ &#x1f534;时间安排 1、报名时间&#xff1a;5月31日—6月4日17:00 2、资格初审时间&#xff1a;5月31日—6月5日17:00 3、准考证打印时间&#xff1a;6月25日—6月29日 4、笔试时间&#xff1a;6月30日 5、笔试成绩&#xff1a;7…