Universal Style Transfer via Feature Transforms (WCT,风格迁移,NIPS2017)

本文深入探讨了风格迁移技术,特别是Li等人的通用风格转移方法,该方法通过特征变换实现高效且高质量的风格转换。文章详细解释了Whitening and Coloring变换如何匹配内容图像和风格图像的统计特性,实现了从高层到低层的多级风格化。

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

Li Y, Fang C, Yang J, et al. Universal Style Transfer via Feature Transforms. NIPS 2017

风格迁移的关键问题是如何提取有效果的风格特征并且让输入的内容图像去匹配这种风格。前人的工作证明了协方差矩阵和Gram矩阵能较好地反映视觉风格。

基于优化的风格迁移方法,可以处理任意风格并且达到满意的效果但是计算代价太大(时间太长);基于前馈网络的方法可以高效运行,但是局限于固定种类的风格或者不太好的视觉效果。

同时实现generalization , quality ,efficiency的任意风格转换时一个挑战性的任务。

generalization: 说的应该是处理多种甚至任意风格图像的能力。

这篇工作提出的方法是用whitening and coloring变换来实现风格迁移, 思想是将风格迁移任务看做是一个图像重构并进行特征变换的任务。WCT操作:输入内容图像特征和风格特征,输出调整后的内容特征使得输入内容特征的协方差矩阵和输入风格特征的协方差矩阵相匹配。

事先需要预训练一个VGG作为encoder和一个与之对称的decoder。它们的参数在后续实验中保持固定。

在这里插入图片描述

在这里插入图片描述

输入的内容图像C和风格图像S经过VGG提取出high-level高层特征 (Relu5_1),进行Whitening and Coloring Transform (WCT),然后通过decoder恢复到原图大小。

再将变换后的图像C和风格图像S经过VGG提取出较低一层的特征(Relu4_1),进行WCT,然后通过decoder恢复到原图大小。

再将变换后的图像C和风格图像S经过VGG提取出低层的特征(Relu1_1),进行WCT,然后通过decoder恢复到原图大小。

The result obtained by matching higher level statistics of the style is treated as the new content to continue to match lower-level information of the style.

也就是说经过匹配了风格图像高层统计量的图像作为新的内容图像继续去匹配风格图像的低层信息。这样各层统计量都得到了匹配。 (Multi-level coarse-to-fine stylization)

重构误差
在这里插入图片描述

特征进行whitening,之后decode 操作效果:
在这里插入图片描述
保持了图像的全局内容,移除了与风格有关的信息。细节处的笔画图案被移除了

在这里插入图片描述

It clearly shows that the higher layer features capture more complicated local structures, while lower layer features carry more low-level information (e.g., colors).

高层特征反映了复杂的局部结构,低层特征具有更多的低层(细节)信息。工作的优化顺序是先匹配高层统计量,再匹配低层统计量。

which indicates that the higher layer features first capture salient patterns of the style and lower layer features further improve details
高层特征捕捉到了风格的显著模式,低层特征进一步优化细节。实验证明:如果先匹配低层统计量,再匹配高层统计量,低层细节信息在高层特征经过操作之后不能被保留。

控制风格化程度
在这里插入图片描述
α\alphaα被称之为style weight.
where α\alphaα serves as the style weight for users to control the transfer effect.

拓展到纹理生成 Texture synthesis:

将输入内容图像替换成随机噪声图像

生成新纹理的插值方式:

在这里插入图片描述

之后将fcs^\hat{f_{cs}}fcs^送入decoder

在这里插入图片描述
In contrast, our approach explains each input noise better because the network is unlikely to absorb the variations in input noise since it is never trained for learning textures.
对于纹理生成一个重要的评价指标是diversity, [27]通过输入噪声生成不同的结果图像。但是实验结果证明噪声被吸收/发挥出了微不足道的效果,因此难以驱动网络去生成较大的视觉变化/差异。相比较而言, 由于proposed mehod对于纹理生成不需要经过训练过程,所以proposed method吸收噪声的能力并不那么强。

WCT操作

目标:在这里插入图片描述

其中fcs^\hat{f_{cs}}fcs^是指匹配之后的特征,fsf_sfs是指风格特征。

1) Whitening操作:

先对fcf_cfc中心化 (We first center fsf_sfs by subtracting its mean vector msm_sms)

之后:
在这里插入图片描述
其中EcE_cEcfcfcTf_cf_c^TfcfcT进行特征分解后的特征向量构成的方阵,DcD_cDc为特征值构成的对角阵。

这样变换后的fc^\hat{f_c}fc^正交:

