图像去噪数据集

Introduction

目前效果出色的深度去噪方法大都采用监督学习的方法,需要采集输入-输出图像对(noisy/noise-free images pairs)建立训练数据集。数据集的建立是关键的任务。数据集的质量将直接决定去噪结果的质量。如何获取尽量多场景的图像数据,如何获得高质量的参考图像(ground truth),是目前研究的热点。

The State of Arts

Method

目前去噪数据集的建立主要分为以下三种方式:

  1. 从现有图像数据库获取高质量图像,然后做图像处理(如线性变化、亮度调整)并根据噪声模型添加人工合成噪声,生成噪声图像;
  2. 针对同一场景,拍摄低ISO图像作为ground truth,高ISO图像作为噪声图像,并调整曝光时间等相机参数使得两张图像亮度一致;
  3. 对同一场景连续拍摄多张图像,然后做图像处理(如图像配准、异常图像剔除等),然后加权平均合成ground truth;
    这几种方法各有利弊:
    第一种方法比较简单省时,高质量图像可以直接从网上获取,但由于噪声是人工合成的,其与真实噪声图像有一定差异,使得在该数据集上训练的网络在真实噪声图像上的去噪效果受限;
    第二种方法只使用单张低ISO图像作为ground truth,难免会残留噪声,且与噪声图像可能存在亮度差异和不对齐的问题;
    第三种方法需要拍摄大量图像,工作量比较大,且需要对图像进行严格对准,但一般得到的ground truth质量比较高;
    在实际应用中,这三种方法都有被采用,并相互结合。一般在网络训练初期,会采用第一种合成噪声图像的方法,快速获得数据集对网络进行训练。如DnCNN,burst kernel predict network等都采用了这种方式。而为了应用于真实环境中,现在越来越多的方法采用真实噪声图像进行网络训练。
    但是,有一个值得考虑的问题是,为了提高去噪网络的鲁棒性和泛化能力,常常需要将输入噪声图像的噪声水平估计也作为网络输入。而真实噪声图像的噪声水平估计往往存在一定误差,从这一方面考虑,合成噪声图像由于噪声模型已知,所以其噪声水平估计是准确的,有利于网络的在不同噪声水平上的泛化。CBDNet就考虑将真实噪声图像和合成噪声图像一起作为训练集,交替对网络进行训练以提升网络的性能。
Datasets

下面简单总结一下现有的真实噪声图像数据集(即第二和第三种方法建立的数据集)。
其中数据集数量以不同的场景与拍摄设备计算(即对同一场景用同一设备在同一参数下连续拍摄多张以一张计算)。

名称年份类型数量链接地址
RENOIR2014第二种(Low/high-ISO images pair)120张project
Nam2016第三种(multi-images mean)15张project
DND2017第二种(Low/high-ISO images pair)50张project
PolyU2018第三种(multi-images mean)40张github
SIDD2018第三种(multi-images mean)200张project

具体情况如下:
RENOIR
参考论文:RENOIR - A Dataset for Real Low-Light Image Noise Reduction
拍摄了120个暗光场景,包含室内和室外场景。每个场景约4张图像,包含2张有噪声图像和两张低噪图像。
RENOIR
Nam
参考论文:A Holistic Approach to Cross-Channel Image Noise Modeling and its Application to Image Denoising
仅包含11个场景,且多是相似物体和纹理。针对这11个场景共拍摄了500张JPEG图像。
Nam1
Nam2
DND
参考论文:Benchmarking Denoising Algorithms with Real Photographs
拍摄50个场景,包括室内和室外场景。
DND
PolyU
参考论文:Real-world Noisy Image Denoising: A New Benchmark
拍摄了40个场景,包括室内正常光照场景和暗光场景,室外正常光照场景。对每个场景连续拍摄了500次。
ANB
SIDD
参考论文:A High-Quality Denoising Dataset for Smartphone Cameras
用5个相机(Google Pixel、iPhone 7、Samsung Galaxy S6 Edge、Motorola Nexus 6、LG G4)在四种相机参数下拍摄了10个场景,200个场景实例,每个场景连续拍摄了150张图像。其中160个场景实例作为训练集,40个场景实例作为测试集(the benchmark)。
具体数据集参数可参考项目主页。

