初探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

相关文章
|
3月前
|
存储 自然语言处理 机器人
实战揭秘:当RAG遇上企业客服系统——从案例出发剖析Retrieval-Augmented Generation技术的真实表现与应用局限,带你深入了解背后的技术细节与解决方案
【10月更文挑战第3天】随着自然语言处理技术的进步,结合检索与生成能力的RAG技术被广泛应用于多个领域,通过访问外部知识源提升生成内容的准确性和上下文一致性。本文通过具体案例探讨RAG技术的优势与局限,并提供实用建议。例如,一家初创公司利用LangChain框架搭建基于RAG的聊天机器人,以自动化FAQ系统减轻客服团队工作负担。尽管该系统在处理简单问题时表现出色,但在面对复杂或多步骤问题时存在局限。此外,RAG系统的性能高度依赖于训练数据的质量和范围。因此,企业在采用RAG技术时需综合评估需求和技术局限性,合理规划技术栈,并辅以必要的人工干预和监督机制。
216 3
|
4月前
|
前端开发 C# Android开发
揭秘Uno Platform跨平台开发魅力:企业级应用的优势与挑战,一篇文章带你深入探究代码背后的秘密
【9月更文挑战第8天】Uno Platform在企业级应用领域展现出强大潜力,凭借其跨平台特性,能够使用C#和XAML为Windows、iOS、Android及Web构建应用,显著降低开发成本。本文将探讨其优势与挑战,并通过示例代码展示其实际应用。Uno Platform不仅提供丰富的UI控件和布局选项,还支持MVVM架构,提升代码的可维护性和可测试性。
77 2
|
5月前
|
前端开发 JavaScript C++
【绝技大公开】Webpack VS Rollup:一场前端工程化领域的巅峰对决,谁能笑到最后?——揭秘两大构建神器背后的秘密与奇迹!
【8月更文挑战第12天】随着前端技术的发展,模块化与自动化构建成为标准实践。Webpack与Rollup作为主流构建工具,各具特色。Webpack是一款全能型打包器,能处理多种静态资源,配置灵活,适合复杂项目;Rollup专注于ES6模块打包,利用Tree Shaking技术减少冗余,生成更精简的代码。Rollup构建速度快,配置简洁,而Webpack则拥有更丰富的插件生态系统。选择合适的工具需根据项目需求和个人偏好决定。两者都能有效提升前端工程化水平,助力高质量应用开发。
58 1
|
5月前
|
缓存 前端开发 JavaScript
"React与GraphQL Apollo Client的神奇之处:如何用高效数据驱动应用让你的项目一鸣惊人?"
【8月更文挑战第31天】在当今的Web开发领域,数据驱动应用已成主流。本文章深入探讨了React——一个用于构建用户界面的流行JavaScript库,与GraphQL及Apollo Client结合使用时如何助力开发者高效创建数据驱动应用。通过示例代码,文章展示了React与GraphQL Apollo Client在实际项目中的应用方法,并总结了其优势及最佳实践,为读者提供了全面的技术指南。
50 0
|
5月前
|
前端开发 API 开发者
【前端数据革命】React与GraphQL协同工作:从理论到实践全面解析现代前端数据获取的新范式,开启高效开发之旅!
【8月更文挑战第31天】本文通过具体代码示例,介绍了如何利用 GraphQL 和 React 搭建高效的前端数据获取系统。GraphQL 作为一种新型数据查询语言,能精准获取所需数据、提供强大的类型系统、统一的 API 入口及实时数据订阅功能,有效解决了 RESTful API 在复杂前端应用中遇到的问题。通过集成 Apollo Client,React 应用能轻松实现数据查询与实时更新,大幅提升性能与用户体验。文章详细讲解了从安装配置到查询订阅的全过程,并分享了实践心得,适合各层次前端开发者学习参考。
50 0
|
5月前
|
数据库 开发者 数据库管理
【惊艳登场】Bottle框架凭什么成为Web开发新宠儿?一个实战案例告诉你背后的秘密!
【8月更文挑战第31天】Bottle是一个简洁高效的Web框架,适用于构建轻量级应用。本文通过开发一个在线笔记应用,展示了Bottle的核心特性和优势。从环境搭建、路由设置到数据库操作,详细介绍了用户注册、登录、笔记创建及管理等功能的实现过程。通过简洁的语法和灵活的路由机制,Bottle让开发者能快速构建功能完备的应用,提升开发效率。
63 0
|
8月前
|
存储 API 开发者
探究GraphQL:从概念到实践
GraphQL是一种用于API开发的查询语言,它具有灵活的数据获取能力和强大的类型系统。与传统RESTful API相比,GraphQL更加高效、可扩展和易于维护。本文将介绍GraphQL的基本概念、核心优势以及实践应用。
|
算法
简单几行代码背后的重大意义
简单几行代码背后的重大意义
|
Web App开发 设计模式 JSON
前端工程化之概念介绍
文章主要点: 1. 脚手架 2. Source Map
159 0
|
API 数据库
FastAPI 学习之路(三十五)项目结构优化
FastAPI 学习之路(三十五)项目结构优化
1115 0
FastAPI 学习之路(三十五)项目结构优化