fc^fc^T=I\hat{f_c} \hat{f_c}^T= Ifc^fc^T=I

证明:

因为,对于所有特征向量xxx
fcfcTx=λxf_c f_c^T x=\lambda xfcfcTx=λx

所以 fcfcTEc=EcDcf_c f_c^T E_c=E_c D_cfcfcTEc=EcDc

因为EcE_cEc为正交方阵,故EcEcT=IE_c E_c^T=IEcEcT=I,并且EcTEc=IE_c^T E_c=IEcTEc=I

所以fcfcT=EcDcEcTf_c f_c^T = E_c D_c E_c^TfcfcT=EcDcEcT
所以EcTfcfcTEc=DcE_c^T f_c f_c^T E_c = D_cEcTfcfcTEc=Dc

所以
fc^fc^T=EcDc−12EcTfcfcTEcDc−12TEcT=EcDc−12DcDc−12TEcT=EcDc−12DcDc−12EcT=EcEcT=I \begin{aligned} \hat{f_c}\hat{f_c}^T&=E_c D_c^{-\frac{1}{2}} E_c^T f_c f_c^T E_c D_c^{-\frac{1}{2}T}E_c^T \\ &=E_c D_c^{-\frac{1}{2}} D_c D_c^{-\frac{1}{2}T}E_c^T \\ &=E_c D_c^{-\frac{1}{2}} D_c D_c^{-\frac{1}{2}}E_c^T \\ &=E_c E_c^T \\ &= I \end{aligned} fc^fc^T=EcDc21EcTfcfcTEcDc21TEcT=EcDc21DcDc21TEcT=EcDc21DcDc21EcT=EcEcT=I

2) Coloring操作:

先对fsf_sfs中心化,再进行变换:在这里插入图片描述
其中EsE_sEsfsfsTf_sf_s^TfsfsT进行特征分解后的特征向量构成的方阵,DsD_sDs为特征值构成的对角阵。

最后再对fcs^\hat{f_{cs}}fcs^去中心化
在这里插入图片描述

这样先进行Whitening再进行Coloring之后,能够使变换后的特征和风格图特征的协方差矩阵匹配:在这里插入图片描述
证明:
fcs^fcs^T=EsDs12EsTfc^fc^TEsDs12TEsT=EsDs12EsTEsDs12EsT=EsDs12Ds12TEs=EsDs12Ds12Es=EsDsEs=fsfsT \begin{aligned} \hat{f_{cs}}\hat{f_{cs}}^T &= E_s D_s^{\frac{1}{2}} E_s^T \hat{f_c} \hat{f_c}^T E_s D_s^{\frac{1}{2}T} E_s^T \\ &=E_s D_s^{\frac{1}{2}} E_s^T E_s D_s^{\frac{1}{2}} E_s^T \\ &=E_s D_s^{\frac{1}{2}} D_s^{\frac{1}{2}T} E_s \\ &=E_s D_s^{\frac{1}{2}} D_s^{\frac{1}{2}} E_s \\ &=E_s D_s E_s \\ &= f_s f_s^T \end{aligned} fcs^fcs^T=EsDs21EsTfc^fc^TEsDs21TEsT=EsDs21EsTEsDs21EsT=EsDs21Ds21TEs=EsDs21Ds21Es=EsDsEs=fsfsT

