深度学习目前为止最有用的东西是图像处理,我们可以用它在极早期判断癌症, 也可以用它在茫茫人海里寻找犯人,但是要我说你能写一个小程序取悦女朋友, 你就不一定能信, 这一招叫艺术风格变换,就是你点击一下,就可以把你女朋友的大头照换成一个毕加索的后现代艺术作品(当然是取代还是找打要看你的艺术品位)。

入行需谨慎

艺术风格迁移是一个古老而现代的主题 , 多少艺术家为了描摹他人作品而竞折腰。 在出现了IT之后, 它也成为adobe之类的公司竞相追求的宠儿,却始终进展缓慢。

而深度学习, 却可以轻轻点击自动完成这个任务, 铁哥在此给大家拆拆招 , 看如何玩转神经风格迁移。

我们说,神经风格迁移就是把一张图片的内容和另一个图片的风格合成的一个方法,比如说你给出一个猫的图片和一个梵高的自画像,就可以生成一只梵高的猫。

在深度学习之前,机器视觉的工程师就尝试用各类神奇的滤镜提取图像的纹理信息,抽取取来的纹理图在经过某个变换放回到原图片里,就得到了一个新的风格的图片。 

深度学习所作的事情,是把这个东西给自动化。我们利用卷积网络的深层结构提取的信息,来替代之前的各种滤镜。 

首先,卷积网络不仅能够做猫狗识别这一类分类任务,在其中间层里,其实包含了丰富的有用信息,而这些信息,正是我们做风格迁移的基础。如果你可视化CNN的各层级结构,你会发现里面的每一层神经元的激活态都对应了一种特定的信息,越是底层的,就越接近画面的纹理信息,如同物品的材质。 越是上层的,就越接近实际内容(能说出来是个什么东西的那些信息),如同物品的种类。

研究人员提出的一套可视化CNN的方法,把深层的内容通过反卷积映射回图象,好比你关心什么,就给你投影出来(Visualizing CNN 2014 )。

底层神经元关心画面的材质

深层神经元关心物品的种类

那么好了,风格迁移不就是这么简单吗,把一张图片的底层信息和另一张图片的上层信息合成一起不久可以了吗? 用适当的数学方法,我们可以在卷积网络的中间层里左手提取图象内容有关的信息,右手提取图象风格有关的信息。

用中间层的信息恢复的内容,可以看到不同层里里都可以找到风格和内容有关的信息, 但是层次越深, 具体的信息就越少, 而“实体” 的概念轮廓犹在

看起来是的,我们可以通过一个已经训练好的CNN, 把一张风格图片和内容图片的信息都抽取出来, 然后拼在一起!

为什么这里要用一个已经训练好的CNN呢? 一个用分类任务训练好的CNN,通常已经具有了对世界大多数图像提取信息的能力, 因为图像传递信息的底层机制是想通的。 我们把这个网络连接的权衡直接共享过来, 图片一导进来, 网络就可以生成直接可用的特征! 这正是迁移学习的原理。

这里我们导入一个已经训练好的VGG19网络,一种非常流行的CNN图像分类框架

所有深度学习和机器学习,都是预先设定好一个损失函数,然后在进行梯度回传,这里也不例外,我们可以通过设定合理的损失函数,来解决问题。这个损失函数,正是一种能够测量生成图片与风格图片,内容图片距离的函数。 

来,兄弟们,看我们如何设定这样一个函数。既然我们的深度卷积网络可以做到测量与内容有关的特征, 那么我们只需要在这个层次上找一下特征向量的距离就好了。 

图像无非是高维空间的一个点,通过神经网络变换再经过特定降维方法处理后我们可以给它转化成二维曲面上的一个点, 我们会发现,在这个世界里, 狗在狗的国度 , 猫在猫的国度。 而我们只需要度量不同图像的空间距离,就测量了内容的相似度。

哇, 这不就是定义距离的公式吗!

