Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >干货|利用卷积自编码器对图片进行降噪

干货|利用卷积自编码器对图片进行降噪

作者头像
小白学视觉
发布于 2022-04-06 02:46:37
发布于 2022-04-06 02:46:37
5990
举报

前言:

这周工作太忙,本来想更把Attention tranlsation写出来,但一直抽不出时间,等后面有时间再来写。我们这周来看一个简单的自编码器实战代码,关于自编码器的理论介绍我就不详细介绍了,网上一搜一大把。最简单的自编码器就是通过一个encoder和decoder来对输入进行复现,例如我们将一个图片输入到一个网络中,自编码器的encoder对图片进行压缩,得到压缩后的信息,进而decoder再将这个信息进行解码从而复现原图。

作图工具:OmniGraffle

自编码器实际上是通过去最小化target和input的差别来进行优化,即让输出层尽可能地去复现原来的信息。由于自编码器的基础形式比较简单,对于它的一些变体也非常之多,包括DAE,SDAE,VAE等等,如果感兴趣的小伙伴可以去网上搜一下其他相关信息。

本篇文章将实现两个Demo,第一部分即实现一个简单的input-hidden-output结的自编码器,第二部分将在第一部分的基础上实现卷积自编码器来对图片进行降噪。

工具说明

  • TensorFlow1.0
  • jupyter notebook
  • 数据:MNIST手写数据集
  • 完整代码地址https://github.com/NELSONZHAO/zhihu/tree/master/denoise_auto_encoder

第一部分

首先我们将实现一个如上图结构的最简单的AutoEncoder。

加载数据

在这里,我们使用MNIST手写数据集来进行实验。首先我们需要导入数据,TensorFlow已经封装了这个实验数据集,所以我们使用起来也非常简单。

如果想让数据显示灰度图像,使用代码plt.imshow(img.reshape((28,28)), cmap='Greys_r')即可。

通过input_data就可以加载我们的数据集。如果小伙伴本地已经有了MNIST数据集(四个压缩包),可以把这四个压缩包放在目录MNIST_data下,这样TensorFlow就会直接Extract数据,而不用再重新下载。我们可以通过imshow来随便查看一个图像。由于我们加载进来的数据已经被处理成一个784维度的向量,因此重新显示的时候需要reshape一下。

构建模型

我们把数据加载进来以后就可以进行最简单的建模。在这之前,我们首先来获取一下input数据的大小,我们加载进来的图片是28x28的像素块,TensorFlow已经帮我们处理成了784维度的向量。同时我们还需要指定一下hidden layer的大小。

在这里我指定了64,hidden_units越小,意味着信息损失的越多,小伙伴们也可以尝试一下其他的大小来看看结果。

AutoEncoder中包含了input,hidden和output三层。

在隐层,我们采用了ReLU作为激活函数。

至此,一个简单的AutoEncoder就构造完成,接下来我们可以启动TensorFlow的graph来进行训练。

训练结果可视化

经过上面的步骤,我们构造了一个简单的AutoEncoder,下面我们将对结果进行可视化看一下它的表现。

这里,我挑选了测试数据集中的5个样本来进行可视化,同样的,如果想观察灰度图像,指定cmap参数为'Greys_r'即可。上面一行为test数据集中原始图片,第二行是经过AutoEncoder复现以后的图片,可以很明显的看到像素信息的损失。

同样,我们也可以把隐层压缩的数据拿出来可视化,结果如下:

这五张图分别对应了test中五张图片的隐层压缩后的图像。

通过上面一个简单的例子,我们了解了AutoEncoder的基本工作原理,下面我们将更进一步改进我们的模型,将隐层转换为卷积层来进行图像降噪。

上面过程中省略了一部分代码,完整代码请去我的GitHub上查看。

第二部分

在了解了上面AutoEncoder工作原理的基础上,我们在这一部分将对AutoEncoder加入多个卷积层来进行图片的降噪处理。

如果有小伙伴对卷积神经网络不清楚的话,可以去知乎看看大神们的文章来学习一下。

同样的我们还是使用MNIST数据集来进行实验,关于数据导入的步骤不再赘述,请下载代码查看。在开始之前,我们先通过一张图片来看一下我们的整个模型结构:

作图工具:OmniGraffle

我们通过向模型输入一个带有噪声的图片,在输出端给模型没有噪声的图片,让模型通过卷积自编码器去学习降噪的过程。

输入层

这里的输入层和我们上一部分的输入层已经不同,因为这里我们要使用卷积操作,因此,输入层应该是一个height x width x depth的一个图像,一般的图像depth是RGB格式三层,这里我们的MNIST数据集的depth只有1。

Encoder卷积层

Encoder卷积层设置了三层卷积加池化层,对图像进行处理。

