Skip to content

风格迁移

风格迁移(Style Transfer)是生成式 AI 最经典、最直观的应用之一——把一张照片的内容保留,同时套上另一张画作的笔触、色调和纹理。本页讲解从 Gatys 的神经风格迁移到快速风格迁移,再到现代扩散风格化的完整脉络,并覆盖 2024-2025 年的实时任意风格化、FLUX/SDXL 风格管线和视频风格迁移等最新进展。前置阅读:CNN 卷积神经网络、扩散模型。

想象你面前有两幅画——一张是你拍的风景照(内容图),另一张是梵高的《星夜》(风格图)。你想画一张”梵高风格的风景照”:

  • 内容 = 画的是什么(山、树、房子的轮廓和位置)。CNN 深层特征(feature map,即卷积核扫描图像后得到的激活矩阵)对物体位置和形状敏感,正好用来锁定内容。直觉上,深层卷积的感受野(receptive field,一个神经元”看到”的输入区域)很大,所以它编码的是”整块区域是什么物体”这种语义信息,而非像素细节。
  • 风格 = 怎么画的(笔触粗细、配色、纹理)。CNN 浅层特征捕捉局部纹理——而 Gram 矩阵(特征通道之间的相关性)能进一步抹掉空间位置信息,只留下”画风”。所谓”通道”(channel)可以理解为一种纹理检测器,比如”竖线检测器""暖色检测器”;Gram 矩阵统计的是这些检测器两两之间”是否经常同时活跃”,恰好刻画了不同纹理如何组合出现的统计规律。
  • 迁移 = 让一张新图同时靠近两边:从一张噪声(或内容图副本)出发,反复调整像素,让它的内容特征逼近内容图、风格特征逼近风格图。

一句话:内容看深层特征的差,风格看 Gram 矩阵的差,两者加权相加就是总损失,对像素做梯度下降。

到了扩散模型时代(2022 年起),核心思路从”优化像素”转向”引导去噪过程”:不再逐像素迭代逼近,而是让一个已经学会画画的扩散模型在去噪时”偏向”目标风格。2024-2025 年的最新趋势则是任意风格实时迁移(给一张没见过的新风格图,零样本秒出结果)和视频风格化(保持时序一致地给整段视频上风格),底层架构也从 UNet 扩散逐步迁移到 DiT(Diffusion Transformer)和 FLUX 等新一代生成主干。

给定一个预训练 VGG 网络(VGG 是 2014 年提出的经典深层卷积网络,由多个 3×3 卷积层堆叠而成,因结构规整、特征层次分明,至今仍是风格迁移的标准”特征提取器”),输入图像 I,在第 l 层得到特征图 F_l,形状为 C_l × H_l × W_l(C_l 个通道,每个通道是一张 H_l × W_l 的特征图)。

VGG19 共有 16 个卷积层,分为 5 个卷积块(conv1_1~conv1_2、conv2_1~conv2_2、…、conv5_1~conv5_4),每个块末尾接一个最大池化层做下采样。随着层数加深,特征图的分辨率逐块减半(如 224→112→56→28→14),通道数逐块翻倍(64→128→256→512→512)。

  • 内容表示:直接用某一层(通常选较深的层,如 conv4_2)的特征图 F_l。两张图在该层特征越接近,它们”看起来内容”就越像。选深层的直觉是:深层特征已经丢弃了大量像素级细节(颜色、纹理),只保留了对物体类别和空间布局的高层抽象表示,因此”内容相似”但不”像素相似”。

  • 风格表示:对每一层特征图计算 Gram 矩阵 G_l,定义为:

    Gl[i][j]=∑spatial(Fl[i]×Fl[j])G_l[i][j] = \sum_{\text{spatial}} ( F_l[i] \times F_l[j] )(对 Hl×WlH_l \times W_l 上每个空间位置求和)

    也就是说,G_l 是一个 C_l × C_l 的方阵,第 i 行 j 列表示第 i 个通道和第 j 个通道在同一位置上”同时活跃”的程度。Gram 矩阵抹掉了”哪里活跃”,只保留了”哪些纹理通道一起出现”——这恰好就是画风。数学上,Gram 矩阵是对特征图做外积后对空间维度求和,等价于特征向量与其转置的点积;它本质上是在估计通道间协方差的一种简化形式。

