人工智能的味道 - 图像风格迁移 by Python

22. 人工智能的味道 - 图像风格迁移

Python是人工智能编程的首选语言,至少当作者在键盘上敲下这行话时,这是事实。作为一本Python基础入门性质的教科书,本书无法就Python在人工智能与深度学习中的应用展开深入讨论。要理解深度学习的内部细节,需要复杂的数学知识。不过作为应用层面的开发者,读者或者不需要理解深度学习复杂的数学细节,简单借助于开源的工具包和模型,也可以享受到人工智能的益处。本章通过图像风格迁移这个示例,让读者尝尝人工智能的味道。

版权声明

本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。

本文不可以以纸质出版为目的进行改编、摘抄。

本文节选自作者的《Python编程基础及应用》视频教程。

22.1 图像风格迁移

在这里插入图片描述

将上图中左上角图像的“风格”提取出来,应用到左下角的“原图”上,生成右方的图像,就是图像风格迁移的研究内容。 艺术风格是什么,即便在艺术家的视角看,也是见人见智的。显然不太可能从数学上准确地定义并求出图像的风格。到底怎么把一个缺乏明确数学定义的概念变成可以执行的程序,是困扰图像风格迁移的研究者的主要问题。

在将人工神经网络和深度学习应用于图像风格迁移之前,人们的主要思路就是分析某一种风格的图像,比如把毕加索画的全部画作进行统计分析,如小波分析,通过建立统计模型,然后迭代改变要做迁移的图像,让它更好地符合统计模型。这种方法有一个很大的缺点:一个程序只能做某一种风格或场景的图像风格迁移。

2015年,Gatsys等人在论文A Neural Algorithm for Artistic Style中首次将人工神经网络用于图像风格迁移,斯坦福大学的李飞飞和她的学生Justin Johnson等人于2016年进一步改进了算法,提高了图像风格迁移的速度。本章示例程序中图像风格迁移就是以Justin Johnson等人训练的深度神经网络模型为基础的。

22.2 深度神经网络

人工智能是一个研究了很多年的课题。它有众多的学派,其中符号学派将机器学习看作逆向演绎,联结学派对大脑进行逆向分析和模拟,进化学派在计算机上模拟生物进化,贝叶斯学派认为学习是一种概率推理形式,理论根基在于统计学。其中,联结学派的主要工具就是人工神经网络,人工神经网络模拟了大脑神经元和神经元间突触连接的结构和工作方式。而深度神经网络又是人工神经网络的一种。
在这里插入图片描述

上图展示了一个深度神经网络(Deep Neural Network) - DNN的示意图。图中的节点称之为神经元,神经元之间的连线模拟了人类大脑中脑细胞之间的突触连接。可以简单地认为,每个神经元具备计算或者是信号处理的功能,它通过突触从别的神经元获取输入,经过计算/处理后再通过突触向其它神经元输出信号。我们已知,大脑细胞之间的每个突触连接,其离子通道的导电能力是有差异的。与之对应,神经网络神经元之间的连接权重参数用来表征该连接的重要程度。

神经元的层次,数量,神经元之间的连接关系可以称为神经网络的结构。突触连接的权重、偏倚等信息则称为神经网络的参数。为满足特定任务的需要,比如在各种图片或者视频中识别出猫,工程师会设计特定的神经网络结构,并将大量经过标注的资料图片(图片中有猫的位置被人工标记)输入神经网络的输入层,通过神经网络的计算,从输出层获得识别结果,然后根据识别错误反向修改神经网络内部的参数,经过多次迭代后,神经网络的内部参数被修正到即便对于标注资料外的图片,神经网络也能识别出猫的程度。这一过程称为神经网络的训练。训练的结果称为模型,它包括了神经网络的结构以及内部参数。

猫长什么模样,在数学上很难精确定义。我们可以认为,上述神经网络的训练过程有点类似于人类学习的过程,经过训练的神经网络模型包括了“何种模式的图像是猫”的知识。这种知识虽然说不清道不明,但在实践中却非常有效。

同理,将梵高的星空等相似风格的画作作为数据集,也可以对深度神经网络进行训练,训练所得的模型包含了这类画作的”风格是什么“以及"如何把另一幅图片变成这种风格"的知识。本章的示例程序就是借助于Justin Johnson等人训练好的图像风格迁移网络模型,对图片进行风格应用的。在调入模型,创建好深度神经网络后,将图片”输入“给图像风格迁移网络,该网络会进行一系列的迭代计算,其输出就是应用了对应风格的被修改过的图片。

22.3 程序解读

本章的示例程序包含在目录C22_StyleTransfer当中,主程序为StyleTransfer.py。子目录images用于存储风格迁移的输入图片,models子目录用于存储风格图片及对应的图像风格迁移网络模型文件。其中,模型文件需要读者自行下载,详情请见Readme.txt。

该程序需要用到opencv-python以及matplotlib库。opencv是著名的C++语言编写的计算机视觉及图像处理工具包,本程序中,主要用它来读取、转换图片以及进行图像风格迁移网络的计算。matplotlib在本程序中用于交互和图片显示。

22.3.1 程序的使用

先下载并将模型文件(扩展名为.t7)存入models子目录。在Visual Source Code中打开StyleTransfer目录,打开StyleTransfer.py并运行即可。按上下方向键可以切换图片,按左右方向键则可以切换风格模型。如本章开始的样图所示,左上角是风格图片,左下角是原图,右边则是风格迁移的结果图片。由于风格迁移网络的计算量很大,所以切换图片或者风格时反应较慢。

22.3.2 数据结构
class App:
    def __init__(self):
        self.idxImage = 0   #当前被风格迁移的图片在images列表中的下标
        self.idxModel = 0   #当前使用的模型文件在models列表中的下标
        self.images = glob.glob("images/*.jpg")  
        self.paintings,self.models = [],
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值