Conclusion

目前来说深度去噪数据集的建立,仍然有许多问题解决,其主要集中在几个方面:

  1. 多场景、多设备图像的获取;
  2. 高质量ground truth的获取;
  3. 更加符合真实噪声分布的噪声模型的建立;
  4. 更加准确的噪声水平估计方法;
    想要建立适用于广泛场景和噪声水平的深度去噪网络还是非常困难,针对于特定应用场景(暗光室内场景等)的噪声建模和去噪网络还是值得做进一步深入研究的。
图像去噪是一种常见的图像处理技术,可以通过降低图像噪声的水平来提高图像质量。CIFAR10数据集是一个常用的图像分类数据集,其中包含10个类别的60000张32x32 RGB图像。下面我们介绍一种使用CIFAR10数据集进行图像去噪的方法。 1. 加载数据集 我们可以使用PyTorch中的torchvision.datasets模块加载CIFAR10数据集。具体代码如下: ```python import torch import torchvision import torchvision.transforms as transforms # 定义数据预处理方式 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) # 加载训练数据集 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) # 加载测试数据集 testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) # 定义数据加载器 trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True, num_workers=2) testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False, num_workers=2) ``` 2. 添加噪声 为了模拟真实场景下的图像噪声,我们可以使用torch.randn()函数生成随机噪声,然后将其添加到图像中。具体代码如下: ```python import torch.nn.functional as F # 定义添加噪声函数 def add_noise(img): noise = torch.randn(img.shape) noisy_img = img + noise return noisy_img # 对训练集和测试集的图像添加噪声 noisy_trainset = [(add_noise(img), target) for img, target in trainset] noisy_testset = [(add_noise(img), target) for img, target in testset] # 定义数据加载器 noisy_trainloader = torch.utils.data.DataLoader(noisy_trainset, batch_size=64, shuffle=True, num_workers=2) noisy_testloader = torch.utils.data.DataLoader(noisy_testset, batch_size=64, shuffle=False, num_workers=2) ``` 3. 定义模型 我们可以使用一个简单的卷积神经网络模型来进行图像去噪。具体代码如下: ```python import torch.nn as nn # 定义卷积神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 32, 3, padding=1) self.conv2 = nn.Conv2d(32, 64, 3, padding=1) self.conv3 = nn.Conv2d(64, 128, 3, padding=1) self.conv4 = nn.Conv2d(128, 64, 3, padding=1) self.conv5 = nn.Conv2d(64, 32, 3, padding=1) self.conv6 = nn.Conv2d(32, 3, 3, padding=1) def forward(self, x): x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = F.relu(self.conv3(x)) x = F.relu(self.conv4(x)) x = F.relu(self.conv5(x)) x = F.relu(self.conv6(x)) return x # 定义模型实例 net = Net() ``` 4. 训练模型 我们可以使用均方误差作为损失函数,使用Adam优化器进行模型训练。具体代码如下: ```python import torch.optim as optim # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = optim.Adam(net.parameters(), lr=0.001) # 训练模型 for epoch in range(10): # 进行10个epoch的训练 running_loss = 0.0 for i, data in enumerate(noisy_trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, inputs) loss.backward() optimizer.step() running_loss += loss.item() if i % 100 == 99: # 每100个batch输出一次损失值 print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100)) running_loss = 0.0 ``` 5. 测试模型 我们可以使用训练好的模型对测试集中的图像进行去噪,并计算去噪后的图像与原图之间的均方误差。具体代码如下: ```python import matplotlib.pyplot as plt import numpy as np # 测试模型 with torch.no_grad(): mse = 0.0 for data in noisy_testloader: images, labels = data outputs = net(images) mse += np.mean((outputs.numpy() - images.numpy()) ** 2) print('均方误差: %.3f' % (mse / len(testset))) # 可视化去噪结果 fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(25,4)) for i in range(10): axes[0][i].imshow(np.transpose(images[i], (1, 2, 0))) axes[1][i].imshow(np.transpose(outputs[i], (1, 2, 0))) plt.show() ``` 运行以上代码,即可使用CIFAR10数据集进行图像去噪
评论 60
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值