为什么用 Gram 矩阵而不是直接逐像素比特征?因为风格是一种全局统计特性(“整幅画总体上偏暖色、笔触偏粗”),而非”某个位置的纹理”。Gram 矩阵正好把空间位置信息聚合掉了,只留下通道间的二阶统计量,与人类对”画风”的感知高度吻合。

神经风格迁移的总损失 = 内容损失 + α×\alpha \times 风格损失:

  • 内容损失 Lcontent=∑(Flcontent−Flgenerated)2L_{\text{content}} = \sum ( F_l^{\text{content}} - F_l^{\text{generated}} )^2,即生成图与内容图在选定层特征图上的均方误差(MSE)。这是在特征空间而非像素空间做比较——特征空间比较更符合人眼感知,因为两张”同一只猫但姿势略不同”的图在像素上可能差很远,但在深层特征上很近。
  • 风格损失 LstyleL_{\text{style}} = 对多层 ll 的每一个,计算 (Glstyle−Glgenerated)2( G_l^{\text{style}} - G_l^{\text{generated}} )^2 的 Frobenius 范数(矩阵所有元素平方和的平方根),再对所有层求和取平均。通常同时在 conv1_1、conv2_1、conv3_1、conv4_1、conv5_1 这 5 层上算风格损失——浅层负责笔触、线条等细粒度纹理,深层负责色彩分布、构图节奏等宏观画风。
  • α\alpha 是控制”多像风格图 vs 多像内容图”的权重比,典型值 α/β\alpha/\beta 在 0.001 到 1 之间(β\beta 是内容项权重)。Gatys 原文用 α/β=1/1000\alpha/\beta = 1/1000 的数量级,即风格项权重大得多——因为 Gram 矩阵的数值尺度本身比内容特征小,需要更大的权重才能”拉动”优化方向。

完整的总损失公式:

Ltotal=β⋅Lcontent+α⋅∑lwl⋅Lstyle,lL_{\text{total}} = \beta \cdot L_{\text{content}} + \alpha \cdot \sum_l w_l \cdot L_{\text{style},l}

其中 wlw_l 是每一层风格损失的权重,通常均分为 1/N1/N(NN 是使用的风格层数量)。

固定 VGG 权重不变(权重冻结,weight freezing——即不计算也不更新 VGG 参数的梯度),把”生成的图像”本身当作可优化变量。具体步骤:

  1. 初始化生成图:通常初始化为内容图副本(比从白噪声开始更快收敛),用 requires_grad_(True) 标记需要梯度。
  2. 前向传播:把内容图、风格图、生成图分别过一遍 VGG,取出对应层的特征。
  3. 计算损失:内容损失在 conv4_2 算,风格损失在 conv1_1~conv5_1 算。
  4. 反向传播 + 更新:对总损失关于像素值做梯度下降(不是更新网络权重!),用 Adam 或 L-BFGS 优化器。L-BFGS 是拟牛顿法的一种,在 Gatys 原文中被使用,因为这种低维但损失景观复杂的优化问题上 L-BFGS 往往比 Adam 收敛更快更稳。
  5. 迭代:几百到几千步后,图像逐渐”长”成既有内容图轮廓、又有风格图纹理的样子。

这就是 Gatys et al. 2015 的开创性工作。每张图需要从头优化几分钟,无法实时使用——这催生了快速风格迁移。

4. 快速风格迁移(Fast Neural Style)

Section titled “4. 快速风格迁移(Fast Neural Style)”

逐图像优化太慢(每张图要跑几分钟)。Johnson et al. 2016 的改进:训练一个前向网络(一个 3 层下采样 + 5 个残差块 + 3 层上采样的卷积网络,又称 transform net),输入任意内容图,直接输出风格化结果。

训练时的损失设计——感知损失(Perceptual Loss):transform net 的输出不再直接和 ground truth 比像素,而是过一遍冻结的 VGG,在特征空间上算内容损失和风格损失。这等价于把 Gatys 的优化过程”蒸馏”进网络权重——训练时仍然需要跑 VGG 算感知损失,但推理时只需一次前向卷积,毫秒级出图。

