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

如何利用卷积自编码器对图片进行降噪?

作者头像
量子位
发布于 2018-03-28 07:39:57
发布于 2018-03-28 07:39:57
1.4K0
举报
文章被收录于专栏:量子位量子位
作者:天雨粟 量子位 已获授权编辑发布

前言

这周工作太忙,本来想更把Attention tranlsation写出来,但一直抽不出时间,等后面有时间再来写,先给大家种个草。

我们这周来看一个简单的自编码器实战代码,关于自编码器的理论介绍我就不详细介绍了,网上一搜一大把。

最简单的自编码器就是通过一个encoder和decoder来对输入进行复现,例如我们将一个图片输入到一个网络中,自编码器的encoder对图片进行压缩,得到压缩后的信息,进而decoder再将这个信息进行解码从而复现原图。

作图工具:OmniGraffle

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

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

工具说明

TensorFlow1.0

jupyter notebook

数据:MNIST手写数据集

完整代码地址:NELSONZHAO/zhihu

第一部分

首先我们将实现一个如上图结构的最简单的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也有了一个初步的认识。

完整的代码已经放在我的GitHub上,链接在此: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两个文件)

如果觉得不错,可以给我的GitHub点个star就更好啦!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量子位 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
cdn加速免备案,什么情况下需要备案
我们经常在生活中会用到cdn加速服务器,这种加速服务器不仅能够提高网速,并且能够在预防网站浏览的时候造成卡顿。所以对于网站来说,它有着非常重要的作用,那么,这种cdn加速器其实有些是需要备案的。但是有些却不需要备案,那么我们该如何看?我们需不需要进行备案呢?cdn加速免备案需要满足什么呢?
用户8715145
2021/09/18
11.3K0
cdn加速免备案,什么情况下需要备案
cdn如何配置 cdn有什么用
当我们在使用网络的时候,经常会出现网络卡顿的情况,这主要是因为使用的网络用户过多,网速不佳造成的,这时候就需要用到cdn了,它可以进行网络加速,能够让我们更好地访问网络。 那么,cdn如何配置呢?
用户8715145
2021/09/24
9.6K0
CDN加速技术,作为开发的我们真的不需要懂吗?
前几天,我们讲到了为何引入缓存且应该什么时候引入,并且讲到了我们生产中缓存的读写策略是什么,忘记了的可以自行去文章列表看下,同时又单独深入讲解了redis哨兵机制(Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了)和缓存穿透问题的解决方案(烦人的缓存穿透问题,今天教就你如何去解决)。至此,我们现在的系统架构已经是这样子的了
架构师修炼
2020/07/17
2.6K0
【玩转 EdgeOne】体验腾讯云下一代CDN—EdgeOne安全加速一体化方案
7月29日有幸受邀参加了腾讯云lighthouse & dnspod在长沙举办的线下meetup交流会,并在会上了解到了腾讯云最新推出的安全加速一体化方案—EdgeOne。
4O4
2023/09/21
1.8K2
【玩转 EdgeOne】体验腾讯云下一代CDN—EdgeOne安全加速一体化方案
一篇文章弄懂CDN技术原理
概述 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因数的影响,响应速度慢还是经常抱怨和困扰。
java思维导图
2018/11/08
2.3K0
使用CloudFlare的cname域名解析部署境外解析CDN加速的图文教程
各位站长可能都知道cloudflare,也了解过他的强大,之前突发奇想境外解析能不能使用cloudflare,国内解析保持原有的,经过一番了解的实操,目前基本实现了,最初一直没有实现是因为我之前解析后都是直接输入网址访问,那么是无效的(或者域名未备案再或者直接502显示),也有很多人利用这个功能做cname解析,毕竟有一部分站长不想将域名迁移境外解析,尤其是备案的域名,不管是何种原因吧,能理解,网上类似的教程很多也是参考了很多,也感谢明月的指导,好了,不废话了,开始操作吧。
李洋博客
2024/12/05
11.9K1
使用CloudFlare的cname域名解析部署境外解析CDN加速的图文教程
【玩转 EdgeOne】新一代的边缘加速CDN“EdgeOne”初体验
不少网友问我的服务器是什么配置的,网速很快,其实之前我就像写一篇关于我使用腾讯云边缘安全加速平台 EdgeOne 的文章无奈一直没有时间去研究,作为下一代CDN产品面世的腾讯云EdgeOne,国内市场上首款真正意义上的一站式边缘安全加速产品,基于腾讯云遍布全球的边缘节点,提供域名解析、动静态智能加速、TCP/UDP 四层加速、DDoS/CC/Web/Bot 防护、边缘函数计算等边缘一体化服务,可帮助客户更快速、更安全、更灵活地响应用户请求。我之前仅仅使用CDN服务,后续接到邀请参与EdgeOne功能的测试,效果真的好,而且无需繁琐的设置。
李洋博客
2024/04/12
8241
【玩转 EdgeOne】新一代的边缘加速CDN“EdgeOne”初体验
网站如何配置CDN加速?网站域名接入CDN加速的步骤(附CDN防御常用配置方式)(cdn加速服务器 吃核心还是吃主频)
什么是CDN?CDN的全称是Content Delivery Network,即内容分发网络CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
雾海梦曦
2022/11/24
49.1K0
网站如何配置CDN加速?网站域名接入CDN加速的步骤(附CDN防御常用配置方式)(cdn加速服务器 吃核心还是吃主频)
Amazon CloudFront 亚马逊云CDN开通和设置网站加速
Amazon CloudFront,是一项快速内容分发网络(CDN)服务,能够以低延迟和高传输速度安全地向全球客户分发数据、视频、应用程序和 API。比如我们可以用于网站、S3对象存储的加速,默认 CloudFront 每个账户拥有每月1TB数据流量。而且,CloudFront 网络拥有超过 225 个节点(PoP),这些节点通过完全冗余的并行 100 GbE 光纤进行连接,可为终端用户提供超低延迟的性能和高可用性。在提供缓存或动态内容时,CloudFront 会自动映射网络状况并智能地路由用户的流量。
老蒋
2023/02/21
9.4K0
Amazon CloudFront 亚马逊云CDN开通和设置网站加速
怎么一行代码都不写,就能给网站加速?
每个开发都会涉及到一个工作,就是网站开发。开发过程势必会涉及到需要对网站加速的部分,很多开发同学对此都很是头疼。
腾讯产业互联网学堂
2024/01/15
5390
CND加速原理和游戏加速原理
而在DNS解析过程中,如果要访问的网站名为:”baidu.com”,客户端首先会在本机的hosts文件和hosts缓存中查找该域名对应的IP地址;如果本机中没有此信息,则会到我们的本地DNS进行询问该域名对应的IP地址;如果本地DNS中仍然没有该域名的IP信息时,则会由本地DNS依次向根DNS、顶级域DNS、权威DNS进行询问,最终本地DNS将IP地址发送给客户端。客户端通过IP地址向远程的源站服务器发出HTTP请求并获取相应的数据内容。
Helloted
2022/06/08
6.8K0
CND加速原理和游戏加速原理
cdn地址是什么?cdn加速有什么用?
关于cdn这块,前几年还是无人关注,现在就不一样了,各种网站内容呈爆发式发出,而用户对网站打开速度要求更高了,所以,cdn充分发挥其特性,让许多用户可以快速获取网站内容,实现良好的上网体验,那么问题来了,cdn地址是什么?cdn加速有什么用?接下来,让我们一起阅读下文。
用户8715145
2021/09/24
7.7K0
什么是cdn服务器?cdn加速服务是什么?
没从事互联网工作的人,很少人会知道怎么解决网络卡顿问题,一般上网搜索都是下载某某加速器,然而这些加速器都是针对散户,而不是企业。那我一个企业网站想少花钱又要更快的网站打开速度,可能吗?答案是肯定的,那么接下来让我们一起了解下什么是cdn服务器?cdn加速服务是什么?别走开,答案在下文。
用户8715145
2021/09/18
13.9K0
什么是cdn服务器?cdn加速服务是什么?
cdn加速怎么解析,cdn加速器应该怎么用
如果有网站的朋友,我相信都听过cdn加速器这个名词,也知道cdn加速器的一些功能是为了能够让自己的网站流畅和传输速度更快,但是cdn加速器的原理是什么?他工作的时候是什么样的状态?他是怎样做到把这些不同的用户串联起来的?确实,很多朋友不知道的。那么,cdn加速怎么解析它的原理又是什么?接下来就为大家一一进行分析。
用户8715145
2021/09/24
42K0
腾讯云CDN如何配置使用
何为CDN呢?为什么的网站需要它呢?网站全国各地可能因为延迟访问慢,而CDN是帮助一个网站能够加速打开。CDN全称内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
用户1094633
2022/02/14
18.7K0
cdn加速什么意思,有什么特点
相信很多朋友并不知道cdn加速什么意思?但是我相信CDN加速却是许多朋友在使用网络过程中都会用到的一项功能,因为这项加速功能,它能够使我们在网络解决的过程中更顺畅,并且使网速达到更快的效果。它的工作原理和它使用的过程中有哪些特点呢?
用户8715145
2021/09/18
4.5K0
cdn加速什么意思,有什么特点
cdn技术原理
作者:IT世界,来自:www.it.com.cn 1. 前言   Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因数的影响,响应速度慢还是经常抱怨和困扰。解决方案就是在网络传输上利用缓存技术使得Web服务数据流能就近访问,是优化网络数据传输非常有效的技术,从而获得高速的体验和品质保证。   网络缓存技术,其目的就是减少网络中冗余数据的重复传输,使之最小化,将广域传输转
架构师小秘圈
2018/04/02
4.6K0
cdn技术原理
体验腾讯云下一代CDN—EdgeOne安全加速一体化方案
7月29日有幸受邀参加了腾讯云lighthouse & dnspod在长沙举办的线下meetup交流会,并在会上了解到了腾讯云最新推出的安全加速一体化方案—EdgeOne。
4O4
2023/08/30
9170
体验腾讯云下一代CDN—EdgeOne安全加速一体化方案
Cdn特点以及适用行业
简单地说,,需要服务器请到TG@Daisy9677/@Vicky105805找我,CDN是一个经策略性部署的整体系统,包括分布式存储、负载均衡、网络请求的重定向和内容管理4个要件,而内容管理和全局的网络流量管理(Traffic Management)是CDN的核心所在。
用户9305758
2022/01/07
9970
cdn加速如何在不同项目中传递,cdn加速应该怎么使用
在使用互联网的过程中,如果遇到了网络卡顿,比如图片缓存,一直转圈圈视频缓冲不出来,其实这也并不是网络不好的问题,其实就是因为该网站没有进行分发网络,也就是cdn加速。CdN加速是把多个服务器的一些静态文件储存在cdn加速服务器里面。因此,用户在访问的时候速度就会更快。这里面就包括了图片,视频等等静态文件。但是我相信很多朋友只知道cdn加速的功能,却不知道cdn加速如何在不同项目中传递的原理。
用户8715145
2021/09/24
8.5K0
推荐阅读
相关推荐
cdn加速免备案,什么情况下需要备案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档