Neural Style Transfer
神经风格迁移通过匹配 CNN 特征统计量,将照片中的内容以另一张图像的风格重新绘制。内容涵盖 Gatys 的方法、快速模型和用途。
神经风格迁移(NST)是一种计算机视觉技术,它通过匹配预训练卷积神经网络(CNN)的内部特征,将一张图像(例如街景照片)的内容以另一张图像(例如绘画)的视觉风格呈现。特征图捕捉图像内容,由深层网络记录画面中各处出现的事物。风格则由特征通道之间的相关性捕捉,这些相关性记录纹理、颜色和笔触,但不保留它们的排列方式。图宾根大学的 Leon Gatys、Alexander Ecker 和 Matthias Bethge 于 2015 年 8 月在《艺术风格的神经算法》中介绍了这项方法;次年,Prisma 应用将其带给了智能手机用户。
原始方法的工作原理#
Gatys 的方法使用在 ImageNet 上训练的 VGG-19 CNN 作为固定的特征提取器,并改变输出图像的像素,而不是网络权重。两种损失函数共同决定结果:
- 内容损失: 输出图像与内容照片在一个深层(conv4_2)的特征图之间的平方差,可保留物体和布局的可辨识性。
- 风格损失: 从 conv1_1 到 conv5_1 五个层的 Gram 矩阵之间的平方差。对于有 C 个通道的层,Gram 矩阵是一个 C x C 表格,其条目 (i, j) 衡量通道 i 和 j 在整张图像各个位置上的共同响应强度之和。
两种损失的加权和通过 L-BFGS 优化算法最小化;反向传播则将梯度通过冻结的网络传回像素:
由于 Gram 矩阵会对所有位置求和,因此图像布局改变时,它几乎不会变化。使用 torchvision 的 ResNet-18(一个比 VGG-19 更小的 ImageNet CNN)交换照片象限,就能在 PyTorch中展示这一点:
import torch
from skimage import data
from torchvision.models import ResNet18_Weights, resnet18
weights = ResNet18_Weights.DEFAULT
cnn = resnet18(weights=weights).eval()
early_layers = torch.nn.Sequential(cnn.conv1, cnn.bn1, cnn.relu, cnn.maxpool, cnn.layer1)
preprocess = weights.transforms()
photo = torch.tensor(data.astronaut()).permute(2, 0, 1) # 3 x 512 x 512
rearranged = torch.roll(photo, shifts=(256, 256), dims=(1, 2)) # same pixels, quadrants swapped
def content_and_style(image):
"""Return an early CNN layer's feature map (content) and its Gram matrix (style)."""
with torch.no_grad():
features = early_layers(preprocess(image)[None])[0].flatten(1) # channels x positions
return features, features @ features.T / features.shape[1]
(content_a, style_a), (content_b, style_b) = content_and_style(photo), content_and_style(rearranged)
print(f"Content change: {(content_a - content_b).norm() / content_a.norm():.0%}")
print(f"Style change: {(style_a - style_b).norm() / style_a.norm():.0%}")交换象限会使特征图变化 96%,但只会使 Gram 矩阵变化 7%;剩下的 7% 来自新接缝和中心裁剪,因为中心裁剪会保留每张图像中不同的部分。这就是为什么风格损失能复制绘画的笔触和调色板,却不会复制画中物体的位置。
快速风格迁移与任意风格迁移#
优化每张图像都需要数百次迭代,因此后续研究将优化过程转移到了训练阶段。斯坦福大学的 Justin Johnson、Alexandre Alahi 和 Li Fei-Fei 于 2016 年使用相同的损失为每种风格训练一个前馈网络,生成结果的速度提高了约三个数量级,并将相同的感知损失应用于超分辨率。Dmitry Ulyanov 和同事发现,在这些网络中用实例归一化取代批量归一化可以提升风格化效果。Xun Huang 和 Serge Belongie 于 2017 年提出的自适应实例归一化(AdaIN)无需重新训练即可处理任意风格:它会调整每个内容特征通道的均值和标准差,使其与风格图像相匹配,再进行解码,整个过程可实时完成。
用于构建稳健视觉模型的风格迁移#
Robert Geirhos 和同事使用 AdaIN 证明,在 ImageNet 上训练的 CNN 更依赖纹理而非形状:一张具有象皮纹理的猫图会被 ResNet-50 标记为大象,这是捷径学习的一种表现。他们使用 Painter by Numbers 绘画集中的 79,434 幅作品,为每张 ImageNet 图像随机添加绘画风格,制作出 Stylized-ImageNet;在该数据集上训练的 ResNet-50 则更多依赖形状。将这个基于形状的网络用作 Faster R-CNN 目标检测模型的骨干网络后,Pascal VOC 2007 上的 mAP50 从 70.7 提升到 75.1,MS COCO 上则从 52.3 提升到 55.2。
同样的思路也可用于检测数据集的数据增强,因为风格迁移不会改变物体的位置。风格化后的标注图像副本可以沿用原图的边界框,因此在 Ultralytics YOLO26检测数据集中,只需在新图像名称下复制原始标签文件即可。
神经风格迁移与相关术语#
- 生成对抗网络(GAN): CycleGAN 学习整个图像集合之间的映射,例如照片与莫奈画作之间的映射,而不是匹配单张风格图像的统计特征。
- 迁移学习: 微调预训练权重以适应新任务。NST 从不更新网络权重,只用网络来衡量损失。
- 扩散模型: 根据文本提示或参考图像重新生成图像以改变其风格;这一过程也可能改变形状和细节。










