Prisma
雷锋网按:本文作者系图普科技工程师。
在 Prisma 的应用下载评论区看到这么一句好玩的话:世界一半人在用《PokemonGO》抓精灵,另一半人在用这个软件修图。
图像编辑软件早就数不胜数,比如胶片风的 VSCO,拼图美颜的拍立得、美图秀秀,二次元卡通的魔漫相机、脸萌,自拍美颜的 PICSPLAY、美颜相机,主打滤镜相机的 Roookie Cam、MIX 滤镜大师等等,这些现象级产品在这个快速迭代的时代层出不穷, 那么 Prisma 凭什么在这样的环境下杀出重围?连俄罗斯总理梅德韦杰夫都特地“翻牌”了。
首先,Prisma 不是简单地在原图上转换色调或者环境风格,也不只是利用普通的滤镜来改变图像的光线、颜色或者重叠图片,它会根据你提供的图片内容和你要求的风格图片的样式重新“画出”一张新的图片,它并不一定使你变美,但它一定让你遇见全新的自己(如下,左一为原图)。
那么,Prisma 与人工智能算法 Neural art 到底怎么回事?Prisma 与 CNN 的具体结合、生成图片的过程又是怎样的呢?
Prisma 与人工智能算法 Neural art
Prisma 的所做的风格转换是机器视觉领域一直在研究的一个问题,称为 texture transfer (纹理转换),其目标为将源图片的风格合成进目标图片中同时保留目标图片的语意内容。
本质上来说,将图片的内容和风格分离并不一定是一个定义明确的问题 (Well-defined problem),这是因为并不能准确定义出图片中的哪部分属于内容,哪部分属于风格,很有可能内容与风格是交织在一起,没有办法进行分离。
所以图片的内容和风格是否可以完全分离这还是一个待解的问题,如果可以,那么用什么样的方法呢?
Prisma 背后的技术
Prisma 背后的技术基于一篇今年 CVPR oral 文章 “Image Style Transfer Using Convolutional Neural Networks”。
其实早在 Prisma 引爆大众市场的半年前,此方法的巧妙及其惊人效果已经引起在学术界引起了广泛关注。众所周知在如今的人工智能领域引起革命的深度学习技术已经将众多任务推向了实用的水平,而 Prisma 用的技术也不出意外的基于深度神经网络,它的系统核心是利用神经表征来分离,再组合随机图片的内容和风格,以此来实现一个可用来描绘艺术图像的算法。它的基本想法是利用一个多层的卷积神经网络(CNN)抽象出给定绘画作品里一些高级的隐藏特征用来模仿绘画风格,并把这个绘画风格应用到一个新的图片上。
而在纹理转换领域,之前传统方法之所以没能取得这么惊人的效果,其本质原因在于之前非深度学习的方法只能获取到目标图片低层次的图片特征,这导致这些方法无法独立的对图片的语意内容和风格的变化进行有效地建模,从而无法很好地对两者进行解耦和合成。
而深度神经网络之所以可以在众多领域中取得惊人效果,正是由于其可以抽取出高层次的信息表征。
Prisma 所使用的方法之所以能成功,就是很巧妙地利用了深度神经网络抽取高层图片表达的能力,能在几十秒内把一张普通的照片转变成一副极具艺术特色的现代画作或者西方名画风格作品。
奥妙在哪里?
下面将采用论文中的两个示意图完整剖析其中的奥妙。
正如上文所说,风格转换需要对图片的内容和风格进行单独地表示,上图中的分别将源图(风格提供方)和目标图(内容提供方)输入到由多层卷积层和池化层组成的深度神经网络中。对于目标图直接使用卷积的响应在每一层中进行重建,可视化的结果为红色框中的结果,可以看出在低层的重建图像几乎和目标图一致,而越高层网络重建出来的图像的一些细节的像素被丢弃而那些图片高层次的语意内容被保留。而源图计算每一层的卷积的特征图(feature maps)的相关系数来重建出风格的特征表示,从绿色框的可视化结果可以看出,这种抽取风格表示的方式在不同网络层成功提取出不同尺度的风格特征。
上图讲解了深度神经网络如何对风格和内容表示进行单独的建模,接下去就可以使用监督学习的深度神经网络进行风格的转换了。
图中左右两边的网络用于抽取源图的风格表示和目标图的内容表示,而中间的网络用于对风格进行合成,论文使用的是白噪声图片作为启始图,思想是通过左右两个网络提供的风格和内容表征进行监督学习,使得输入图片每一层抽取出来的风格表征和高层抽取出来的内容表征和左右两个网络相应网络层重建出来的表征越来越一致,如此通过标准的随机梯度下降算法,不断迭代使得白噪声图片变成最终想要的合成图。
使用数学表达去描述上述思想就是需要构造一个损失函数(红框所示),此损失函数是由风格损失项和内容损失项两者线性组成,其中 alpha 和 belta 分别代表风格和内容的权重比例,若 alpha/belta 高则生成图会更凸显出内容而风格化会少一些,低则生成图会风格化强烈但是内容被稀释,这也是Prisma 提供用户调节的原理所在。(风格损失项和内容损失项的具体细节可以参见论文。)当有了损失函数,就可以对图像向量求解梯度,进而使用后项传递算法就可以对输入的图像不断进行更新从而进行风格转换(绿框所示)。
另外,通过在提取图像风格特征之前先改变图像的大小,可以通过控制-style_scale 参数该从图像中提取哪种艺术特征。(三幅图像从左到右,-style_scale=2.0、1.0、0.5)
除此之外,Prisma 还可以使用超过一种风格图像来混合多种艺术风格。(下图分别为:"The Starry Night" + "The Scream", "The Scream" + "Composition VII")
或者在使用多个风格图像的时候,可以控制混合的程度来呈现不同的图像类型。
还可以在保留颜色的前提下改变图像风格,比如说,如果你设置参数-original_colors 1,系统输出的图片会保留原图的颜色(如下图)。
以上就是 Prisma 背后的全部技术原理,当我们剖析一下发现其实里面的原理并不复杂,对于熟悉深度学习的人来说,不出一周就可以复现出其中的算法。
但最重要的是体会到此算法成功的核心在于利用了深度学习网络对于高层语意信息的表达能力,同时巧妙的构造出损失函数,其他的就只是顺水推舟的使用深度神经网络进行求解而已。
利用 AI 算法修图虽酷,但 Prisma 也有一定的缺陷
比如说,一定要在有网络状态较好、网络较快的状态下才可以使用顺畅,因为需要在线加载绘画风格图像以及用户提供的内容图片需要发送到远程的服务器上进行人工智能计算后再传回来,所以,相对其他修图软件,它的图片编辑速度慢很多,一般都需要等待几十秒才可以看到预览效果。
另外,因为所有的图片处理都是在云端完成,所以会有少部分用户遇到使用人数过多,服务器过载的情况。
一样使用深度学习,deepart.io 为何不像 Prisma 一样火?
在 Prisma 出现之前,也有过一款基于深度学习技术的修图应用:deepart.io,但是 deepart 却无法取得像 Prisma 一样的成功。
一方面在于其处理一张图片需要消耗大量的的 GPU 时间,导致了很多服务器资源开销,如果用户愿意承担这部分费用,处理时间在半小时左右,如果不捐助的话,需要 6 个小时左右;
另一方面,deepart 主要是由大学的研究员做的技术性实验,并不会投入过多的精力,在风格图像类型、品牌推广和商业化应用上考虑较少。
而 Prisma 通过优化了算法,相对缩短了一大部分的操作时间,并且用户不需要到网页提交照片、不需要注册即可免费使用 35 种不同绘画风格的滤镜,在这个移动互联网的时代,这样的移动 App 更受大众欢迎。
最近,Prisma 推出了 Android 版,这无疑会带来更大的用户量,日活跃度有可能超越 200 万人次。据透露,“视频滤镜”已经进入内测阶段,大约在一周后会发布,此外,还有可能会推出“GIF 艺术滤镜”、“视频直播”等功能,创造出“流动的油画”。
还记得在两年前,波兰画家兼导演 dorota kobiela 以及奥斯卡获奖制片人 hugh welchman 开始筹备一部专门向梵高致敬的手绘油画电影《loving vincent》,近百名画师经高强度训练并每日模仿梵高风格,目前已完成超过 5.6 万幅绘画作品。在这部片里,每一幅静止的画都是模仿梵·高绘画风格的油画,电影每一秒都将用到 12 幅这样的画,然后一系列静止的画组合在一起快速播放,形成动态的效果。
如果把 Neural art 的技术成功应用到视频上,这部梵高的电影再不需要如此高投入,甚至还“拍摄”任意绘画风格的电影,将电影与艺术糅合,把自己封印在艺术品里,是件很美的事,就像蒙娜丽莎,在达芬奇的画中,她的微笑是永恒的。人对美和永恒的追求,这也许是 Prisma 能这样迅速夺取人心的深层次原因。
Prisma 的意义在于以艺术的名义用流行的方式把深度学习的能力展现给了大众。虽然如今众多的人工智能公司使用 AI 技术去服务大众,但像 Prisma 这样如此火热的引爆大众对于如今人工智能技术的惊讶还十分少见。
但我想这只是一个开始,人工智能技术正在向各个领域进发,无论是高科技领域如自动驾驶,机器人,还是一些偏门的领域,如艺术,社会公益,都会不断看到人工智能带来的实惠和惊喜。
也许你第一次使用 Prisma 的时就被其效果深深的折服。我想说的是,你的惊讶才刚刚开始。
Prisma的更多相关文章
- 分享一下怎么开发一款图片视频类App,秒拍和prisma
第一步,分解短视频App的功能 我们在秒拍官网看到如此描述: [视频拍摄及导入]支持直接拍摄及导入手机本地的视频 [照片电影]照片专属特效,轻松创作照片电影 [MV特效]10余款全新MV特效,让普通视 ...
- Prisma GraphQL 服务器 生产者 "https://www.prisma.io"
Prisma 一个 GraphQL 服务器 生产者 "https://www.prisma.io" , 关注一下
- 布拉格捷克理工大学研究团队:Prisma进化版
原文链接 还记得 Prisma 吗?就是能把拍摄的照片转化为各种名画风格的修图软件,神经网络的深度学习后,想要波普还是梵高风的图片都不在话下. 现在,它的进化版本来了.这回是布拉格捷克理工大学的研究 ...
- prisma 服务器端订阅试用
graphql 协议是支持数据的实时订阅功能的(一般基于websocket 进行实现) prisma 支持客户端订阅以及服务器端订阅(类似webhook),可以方便将 数据推送后端服务 目的 pr ...
- prisma 集成 pipelinedb测试
pipelinedb 是一个基于pg数据库开发的stream sql 数据库,和prisma 集成起来可以开发很 方便的stream 应用 使用docker 安装 项目初始化 prisma init ...
- prisma 集成tidb 安装试用
以前官方提供的ansible 的脚本,现在有了docker的版本,可以方便测试使用 实际完整配置参考 https://github.com/rongfengliang/prisma-tidb 安装ti ...
- prisma middleware 简化 graphql resolver 编写的类库
prisma 推出middleware 的目的就是保持resolver 的简洁 作用: 输入参数访问同一个resolver 决定resolver 最终的返回值 在resolver 连中捕获异常以及 ...
- prisma graphql 集成timescaledb
prisma 官方文档说明了因为支持pg 所以相关的timescaledb.cockroachdb 应该也是支持的 但是测试之后timescaledb 支持cockroachdb有问题(事务处理模型支 ...
- prisma graphql 工具基本使用
项目使用docker-compose mysql 运行 安装 npm insatll -g prisma or yarn global add prisma 创建代码 项目结构 ├── README. ...
随机推荐
- Direct2D DirectWrite绘制文字
绘制文本使用DirectWrite: 为了简化 DirectWrite 的使用,RenderTarget有3个方法可以直接绘制文本: DrawText,用于简单绘制,支持Unicode. DrawTe ...
- Android listview 的优化
接[Android listview的应用][1] 在我们上一篇[Android listview的应用][1]中,我们的adapter中的getView()方法中每次都将布局重新加载一遍,这样就会导 ...
- 学习笔记 css3--选择器&新增颜色模式&文本相关
Css3 选择器 --属性选择器 E[attr]只使用属性名,但没有确定任何属性值,E[attr="value"]指定属性名,并指定了该属性的属性值E[attr~="va ...
- 像素转换问题-队列解决办法(或者dfs)
在一定大小的像素图像中,将同色区域的颜色值替换为其他颜色值,从而产生新的图像,输入数据,图像大小,指定的像素点坐标,要替换成的颜色. 一开始出队操作写错了折腾半天,当队列中只有一个元素是出队后要将队首 ...
- javascript 跨域汇总
什么是跨域?当两个域具有相同的协议.相同的端口.相同的host时,那么我们就可以认为它们是相同的域.比如:http://www.example.com/a.html 和 http://www.exam ...
- createDocumentFragment
http://www.cnblogs.com/myjavascript/p/3708920.html 对于循环批量操作页面的DOM有很大帮助!利用文档碎片处理,然后一次性append,并且使用原生的j ...
- MySQL 5.6 中 TIMESTAMP 的变化
http://www.williamsang.com/archives/818.html
- 在WPF中自定义你的绘制(一)
原文:在WPF中自定义你的绘制(一) 在WPF中自定义你的绘制(一) ...
- html5本地存储 local storage
HTML5 web storage, a better local storage than cookies. With HTML5, web pages can store data locally ...
- PHP内核学习(一)SAPI
学习PHP-src之前,我准备了一份源文件: GitHub下载->https://github.com/helingfeng/php-src 简单分析一下源码的目录结构: 1. root根目录下 ...