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

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

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

目录

概述

演示效果

核心代码

写在最后


概述

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

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

相关文章

串口通信问题排查总结

串口通信问题排查 排查原则: 软件从发送处理到接收处理,核查驱动、控制及发送接收数据是否正常。硬件从发送到接收,针对信号经过的各段,分段核对信号是否正常。示波器、逻辑分析仪。用万用表、示波器、逻辑分析仪等工具&#xf…

JRT性能演示

演示视频 君生我未生,我生君已老,这里是java信创频道JRT,真信创-不糊弄。 基础架构决定上层建筑,和给有些品种的植物种植一样,品种不对,施肥浇水再多,也是不可能长成参天大树的。JRT吸收了各方…

基于文本来推荐相似酒店

基于文本来推荐相似酒店 查看数据集基本信息 import pandas as pd import numpy as np from nltk.corpus import stopwords from sklearn.metrics.pairwise import linear_kernel from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extrac…

C++:类和对象

一、前言 C是面向对象的语言,本文将通过上、中、下三大部分,带你深入了解类与对象。 目录 一、前言 二、部分:上 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的…

【busybox记录】【shell指令】readlink

目录 内容来源: 【GUN】【readlink】指令介绍 【busybox】【readlink】指令介绍 【linux】【readlink】指令介绍 使用示例: 打印符号链接或规范文件名的值 - 默认输出 打印符号链接或规范文件名的值 - 打印规范文件的全路径 打印符号链接或规范文…

(函数)颠倒字符串顺序(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <string.h>//声明颠倒函数; void reverse(char a[]) {//初始化变量值&#xff1b;int i, j;char t;//循环颠倒&#xff1b;for (i 0, j strl…

【使用ChatGPT构建应用程序】应用程序开发概述:1. 管理秘钥、2. 数据安全、3. 与应用程序解耦、4. 注意提示语的注入攻击

文章目录 一. 首先注意的两个方面1. 管理API密钥1.1. 用户提供API密钥1.2. 你自己提供API密钥 2. 数据安全和数据隐私 二. 软件架构设计原则&#xff1a;与应用程序解耦三. 注意LLM提示语的注入攻击1. 分析输入和输出2. 监控和审计3. 其他要注意的注入情况 在了解了ChatGPT的文…

一篇文章讲透排序算法之快速排序

前言 本篇博客难度较高&#xff0c;建议在学习过程中先阅读一遍思路、浏览一遍动图&#xff0c;之后研究代码&#xff0c;之后仔细体会思路、体会动图。之后再自己进行实现。 一.快排介绍与思想 快速排序相当于一个对冒泡排序的优化&#xff0c;其大体思路是先在文中选取一个…

基于Python实现 HR 分析(逻辑回归和基于树的机器学习)【500010104】

介绍 数据集说明 此数据集包含与员工有关的综合属性集合&#xff0c;从人口统计细节到与工作相关的因素。该分析的主要目的是预测员工流动率并辨别导致员工流失的潜在因素。 在这个数据集中&#xff0c;有14,999行&#xff0c;10列&#xff0c;以及这些变量&#xff1a;满意度…

ClickHouse 与其他数仓架构的对比——Clickhouse 架构篇(四)

文章目录 前言ClickHouse与Hive的对比计算引擎的差异ClickHouse比Hive查询速度快的原因 ClickHouse与HBase的对比HBase的存储系统与ClickHouse的异同HBase的适用场景及ClickHouse不适合的原因 ClickHouse与Kylin的对比Kylin的架构Kylin解决性能问题的思路Kylin方案的缺陷ClickH…

我觉得 “砍需求” 是程序员最牛逼的本领

在下认为&#xff0c;不会 “砍需求” 的程序员不是好程序员&#xff0c;工作经验越丰富的程序员&#xff0c;砍需求的本领一般就越高。即使现在我多了一个身份 —— 管理团队&#xff0c;我也会帮开发同学去跟产品砍需求。 没错&#xff0c;从管理者的角度&#xff0c;我希望…

web练习

[CISCN 2022 初赛]ezpop ThinkPHP V6.0.12LTS 反序列化漏洞 漏洞分析 ThinkPHP6.0.12LTS反序列漏洞分析 - FreeBuf网络安全行业门户 解题过程 ThinkPHP V6.0.12LTS反序列化的链子可以找到&#xff0c;找到反序列化的入口就行 反序列化的入口在index.php/index/test 链子 …

latex中伪代码后面多出=0

这latex简直就是憨猪&#xff01;&#xff01;&#xff01; \usepackage{algpseudocode} 注释掉&#xff0c;或者删除就可以了 还有&#xff0c;引用包的时候一般begin{}中括号里是什么就引入什么包。 这下面这几行&#xff0c;开始全爆红说没定义&#xff0c;我就去一行一行问…

【SPSS】基于因子分析法对水果茶调查问卷进行分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

P2341 受欢迎的牛

题目描述 每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N 头牛&#xff0c;给你 M 对整数&#xff0c;表示牛 A 认为牛 B 受欢迎。这种关系是具有传递性的&#xff0c;如果 A 认为 B 受欢迎&#xff0c;B 认为 C 受欢迎&#xff0c;那么牛 A 也认为牛 C 受欢迎。你的任务是…

MATLAB学习:频谱图的绘制

1.概述 时域信号经FFT变换后得到了频谱,在作图时还必须设置正确的频率刻度,这样才能从图中得到正确的结果。 2.案例分析 下面透过一个简单的例子来分析频谱图中频率刻度(横坐标)的设置的重要性。一余弦信号,信号频率为30Hz,采样频率100Hz,信号长128,在FFT后做谱图&#xff0…

Iphone自动化指令每隔固定天数打开闹钟关闭闹钟(二)

1.首先在搜索和操作里搜索“查找日期日程" 1.1.然后过滤条件开始日期选择”是今天“ 1.2.增加过滤条件&#xff0c;日历是这里选择”工作“ 1.3.增加过滤条件&#xff0c;选择标题&#xff0c;是这里选择”workDay“ 1.4选中限制&#xff0c;日历日程只要一个&#xff0c;…

k8s部署calico遇到的问题

kubernetes安装calico calico官网 环境&#xff1a;centos7.9&#xff0c;calico 3.23&#xff0c;kuberadm 1.26 问题1&#xff1a;执行kubectl create -f calico.yml后报错如下 error: resource mapping not found for name: “tigera-operator” namespace: “” from “…

echarts-dataset,graphic,dataZoom, toolbox

dataset数据集配置数据 dataset数据集&#xff0c;也可以完成数据的映射&#xff0c;一般用于一段数据画多个图表 例子&#xff1a; options {tooltip: {},dataset: {source: [["product", "2015", "2016", "2017"],["test&q…

HTTP Basic Access Authentication Schema

HTTP Basic Access Authentication Schema 背景介绍流程安全缺陷参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得&#xff0c;并非原创&#xff0c;目的是为了需要时方便查看。 介绍 HTTP Basic Access Authentication Schema&#xff0c;HTTP 基本访问认证模式…