在今天的文章中,我们会建立一个很棒的风格迁移网络。为了做到这一点,我们需要深入地了解 CNN 和卷积层的工作原理。在文章结束时,你将会创建一个风格迁移网络,这个网络能够在保留原始图像的同时将新样式应用到它上面。
波士顿天际线和梵高的繁星之夜混合效果
风格迁移
在开始之前,先明确一下我们的目标。
我们将风格迁移定义为改变图像风格同时保留它的内容的过程。
给定一张输入图像和样式图像,我们就可以得到既有原始内容又有新样式的输出图像。在 Leon A. Gaty 的论文 A Neural Algorithm of Artistic Style 中有所描述。
输入图像 + 样式图像 -> 输出图像(风格化)
工作方式
准备输入图像和风格图像并将它们调整为相同的大小。
加载预训练的卷积神经网络(VGG16)。
区分负责样式的卷积(基本形状,颜色等)和负责内容的卷积(特定于图像的特征),将卷积分开可以单独地处理内容和样式。
优化问题,也就是最小化:
内容损失(输入和输出图像之间的距离 - 尽力保留内容)
风格损失(风格和输出图像之间的距离 - 尽力应用新风格)
总变差损失(正则化 - 对输出图像进行去噪的空间平滑度)
5.最后设置梯度并使用 L-BFGS 算法进行优化。
实现
可以在 Kaggle kernel 或 GitHub找到该项目的完整代码。
输入
# 旧金山
san_francisco_image_path = "https://www.economist.com/sites/default/files/images/print-edition/20180602_USP001_0.jpg"
# 输入可视化
input_image = Image.open(BytesIO(requests.get(san_francisco_image_path).content))
input_image = input_image.resize((IMAGE_WIDTH, IMAGE_HEIGHT))
input_image.save(input_image_path)
input_image
这就是旧金山的天际线
风格
然后定义一个风格图像。
# Tytus Brzozowski
tytus_image_path = "http://meetingbenches.com/wp-content/flagallery/tytus-brzozowski-polish-architect-and-watercolorist-a-fairy-tale-in-warsaw/tytus_brzozowski_13.jpg"
# 风格图像可视化
style_image