1. 前言
前面我们一直在学习计算机视觉中的"识别型任务",例如:
-
图像分类
-
目标检测
-
语义分割
这些任务的核心都是:
让模型理解图像里有什么。
但深度学习不仅能"看懂图像",还能"生成图像风格效果"。
其中一个非常经典、也非常有趣的任务就是:
样式迁移(Style Transfer)
样式迁移的目标不是识别图像类别,而是:
把一张图的内容,与另一张图的风格融合起来,生成一张新的图像。
比如:
-
保留一张照片中的人物、建筑、景物结构
-
同时让它呈现梵高油画、素描、水彩等艺术风格
这就是样式迁移的魅力所在。
2. 什么是样式迁移
样式迁移可以简单理解为:
内容来自一张图,风格来自另一张图,最终生成一张兼具两者特点的新图像。
这里通常会涉及三张图:
2.1 内容图(Content Image)
内容图决定:
-
图中主要物体是什么
-
空间布局怎样
-
结构轮廓如何
例如一张城市照片、一张猫的图片、一张人物照片。
2.2 样式图(Style Image)
样式图决定:
-
颜色风格
-
笔触纹理
-
艺术表现形式
例如油画、水墨画、卡通风格图片。
2.3 生成图(Generated Image)
生成图是最终优化出来的结果。
它希望做到:
-
在内容上接近内容图
-
在风格上接近样式图
所以样式迁移本质上是在求一张"折中"的图。
3. 样式迁移和前面视觉任务的区别
这一点很重要。
3.1 前面的任务
前面的图像分类、检测、分割,本质上都在做:
从图像中提取语义信息
输出通常是:
-
类别
-
边界框
-
分割图
3.2 样式迁移
样式迁移不是在输出类别标签,而是在:
直接优化图像本身
也就是说,模型最终不是告诉你"这是什么",
而是直接生成一张新的图片。
所以,样式迁移更偏向于:
-
图像生成
-
图像优化
-
视觉风格表达
4. 样式迁移最核心的问题是什么
样式迁移最关键的问题是:
什么叫"内容"?什么叫"风格"?
如果这两个概念说不清,样式迁移就无从下手。
深度学习里的一个重要发现是:
-
卷积神经网络的不同层,会提取不同层次的图像特征
-
较深层特征更偏向语义内容
-
较浅层或统计特征更能体现纹理与风格
于是我们就可以借助预训练卷积网络来分别表示:
-
内容
-
风格
这正是样式迁移的理论基础。
5. 内容是什么
在样式迁移中,"内容"通常指的是:
图像中的高层语义结构和空间布局
例如一张城市照片,它的内容可能包括:
-
楼房在什么位置
-
道路怎样延伸
-
人物站在哪里
-
物体之间的大致关系
这些信息不太关心具体颜色和纹理,
而更关注"图中是什么、怎么摆放"。
在卷积网络中,较深层的特征往往更擅长表示这些内容信息。
6. 风格是什么
在样式迁移中,"风格"通常指的是:
图像的纹理、颜色分布、笔触模式、局部统计结构
例如一幅油画的风格可能表现为:
-
强烈的色彩对比
-
某种独特的笔触纹理
-
特定的局部纹理重复模式
这些信息不强调图中具体是猫还是狗,
而更强调"画面看起来像什么艺术风格"。
所以风格更像是一种:
-
纹理统计特征
-
视觉表现方式
7. 为什么卷积神经网络能做样式迁移
这其实是样式迁移里最漂亮的地方。
预训练卷积神经网络(例如 VGG)已经在大规模图像数据上学到了丰富特征。
而这些特征不是只有分类用途,它们本身就包含了大量关于图像结构和纹理的信息。
于是我们可以这样利用它:
对内容图
提取某些深层特征,作为内容表示。
对样式图
提取若干层特征,并计算它们的统计关系,作为风格表示。
对生成图
不断调整像素,让它的:
-
内容特征接近内容图
-
风格特征接近样式图
这就能完成样式迁移。
8. 样式迁移的基本思想
样式迁移的核心不是"训练一个新分类器",
而是:
把生成图当作优化变量,直接优化这张图。
也就是说,我们不是像平常那样训练模型参数,
而是固定一个预训练网络,然后不断更新生成图像本身。
这个过程大致可以分成三步:
第一步:准备内容图和样式图
这两张图分别提供内容目标和风格目标。
第二步:初始化一张生成图
可以随机初始化,也可以从内容图开始。
第三步:反复优化生成图
让它同时满足:
-
内容上接近内容图
-
风格上接近样式图
9. 内容损失是什么
为了让生成图保留内容图的结构信息,
我们需要定义一个"内容相似度"指标。
最常见的做法是:
比较生成图和内容图在某一深层特征图上的差异
如果记:
-
内容图特征为
P -
生成图特征为
F
那么内容损失通常可以理解为:
两者特征差距越小越好
也就是说:
-
生成图的深层表示要接近内容图
-
这样它的整体布局和主要语义就能保留下来
所以内容损失本质上是在约束:
不要把原图内容弄丢了
10. 风格损失是什么
风格比内容更抽象,不适合简单逐像素比较。
因为同样一种风格,可以出现在很多不同布局的图里。
所以样式迁移通常不是直接比较特征值本身,
而是比较特征之间的统计关系。
李沐这里常见的讲法是:
通过 Gram 矩阵来表示风格
11. 什么是 Gram 矩阵
Gram 矩阵可以简单理解为:
特征通道之间的相关性统计
假设某一层特征图有很多通道。
不同通道往往会响应不同类型的纹理、边缘、颜色模式。
如果我们去看:
-
哪些通道经常一起激活
-
它们之间相关性如何
就能得到一种比较稳定的"风格描述"。
这就是 Gram 矩阵的作用。
所以风格并不是"某个具体物体长什么样",
而更像是:
特征模式之间的整体统计关系
12. 为什么 Gram 矩阵适合表示风格
因为风格更多体现在:
-
纹理重复
-
局部图案
-
通道相关性
-
色彩与笔触统计
而不是某个像素必须精确出现在某个位置。
Gram 矩阵会弱化具体空间位置信息,
更强调整体纹理统计特征。
这刚好符合"风格"的定义。
所以在样式迁移中,常常会让生成图的 Gram 矩阵尽量接近样式图的 Gram 矩阵。
13. 总损失由哪些部分组成
样式迁移最终通常会同时考虑三种损失。
13.1 内容损失
保证生成图保留内容图的主要结构和语义。
13.2 风格损失
保证生成图呈现样式图的纹理、颜色和艺术风格。
13.3 总变差损失(可选)
用来让生成图更平滑,减少噪声和过度抖动。
所以总目标通常可以理解为:
内容损失 + 风格损失 + 平滑约束
不同损失项之间会有不同权重。
权重调节得不同,结果风格浓度也会不同。
14. 样式迁移的优化过程怎么理解
样式迁移最有意思的一点在于:
优化的对象不是网络参数,而是图像像素本身。
也就是说:
-
预训练网络参数固定不动
-
内容图和样式图固定不动
-
我们只不断修改生成图
每一步优化都会让生成图变得:
-
更像内容图的结构
-
更像样式图的风格
经过很多轮迭代后,最终得到融合结果。
所以样式迁移的过程,本质上是一种:
基于预训练特征空间的图像优化
15. 为什么样式迁移通常用 VGG 网络
在经典样式迁移中,常常用 VGG 这样的卷积网络。
原因主要有几点:
15.1 特征层次清晰
VGG 网络结构相对规整,容易提取不同层的特征。
15.2 在视觉表示上效果好
VGG 在 ImageNet 上训练后,学到的特征对内容和纹理都有较好表征能力。
15.3 便于取中间层
样式迁移需要比较多个中间层特征,VGG 非常方便做这件事。
所以它成了经典选择。
16. 样式迁移生成出来的图为什么"既像又不像"
这是一个很有意思的现象。
生成图通常会:
-
保留内容图的大致结构
-
却拥有样式图的颜色和纹理风格
所以你会觉得:
-
它"像"内容图,因为布局没丢
-
它"又不像"内容图,因为画风完全变了
这正是样式迁移追求的效果:
内容不丢,风格变了
17. 样式迁移的应用场景
虽然样式迁移最初很有艺术感,但它并不只是"好玩"。
它常见的应用包括:
17.1 艺术图像生成
把普通照片转换成油画、水彩、素描等艺术风格。
17.2 图像美化与创意设计
用于视觉海报、封面设计、照片滤镜生成等。
17.3 风格一致性处理
让一组图像保持统一画面风格。
17.4 作为生成模型思想启发
它对很多后续图像生成与特征解耦工作都有启发意义。
18. 样式迁移和生成对抗网络有什么不同
这部分可以顺带提一句,帮助读者区分。
样式迁移
通常是:
-
固定预训练特征提取网络
-
直接优化生成图
-
目标明确是融合某内容图和某风格图
GAN 等生成模型
通常是:
-
训练一个生成器
-
从随机噪声生成图像
-
学习整个数据分布
所以样式迁移更像是:
有目标约束的图像优化
而不是从零采样生成全新图像。
19. 李沐这一节的重点是什么
这一节主要不是推公式,而是帮助你建立以下认知:
第一,样式迁移有三张核心图像
-
内容图
-
样式图
-
生成图
第二,内容和风格可以通过深度特征分开表示
深层特征更偏内容,统计相关性更偏风格。
第三,生成图是通过优化得到的
不是直接一次前向传播"算出来"的。
第四,样式迁移是深度特征表示能力的一个漂亮应用
这说明 CNN 学到的特征不只是能做分类。
20. 本节总结
这一节我们初步认识了样式迁移,核心内容可以总结为以下几点。
20.1 样式迁移要融合内容和风格
生成图在内容上接近内容图,在风格上接近样式图。
20.2 内容通常由深层特征表示
它描述图像中的语义结构和空间布局。
20.3 风格通常由特征统计关系表示
特别是通过 Gram 矩阵来表示纹理和风格特征。
20.4 样式迁移通过优化生成图完成
固定预训练网络,不断更新生成图像本身。
20.5 它是深度学习视觉生成中的经典任务
既有理论美感,也有很强的可视化效果。
21. 学习感悟
样式迁移这一节很特别,因为它让人意识到:
深度学习不仅能"识别世界",还能"重构表达世界的方式"。
同样是一张图,
分类任务问的是"这是什么",
检测任务问的是"它在哪里",
分割任务问的是"每个像素是什么",
而样式迁移问的则是:
"能不能保留内容,但换一种艺术表达方式?"
这让深度学习从"理解图像"进一步走向了"生成图像"。