### 风格迁移网络的种类与实现模型 风格迁移Style Transfer)是计算机视觉和深度学习领域中的一项重要技术,旨在将一幅图像的视觉风格迁移到另一幅图像上,同时保留其内容结构。随着深度学习的发展,风格迁移网络经历了多个阶段的演进,从早期基于优化的方法到现代基于生成模型的架构,形成了多样化的模型体系。 #### 1. 基于优化的传统风格迁移模型 最早的风格迁移方法基于卷积神经网络(CNN)提取图像特征,并通过优化目标函数来实现风格与内容的融合。这类方法通常使用预训练的 CNN(如 VGG 网络)作为特征提取器,分别计算内容损失和风格损失。内容损失通常采用均方误差(MSE)来衡量生成图像与内容图像在特征空间中的相似性,而风格损失则通过 Gram 矩阵来捕捉图像的纹理特征[^2]。 这种方法的典型代表是由 Gatys 等人提出的方法,其核心思想是利用 VGG 网络提取图像的多尺度特征,并通过优化过程生成风格化图像。尽管该方法生成的图像质量较高,但其计算效率较低,难以满足实时应用需求。 #### 2. 前馈风格迁移网络 为了提高风格迁移的效率,研究人员提出了基于前馈网络的风格迁移方法,其中最具代表性的是 Johnson 等人提出的**快速风格迁移网络**(Fast Neural Style Transfer)。该方法通过训练一个前馈网络,直接将输入图像映射到风格化图像,避免了每次生成图像时的优化过程。该网络通常由编码器-解码器结构组成,结合了残差块(Residual Blocks)以增强图像的细节保留能力。 此类方法显著提高了风格迁移的速度,使其适用于实时视频风格迁移等应用场景。然而,由于网络是针对特定风格进行训练的,因此缺乏灵活性,难以实现多风格迁移。 #### 3. 多风格迁移网络 为了解决单风格迁移模型的局限性,研究人员提出了**多风格迁移网络**,如 Adaptive Instance Normalization(AdaIN)。该方法通过在特征空间中对内容图像和风格图像的统计特征进行匹配,实现风格的快速迁移。AdaIN 方法无需训练特定风格的网络,而是通过调整风格图像的均值和方差来控制输出图像的风格,从而实现了灵活的多风格迁移。 此外,WCT(Wavelet-Transformed Content and Texture)方法结合小波变换和特征变换,进一步提升了风格迁移的质量和多样性。 #### 4. 基于扩散模型的风格迁移 近年来,扩散模型(Diffusion Models)在图像生成任务中取得了巨大成功,并逐渐被应用于风格迁移领域。扩散模型通过逐步去噪的方式生成图像,能够更好地学习解耦的风格信息,并实现更高质量和更灵活的风格迁移效果。例如,基于扩散的风格迁移模块可以更精细地控制风格的局部特征和全局一致性,从而生成更具艺术性和真实感的图像[^1]。 #### 5. 自编码器与变体在风格迁移中的应用 自编码器(Autoencoder, AE)及其变体(如变分自编码器 VAE)也被广泛用于风格迁移任务。这类方法通常将图像编码到潜在空间,再通过解码器生成风格化图像。通过在潜在空间中引入风格控制变量,可以实现对风格的解耦表示和灵活控制。 例如,CycleGAN 和 StarGAN 等生成对抗网络(GAN)与自编码器相结合,能够实现跨域风格迁移,并支持多风格切换和属性编辑。 #### 6. 实时视频风格迁移模型 在视频风格迁移方面,研究者们提出了多种优化策略,如帧间一致性约束、光流估计等,以确保风格迁移在时间维度上的连续性。例如,Temporal Consistency Loss 被用于约束相邻帧之间的风格一致性,从而避免视频中出现闪烁或抖动现象。此外,轻量级网络结构和模型压缩技术也被用于提升视频风格迁移的实时性。 ### 示例代码:使用 AdaIN 进行风格迁移 ```python import torch from torchvision import transforms from PIL import Image import numpy as np def adain(content_feat, style_feat): content_mean, content_std = calc_mean_std(content_feat) style_mean, style_std = calc_mean_std(style_feat) normalized_feat = (content_feat - content_mean) / content_std return normalized_feat * style_std + style_mean def calc_mean_std(feat, eps=1e-5): # 计算特征的均值和标准差 feat_mean = feat.mean(dim=[2,3], keepdim=True) feat_std = feat.std(dim=[2,3], keepdim=True) + eps return feat_mean, feat_std # 加载内容图像和风格图像 content_img = Image.open("content.jpg") style_img = Image.open("style.jpg") # 图像预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Resize((512, 512)), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) content_tensor = transform(content_img).unsqueeze(0) style_tensor = transform(style_img).unsqueeze(0) # 使用预训练的 VGG 网络提取特征 vgg = models.vgg19(pretrained=True).features for param in vgg.parameters(): param.requires_grad = False # 提取内容和风格特征 content_features = vgg(content_tensor) style_features = vgg(style_tensor) # 应用 AdaIN 进行风格迁移 transferred_features = adain(content_features, style_features) # 解码器部分(简化示例) decoder = nn.Sequential( nn.ConvTranspose2d(512, 256, kernel_size=4, stride=2, padding=1), nn.ReLU(), nn.ConvTranspose2d(256, 3, kernel_size=4, stride=2, padding=1), nn.Sigmoid() ) transferred_image = decoder(transferred_features) # 保存生成图像 def save_image(tensor, filename): tensor = tensor.squeeze(0).cpu().detach().numpy() tensor = tensor.transpose(1, 2, 0) tensor = (tensor * 255).astype(np.uint8) Image.fromarray(tensor).save(filename) save_image(transferred_image, "output_adain.jpg") ``` ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值