用Python快速实现图片的风格迁移
想获取本文完整代码和数据的下载链接,可在后台回复发文日期"20181126"。
先来看下效果:
上图是小编在甘南合作的米拉日巴佛阁外面拍下的一张照片,采用风格迁移技术后的效果为:
一些其它效果图:
下面进入正题。
近年来,由深度学习所引领的人工智能(AI)技术浪潮,开始越来越广泛地应用到生活各个领域。这其中,人工智能与艺术的交叉碰撞,在相关技术领域和艺术领域引起了高度关注。就在上个月,由电脑生成的艺术品在佳士得(Christie’s)的拍卖价竟高达43.25万美元,证明人工智能不仅可以具有创造性,还可以创作出世界级的艺术品。
早些时候,有些人坚信艺术的创造力是人工智能无法替代的,艺术将是人类最后一片自留地!这不,没过多久,这片唯一的自留地也逐渐被人工智能所取代。
在这各种神奇的背后,最核心的就是基于深度学习的风格迁移(style transfer)技术。我将在这篇博客带领大家学习如何使用Python来快速实现图片的风格迁移。阅读完本博客后,相信你也能够创造出漂亮的艺术品。
1. 什么是图片的风格迁移?
所谓图片风格迁移,是指利用程序算法学习著名画作的风格,然后再把这种风格应用到另外一张图片上的技术。
举个例子,见上图。左边是我们的原始图片(也称内容图像):小编在苏州甪直古镇的一座小桥上拍下的一张照片。
中间是我们的风格图片:挪威表现派画家爱德华·蒙克的代表作《呐喊》(The Scream)。
右边是将爱德华·蒙克的《呐喊》的风格应用于原始图片后生成的风格化结果图。仔细观察,图片是如何保留了流水、房屋、房屋在水中的倒影,甚至远处树木的内容,但却运用了《呐喊》的风格,就好像爱德华·蒙克在我们的景色中运用了他高超的绘画技巧一样!
问题是,我们应该定义一个什么样的神经网络来执行图片的风格迁移?
这可能吗?
答案是:可以的。我将在下一节简单讨论如何基于神经网络来实现图片风格的迁移。
2. 基本原理
Gatys等人在2015年发表了第一篇基于深度学习的风格迁移算法文章,原文链接为https://arxiv.org/abs/1508.06576,随后文章收录于2016年的CVPR顶会。
有趣的是,他们提出了一种完全不需要新网络架构的风格迁移算法,其使用的网络构架是在前人的VGG19基础上稍加改造而成的,而且网络参数也使用预训练(通常在ImageNet上)网络的参数。我们来看下它的原理:
我们知道,卷积神经网络(CNN)具有很强的图像特征(feature/representation)提取能力,如上图所示。
对于内容图片,深层网络(d和e)提取的是高维特征,同时也丢弃了细节信息;浅层网络(a, b和c)提取的是低维特征,图片的细节大多都保留下来了。
对于风格图片,通过包含多层的特征相关性(Gram矩阵),可获得多尺度图像风格的重构,捕获其纹理信息。这样构建的网络可以忽略图像的具体细节,保留风格。
为了将内容图片和风格图片融合在一起(见下图),我们应该使风格化结果图(初始为一张白噪声图片)的特征同时与内容图片和风格图片的特征之间的距离最小化,最终获取我们所需的风格化结果图。
因此生成目标图片的损失函数可定义为:
其中α和β分别是内容图片和风格图片的特征所占的权重,通过最小化这个损失函数就可以获得我们想要的结果。来看个动态示意图:
值得注意的是,这里优化的参数不再是网络的权重ω和偏差b,而是初始输入的一张白噪声图片。
虽然上述方法可产生非常漂亮的风格迁移效果,但是速度很慢。
2016年,Johnson等人基于Gatys等人的工作,提出了一种速度可提高三个数量级的风格迁移算法。虽然算法的速度很快,但最大的缺点是不能像Gatys等人那样随意选择你的风格图片。针对每张风格图片,你都需要训练一个网络来重现这个风格。一旦网络模型训练好之后,你就可将它应用于你想要的任何内容图片了。
这篇博客我们将使用Johnson等人的方法,其算法实现和预训练模型可参考https://github.com/jcjohnson/fast-neural-style。
3. 基于OpenCV的快速实现
下面利用OpenCV来快速实现图片的风格迁移,我将其封装成一个叫 style_transfer()
的函数,其使用说明可参考函数内部的注释。目前只有11个预训练模型可用,所有模型和相应风格图片都已上传至百度网盘。
## 载入所需库
import cv2
import time
def style_transfer(pathIn='', pathOut='', model='', width=None, jpg_quality=80): ''' pathIn: 原始图片的路径 pathOut: 风格化图片的保存路径 model: 预训练模型的路径 width: 设置风格化图片的宽度,默认为None, 即原始图片尺寸 jpg_quality: 0-100,设置输出图片的质量,默认80,越大图片质量越好 ''' ## 读入原始图片,调整图片至所需尺寸,然后获取图片的宽度和高度 img = cv2.imread(pathIn) (h, w) = img.shape[:2] if width is not None: img = cv2.resize(img, (width, round(width*h/w)), interpolation=cv2.INTER_CUBIC) (h, w) = img.shape[:2] ## 从本地加载预训练模型 print('加载预训练模型......') net = cv2.dnn.readNetFromTorch(model) ## 将图片构建成一个blob:设置图片尺寸,将各通道像素值减去平均值(比如ImageNet所有训练样本各通道统计平均值) ## 然后执行一次前馈网络计算,并输出计算所需的时间 blob = cv2.dnn.blobFromImage(img, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False) net.setInput(blob) start = time.time() output = net.forward() end = time.time() print("风格迁移花费:{:.2f}秒".format(end - start)) ## reshape输出结果, 将减去的平均值加回来,并交换各颜色通道 output = output.reshape((3, output.shape[2], output.shape[3])) output[0] += 103.939 output[1] += 116.779 output[2] += 123.680 output = output.transpose(1, 2, 0) ## 输出风格化后的图片 cv2.imwrite(pathOut, output, [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality])
来测试一下:
从运行结果可知,在CPU上,一张图片的风格迁移所花的时间大概也就几秒。如果使用GPU,完全可以实时对视频/摄像头进行风格迁移处理。
4. 目前的相关进展
自Gatys等人第一次(2015年)实现基于深度学习的风格迁移以来,风格迁移技术仍一直在发展,如今在速度和质量上都有了很大提高。目前的一些进展可以通过下面的链接来了解:
https://github.com/jcjohnson/fast-neural-style
https://github.com/DmitryUlyanov/texture_nets
https://github.com/luanfujun/deep-painterly-harmonization
https://junyanz.github.io/CycleGAN/
他们的一些作品:
1. 风格迁移
2. 外来图片的融合
3. 图片季节的变换
4. 图片背景的虚化
5. 角色互换
以上就是本文的全部内容,希望对大家的学习有所帮助。如果觉得文章不错,动手转发支持一下哦!
人民日报终发文:国航“避重就轻、不作为、护犊子、体验差、听不进批评”
南抖音北快手,智障界的两泰斗
遇事不决赖毛子,美国这次打算封杀变脸APP
用Python快速实现图片的风格迁移相关推荐
- 用Python深度学习来快速实现图片的风格迁移
先来看下效果: 上图是小编在甘南合作的米拉日巴佛阁外面拍下的一张照片,采用风格迁移技术后的效果为: 一些其它效果图: 下面进入正题. 近年来,由深度学习所引领的人工智能(AI)技术浪潮,开始越来越广泛 ...
- 有趣的深度学习——使用TensorFlow 2.0实现图片神经风格迁移
前言 这也是一个重写的项目,之前用Python 2.7 + TensorFlow 1.4写的图片神经风格迁移的项目(TensorFlow 练手项目三:使用 VGG19 迁移学习实现图像风格迁移)直到现 ...
- 教你一招利用Python快速去除图片水印
大家好,我是IT界搬运工. 相信大家都有在网上下载好图片但是有水印的烦恼,那么问题就来了:看到心爱的图片想要"占为己有".怎么把图片上的水印去除呢?今天我就来教你一招利用Pytho ...
- 快速搭建自己的风格迁移
Linux环境,我用的是ubuntu16.04. 安装TensorFlow,这个按照官网的指导一步步来就可以,需要注意的是在线安装的时候需要翻墙,有CPU和GPU两个版本,推荐GPU(如果有N卡的话) ...
- python 快速获取图片大小
实现原理 利用header请求原则,只进行header请求获取图片info,有效缩短时间,减少图片下载解析的过程: url = "http://avatar.csdn.net/0/A/C/1 ...
- 用Python实现图片风格迁移,让你的图片更加的高逼格!
先来看下效果: 上图是老王在甘南合作的米拉日巴佛阁外面拍下的一张照片,采用风格迁移技术后的效果为: 一些其它效果图: 下面进入正题. 如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qu ...
- 让你的图片更有逼格,用Python实现图片风格迁移
点击上方 Python知识圈,选择置顶或星标 第一时间关注 Python 技术干货! 文章转自R语言和Python学堂,禁二次转载 阅读文本大概需要 3 分钟. 先来看下效果: 上图是小编在甘南合作的 ...
- Python实现快速的风格迁移
目录 一.什么是风格迁移? 二.风格迁移算法实现步骤 三.风格迁徙算法代码实现 四.代码运行流程 五.风格迁徙算法效果展示与分析 六.思维扩展 参考资料 注意事项 一.什么是风格迁移? 所谓的迁移 ...
- 图像迁移风格保存模型_图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用...
原标题:图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用 选自Medium 作者:Philip Meier 机器之心编译 编辑:陈萍 易于使用的神经风格迁移框架 py ...
- 图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用
易于使用的神经风格迁移框架 pystiche. 将内容图片与艺术风格图片进行融合,生成一张具有特定风格的新图,这种想法并不新鲜.早在 2015 年,Gatys. Ecker 以及 Bethge 开创性 ...
最新文章
- 元学习—Meta Learning的兴起
- mysql压力测试教程_Mysqlslap MySQL压力测试工具 简单教程
- oracle:connect by start
- java模态_java – 如何在另一个模态JDialog之上创建一个模态的JDialog
- 预见未来 | 数据智能的现在与未来
- 基于微服务架构的token生成和使用
- 解决:mysql 连接报错 Authentication plugin ‘caching_sha2_password‘cannot be loaded
- APE结合键盘控制角色运动 转
- 本体学习的概念及目标
- php get 传循环出来的参数_简单学习PHP中的反射
- Home_W的位运算(位运算+预处理)
- VedioCapture
- python_类装饰器
- linux编写设备驱动 编译成ko文件 重新编译内核,Linux内核驱动将多个C文件编译成一个ko文件的方法——每一个C文件中都有module_init与module_exit...
- 微信测试号实现微信网页的分享
- 新兴职业背后的认知逻辑
- Python 爬取懂车帝详情页“全部车型模块信息”!懂车帝就火起来了吗?
- Java | 实现消息提醒的图标闪烁功能
- thawte,globalsign,alphassl,rapidssl,geotrust,digicert证书品牌的对照
- 浏览器手动设置Cookie
热门文章
- 关于主机远程唤醒(WOL,Wake on Lan)的几种方法
- 移动存储设备数据卡和闪存盘等半导体存储式设备,数据消失被格式化,如何拯救恢复?
- 第一次发现国产剧能这么“好笑”,谢谢您嘞!!
- K8s(二):130 道 K8s/Docker 配套练习题,学+练结合,一次吃透
- 鸿蒙来了!能否与安卓、iOS三足鼎立?
- 关于Java锁机制面试官会怎么问,深刻易懂
- 一图全解10个影响人类社会的算法
- 0点睡觉很会养生”苏宁高管的这话让IT人很憋屈
- mfc 鼠标移动到 button上面时 背景颜色改变_Python3与PyQt5编程示例:实现颜色拾取器小工具...
- vue中npm run dev运行项目不能自动打开浏览器! 以及 webstorm跑vue项目jshint一直提示错误问题的解决方法!...