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

2024-05-30 00:20

本文主要是介绍【传知代码】自监督高效图像去噪(论文复现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

目录

概述

演示效果

核心代码

写在最后


概述

        随着深度学习的发展,各种图像去噪方法的性能不断提升。然而,目前的工作大多需要高昂的计算成本或对噪声模型的假设。为解决这个问题,该论文提出了一种自监督学习方法。该方法使用一个简单的两层卷积神经网络和噪声到噪声损失(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 npdef 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]) / 2return image_sub1, image_sub2class 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

写在最后

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

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

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

这篇关于【传知代码】自监督高效图像去噪(论文复现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015046

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I