最近一款叫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维的特征矩阵。如下图:
输入的图片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,就计算特征映射中的一个数值。比如:
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丢失了一些内容细节。
对于某个提取内容的卷积层l,论文定义的损失函数:
损失函数对l层的激活函数求导:
用误差反向传播和梯度下降法, 改变 ,最小化损失值,最终得到的新图在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层的损失函数 :
对l层的激活函数求导:
改变 , 最小化损失值, 也就是在某一层原图的风格格拉姆矩阵和生成的图片的格拉姆矩阵的均方差最小。
总的风格损失函数,其中w是某个卷积层的权重:
1.3用Pooling层降低计算量
将卷积层得到的结果无重合地分割,选择每一部分的最大值,降低特征矩阵的size(downsampling)
2.图像合成
将内容图片 , 和风格图片 输入,卷积层提取出个层的内容特征矩阵 和风格特征 。 在一张随机白噪声图片 上, 通过梯度下降 算法,每次迭代中计算新生成的风格特征和内容特征 , 直到损失值收敛。在合成中使用的损失函数为:
对内容损失函数 或 风格损失函数都是线性关系,权重分别为alpha和 beta.
论文中 , 内容特征由conv4_2
提取, 风格特征由conv1_1
, conv2_1
,conv3_1
, conv4_1
, conv5_1
提取,权重都是0.2 = 1×10−3.
3.影响图片合成效果的因素
3.1 内容损失和风格损失的比值
下图中 的比值变化,图像的内容和风格比例不同,效果不同, 直观体现在风格特征多,还是内容特征多。
3.1提取特征的卷积层不同,合成图片效果不同
在生成图片的过程中,我们用卷积层提取出风格和内容特征, 在迭代中生成最匹配这些特征的图片,所以选择哪些卷积层作为匹配项,对最终图片的效果有比较大的影响。
提取内容特征的卷积层
低层级会保留更多的细节像素
提取风格的卷积层
高层级的卷积层提取出来的风格特征更平滑
4.实现
跟@无悬 花了几天一起开发的仿Prima的图片处理软件Demo. 支持摄像或相册选图。
http://gitlab.alipay-inc.com/creative/prisma
http://gitlab.alipay-inc.com/creative/neural-artwork