原标题:在 PyTorch 中真实感风格转换所需的一切
来源:AI 研习社 链接:https://www.yanxishe.com/TextTranslation/1736
本文来自于论文高分辨率网络的真实感风格转移。我将分析论文中的细节和相关pytorch代码。具体代码实现可以在这里找到,论文的官方代码发布在这里。
将此模型用作实际的样式转换模型。
索引
1. 什么是风格转换?
2. 为什么要另写一篇论文?
3. 格兰姆矩阵
4. 高分辨率模型
5. 风格转换细节
6. 高分辨率生成网络
7. 损失函数
8. 难点
9. 总结
什么是风格转换?
我们输入两张图像,一张是内容图像,另一张是风格图像。
图1: 左:内容图像;右:风格图像
我们的目的是将风格图像的样式转化为内容图像,就像下图。
为什么要另写论文?
尽管早期风格转换的工作成功达成了目的,但不能保持内容图像的结构。举个例子,比较图2和原始的内容图像(图1)。你会发现内容图像中的曲线和结构并不扭曲,输出图像和内容图像具有相同的结构。
图3:(e)和(j)是本文的结果,同时与其他文章的方法进行了比较。图片来自于原始论文的图1
格拉姆矩阵
论文的主要思想是使用格兰姆矩阵进行风格转换。下方列出的两篇论文证明卷积神经网络特征映射的格兰姆矩阵可以表现图像的风格,并且提出了图像风格化的神经风格转换算法。
1. Texture Synthesis Using Convolution Neural Networks by Gatys et al. 2015
2. Image Style Tranfer Using Convolution Neural Networks by Gatys et al. 2016
格兰姆矩阵的细节可以查询维基百科。在数学上,给定一个向量,格兰姆矩阵的计算为:
高分辨率模型
这是CVPR 2019论文接受的最新研究论文。 因此,通常在CNN中发生的事情是,我们先减小图像尺寸,同时增加过滤器数量,然后再将图像尺寸增加回原始尺寸。
现在,这迫使我们的模型以非常小的分辨率生成输出图像,这导致丢失了更精细的细节和结构。 为了解决这个问题,引入了高分辨率模型。
高分辨率网络旨在在整个过程中保持高分辨率表示,并不断从低分辨率网络接收信息。 因此,我们以原始分辨率训练模型。
该模型的示例将在下面介绍。 您可以参考原始论文以获取更多详细信息。 我将在下周的博客文章中详细介绍该主题。
样式转移详细信息
现代深度学习样式转换算法的一般架构看起来像这样。
图4:深度学习时代中用于样式转换的模型架构。 图取自原始论文的图3。
样式转换模型需要三件事
1、生成模型:-将生成输出图像。 在图4中,这是“高分辨率生成网络”
2、损失函数:-如果您想获得良好的结果,正确选择损失函数非常重要。
3、损失网络:-您需要经过预训练的CNN模型,并且可以从图像中提取良好的特征。 在我们的案例中,它是在ImageNet上预训练的VGG19。
因此,我们加载了VGG模型。 完整的代码可在我的GitHub存储库中找到。
接下来,我们将映像加载到磁盘。
我的图像存储为src / imgs / content.png和src / imgs / style.png。
详细信息:-加载图像时,应使用什么尺寸? 您的内容图片大小应被4整除,因为我们的模型会将图片下采样2次。 对于样式图像,请勿调整其大小。 使用其原始分辨率。
对于我使用的图像,内容图像的大小为(500x500x3),样式图像的大小为(800x800x3)。
高分辨率生成网络
图5:高分辨率发电网络的结构。当我们融合具有不同分辨率的特征图时,我们将这些特征图像直接连接起来,例如初始模块,例如,特征图4由特征图2和特征图3串联。我们使用瓶颈残差来确保我们的网络可以很好地训练并在保持良好视觉效果的同时加快训练速度。图取自原始论文的图2。
该模型非常简单,我们从500x500x3的图像开始,并为整个模型保持此分辨率。我们将采样降低为250x250和125x125,然后将它们与500x500图像融合在一起。
细节:-
1、不使用池化(因为池化会导致信息丢失)。取而代之的是使用跨步卷积(即跨步= 2)。
2、没有使用辍学。但是,如果需要正则化,则可以使用权重衰减。
3、3x3转换内核在padding = 1的任何地方都可以使用。
4、仅使用零填充。测试了反射填充,但效果不佳。
5、对于上采样,使用“双线性”模式。
6、对于下采样,使用转换层。
7、使用InstanceNorm。
实施代码
在每个块之间使用残余连接。 我们使用ResNet架构中的BottleNeck层。 (在图5中,所有水平箭头都是瓶颈层)。
刷新瓶颈层。
图6:来自ResNet论文的BottleneckModule的体系结构。
现在,我们准备实现我们的style_transfer模型,我们将其称为HRNet(基于本文)。 使用Fig5作为参考。
损失函数
在样式转换中,我们使用特征提取来计算损失值。 简单来说,特征提取意味着您采用了预先训练的imagenet模型,并通过它传递图像并存储中间层输出。 通常,VGG模型用于此类任务。
图7:VGG网络的模型架构
因此,您可以获取conv层的输出。 就像上面的图一样,您可以从第二个3x3转换64层获取输出,然后从3x3转换128进行输出。
为了从VGG中提取特征,我们使用以下代码。
我们总共使用5层进行特征提取。 仅conv4_2用作内容丢失的层。
参考图4,我们将HRNet的输出图像以及原始内容和样式图像通过VGG传递。
有两个损失
1、内容损失
2、风格损失
内容损失:内容图像和输出图像应具有与损失网络VGG计算的相似的特征表示。 因为我们只更改样式,而没有更改图像的结构。
对于含量损失,我们使用欧氏距离,如公式所示
Phi_j意味着我们指的是第j层损耗网络的激活。 在代码中看起来像这样
样式损失:为此,我们使用gram矩阵。 因此,图像的样式由其gram矩阵给出。 我们的目的是使两个图像的样式接近,因此我们计算样式图像和输出图像的语法矩阵之差,然后采用它们的Frobenius范数。
难点
为了计算最终损失,我们将它们乘以一些权重。
content_loss = content_weight * content_loss
style_loss = style_weight * style_loss
困难在于设置这些值。 如果需要一些期望的输出,则必须先测试不同的值,然后才能获得期望的结果。
要建立自己的直觉,您可以选择两个图像并尝试不同的值范围。 我正在努力提供类似的摘要。 它可以在我的回购自述文件中找到。
纸张建议content_weight = [50,100]和style_weight = [1,10]。
结论
好了,祝贺到了最后。 您现在可以实现样式转换。 现在阅读本文以获取有关样式转换的更多详细信息。
查看我的仓库README,它将包含有关如何使用仓库中代码的完整说明,以及有关如何训练模型的完整步骤。 在下周,我还将添加视频支持。 因此,您可以为视频中的所有帧传输样式。 我正在尝试循环学习以进行样式转换。 还将增加对fastai的支持。
一THE END一
免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。
合作及投稿邮箱:E-mail:editor@tusaishared.com