Instance Normalization 的关键作用:Ulyanov et al. 2016 发现,把 Batch Normalization(批归一化,对一整批样本的同一通道做均值方差归一化)换成 Instance Normalization(实例归一化,对每个样本的每个通道独立做均值方差归一化),风格迁移质量大幅提升。直觉是:InstanceNorm 强制每个样本每个通道的均值和方差归一化为 0 和 1,相当于”抹掉内容图自带的亮度/对比度统计”,让网络更容易统一输出到风格图的目标统计分布上——这正好去除了内容图的”原画风”,给目标画风腾出空间。

AdaIN(Adaptive Instance Normalization):Huang & Belongie 2017 进一步提出,不用训练就能对任意新风格做实时迁移。核心思想是把内容图特征的均值方差直接替换成风格图特征的均值方差(而非归一化到 0/1),从而把内容的”骨架”保留、把风格的”统计皮肤”套上去。这是很多工业级实时风格化方案的基石。

Stable Diffusion 之后,主流做法转向利用预训练扩散模型强大的先验能力:

  • img2img + 风格提示词:给内容图加部分噪声再去噪,配合”oil painting style of…”之类的文本提示,改变画风同时保留大致结构。加噪的强度(denoising strength,0~1)控制风格化程度——值越高越像重画,值越低越像原图。
  • ControlNet 锁结构:用 ControlNet 从内容图提取边缘/深度/姿态等结构信息作为条件,扩散模型只改画风不改结构,可控性极强。
  • 风格 LoRA:用少量目标风格图片训练一个 LoRA(Low-Rank Adaptation,低秩适配——只训练少量参数的轻量微调方法),让基础模型稳定复现某种画风,推理时通过权重叠加控制风格浓度。
  • IP-Adapter:把风格图通过图像编码器编码为 embedding(向量表示),作为额外的交叉注意力(cross-attention,扩散模型中让文本/图像条件影响生成结果的核心机制)条件注入,无需训练即可实现参考图引导的风格化。

2024 年以来,风格迁移领域出现了几条明显的技术主线:

(a)零样本/任意风格的扩散风格化

  • StyleAligned (2024):在同一个 batch 里让内容图和风格图共享自注意力(self-attention)的 key/value,仅通过一条额外的注意力分支就能让生成图对齐到风格图的统计——几乎零额外计算量,即插即用。
  • InstantStyle (2024):基于 IP-Adapter 改进,只把风格 embedding 注入到特定的网络层(只影响风格、不干扰内容),解决了早期 IP-Adapter”风格和内容会互相污染”的问题,对任意新风格零样本效果好。
  • DreamStyler:用文本反转(textual inversion)的思路,把风格图学成几个可训练的 token embedding,与提示词拼接后控制风格。

(b)从 UNet 到 DiT / FLUX 的架构迁移

2024 年发布的 FLUX.1(Black Forest Labs,Stable Diffusion 原班人马)采用了纯 Transformer(DiT,Diffusion Transformer)主干而非 UNet,参数量达 12B,图像质量和文本理解大幅提升。FLUX 的出现让风格化工作流开始向新主干迁移:FLUX + 风格 LoRA、FLUX + ControlNet、FLUX Redux(图像条件变体)等组合成为 2024 下半年至 2025 年的新主流。DiT 架构的好处是缩放律(scaling law,模型越大效果越好)更清晰,且自注意力的全局感受野天然适合”风格”这种全局属性。

(c)视频风格化与时序一致性

  • 给单帧做风格迁移早已不是问题,但给视频做风格化最大的挑战是时序抖动(temporal flicker)——每帧独立风格化后,帧间的颜色、纹理跳变会让画面闪烁。
  • 2024-2025 的方案多基于”跨帧注意力”(cross-frame attention,让相邻帧共享注意力结果以保持一致)或光流引导(optical flow,用帧间运动信息约束风格化结果的连续性)。
  • AnimateDiff、EbSynth + Stable Diffusion、以及基于 SVD(Stable Video Diffusion)的风格化管线是目前的主流选择。

(d)基于流匹配(Flow Matching)的新范式