然后呢,如何搞定风格,风格通常是一个艺术家眼中主关的有点虚无缥缈的概念,也就是我们通常说的感觉, 比如梵高或者莫奈的画,你没有经过艺术熏陶也可以得来。

而在深度学习的角度下, 这种感觉却发现与不同神经元活动的相关性有关! 也就是说,风格是深度网络神经元活动的某种统计特性! 悄悄的,我们把艺术和数学对接上了。 统计果然是上帝的语言啊有木有!

这里我们借助一个叫gram矩阵的数学工具,它通过测量同一层卷积输出不同通道之间的相关性(计算不同通道间的相关性,组成一个矩阵)给出一个对风格的度量。然后,我们在测量一下风格之间的距离不就行了吗?

把CNN某一层对应不同特征的神经元像摊煎饼一样摊开, 然后计算之间的相关性

得到一个矩阵,矩阵的每个元素对应不同特征间的相关性

这个损失函数就是gram 矩阵之间的距离!

注意,衡量风格之间的距离, 我们是把不同网络层级间的gram矩阵的距离都计算一下加在一起,这样可以把不同层次度量的东西综合起来 。

好了,到这一步, 大功告成, 把两个损失函数叠加在一起就好了。

目标函数的设计学问可大了,改变a和b的比例就能造成很多区别,大家注意风格图片的比例越高,图像就越纹理化。

风格的权重变大的时候, 那图像就变成了意大利瓷砖!

然后我们可以做什么呢? 梯度下降!但注意,这里我们优化的目标不是网络权重而是图像本身,这样我们就大功告成了!

当然这里说的只是风格迁移的一种, 这种方法的优点是通俗易懂, 而缺点是速度很慢。 还有一个方法,是借用生成网络,直接给搞出来, 这个方法更快速, 更加适合工业封装。 我来给大家展示一下这个方法的实质。

像不像GAN的结构!

哈哈,这样我们就可以完成一幅艺术作品交给家里领导了,但是不要忘记哦, 这件事给我们的启示绝不止这一个呀。 它给我们启示的是,我们深层神经编码的机制里,深度学习的踪影, 你对风格的认知,其实是和内容的认知一样, 是可以量化的,而不像某些艺术家所言, 完全主观,与数学无关。 不仅可以量化,而且这个信息是可以独立被提取的, 这种信息不是存在于某个神经元之上, 而是分布式的存在于多级神经网络的不同尺度之间, 通过每一层神经元的统计规律表达。

虽然我们尚不知道这些猜想是否正确, 他们我们人类深奥的视觉处理机制提供了一种聪明的理解方法。

附: 代码, 看看用pytorch做出来是多么简洁:

计算内容损失函数

计算风格损失函数

设定模型主体!

训练过程!

