你可能会以为,AI 画图最难的是画得逼真。用久了你会发现,比“画得不像”更让人头疼的是“风格不统一”:让它画一只猫,很好看;画一艘飞船,也很好看;但两张图摆在一起,谁都不信它们出自同一个画师。

风格一致性,是 AI 绘画从“能出图”到“能干活”之间那道坎。给小说画封面、给游戏画立绘、给公众号配插图——图与图之间风格不统一,前面所有工作都得推翻重来。
我最早也天真地以为,在 prompt 里堆风格词就够了。直到我靠 Stable Diffusion 做了半年系列插画,才明白一件事:风格这个词,在扩散模型里不是一根线,而是一团乱麻。
为什么在 prompt 里写十遍 "watercolor" 也没用
一句话回答:因为扩散模型里没有一个叫“风格”的旋钮。
Stable Diffusion 这类模型生成图片,本质是从学过的“图像概率分布”里采样。prompt 先被文本编码器转成 token embedding,每一步去噪时,cross-attention 层让这些 embedding 影响噪声预测。
问题出在这:水彩、油画、赛博朋克这类词,在训练数据里跟成千上万张具体图片绑定过。模型只知道“大概长这样”,但“大概”太模糊了——同样是 watercolor,有的训练图是细笔薄涂,有的是重彩泼洒。模型学到的是“所有水彩画风格的平均值”,而不是某个画师的风格。
Google 在 2022 年的 Textual Inversion 论文 里点破过这个问题:文本空间里一个词的粒度,跟“特定画师的风格”这种高度细粒度的视觉属性,根本对不上。
就算你在 prompt 里写十遍 watercolor,也只是把这个“统计平均值”往同一个方向再拉一点。就像你在餐厅对着厨师喊十遍“多放盐”——他能做到的是更咸,不是变成你奶奶的手艺。
风格到底藏在模型的哪里
要理解解决方案,先要知道风格藏在哪。过去几年形成一个共识:在扩散模型里,风格主要分布在 U-Net 的 normalization 层和自注意力层。
normalization 层学的是每个通道的整体统计特征——色彩、明暗、对比度。这些正是人眼判断“画风”的第一手线索。自注意力层学的是“笔触与笔触之间的关系”——你总觉得“这像是手绘的而不是喷绘的”,靠的就是这种质感差异。
而 cross-attention 层(文本引导层)主要管内容:猫在哪、飞船在哪、物体什么形状。
这意味着什么?你依赖的 prompt 描述,恰好作用在最不管“笔触”的那一层。想让模型学会一种精确风格,本质上得调整权重层的分布。所以真正的解法只有三类:在文本侧学一个新词、在权重侧微调参数、在图像侧喂一张参考图。
三种主流方案,分别把风格锚在哪
把风格变成一个新词:Textual Inversion
既然现有词不够用,那就自己造一个。拿出 3-5 张风格统一的参考图,冻结模型所有权重,只训练一个独立的 embedding 向量。训练完,这个词进入词表,你在 prompt 里写上它,模型就往参考图的风格靠拢。
优点是数据需求少、训练快,普通消费级显卡几十分钟搞定。缺点是表达力有限——一个词能承载的信息就那么多。它能抓住“色调和大致调性”,但抓不住“每一笔都对”的质感。用它定调可以,用它复刻画师,不够。
Textual Inversion 到底在训练什么?
目标很简单:让模型看到新词时,生成过程尽量贴近参考图。做法是把参考图加噪再让模型去噪,算预测误差,反向传播——但只更新新词那一个 embedding 向量,其他参数全部冻结。
把风格写进权重:LoRA
LoRA(Low-Rank Adaptation)最初是 2021 年用来微调大语言模型的 方法,2022 年底被 Stable Diffusion 社区搬过来,如今是风格一致性最主流的手段。
原理一句话:冻结原始模型,在 attention 层旁边并接一条低秩旁路。训练时只更新旁路,生成时把旁路输出加回主路。低秩分解让旁路参数量只有原模型的百分之一左右,训练完保存成文件往往只有几十 MB。
风格 LoRA 一般需要 50-200 张统一风格的图。效果扎实,笔触、上色、线条处理都能抓住。但它有两个坑:
- 数据少时,风格和内容会绑在一起学。素材里总出现龙猫,训练出的 LoRA 可能画什么都像宫崎骏片场。
- 一个 LoRA 只能学一种画风。要十种画风就得训十个,这是一次性投资。
同期 Google 还提出过 DreamBooth,几张图就能微调整个模型,效果不错但模型文件太大,生态位基本被 LoRA 取代。
把参考图喂进模型:IP-Adapter
如果不想训练呢?腾讯 2023 年提出的 IP-Adapter 走另一条路:用 CLIP 图像编码器把参考图变成视觉特征,再通过一组专门的 cross-attention 注入 U-Net。
它跟 img2img 的区别在于:IP-Adapter 只注入“风格/构图提示”,不覆盖原有文本引导。你可以同时说“画一只猫”和“参考这张水彩”,内容与风格相对独立。
优势是零训练,给张图就能换风格。短板是内容泄漏——参考图里的动作、构图、物品会偶尔被一起抄过来。你要的是它的色调,它连构图一起给你搬来了。
三个方案怎么选
| 维度 | Textual Inversion | LoRA | IP-Adapter |
|---|---|---|---|
| 要多少图 | 3-5 张 | 50-200 张 | 0 张(1 张参考图) |
| 要训多久 | 几十分钟 | 数小时 | 不用训 |
| 风格还原度 | 弱,定个调性 | 强,贴近原画师 | 中,看参考图给不给力 |
| 内容泄漏 | 低 | 过拟合时会 | 较高 |
| 适合场景 | 出草稿、定方向 | 正式系列插画 | 试稿、快速换风 |
关于 seed、风格词堆叠和 img2img 的三个误解
固定 seed 就能统一风格?
不能。seed 只决定初始噪声。内容一变,去噪路径千差万别。它只能保证“同样 prompt、同样 seed”时随机细节一致,跨内容时完全帮不上忙。
风格词叠得越多,风格越强?
不会。叠太多词,每个风格的“统计平均值”互相拉扯,最后得到的是“平均值的平均值”——一种什么都是又什么都不是的廉价质感。
img2img 能不能保持风格?
它能保留参考图的结构和色彩,但改内容主体时,构图容易被锁死。你要的是“同一画师画一艘飞船”,img2img 会给你“同一张草图涂一艘飞船”。
我的真实经验:最优解是组合拳
讲完原理,说点实操。我最早以为“固定 seed + 固定 prompt 模板”就能统一风格,试了之后才知道这是个根本盲点:seed 只是初始噪声,内容一变,去噪路径完全不同。它保证不了风格。
- 先训一个 LoRA 定“笔触”。这是风格的骨干,管线条、上色、材质。
- 用 IP-Adapter 传一张参考图,把色调和光影方向补上。
- 把 prompt 写成固定模板:「风格词 + 画面主体 + 画质后缀」,每次只替换主体。
- LoRA 权重调到 0.7-0.9,不要拉满。拉满容易把内容一起锁死。
- 每个画面生成 8-10 张,挑风格最统一的。这一步不“智能”,但它是目前最可靠的质量保障。
这套流程让我从“十张图十个风格”,变成“十张图里八张像同一个画师”。剩下两张还是不行,但已经够用了。
当前方案的边界在哪
说点大实话。
第一,所有方案都依赖“足够的风格样本”。LoRA 需要 50-200 张,IP-Adapter 依赖参考图的质量。你手里只有一两张图想要抽出一个完整风格?目前没有好办法。
第二,风格和内容的解耦不彻底。学宫崎骏的 LoRA,通常会把“漂浮感、大场景、细腻背景”这些内容倾向一起学进去。风格从来不是单纯的“画法”,它跟创作者看世界的方式绑在一起。这一点,2015 年 Gatys 的神经风格迁移论文 就捅过娄子——用 Gram 矩阵分离“内容”和“风格”,结果换背景的时候连构图一起换了。
第三,风格本身是个开放概念。你可以说“这个插画师用了大量留白”,但“留白多少”没有一个数值坐标。这也是为什么现在没有“风格调节滑块”——因为还没人知道“风格”这个维度的轴应该怎么定。
未来我比较看好的方向,是把“风格”建模成独立的标识向量,像人脸 ID 那样在更高层的语义空间做风格对齐。目前这个方向还在论文阶段,离稳定使用有距离。
在那之前,想让 AI 画出“看起来像同一个插画师画的”十张图,最靠谱的办法仍然是:训练一个高质量的 LoRA,多画几张,然后挑。这很不浪漫,但它有效。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/698.html