使用自编码器进行图像去噪

简介: 使用自编码器进行图像去噪

在这篇文章中,你将了解自编码器是如何工作的,以及为什么它们被用于医学图像去噪。

正确理解图像信息在医学等领域是至关重要的。去噪可以集中在清理旧的扫描图像上,或者有助于癌症生物学中的特征选择。噪音的存在可能会混淆疾病的识别和分析,从而导致不必要的死亡。因此,医学图像去噪是一项必不可少的预处理技术。

所谓的自编码器技术已被证明是非常有用的图像去噪。

自编码器由编码器模型和解码器模型两个相互连接的人工神经网络组成。自动编码器的目标是找到一种将输入图像编码为压缩格式(也称为潜在空间)的方法,使解码后的图像版本尽可能接近输入图像。

Autoencoders如何工作

该网络提供了原始图像x,以及它们的噪声版本x~。该网络试图重构其输出x ',使其尽可能接近原始图像x。通过这样做,它学会了如何去噪图像。

640.png

如图所示,编码器模型将输入转换为一个小而密集的表示。解码器模型可以看作是一个生成模型,它能够生成特定的特征。

编码器和解码器网络通常作为一个整体进行训练。损失函数判断网络创建的输出x '与原始输入x的差别。

通过这样做,编码器学会了在有限的潜在空间中保留尽可能多的相关信息,并巧妙地丢弃不相关的部分,如噪声。解码器学习采取压缩潜在信息,并重建它成为一个完全无错误的输入。

如何实现自动编码器

让我们实现一个自动编码器去噪手写数字。输入是一个28x28的灰度图像,构建一个784个元素的向量。

编码器网络是一个由64个神经元组成的稠密层。因此,潜在空间将有维数64。该层中的每个神经元上都附加了一个ReLu激活函数,根据每个神经元的输入是否与自编码器的预测相关,决定该神经元是否应该被激活。激活函数还有助于将每个神经元的输出规整为1到0之间的范围。

解码器网络是由784个神经元组成的单一致密层,对应28x28灰度化输出图像。sigmoid激活函数用于比较编码器输入和解码器输出。

采用二元交叉熵作为损失函数,Adadelta作为最小化损失函数的优化器。

importkerasfromkeras.layersimportInput, Densefromkeras.modelsimportModelfromkeras.datasetsimportmnistimportnumpyasnp#inputlayerinput_img=Input(shape=(784,))
#autoencoderencoding_dim=32encoded=Dense(encoding_dim, activation='relu')(input_img)
encoded_input=Input(shape=(encoding_dim,))
decoded=Dense(784, activation='sigmoid')(encoded)
autoencoder=Model(input_img, decoded)
decoder_layer=autoencoder.layers[-1]
decoder=Model(encoded_input, decoder_layer(encoded_input))
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')

MNIST数据集是一个著名的手写数字数据库,广泛用于机器学习领域的训练和测试。我们在这里使用它产生合成噪声数字应用高斯噪声矩阵和剪切图像之间的0和1。

importmatplotlib.pyplotaspltimportrandom%matplotlibinline#getMNISTimages, cleanandwithnoisedefget_mnist(noise_factor=0.5):
(x_train, y_train), (x_test, y_test) =mnist.load_data()
x_train=x_train.astype('float32') /255.x_test=x_test.astype('float32') /255.x_train=np.reshape(x_train, (len(x_train), 28, 28, 1))
x_test=np.reshape(x_test, (len(x_test), 28, 28, 1))
x_train_noisy=x_train+noise_factor*np.random.normal(loc=0.0, scale=1.0, size=x_train.shape)
x_test_noisy=x_test+noise_factor*np.random.normal(loc=0.0, scale=1.0, size=x_test.shape)
x_train_noisy=np.clip(x_train_noisy, 0., 1.)
x_test_noisy=np.clip(x_test_noisy, 0., 1.)
returnx_train, x_test, x_train_noisy, x_test_noisy, y_train, y_testx_train, x_test, x_train_noisy, x_test_noisy, y_train, y_test=get_mnist()
#plotnrandomdigits#uselabelstospecifywhichdigitstoplotdefplot_mnist(x, y, n=10, randomly=False, labels=[]):
plt.figure(figsize=(20, 2))
iflen(labels)>0:
x=x[np.isin(y, labels)]
foriinrange(1,n,1):
ax=plt.subplot(1, n, i)
ifrandomly:
j=random.randint(0,x.shape[0])
else:
j=iplt.imshow(x[j].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
plot_mnist(x_test_noisy, y_test, randomly=True)

640.png

你还能认出数字,但有些几乎认不出来。因此,我们想使用我们的自动编码器学习恢复原始数字。我们通过拟合超过100个epoch的自编码器,同时使用噪声数字作为输入,原始去噪数字作为目标。

因此,自编码器将最小化噪声和干净图像之间的差异。通过这样做,它将学会如何从任何看不见的手写数字中去除噪声,产生了类似的噪声。

#flattenthe28x28imagesintovectorsofsize784.x_train=x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test=x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
x_train_noisy=x_train_noisy.reshape((len(x_train_noisy), np.prod(x_train_noisy.shape[1:])))
x_test_noisy=x_test_noisy.reshape((len(x_test_noisy), np.prod(x_test_noisy.shape[1:])))
#traininghistory=autoencoder.fit(x_train_noisy, x_train,
epochs=100,
batch_size=128,
shuffle=True,
validation_data=(x_test_noisy, x_test))
#plottrainingperformancedefplot_training_loss(history):
loss=history.history['loss']
val_loss=history.history['val_loss']
epochs=range(1, len(loss) +1)
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
plot_training_loss(history)