图像风格迁移【老版】相关推荐

  1. 动手学深度学习PyTorch版--Task7--目标检测基础;图像风格迁移

    一.目标检测基础 1.目标检测和边界框 %matplotlib inline from PIL import Imageimport sys sys.path.append('/home/kesci/ ...

  2. 深度学习实战-图像风格迁移

    图像风格迁移 文章目录 图像风格迁移 简介 画风迁移 图像风格捕捉 图像风格迁移 图像风格内插 补充说明 简介 利用卷积神经网络实现图像风格的迁移. 画风迁移 简单来说就是将另一张图像的绘画风格在不改 ...

  3. GANs系列:用于图像风格迁移的CycleGAN网络原理解读

    CycleGAN论文:https://arxiv.org/pdf/1703.10593.pdf 一.前言 目前关于GAN应用,比较有意思的应用就是GAN用在图像风格迁移,图像降噪修复,图像超分辨率了, ...

  4. 图像风格迁移做了一件文化衫-【布尔艺数】

    互联网人的夏天 一定少不了件又潮又酷的文化衫. 既要潮又要酷!这可难坏了设计小伙伴- 赶紧召集大家一起出点子! 一番讨论后,大家一致认为: Hinton !是业界最潮最酷的人! Geoff Hinto ...

  5. 【深度学习前沿应用】图像风格迁移

    [深度学习前沿应用]图像风格迁移 活动地址:[CSDN21天学习挑战赛](https://marketing.csdn.net/p/bdabfb52c5d56532133df2adc1a728fd) ...

  6. 图像风格迁移(动手学深度学习)

    画风迁移 简单来说就是将另一张图像的绘画风格在不改变原图图像内容的情况下加入到原图像中,从而"创造"名家风格的绘画作品. 这其中牵扯到很多难题,但是很多问题已经被一一攻克,一般而言 ...

  7. 读“基于深度学习的图像风格迁移研究综述”有感

    前言 关于传统非参数的图像风格迁移方法和现如今基于深度学习的图像风格迁移方法. 基于深度学习的图像风格迁移方法:基于图像迭代和模型迭代的两种方法的优缺点. 基于深度学习的图像风格迁移方法的存在问题及其 ...

  8. 将 TensorFlow 移植到 Android手机,实现物体识别、行人检测和图像风格迁移详细教程

    2017/02/23 更新 贴一个TensorFlow 2017开发者大会的Mobile专题演讲 移动和嵌入式TensorFlow 这里面有重点讲到本文介绍的三个例子,以及其他的移动和嵌入式方面的TF ...

  9. 图像迁移风格保存模型_CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介、关键步骤配图、案例应用...

    CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介.过程思路.关键步骤配图.案例应用之详细攻略 目录 图像风格迁移算法简介 图像风格迁移算法过程思路 1.VGG对比NS 图像风 ...

  10. cnn风格迁移_快速图像风格迁移思想在无线通信中的另类应用:算法拟合

    在本文中,并不是介绍最新的一些论文,而是回顾自己在很早(半年前?)读过的几篇文章.[1]Learning to optimize: Training deep neural networks for ...

最新文章

  1. Ubuntu11.10下载android4.0.1源码
  2. yolov5 v3.0训练报错: torch.nn.modules.module.ModuleAttributeError: ‘BatchNorm2d‘ object has no attribute
  3. uniapp 微信小程序打包 vendor.js过大 导致打包超过2M
  4. 关闭用playsound函数的WAV文件
  5. 安装完成后的配置_cent os7 默认安装后的一般配置
  6. (14) ZYNQ AXI4-Lite总线简介(学无止境)
  7. TIOBE 11 月榜单:C、Swift、Go、D 与 Rust 起起伏伏
  8. 工作资讯003---甘特图
  9. packmol建模流程-计算
  10. npm ERR! Error: EPERM: operation not permitted问题解决
  11. 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为...
  12. tns-03505: 无法解析名称_在 Azure上购买域名并进行域名解析
  13. 人工智能英语演讲总结,持续更新~
  14. Rayman的绝顶之路——Leetcode每日一题打卡10
  15. Android 获取经纬度处理
  16. 【PCL】—欧式聚类算法详解
  17. 《iPhone-电脑文件导入苹果手机》
  18. python 修改文件内容3种方法,Python实现修改文件内容的方法分析
  19. B - Restore Modulo
  20. 周训练计划之(韦德分化训练法:胸、肩、背、腿、腹)

热门文章

  1. 揭秘喜马拉雅黑科技——网页播放器(创建自己的单页应用)
  2. 计算机图片数据传输图,电脑对电脑或手机传送文件图片的工具
  3. 自学Java语言网络编程局域网内与电脑无线传输视频,图片文件,调用系统媒体播放视频图片文件
  4. TortoiseGit 文件图标显示灰色对号
  5. 【python基础教程】计算器
  6. SLIC超像素分割方法
  7. python豆瓣电影爬虫
  8. 你的新媒体写作工具横向测评,请查收!
  9. Internet Explorer 编程简述(序)
  10. threshold 阈值,阀值,阙值