2024 年起,部分新一代生成模型(如 SD3、FLUX)从传统的 DDPM 去噪范式转向流匹配(Flow Matching / Rectified Flow)。流匹配把生成过程建模为从噪声到数据的连续概率路径,训练目标是学习这条路径的速度场(velocity field)。在风格迁移语境下,流匹配的训练更稳定、路径更直(步数更少),让风格化管线在更少采样步数下就能获得高质量结果。

快速风格迁移(Fast Neural Style)训练架构

Section titled “快速风格迁移(Fast Neural Style)训练架构”

PyTorch:用 VGG 特征做神经风格迁移

Section titled “PyTorch:用 VGG 特征做神经风格迁移”
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import models, transforms
# 用预训练 VGG19 的卷积部分作为特征提取器
vgg = models.vgg19(weights=models.VGG19_Weights.DEFAULT).features.eval()
for p in vgg.parameters():
p.requires_grad_(False) # VGG 权重冻结,只优化生成图
# 内容图和风格图(这里用随机张量示意,实际换成你的图片)
content = torch.randn(1, 3, 256, 256)
style = torch.randn(1, 3, 256, 256)
gen = content.clone().requires_grad_(True) # 生成图初始=内容图
def gram(x): # 计算 Gram 矩阵:通道间相关性,抹掉空间位置
b, c, h, w = x.shape
x = x.view(c, h * w)
return x @ x.t() / (c * h * w)
opt = torch.optim.Adam([gen], lr=0.02)
for step in range(300):
opt.zero_grad()
# 取某一层特征算内容损失,风格损失类似(实际多层加权)
fc = vgg[:8](content); fg = vgg[:8](gen)
lc = F.mse_loss(fg, fc) # 内容损失
gs = gram(vgg[:4](style)); gg = gram(vgg[:4](gen))
ls = F.mse_loss(gg, gs) # 风格损失
loss = lc + 100 * ls # alpha 控制风格强度
loss.backward(); opt.step()
print(f"最终损失: {loss.item():.4f}") # 损失下降即说明风格在迁移

代码解读:vgg[:8] 取 VGG 前 8 层(到 conv2_2 附近)算内容特征,vgg[:4] 取前 4 层(conv1_2 附近)算风格特征——实际项目中建议多层加权(见下方改进版)。gram() 函数把 (C, H×W) 的 reshape 后做矩阵乘法得到 C×C 的 Gram 矩阵,除以元素数防止层越深、特征图越大时数值爆炸。gen 是唯一需要梯度的变量,Adam 优化器直接对像素值做梯度下降。

PyTorch:多层风格损失改进版(更接近工业实践)

Section titled “PyTorch:多层风格损失改进版(更接近工业实践)”
# 更接近实际项目的多层风格迁移:内容层 + 5 层风格层
STYLE_LAYERS = [0, 5, 10, 19, 28] # conv1_1, conv2_1, conv3_1, conv4_1, conv5_1
CONTENT_LAYER = 21 # conv4_2
def extract_features(x, model, layers):
"""逐层前向,返回指定层的特征字典"""
feats = {}
for i, layer in enumerate(model):
x = layer(x)
if i in layers:
feats[i] = x
return feats
def total_variation_loss(img):
"""TV 正则化:惩罚相邻像素差异过大,让结果更平滑、减少高频噪点"""
tv_h = F.mse_loss(img[:, :, 1:, :], img[:, :, :-1, :])
tv_w = F.mse_loss(img[:, :, :, 1:], img[:, :, :, :-1])
return tv_h + tv_w
# 训练循环中加入 TV 损失
# loss = content_loss + alpha * style_loss + gamma * tv_loss
# gamma 典型值 1e-6,作用是让输出更干净、少颗粒感

现代:用 diffusers + img2img 做扩散风格化

Section titled “现代:用 diffusers + img2img 做扩散风格化”
# pip install diffusers transformers accelerate
import torch
from diffusers import StableDiffusionImg2ImgPipeline
pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
torch_dtype=torch.float16,
).to("cuda")
# init_image 是 PIL.Image 格式的内容图;strength 越高越像重画
prompt = "oil painting in the style of Van Gogh, thick brush strokes, vibrant colors"
result = pipe(
prompt=prompt,
image=init_image, # 内容图
strength=0.6, # 0~1,控制风格化程度
guidance_scale=7.5, # CFG,越高越遵循提示词
num_inference_steps=30,
).images[0]