第一层卷积中,我们使用了64个大小为3 x 3 的滤波器(filter),strides默认为1,padding设置为same后我们的height和width不会被改变,因此经过第一层卷积以后,我们得到的数据从最初的28 x 28 x 1 变为 28 x 28 x 64。

紧接着对卷积结果进行最大池化操作(max pooling),这里我设置了size和stride都是2 x 2,池化操作不改变卷积结果的深度,因此池化以后的大小为 14 x 14 x 64。

对于其他卷积层不再赘述。所有卷积层的激活函数都是用了ReLU。

经过三层的卷积和池化操作以后,我们得到的conv3实际上就相当于上一部分中AutoEncoder的隐层,这一层的数据已经被压缩为4 x 4 x 32的大小。

至此,我们就完成了Encoder端的卷积操作,数据维度从开始的28 x 28 x 1变成了4 x 4 x 32。

Decoder卷积层

接下来我们就要开始进行Decoder端的卷积。在这之前,可能有小伙伴要问了,既然Encoder中都已经把图片卷成了4 x 4 x 32,我们如果继续在Decoder进行卷积的话,那岂不是得到的数据size越来越小?所以,在Decoder端,我们并不是单纯进行卷积操作,而是使用了Upsample(中文翻译可以为上采样)+ 卷积的组合。

我们知道卷积操作是通过一个滤波器对图片中的每个patch进行扫描,进而对patch中的像素块加权求和后再进行非线性处理。举个例子,原图中我们的patch的大小假如是3 x 3(说的通俗点就是一张图片中我们取其中一个3 x 3大小的像素块出来),接着我们使用3 x 3的滤波器对这个patch进行处理,那么这个patch经过卷积以后就变成了1个像素块。在Deconvolution中(或者叫transposed convolution)这一过程是反过来的,1个像素块会被扩展成3 x 3的像素块。

但是Deconvolution有一些弊端,它会导致图片中出现checkerboard patterns,这是因为在Deconvolution的过程中,滤波器中会出现很多重叠。为了解决这个问题,有人提出了使用Upsample加卷积层来进行解决。

关于Upsample有两种常见的方式,一种是nearest neighbor interpolation,另一种是bilinear interpolation。

本文也会使用Upsample加卷积的方式来进行Decoder端的处理。

在TensorFlow中也封装了对Upsample的操作,我们使用resize_nearest_neighbor对Encoder卷积的结果resize,进而再进行卷积处理。经过三次Upsample的操作,我们得到了28 x 28 x 64的数据大小。最后,我们要将这个结果再进行一次卷积,处理成我们原始图像的大小。

最后一步定义loss和optimizer。

loss函数我们使用了交叉熵进行计算,优化函数学习率为0.001。

构造噪声数据

通过上面的步骤我们就构造完了整个卷积自编码器模型。由于我们想通过这个模型对图片进行降噪,因此在训练之前我们还需要在原始数据的基础上构造一下我们的噪声数据。

我们通过上面一个简单的例子来看一下如何加入噪声,我们获取一张图片的数据img(大小为784),在它的基础上加入噪声因子乘以随机数的结果,就会改变图片上的像素。接着,由于MNIST数据的每个像素数据都被处理成了0-1之间的数,所以我们通过numpy.clip对加入噪声的图片进行clip操作,保证每个像素数据还是在0-1之间。

np.random.randn(*img.shape)的操作等于np.random.randn(img.shape[0], img.shape[1])

我们下来来看一下加入噪声前后的图像对比。

训练模型

介绍完模型构建和噪声处理,我们接下来就可以训练我们的模型了。

在训练模型时,我们的输入已经变成了加入噪声后的数据,而输出是我们的原始没有噪声的数据,主要要对原始数据进行reshape操作,变成与inputs_相同的格式。由于卷积操作的深度,所以模型训练时候有些慢,建议使用GPU跑。

记得最后关闭sess。

结果可视化

经过上面漫长的训练,我们的模型终于训练好了,接下来我们就通过可视化来看一看模型的效果如何。

可以看到通过卷积自编码器,我们的降噪效果还是非常好的,最终生成的图片看起来非常顺滑,噪声也几乎看不到了。

有些小伙伴可能就会想,我们也可以用基础版的input-hidden-output结构的AutoEncoder来实现降噪。因此我也实现了一版用最简单的input-hidden-output结构进行降噪训练的模型(代码在我的GitHub)。我们来看看它的结果:

可以看出,跟卷积自编码器相比,它的降噪效果更差一些,在重塑的图像中还可以看到一些噪声的影子。

结尾:

