风格迁移网络

本文深入探讨了快速风格迁移的网络结构,包括生成网络和损失网络的作用与设计。生成网络负责风格转换,损失网络用于计算内容和风格损失,确保转换后的图像既保留原内容又融合新风格。文中详细解释了如何利用预训练的CNN提取图像特征,通过感知损失函数优化图像转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成网络与损失网络

快速风格迁移的网络结构包含两个部分。一个是生成网络(Transformation Network),一个是损失网络(Loss Network)。生成网络是将输入图像进行风格迁移后输出,损失网络用以计算生成图像的内容损失和风格损失。

对于生成网络,本质上是一个卷积神经网络,但不采用池化层,取而代之的是用步幅卷积或微步幅卷积做网络内的上采样或下采样。神经网络有五个残差块组成,除了最末的输出层以外,所有的非残差卷积层都跟着一个空间性的Instance NormalizationRELU的非线性层(Instance Normalization正则化是用来防止过拟合,RELU防止梯度消失)。最末层使用一个缩放的Tanh来确保输出图像的像素在[0,255]之间。除了第一层和最后一层采用9x9的卷积核(kernel),其他所有卷积层都用3x3的卷积核。

损失网络φ定义内容损失(content loss)和一个风格损失(style loss),分别衡量内容和风格上的差距。对于每一张输入的图片x我们有一个内容目标yc一个风格目标ys,对于风格转换,内容目标yc是输入图像x,输出图像y,应该把风格ys结合到内容x=yc上。系统为每一个目标风格训练一个网络,为确保所用到的损失函数能更好的衡量图片感知及语义上的差距,需要使用一个预先训练好用于图像分类的CNN,这个CNN已经学会感知和语义信息编码,这正是图像风格转换系统的损失函数中需要做的。所以使用了一个预训练好用于图像分类的网络φ,来定义系统的损失函数。之后使用同样是深度卷积网络的损失函数来训练我们的深度卷积转换网络。损失网络虽然也是卷积神经网络(CNN),但是参数不做更新,只用来做内容损失和风格损失的计算,训练更新的是前面的生成网络的权值参数。所以从整个网络结构上来看输入图像通过生成网络得到转换的图像,然后计算对应的损失,整个网络通过最小化内容和风格损失不断地更新前面的生成网络权值。

在求损失的过程,从预训练好的损失网络中提取高级特征,使用感知损失函数代替逐像素损失函数。在训练的过程中,感知损失函数比逐像素损失函数更适合用来衡量图像之间的相似程度。

(1)内容损失

内容的损失计算用VGG计算得到的高级特征来表示,因为VGG模型本来是用于图像分类的,所以一个训练好的VGG模型可以有效的提取图像的高级特征(内容)。计算的公式如下:

                                           

如果较低的层的特征损失最小,往往能够生成在视觉上和y不太能区分的图像。用一个特征损失来训练我们的图像转换网络能让输出非常接近目标图像y,但也并不是让它们完全的匹配。

(2)风格损失

内容损失惩罚了输出的图像(当它偏离了目标y时),所以同样的,我们也希望对输出的图像去惩罚风格上的偏离:颜色,纹理,共同的模式等方面。为了达成这样的效果,一些研究者定义出了Gram矩阵。在卷积神经网络中,每个特征图的大小一般是 MxNxC这种大小,MxN表示的是一个矩阵的大小,C表示厚度,通俗说就是有CMxN 这样的矩阵叠在一起。

首先Gram矩阵的大小是由特征图的厚度决定的,等于CxC。首先把特征图中第i层和第j层取出来,得到了两个MxN的矩阵,然后将这两个矩阵对应元素相乘然后求和得到Gram(i,j)。这样 Gram 中每个元素都可以表示两层特征图的一种组合,就可以定义为它的风格。然后风格的差异就是两幅图的 Gram 矩阵的差异,与内容的差异的计算方法一样,通过这两个矩阵的差就可以量化风格的差异。

训练阶段:选定一张风格图片。训练过程中,将数据集中的图片输入网络,生成网络生成结果图片y,损失网络提取图像的特征图,将生成图片y分别与目标风格图片ys和目标输入图片(内容图片)yc做损失计算,根据损失值来调整生成网络的权值,通过最小化损失值来达到目标效果。

执行阶段:给定一张图片,将其输入已经训练好的生成网络,输出这张图片风格转换后的结果。

2.2 实现效果

我厦的颂恩楼,结合各种风格,效果如下:

其他建筑与风格结合效果如下所示:

图2-1 单风格迁移网络

上面的效果发现,原图的颜色被风格图改变,我们可以尝试不改变原来图像的颜色,只迁移风格图的纹理,得到效果如下所示:

图2-2 迁移纹理不迁移颜色

通过python的flask,制作出GUI界面如下:

通过控件来改变各种风格的结合,以及每个风格的比例:

图2-4 多风格迁移界面设计(左边风格选择,右边为输出)

### 图像风格迁移的神经网络架构 对于图像风格迁移任务,卷积神经网络(CNN)被广泛采用来实现艺术风格转换。具体而言,在VGG网络的基础上进行了改进和优化以适应风格迁移的需求[^1]。 #### 基础框架 该方法通常依赖于预训练好的深层CNN模型作为特征提取器。通过前向传播输入图片至不同层次,可以获得抽象程度各异的内容表示以及纹理信息。为了分离内容与样式,分别计算来自同一张图像的不同层激活响应之间的差异: - **内容损失(Content Loss)**:衡量重建图像同原始目标图像间高层语义差距; - **风格损失(Style Loss)**:评估合成作品相对于指定艺术家画作风格统计特性的相似度; 两者共同构成了总变分正则化项(Total Variation Regularization),从而确保最终输出既保留原图结构又具备期望的艺术效果。 ```python import torch.nn as nn class StyleTransferNet(nn.Module): def __init__(self, encoder_weights=None): super().__init__() self.encoder = EncoderNetwork(pretrained=True) if encoder_weights is not None: self.load_state_dict(torch.load(encoder_weights)) def forward(self, content_image, style_images): # Extract features from both images using the pretrained CNN (e.g., VGG19) content_features = self.encoder(content_image) style_features = [self.encoder(style_img) for style_img in style_images] generated_image = initialize_random_noise_like(content_image) optimizer = setup_optimizer([generated_image]) for iteration in range(num_iterations): gen_content_feat = self.encoder(generated_image.detach()) loss_c = compute_content_loss(gen_content_feat, content_features) loss_s = sum(compute_style_loss(gen_content_feat, s_f) for s_f in style_features) total_variation = calculate_total_variation(generated_image) combined_loss = alpha * loss_c + beta * loss_s + gamma * total_variation optimizer.zero_grad() combined_loss.backward(retain_graph=True) optimizer.step() return generated_image ``` 此代码片段展示了如何构建一个简单的基于PyTorch框架下的风格转移网络实例。其中`EncoderNetwork`代表用于编码输入图像并获取其内部表征的模块,而其他函数定义了具体的损失计算逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值