Neural Artistic Style

风格迁移

代码

本期做一个笔者认为神奇的实现,将一张真实的照片加入名画的风格生成一张新的照片。

论文地址:A Neural Algorithm of Artistic Style

首先介绍两个前置知识点,VGG和迁移学习

VGG

结构可以看成由CNN和FC组成,CNN(本期我们只会用到这一部分)又由五个Block组成:k个CNN3X3 + MaxPool。本期使用图中的E,VGG19。

迁移学习 导入已经训练好的模型参数来训练我们自己的模型,Pytorch使用迁移学习非常方便。

论文浅析

论文前半部分描述了实践和理解,确实可以做出比较理想的结果,但是笔者私以为数学支撑比较薄弱。

所以笔者直接从章节Methods开始说:

  • 首先,整个图片融合过程有三张图片:1、实际照片(下称p),2、名画(下称s),3、融合1和2的生成照片(下称x)。
  • 融合分两步:1、x和p在vgg的某几层使用Mean Squared Error来计算loss,2、x和s的矫正就有些微不同,论文中将图片降维后使用Matrix来存放各自特征,然后使用Mean Squared Error来计算loss。
  • 最后,上述所有loss相加后BP。

这里需要注意一点:整个训练流程VGG、p、s一直不变,只有x的参数在随BP更新

代码实现

首先提取已训练好的vgg参数来构建我们的模型

加载VGG19并导入已训练好的参数,行60, 65

而我们的模型构建就非常简单了,行40~55

Style Loss

图片的提取和保存点我查看,这里不在详述。

优化函数使用的LBFGS,代码:

结果

梵高-星空

毕加索

Nevermore Written by:

步步生姿,空锁满庭花雨。胜将娇花比。