至此,我们完成了基础版本的AutoEncoder模型,还在此基础上加入卷积层来进行图片降噪。相信小伙伴对AntoEncoder也有了一个初步的认识。完整的代码https://github.com/NELSONZHAO/zhihu/tree/master/denoise_auto_encoder,其中包含了六个文件:

  • BasicAE,基础版本的AutoEncoder(包含jupyter notebook和html两个文件)
  • EasyDAE,基础版本的降噪AutoEncoder(包含jupyter notebook和html两个文件)
  • ConvDAE,卷积降噪AutoEncoder(包含jupyter notebook和html两个文件)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
开发 | 利用卷积自编码器对图片进行降噪
AI科技评论按:本文原作者天雨粟,原文载于作者的知乎专栏机器不学习。本文获得作者授权转载至AI科技评论。 前言 这周工作太忙,本来想更把 Attention tranlsation 写出来,但一直抽不出时间,等后面有时间再来写。我们这周来看一个简单的自编码器实战代码,关于自编码器的理论介绍我就不详细介绍了,网上一搜一大把。最简单的自编码器就是通过一个 encoder 和 decoder 来对输入进行复现,例如我们将一个图片输入到一个网络中,自编码器的 encoder 对图片进行压缩,得到压缩后的信息,进而
AI科技评论
2018/03/13
8160
开发 | 利用卷积自编码器对图片进行降噪
深度学习算法(第30期)----降噪自编码器和稀疏自编码器及其实现
深度学习算法(第29期)----可视化自编码器和无监督预训练 今天我们一起学一下降噪自编码器和稀疏自编码器方面的知识。
智能算法
2019/10/14
3.5K0
深度学习算法(第30期)----降噪自编码器和稀疏自编码器及其实现
用自编码器进行图像去噪
在深度学习中,自编码器是非常有用的一种无监督学习模型。自编码器由encoder和decoder组成,前者将原始表示编码成隐层表示,后者将隐层表示解码成原始表示,训练目标为最小化重构误差,而且一般而言,隐层的特征维度低于原始特征维度。 自编码器只是一种思想,在具体实现中,encoder和decoder可以由多种深度学习模型构成,例如全连接层、卷积层或LSTM等,以下使用Keras来实现用于图像去噪的卷积自编码器。 1 结果 先看一下最后的结果,使用的是手写数字MNIST数据集,上面一行是添加噪音的图像,下面一
张宏伦
2018/06/07
1.4K0
视觉进阶 | 用于图像降噪的卷积自编码器
在神经网络世界中,对图像数据进行建模需要特殊的方法。其中最著名的是卷积神经网络(CNN或ConvNet)或称为卷积自编码器。并非所有的读者都了解图像数据,那么我先简要介绍图像数据(如果你对这方面已经很清楚了,可以跳过)。然后,我会介绍标准神经网络。这个标准神经网络用于图像数据,比较简单。这解释了处理图像数据时为什么首选的是卷积自编码器。最重要的是,我将演示卷积自编码器如何减少图像噪声。这篇文章将用上Keras模块和MNIST数据。Keras用Python编写,并且能够在TensorFlow上运行,是高级的神经网络API。
磐创AI
2019/12/23
9010
视觉进阶 | 用于图像降噪的卷积自编码器
【干货】对抗自编码器PyTorch手把手实战系列——对抗自编码器学习笔迹风格
即使是非计算机行业, 大家也知道很多有名的神经网络结构, 比如CNN在处理图像上非常厉害, RNN能够建模序列数据. 然而CNN, RNN之类的神经网络结构本身, 并不能用于执行比如图像的内容和风格分
WZEARW
2018/04/25
2.2K3
【干货】对抗自编码器PyTorch手把手实战系列——对抗自编码器学习笔迹风格
【干货】对抗自编码器PyTorch手把手实战系列——PyTorch实现自编码器
即使是非计算机行业, 大家也知道很多有名的神经网络结构, 比如CNN在处理图像上非常厉害, RNN能够建模序列数据. 然而CNN, RNN之类的神经网络结构本身, 并不能用于执行比如图像的内容和风格分
WZEARW
2018/04/16
3.3K0
【干货】对抗自编码器PyTorch手把手实战系列——PyTorch实现自编码器
自编码器原理概述_编码器结构及工作原理
原文链接:http://www.chenjianqu.com/show-62.html
全栈程序员站长
2022/11/15
2.6K0
自编码器原理概述_编码器结构及工作原理
【学术】一文搞懂自编码器及其用途(含代码示例)
自编码器(Autoencoder)是一种旨在将它们的输入复制到的输出的神经网络。他们通过将输入压缩成一种隐藏空间表示(latent-space representation),然后这种重构这种表示的输
AiTechYun
2018/03/02
9160
【学术】一文搞懂自编码器及其用途(含代码示例)
【机器学习-无监督学习】自编码器
  在前面的文章中,我们介绍了各种类型的无监督学习算法,如聚类算法、降维算法等。归根结底,无监督学习的目的是从复杂数据中提取出可以代表数据的特征,例如数据的分布、数据的主要成分等等,再用这些信息帮助后续的其他任务。随着机器学习向深度学习发展和神经网络的广泛应用,用神经网络提取数据特征的方法也越来越重要。本文介绍的自编码器(autoencoder,AE)就是其中最基础的一种无监督特征提取方法,也是一种深度学习模型。
