【编程奇妙夜】神经网络风格迁移-手机街拍秒变世界名画

神经网络风格迁移-手机街拍秒变世界名画
例如



风格迁移
将风格图图片迁移到内容图


不会写代码,这个网站可以直接生成


神经网络风格迁移算法原理


两个损失函数,内容损失函数,和风格损失函数

算法流程

例如

预备神经网络知识

卷积神经网络核心

一个卷积核对一个feature map


不同卷积核提取不同特征



越来越复杂抽象提取的特征

总结:

浅层卷积核提取:边缘、颜色、斑块等低层像素特征
中层卷积核提取:条纹、纹路、形状等中层纹理特征
高层卷积核提取:眼睛、轮胎、文字等高层语义特征
最后的分类输出层输出最抽象的分类结果
讲解论文,VGG网络

每一个block提取不同的卷积核

对比VGG16、19

损失函数设计
内容损失函数


网络越深重建效果越差、会存在信息丢失

风格损失函数

不同通道不同卷积核,提取不同特征


归纳


从更高层重建效果会更好

不同层重建不同纹理,越高层纹理信息越丰富


融合风格损失函数和内容损失函数

网络越深重建效果越差。

总损失函数


风格图的大小也会改变

小的更细节,感受野越大
代码实现
公众号 人工智能小技巧 回复 风格迁移。下载资料、代码、论文笔记

权重参数定义
--content_weight 内容损失函数所占的权重
--style_weight 风格损失函数所占的权重
--tv_weight 全局像素平滑损失函数 total variation loss
内容损失函数的计算方法:将内容图和生成图分别由预训练CNN运行,获得各自的中间层特征,然后求两个特征的L2距离
风格损失函数的计算方法:通过Gram矩阵可以提取风格图中不同尺度的颜色/纹理信息
风格图和生成图分别在ImageNet数据集中预训练的CNN中运行,获得不同层各自的Gram矩阵,然后计算每一层的两个Gram矩阵的L2距离,再对不同层的结果求损失


解析命令行参数


按照内容图的尺寸调整生成图像的大小

定义工具函数
预处理,将

将张量传入ImageNet数据集上预训练好的VGG19模型中
模型的输入为定义好的Input_tensor
获得模型的所有层以及每一层的输出

定义三个损失函数

全局像素平滑损失函数(total variation loss)的作用是平滑像素点,防止噪声,使图像看上去更贴近自然图像

融合三个损失函数

算法扩展升级


如保留内容图颜色

融合多个风格图

把不同画家风格融合在一张图,之前融合一个风格


Fast Style Transfer

fast-style-transfer

网站:http://github.com/jcjohnson/fast-neural-style

Instance Normalization归一化方法

Batch Norm:mini-batch中N个图片用同样卷积核卷积得到的第C个feature map
Layer Norm:mini-batch中第一个图片的全部C通道feature map
instance norm:mini-batch中第一张图片的第C个feature map
group norm:mini-batch中第一个图片的某些通道的feature map

加instance norm的效果 ,

但是这个存在缺点是每种风格都必须单独训练一个神经网络
因此考虑一种网络生成多种风格,把不同的风格来进行融合,只需要调整里面的参数

conditional instance normalization

fast-style transfer

pip 安装各种python的第三方工具包
conda不局限于python,既可以当第三方工具包也可以当做环境管理工具,不局限于Python,在javascript这些环境中都可以使用
训练
.checkpoint里面存放各种风格训练好的模型


运行视频的风格迁移

论文解析:A Neural Algorithm of Artistic Style
fine art:指的是绘画、建筑、雕塑、音乐、诗歌、戏剧、舞蹈等艺术






通过白噪声重构的方法,使用低层神经网络提取的特征来重构的话,获得的就是低层的特征,只有边缘斑点信息,越到高层就可以捕捉更大范围的风格信息,低层感受野小,捕捉细节条纹斑块,高层感受野大,捕捉星团,点彩的信息

内容信息重建,使用卷积神经网络每层提取的特征来重建






