参数解读:strength=0.6 表示给内容图加 60% 的噪声再去噪——值越高原图结构保留越少。guidance_scale(CFG,Classifier-Free Guidance)是控制模型”多听从提示词”的旋钮,值越高风格越浓但可能过度饱和。如需更强的结构保留,可叠加 ControlNet 的 Canny/Depth 条件。

  • 内容层和风格层的选择很关键:内容层选太浅会”画得不像原图”(浅层特征太偏像素级),选太深又”太死板”(深层特征过于语义化);风格层通常取多层(conv1_1 到 conv5_1)的组合,浅层抓笔触、深层抓配色结构。
  • alpha/beta 权重比决定画风浓度:beta 是内容权重,alpha 是风格权重。风格太弱像滤镜,太强则内容认不出来——多试几个比例。Gatys 原文用 1:1000 量级,但具体数值依赖 Gram 矩阵的归一化方式。
  • 先做颜色匹配再做迁移:把内容图的色调直方图(color histogram,图像各颜色通道的分布统计)对齐到风格图,能避免结果颜色发灰,是工业级流水线的小技巧。
  • 加 TV 正则化减少噪点:Total Variation 损失惩罚相邻像素差异过大,能让 Gatys 方法的结果更干净、少高频颗粒——工业实现几乎都加上。
  • 推理速度看场景:单张精修用 Gatys 优化法(慢但质量高);App 实时处理用前向网络(Fast Neural Style / AdaIN)或扩散 img2img(快)。
  • 现代首选是扩散 + LoRA 或 IP-Adapter:要稳定复现某画师风格,训练一个风格 LoRA 比 Gatys 优化快得多,效果也更好;要零样本试新风格,用 IP-Adapter / InstantStyle 更灵活。
  • FLUX 已成为 2024-2025 的新主力:如果项目可以接受更大的模型体积,FLUX.1 [dev] + 风格 LoRA 的组合在画风多样性和细节质量上已超过 SD 1.5/SDXL 体系,社区生态(CivitAI 上的 FLUX LoRA)也在快速成熟。
  • 视频风格化务必处理时序一致性:逐帧独立做风格化会产生闪烁;用 AnimateDiff、跨帧注意力或光流约束来保证帧间连续性。
  • 手机摄影滤镜:Prisma、美图秀秀的”名画滤镜”——用户上传照片秒变梵高/浮世绘风格,背后多是快速风格迁移前向网络(Fast Neural Style + InstanceNorm/AdaIN)。
  • 影视与游戏美术:把实拍素材一键风格化为动画/油画质感,降低美术成本;如《蜘蛛侠:平行宇宙》风格的批量处理。2024 年起,基于扩散模型的视频风格化管线开始进入影视后期工具链。
  • 头像与社交:微信、抖音的”AI 漫画脸""油画脸”特效,多数基于扩散模型 img2img + 风格化提示词或 IP-Adapter。详见图像编辑。
  • 建筑与室内设计:把线稿或实景图渲染成水彩、马克笔、不同建筑流派的效果图,用于方案汇报。配合 ControlNet 的线稿/深度条件可以精确保留建筑结构。
  • 教育与可视化:把科学图像风格化为儿童插画风格,用于科普读物生成。
  • 电商与广告(2024-2025 新增):把商品实拍图统一风格化为品牌调性一致的营销图,用 FLUX + 品牌 LoRA 批量生产,大幅降低拍摄和修图成本。
  • 短视频与直播实时风格化(2024-2025 新增):基于 AdaIN 或轻量扩散蒸馏模型的实时风格化,已进入直播美颜和短视频特效管线,支持”实时油画风直播间”等玩法。