Francek Chen
2025/01/22
5450
【机器学习-无监督学习】自编码器
基于TensorFlow实现自编码器(附源码)
关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 AE简介 传统的机器学习很大程度上依赖于好的特征工程,而特征工程是一项十分耗费精力与时间的事情,最主要的是在语音、图像和视频中提取有效地特征就更难了。而深度学习,包括有监督的深度学习和无监督的深度学习,可以完美的解决人工难以有效提取特征的问题,他可以大大缓解机器学习模型对特征工程的依赖性 例如在图像识别问题中,我们有大量的图片,这其中不仅包括汽车的图片还包括其他类别的图片,那么我们如何
昱良
2018/04/08
3.9K0
基于TensorFlow实现自编码器(附源码)
机器学习笔记 – 自动编码器autoencoder
简而言之,自动编码器通过接收数据、压缩和编码数据,然后从编码表示中重构数据来进行操作。对模型进行训练,直到损失最小化并且尽可能接近地再现数据。通过这个过程,自动编码器可以学习数据的重要特征。
全栈程序员站长
2022/08/25
3.4K0
机器学习笔记 – 自动编码器autoencoder
详解自动编码器(AE)
传统的自动编码器是一种数据的压缩算法 其算法包括编码阶段和解码阶段,且拥有对称的结构。
全栈程序员站长
2022/08/14
1.3K0
详解自动编码器(AE)
深度有趣 | 05 自编码器图像去噪
自编码器(AutoEncoder)是深度学习中的一类无监督学习模型,由encoder和decoder两部分组成
张宏伦
2018/12/13
8690
GAN 并不是你所需要的全部:从AE到VAE的自编码器全面总结
说到计算机生成的图像肯定就会想到deep fake:将马变成的斑马或者生成一个不存在的猫。在图像生成方面GAN似乎成为了主流,但是尽管这些模型在生成逼真的图像方面取得了巨大成功,但他们的缺陷也是十分明显的,而且并不是生成图像的全部。自编码器(autoencoder)作为生成的图像的传统模型还没有过时并且还在发展,所以不要忘掉自编码器!
deephub
2022/04/14
9900
GAN 并不是你所需要的全部:从AE到VAE的自编码器全面总结
自编码器 AE(AutoEncoder)程序
在这种自编码器的最简单结构中,只有三个网络层,即只有一个隐藏层的神经网络。它的输入和输出是相同的,可通过使用Adam优化器和均方误差损失函数,来学习如何重构输入。
代码的路
2022/06/18
6140
自动编码器
定义解码器:输出784个神经元,使用sigmoid函数,(784这个值是输出与原图片大小一致)
Lansonli
2021/10/09
9020
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》第17章 使用自编码器和GAN做表征学习和生成式学习
(第二部分:深度学习) 第10章 使用Keras搭建人工神经网络 第11章 训练深度神经网络 第12章 使用TensorFlow自定义模型并训练 第13章 使用TensorFlow加载和预处理数据 第14章 使用卷积神经网络实现深度计算机视觉 第15章 使用RNN和CNN处理序列 第16章 使用RNN和注意力机制进行自然语言处理 第17章 使用自编码器和GAN做表征学习和生成式学习 [第18章 强化学习] [第19章 规模化训练和部署TensorFlow模型]
SeanCheney
2020/01/15
2K0
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》第17章 使用自编码器和GAN做表征学习和生成式学习
理解深度学习:与神经网络相似的网络-自编码器(上)
本篇文章可作为<利用变分自编码器实现深度换脸(DeepFake)>(稍后放出)的知识铺垫。
老潘
2018/07/17
1.1K0
理解深度学习:与神经网络相似的网络-自编码器(上)
Tensorflow2.X中使用自编码器图像重构实战---文末送书
图像重构是计算机视觉领域里一种经典的图像处理技术,而自编码器算法便是实现该技术的核心算法之一。在了解了自编码器的基本原理之后,本节就通过实例讲解如何利用Tensorflow2.X来一步步地搭建出一个自编码器并将其应用于MNIST手写图像数据的重构当中。
Color Space
2022/09/26
6130
自编码器完全指南:从0到1,掌握特征提取与生成新技能!
今日推荐:Spring AI再更新:如何借助全局参数实现智能数据库操作与个性化待办管理
小说男主
2024/11/12
7410
自编码器完全指南:从0到1,掌握特征提取与生成新技能!
推荐阅读
相关推荐
开发 | 利用卷积自编码器对图片进行降噪
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档