初探Prisma背后的算法

简介: 最近一款叫Prisma的图像处理软件特别火,上传任意一张自己的图片,选择一种抽象画的风格,Prisma为你生成艺术风格的图片。跟@无悬一起开发的高仿Prisma的Demo: Prisma应用的算法来自2016年的一篇论文CVPR 2016 Oral Paper [Image Style Transfer Using Convolutional Neural Networks](h

最近一款叫Prisma的图像处理软件特别火,上传任意一张自己的图片,选择一种抽象画的风格,Prisma为你生成艺术风格的图片。跟@无悬一起开发的高仿Prisma的Demo:

Prisma应用的算法来自2016年的一篇论文CVPR 2016 Oral Paper Image Style Transfer Using Convolutional Neural Networks
论文提到的主要思路是,用19层的卷积神经网络(VGG)提取图片的内容特征或风格特征,然后将源图片A的内容和源图片B的风格进行融合,“画出”一张带有B图片风格特征和A图片内容特征的目标图片。

1.用卷积层提取图像特征

卷积层的输入是图片,w * h * d的三维矩阵,w像素宽, h像素高, d=3(RGB三个通道), 用滤波器Filter(一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,平移滑动Filter,直到计算完所有数据 ,就将3维的矩阵映射成2维的特征矩阵。如下图:
convolved_feature
输入的图片5X5X3的图片(W=5),外围边缘补充 0 (P=1) ;中间部分是两个不同的滤波器Filter w0、Filter w1 尺寸3X3X3,(F =3, 深度跟输入相同);Stride步长S = 2 (滤波器移动间隔是两个像素);最右边则是两个不同的Filter处理图片后得到的不同输出 , 尺寸都是3X3。 (W-F+2P)/S + 1 = 3. Input Volume数据窗口的值跟Filter的值相乘再相加,再加上bias,就计算特征映射中的一个数值。比如:
5d19f3005b9cfd8977eebcc55f23f3b6


0*1+0*1+0*-1+0*-1+0*0+1*1+0*-1+0*-1+-1*0 = 1 ;

0*-1+0*0+0*-1+0*0+1*0+1*-1+0*1+0*-1+2*0= -1; 

0*0+0*1+0*0+0*1+2*0+0*1+0*0+0*-1+0*1 = 0

bias = 1 
1 + (-1) + 0 + 1 = 1 // o[0,0,0]

1.1 图像内容特征提取

论文提到,观察从conv1_2(a), conv2_2(b), conv3_2 (c), conv4_2 (d),conv5_2’(e) 这5个神经网络卷积层提取出的内容特征,看下图a,b,c,d,e几张房子的小图, a~c原图的内容特征和原图很吻合。但是c和d丢失了一些内容细节。

content_presentation

对于某个提取内容的卷积层l,论文定义的损失函数:

41a8bf40b4c2a930a6412dfd9f6742b1

1218e096a89a0c96ec39be08f1a4c1e6

损失函数对l层的激活函数求导:

b6cadd35d991bfb4ae1dbdb172d0c7de

用误差反向传播和梯度下降法, 改变 x ,最小化损失值,最终得到的新图在l层和原图的特征一致。

1.2 风格提取

论文提到,用卷积层的组合提取风格特征:conv1_1 (a), conv1_1 and conv2 _1(b), conv1_1, conv2_1 and conv3 _1 (c), conv1_1, conv2_1, conv3_1 and conv4_1 (d), conv1_1, conv2_1, conv3_1, conv4_1 and conv5_1 (e)

在l层的损失函数 :

66a9cb8b985a2a7197e7cdc97f208120

51f0f0bb4fac36b0e909c6a8b4780d5f

对l层的激活函数求导:

9dc0d88b22d0a67d53bf29a7b27e16bd

改变 x , 最小化损失值, 也就是在某一层原图的风格格拉姆矩阵和生成的图片的格拉姆矩阵的均方差最小。

总的风格损失函数,其中w是某个卷积层的权重:

6193e1f0c88d9861e31aa360de619223

1.3用Pooling层降低计算量

将卷积层得到的结果无重合地分割,选择每一部分的最大值,降低特征矩阵的size(downsampling)

15e89ec6a866be1f7130655527079786

2.图像合成

将内容图片 p-v, 和风格图片 a-v 输入,卷积层提取出个层的内容特征矩阵 pl和风格特征 al。 在一张随机白噪声图片 x上, 通过梯度下降 算法,每次迭代中计算新生成的风格特征gl和内容特征 Fl, 直到损失值收敛。在合成中使用的损失函数为:

transfer_loss

对内容损失函数 或 风格损失函数都是线性关系,权重分别为alpha和 beta.
transfer

论文中 , 内容特征由conv4_2提取, 风格特征由conv1_1 , conv2_1,conv3_1, conv4_1, conv5_1 提取,权重都是0.2 ratio = 1×10−3.

3.影响图片合成效果的因素

3.1 内容损失和风格损失的比值

下图中 ratio 的比值变化,图像的内容和风格比例不同,效果不同, 直观体现在风格特征多,还是内容特征多。

ratio_effect

3.1提取特征的卷积层不同,合成图片效果不同

在生成图片的过程中,我们用卷积层提取出风格和内容特征, 在迭代中生成最匹配这些特征的图片,所以选择哪些卷积层作为匹配项,对最终图片的效果有比较大的影响。

提取内容特征的卷积层

低层级会保留更多的细节像素

conv_effect

提取风格的卷积层

高层级的卷积层提取出来的风格特征更平滑

4.实现

跟@无悬 花了几天一起开发的仿Prima的图片处理软件Demo. 支持摄像或相册选图。
http://gitlab.alipay-inc.com/creative/prisma
http://gitlab.alipay-inc.com/creative/neural-artwork

show_2

相关文章
|
缓存 移动开发 图形学
进击的 Vulkan 移动开发(二)之谈谈对渲染流程的理解
都说 OpenGL 、Vulkan 是用来绘制二维、三维图形的,那么这个绘制渲染的流程到底是怎么样的呢?这里,谈谈我自己对它的理解。
608 0
进击的 Vulkan 移动开发(二)之谈谈对渲染流程的理解
系列文章深度解读|SwiftUI 背后那些事儿
前言 今年苹果的WWDC你看了吗?苹果在2019年的WWDC的重头戏当然非SwiftUI莫属:全新的声明式语法、绑定式API、和响应式变成框架Combine。这一切的一切都预示着即将在Apple Native布局系统掀起一场革命。
17732 0
|
4月前
|
前端开发 JavaScript C++
【绝技大公开】Webpack VS Rollup:一场前端工程化领域的巅峰对决,谁能笑到最后?——揭秘两大构建神器背后的秘密与奇迹!
【8月更文挑战第12天】随着前端技术的发展,模块化与自动化构建成为标准实践。Webpack与Rollup作为主流构建工具,各具特色。Webpack是一款全能型打包器,能处理多种静态资源,配置灵活,适合复杂项目;Rollup专注于ES6模块打包,利用Tree Shaking技术减少冗余,生成更精简的代码。Rollup构建速度快,配置简洁,而Webpack则拥有更丰富的插件生态系统。选择合适的工具需根据项目需求和个人偏好决定。两者都能有效提升前端工程化水平,助力高质量应用开发。
50 1
|
4月前
|
缓存 前端开发 JavaScript
"React与GraphQL Apollo Client的神奇之处:如何用高效数据驱动应用让你的项目一鸣惊人?"
【8月更文挑战第31天】在当今的Web开发领域,数据驱动应用已成主流。本文章深入探讨了React——一个用于构建用户界面的流行JavaScript库,与GraphQL及Apollo Client结合使用时如何助力开发者高效创建数据驱动应用。通过示例代码,文章展示了React与GraphQL Apollo Client在实际项目中的应用方法,并总结了其优势及最佳实践,为读者提供了全面的技术指南。
45 0
|
4月前
|
前端开发 API 开发者
【前端数据革命】React与GraphQL协同工作:从理论到实践全面解析现代前端数据获取的新范式,开启高效开发之旅!
【8月更文挑战第31天】本文通过具体代码示例,介绍了如何利用 GraphQL 和 React 搭建高效的前端数据获取系统。GraphQL 作为一种新型数据查询语言,能精准获取所需数据、提供强大的类型系统、统一的 API 入口及实时数据订阅功能,有效解决了 RESTful API 在复杂前端应用中遇到的问题。通过集成 Apollo Client,React 应用能轻松实现数据查询与实时更新,大幅提升性能与用户体验。文章详细讲解了从安装配置到查询订阅的全过程,并分享了实践心得,适合各层次前端开发者学习参考。
45 0
|
4月前
|
数据库 开发者 数据库管理
【惊艳登场】Bottle框架凭什么成为Web开发新宠儿?一个实战案例告诉你背后的秘密!
【8月更文挑战第31天】Bottle是一个简洁高效的Web框架,适用于构建轻量级应用。本文通过开发一个在线笔记应用,展示了Bottle的核心特性和优势。从环境搭建、路由设置到数据库操作,详细介绍了用户注册、登录、笔记创建及管理等功能的实现过程。通过简洁的语法和灵活的路由机制,Bottle让开发者能快速构建功能完备的应用,提升开发效率。
57 0
|
4月前
|
JavaScript 前端开发 数据库
Tornado框架:异步时代的Web开发,它能否颠覆你的编码世界观?
【8月更文挑战第31天】构建高性能Web应用时,选择合适工具至关重要。Tornado不仅是一个Web框架,还内置高性能HTTP服务器,无需外部依赖即可独立运行,区别于需结合Gunicorn或uWSGI的Django和Flask。本文将探讨Tornado如何革新Web开发,并提供示例。
59 0
|
4月前
|
前端开发 API 开发者
【React状态管理新思路】Context API入门:从零开始摆脱props钻孔的优雅之道,全面解析与实战案例分享!
【8月更文挑战第31天】React 的 Context API 有效解决了多级组件间状态传递的 "props 钻孔" 问题,使代码更简洁、易维护。本文通过电子商务网站登录状态管理案例,详细介绍了 Context API 的使用方法,包括创建、提供及消费 Context,以及处理多个 Context 的场景,适合各水平开发者学习与应用,提高开发效率和代码质量。
47 0
|
7月前
|
存储 API 开发者
探究GraphQL:从概念到实践
GraphQL是一种用于API开发的查询语言,它具有灵活的数据获取能力和强大的类型系统。与传统RESTful API相比,GraphQL更加高效、可扩展和易于维护。本文将介绍GraphQL的基本概念、核心优势以及实践应用。
|
7月前
|
设计模式 中间件 开发者
Koa2 的洋葱模型是什么?它是如何实现的?
Koa2 的洋葱模型是什么?它是如何实现的?
238 0