PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)

也就是使用预训练的卷积神经网络来实现艺术家的风格迁移。

1.背景介绍

Neural_Style也叫做Neural-Transfer,这个算法就是输入一张图片,然后选择一种艺术风格图片,算法会将他们两个融合在一起,让输入的图片达到这种艺术的效果。

2.原理分析

首先是需要让融合图片和原始图片有尽可能高的相似度,或者说尽可能低的差异性,同时也需要让融合图片和风格图片在风格上尽可能相近。
1.内容差异
最简单的想法就是将两张图片的每个像素点逐一进行比较,可以看作是均方误差,也就是求一下差,在计算平方的和,在定义风格的差异的时候,调用了Gram矩阵来表示图片的风格
2.Gram矩阵
Gram矩阵大小是由特征图的厚度d决定的,等于d*d,每一个Gram矩阵中的元素,也就是Gram(i,j)等于以下公式:
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第1张图片
所以矩阵中每个元素都可以理解为由特征图中的I层和j层矩阵相关性的表示。
3.风格差异
这两幅图的Gram矩阵的差距就像内容差异的计算方法一样,可调用公式计算
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第2张图片

3代码实现

1.内容差异的代码如下:
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第3张图片
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第4张图片
图片在预训练的卷积层之下得到特征图,最后输出与基准内容图片的加权距离,所以在初始化中需要传入基准图片和权重,在通过target.detach()将基准图从计算图中分离出来,看成一个常量。
2.风格差异的代码如下:
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第5张图片
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第6张图片
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第7张图片
3.建立模型代码如下:
首先使用预训练的19层VGG网络,去掉最后的全连接层,只保留前面的卷积层
在这里插入图片描述
再需要确定哪几层的网络输出作为内容和风格的输出层:
在这里插入图片描述
再使用第四层卷积层作为内容层的输出,使用1-5层的卷积层输出作为风格层的输出,再重构我们的网络模型。
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第8张图片
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第9张图片
PyTorch实战之Neural-Style(使用PyTorch进行风格迁移)_第10张图片

4.总结

利用PyTorch实现基本风格转移算法,通过预训练的卷积网络提取出更高纬度的图片内容和风格,最后通过定义内容损失函数和风格损失函数进行反向传播更新参数,实现了图片风格融合的算法。

你可能感兴趣的