使用自动编码器进行图像去噪 - 深度学习项目的初学者指南
使用自动编码器进行图像去噪 - 深度学习项目的初学者指南
介绍
让我们从理解术语“图像去噪”的含义开始我们的讨论,这也是我们的文章标题——
图像去噪是从图像中去除噪声的过程
图像中存在的噪声可能是由实际上难以处理的各种内在或外在条件引起的。图像去噪问题是图像处理和计算机视觉领域的一个非常基本的挑战。因此,它在许多领域中发挥着重要作用,获取原始图像对于鲁棒性能非常重要。
让我们看看存在噪声的图像是什么样子的:
带有噪声的图像示例
因此,在本文中,我们将看到如何使用自动编码器或编码器-解码器网络从带有噪声的图像中去除噪声。
在本文中,我将使用深度人工神经网络实现自动编码器。我的下一篇文章中,我还将针对相同的问题陈述使用深度卷积神经网络来描述自动编码器。所以,试试这个项目,并在我的下一个教程中继续关注我们。
现在,让我们也看看去除噪声后图像的外观:
对顽皮狗图像进行降噪之前和降噪之后
现在,让我们通过了解一些关于自动编码器的基本概念来开始我们的讨论。
编码器-解码器网络(自动编码器)概述
自编码器是一种无监督的人工神经网络,经过训练可以将其输入复制到输出。对于图像数据,自动编码器将首先将图像编码为低维表示,然后将该表示解码回图像。编码器-解码器包含以下两种结构:
- 编码器 -该网络将数据下采样到较低的维度。
- 解码器 -该网络从较低维度的表示中重建原始数据。
较低维度(即编码器网络的输出)表示通常称为潜在空间表示。
关于自动编码器,我们必须记住的一件事是,它们只能压缩与它们接受过训练的数据相似的数据。它们本质上也是有损的,这意味着相对于原始输入,输出将降级。
它们通过反向传播进行类似于人工神经网络的训练。
让我们开始吧!
加载必要的库
第一步是加载必要的 Python 库。我们将导入诸如numpy 之类的库,用于优化矩阵乘法,matplotlib用于数据可视化,例如绘制图像。来自 Keras 的序列模型为我们提供了一个空的架构,根据我们的架构,我们将在其中添加几个全连接层,Dense在我们的网络中创建全连接层,直接从Keras导入MNIST数据集。
import numpy
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.datasets import mnist
现在,我们完成了导入必要库的第一步,让我们继续以 numpy 的形式加载数据集。
以 Numpy 格式加载数据集
在本文中,我们将使用 MNIST 数据集,这是一个简单的计算机视觉数据集。它由灰度形式的手写数字图像组成,每个图像的大小为 28x28 像素。MNIST 数据集是深度学习中广泛使用的基准数据集,非常适合用于演示图像去噪技术。
让我们加载数据集并将其分为训练集和测试集:
(x_train, _), (x_test, _) = mnist.load_data()
由于我们只关注图像去噪,因此我们可以忽略标签数据。接下来,我们需要对图像数据进行预处理,以便将其输入到自动编码器中。
数据预处理
在将图像输入到自动编码器之前,我们需要对其进行预处理。这包括将像素值缩放到 0 到 1 之间,并将图像展平为一维数组:
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), numpy.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), numpy.prod(x_test.shape[1:])))
现在,我们的数据已经准备好输入到自动编码器中了。接下来,让我们构建自动编码器模型。
构建自动编码器模型
我们将使用 Keras 的 Sequential API 来构建自动编码器模型。自动编码器由编码器和解码器两部分组成。编码器将输入图像压缩到较低维度的表示,而解码器则尝试从该表示中重建原始图像。
让我们定义编码器部分:
input_dim = x_train.shape[1]
encoding_dim = 32
autoencoder = Sequential()
autoencoder.add(Dense(encoding_dim, input_shape=(input_dim,), activation='relu'))
autoencoder.add(Dense(input_dim, activation='sigmoid'))
在这个简单的自动编码器中,我们只使用了两个全连接层。第一层是编码器,将输入图像压缩到 32 维的潜在空间表示。第二层是解码器,尝试从潜在空间表示中重建原始图像。
现在,让我们编译模型:
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
我们使用 Adam 优化器和二元交叉熵损失函数来训练模型。这是因为我们的输入数据是二值化的(0 到 1 之间的像素值),并且我们希望模型能够尽可能准确地重建原始图像。
训练自动编码器
现在,我们的模型已经定义好了,让我们训练它:
autoencoder.fit(x_train, x_train,
epochs=50,
batch_size=256,
shuffle=True,
validation_data=(x_test, x_test))
我们训练模型 50 个周期,每个周期使用 256 个样本的批量大小。我们还启用了数据洗牌,以确保模型在每个周期中都能看到不同的数据顺序。最后,我们使用测试数据集来验证模型的性能。
评估模型性能
训练完成后,我们可以使用测试数据集来评估模型的性能:
decoded_imgs = autoencoder.predict(x_test)
这将生成测试集上所有图像的重建版本。接下来,让我们可视化一些原始图像、噪声图像和重建图像:
n = 10
plt.figure(figsize=(20, 4))
for i in range(n):
# 显示原始图像
ax = plt.subplot(2, n, i + 1)
plt.imshow(x_test[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
# 显示重建图像
ax = plt.subplot(2, n, i + 1 + n)
plt.imshow(decoded_imgs[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
这将显示原始图像和重建图像的并排比较。通过观察这些图像,我们可以评估模型的去噪性能。
总结
在本文中,我们介绍了如何使用自动编码器进行图像去噪。我们使用了 MNIST 数据集作为示例,并使用 Keras 构建了一个简单的自动编码器模型。通过训练模型并可视化结果,我们可以看到自动编码器在去除图像噪声方面的能力。
这是一个非常基础的自动编码器实现,但在实际应用中,可以使用更复杂的架构(如卷积自动编码器)来获得更好的性能。此外,还可以尝试使用不同的损失函数、优化器和超参数来进一步优化模型。