类库语言说明
torchvision.modelsPython提供 VGG/AlexNet 预训练权重,是神经风格迁移的基础特征提取器
pystichePython专为神经风格迁移设计的高级库,内置多种损失和多层选择策略
fast-neural-stylePythonJohnson 等人的快速风格迁移 PyTorch 参考实现
diffusersPythonHuggingFace 扩散模型库,用 img2img + LoRA / IP-Adapter 做现代风格化,2024-2025 已支持 FLUX、SD3 等新主干
ComfyUIPython/节点基于节点的 Stable Diffusion 工作流工具,风格化流水线可视化搭建;FLUX 风格化工作流生态最完善。详见ComfyUI 工作流
InstantStylePython基于 IP-Adapter 的零样本任意风格迁移方案,2024 年开源,可直接集成进 diffusers
AnimateDiffPython视频风格化与动画生成框架,解决风格迁移的时序一致性问题
术语英文解释
风格迁移Style Transfer把一张图的内容保留、套上另一张图的画风,生成”某风格的内容图”
内容损失Content Loss生成图与内容图在某层特征上的差,保证”画的是同一个东西”
风格损失Style Loss生成图与风格图 Gram 矩阵的差,保证”用同样的画风”
Gram 矩阵Gram Matrix特征通道两两相关性的方阵,抹掉空间位置、只保留纹理统计
感知损失Perceptual Loss在预训练网络的特征空间(而非像素空间)计算损失,更符合人眼感知;快速风格迁移用它做训练监督
实例归一化Instance Normalization (IN)对每个样本每个通道独立做均值方差归一化,抹掉内容图原始亮度/对比度统计,是风格化网络的标配
自适应实例归一化AdaIN把内容特征的均值方差替换成风格特征的均值方差,无需训练即可实时任意风格迁移
快速风格迁移Fast Neural Style训练一个前向网络一次学好风格,推理时毫秒级出图
图生图img2img扩散模型以一张图加噪声为起点再去噪,用于改风格或编辑
风格 LoRAStyle LoRA用少量风格图微调出的小模块,让基础模型稳定复现某种画风
IP-AdapterImage Prompt Adapter把参考图编码为 embedding 注入扩散模型的交叉注意力,零样本引导生成结果的风格/内容
流匹配Flow Matching / Rectified Flow用连续概率路径替代传统去噪过程的生成范式,训练更稳、路径更直,SD3/FLUX 等新一代模型采用
交叉注意力Cross-Attention让文本/图像条件影响生成结果的核心机制,也是 IP-Adapter 注入风格条件的通道
时序一致性Temporal Consistency视频风格化中相邻帧风格化结果不闪烁、连续过渡的性质
  • Gatys, Ecker & Bethge, “A Neural Algorithm of Artistic Style” (2015):神经风格迁移的开山之作,首次用 CNN 特征 + Gram 矩阵分离内容与风格,引发全网”AI 作画”热潮。
  • Johnson, Alahi & Fei-Fei, “Perceptual Losses for Real-Time Style Transfer” (ECCV 2016):快速风格迁移论文,用前向网络 + 感知损失把推理速度从分钟级降到毫秒级,让风格迁移走进手机。
  • Ulyanov et al., “Instance Normalization: The Missing Ingredient for Fast Stylization” (2016):发现 InstanceNorm 对风格迁移效果提升巨大,至今仍是风格化网络的标配。
  • Huang & Belongie, “Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization” (ICCV 2017):AdaIN 方法,无需重训即可对任意新风格做实时迁移,是很多工业方案的基础。
  • Ye et al., “IP-Adapter: Text Compatible Image Prompt Adapter for Text-to-Image Diffusion Models” (2023):图像条件适配器,把参考图注入扩散模型,成为零样本风格化的事实标准之一。
  • Hwang et al., “StyleAligned: Image and Video Style Alignment with Feed-Forward Diffusion” (2024):通过共享自注意力实现零额外成本的批量风格对齐,是 2024 年最具影响力的风格化方法之一。
  • Wang et al., “InstantStyle: Free Lunch towards Style-Preserving in Text-to-Image Generation” (2024):基于 IP-Adapter 的改进,精准分离风格与内容,零样本任意风格效果好。
  • Esser et al., “Scaling Rectified Flow Transformers for High-Resolution Image Synthesis” (SD3 / Rectified Flow, 2024):Stable Diffusion 3 的技术报告,引入流匹配 + DiT 架构,代表了扩散风格化底层主干的新方向。FLUX.1 同样基于此范式。