640.png

如何用自编码器去噪

现在我们可以使用经过训练的自动编码器来清除不可见的噪声输入图像,并将它们与被清除的图像进行对比。

#plotde-noisedimagesdefplot_mnist_predict(x_test, x_test_noisy, autoencoder, y_test, labels=[]):
iflen(labels)>0:
x_test=x_test[np.isin(y_test, labels)]
x_test_noisy=x_test_noisy[np.isin(y_test, labels)]
decoded_imgs=autoencoder.predict(x_test)
n=10plt.figure(figsize=(20, 4))
foriinrange(n):
ax=plt.subplot(2, n, i+1)
plt.imshow(x_test_noisy[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()
returndecoded_imgs, x_testdecoded_imgs_test, x_test_new=plot_mnist_predict(x_test, x_test_noisy, autoencoder, y_test)

640.png

总的来说,噪音被很好地消除了。人工输入图像上的白点已经从清洗后的图像中消失。这些数字可以被视觉识别。例如,有噪声的数字' 4 '根本不可读,现在,我们可以读取它的清洁版本。去噪对信息质量有不利影响。重建的数字有点模糊。解码器添加了一些原始图像中没有的特征,例如下面的第8位和第9位数字几乎无法识别。

640.png

在本文中,我描述了一种图像去噪技术,并提供了如何使用Python构建自动编码器的实用指南。放射科医生通常使用自动编码器去噪MRI、US、x射线或皮肤病变图像。这些自动编码器是在大型数据集上训练的,比如印第安纳大学的胸部x射线数据库,其中包含7470张胸部x射线图像。去噪自动编码器可以通过卷积层来增强,以产生更有效的结果。

目录
相关文章
|
6月前
|
机器学习/深度学习 自然语言处理 数据可视化
深度探索变分自编码器在无监督特征学习中的应用
【4月更文挑战第20天】 在深度学习领域,无监督学习一直是研究的热点问题之一。本文聚焦于一种前沿的生成模型——变分自编码器(Variational Autoencoder, VAE),探讨其在无监督特征学习中的关键作用与应用潜力。不同于传统的摘要形式,本文将直接深入VAE的核心机制,分析其如何通过引入随机隐变量和重参数化技巧,实现对复杂数据分布的有效建模。文章还将展示VAE在多个实际数据集上的应用结果,验证其作为无监督特征提取工具的有效性和普适性。通过理论与实践的结合,本文旨在为读者提供关于VAE在无监督特征学习领域的全面认识。
|
9天前
|
机器学习/深度学习 存储 编解码
什么是图像噪声?是如何产生的?图像去噪技术都有哪些?
图像噪声是在图像采集、传输和处理过程中产生的像素值异常现象,主要由光子计数统计、电子偏移和放大器噪声等因素引起。噪声影响图像质量,降低信噪比,使特征难以识别。图像去噪技术包括传统方法(如空间域滤波、频域滤波、图像压缩和超糅合)和基于深度学习的方法(如卷积神经网络、残差网络和生成对抗网络),旨在有效去除噪声,提高图像质量。
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
VQ-VAE:矢量量化变分自编码器,离散化特征学习模型
VQ-VAE 是变分自编码器(VAE)的一种改进。这些模型可以用来学习有效的表示。本文将深入研究 VQ-VAE 之前,不过,在这之前我们先讨论一些概率基础和 VAE 架构。
123 10
|
4月前
|
机器学习/深度学习 算法 PyTorch
使用Pytorch中从头实现去噪扩散概率模型(DDPM)
在本文中,我们将构建基础的无条件扩散模型,即去噪扩散概率模型(DDPM)。从探究算法的直观工作原理开始,然后在PyTorch中从头构建它。本文主要关注算法背后的思想和具体实现细节。
8703 3
|
4月前
|
机器学习/深度学习 编解码 算法框架/工具
使用Python实现深度学习模型:图像超分辨率与去噪
【7月更文挑战第17天】 使用Python实现深度学习模型:图像超分辨率与去噪
137 4
|
6月前
|
机器学习/深度学习 数据可视化 PyTorch
使用Python实现深度学习模型:变分自编码器(VAE)
使用Python实现深度学习模型:变分自编码器(VAE)
418 2
如何使用变分自编码器进行图像生成
如何使用变分自编码器进行图像生成
87 0
|
6月前
|
人工智能 数据可视化 vr&ar
TripoSR:一个图像到3D生成模型,你get到了嘛!
TripoSR:一个图像到3D生成模型,你get到了嘛!
108 1
|
6月前
|
机器学习/深度学习 算法 PyTorch
使用PyTorch实现去噪扩散模型
在深入研究去噪扩散概率模型(DDPM)如何工作的细节之前,让我们先看看生成式人工智能的一些发展,也就是DDPM的一些基础研究。
93 0
|
6月前
|
机器学习/深度学习 存储 计算机视觉
特征提取
特征提取
92 3