CoTyle - 用一个数字码表示一类风格

一、背景:这篇论文想解决什么?

以前控制画风有几种办法:

  • 文字描述:写“赛博朋克、霓虹灯、雨天”,但同一种描述每次画出来风格不稳定。
  • 参考图:给一张风格图,让模型照着画,但只能模仿已有风格,不能创造新风格。
  • LoRA:给模型加个小补丁学风格,但分享麻烦,不能只用一个数字表示。
  • Midjourney 风格码:工业界有类似功能,但不公开技术细节。

所以 CoTyle 提出:
只给一个数字码,就能生成一种新风格,并且同一个数字码每次风格一致、可复现、可分享。

核心一句话:
一个数字码 = 一个风格控制器。


二、介绍:CoTyle 的整体框架

CoTyle 有三个主要组件:

组件 作用 比喻
编码器 + 码本 把图像变成离散索引 自动编一本“风格调料包编号表”
扩散模型 学会用风格嵌入画图 画师学会看调料包画画
自回归生成器 用数字码创造新索引序列 输入法根据种子编出一句话

整体流程:

  • 训练:先学码本,再教扩散模型,最后训练自回归生成器。
  • 推理:给数字码或参考图,查码本得到风格嵌入,扩散模型画图。

三、训练各阶段

阶段 1:训练风格码本

输入

  • 一堆图像对,每对两张图,标注“同风格”或“不同风格”。

输出

  • 一个码本:1024 个格子,每个格子是一个 64 维向量。
  • 一个编码器:把 ViT 的高维特征压到 64 维。

过程

  1. 每张图过 ViT,切成 14×14=196 个 patch,每个 patch 得到一个高维向量。
  2. 每个 patch 过编码器,压成 64 维向量。
  3. 拿这个 64 维向量去码本里找最近的格子,得到索引,比如 88。
  4. 用对比损失:同风格的图,索引应该靠近;不同风格的图,索引应该远离。
  5. 加重建损失和 VQ 损失,防止码本塌缩。

为什么要有这个过程?

因为后面要用“离散索引”来表示风格,而离散索引方便自回归模型做 next-token prediction。
同时,量化过程能压制内容信息,让码本更关注风格。

推理阶段有啥用?

推理时,索引查码本,变成 64 维风格向量。
比喻:码本像一本调料包编号表,索引是编号,向量是调料包内容。


阶段 2:训练扩散模型(T2I-DM)

输入

  • 一对同风格图 (x_1, x_2)。
  • (x_1) 用来提风格,(x_2) 的文本提示 (y_2) 当条件。
  • 目标图是 (x_2)。

输出

  • 一个会“看风格嵌入画画”的扩散模型。

过程

  1. (x_1) 过 ViT + 编码器 + 码本,得到 196 个索引。
  2. 索引查码本,得到 196 个 64 维向量,组成风格嵌入。
  3. 风格嵌入当作“文本输入”,通过文本分支注入 DiT。
  4. 同时输入 (x_2) 的文本提示。
  5. 扩散模型学习:给定风格嵌入 + 文本,生成 (x_2)。
  6. 用 rectified flow matching 训练。

为什么要有这个过程?

因为扩散模型原本只认识文字,不认识“风格嵌入”。
这一步是教它:风格嵌入 + 文字 → 图像。

推理阶段有啥用?

推理时,拿到风格嵌入后,扩散模型就能画出对应风格的图。
比喻:画师学会看调料包编号,知道 88 号是水墨、200 号是油画,然后按文字要求画猫画狗。


阶段 3:训练自回归风格生成器

输入

  • 每张训练图的 196 个索引序列,比如 [88, 200, 501, ...]。

输出

  • 一个自回归模型,能根据前几个索引预测下一个。

过程

  1. 所有训练图过 ViT + 编码器 + 码本,得到各自的 196 个索引。
  2. 把这些索引序列当成“句子”。
  3. 训练自回归模型做 next-token prediction。
  4. 架构用 Qwen2-0.5B,但从零训练。

为什么要有这个过程?

因为推理时用户只给一个数字码,模型需要根据这个数字码“编”出一串新的 196 个索引。
自回归模型就是学索引序列的分布,从而能创造新序列。

推理阶段有啥用?

数字码当种子 → 自回归生成器生成 196 个索引 → 查码本 → 风格嵌入 → 扩散画图。
比喻:自回归模型像输入法,你给一个开头,它根据学过的语言规律,编出一整句话。


四、推理阶段

路线 A:数字码 → 创造新风格

输入

  • 数字码,比如 12345。
  • 文本提示,比如“一只猫”。

输出

  • 一张符合该风格和文本的图。

过程

  1. 用数字码固定随机种子。
  2. 随机采样第一个索引 (I_0)。
  3. 自回归生成器生成后面 195 个索引。
  4. 得到 196 个索引。
  5. 查码本,得到 196 个 64 维风格向量。
  6. 风格向量 + 文本提示一起喂给扩散模型。
  7. 扩散模型从噪声出发,生成图像。

比喻

数字码像种子,种下去长出的树品种固定;
但每次浇水阳光不同,所以具体形状可能略有不同。
风格一致,细节可变化。


路线 B:参考图 → 模仿已有风格

输入

  • 参考图。
  • 文本提示。

输出

  • 一张风格像参考图、内容听文本的图。

过程

  1. 参考图过 ViT,得到 196 个 token。
  2. 每个 token 过编码器,压成 64 维。
  3. 去码本找最近格子,得到 196 个索引。
  4. 查码本,得到风格嵌入。
  5. 风格嵌入 + 文本提示喂给扩散模型。
  6. 扩散模型生成图像。

比喻

你拿一张水墨画当参考,码本帮你查出“水墨调料包”,画师照着这个调料包画新内容。
只能模仿,不能创造新风格。


五、你之前分不清的点

1. 码本、索引、向量、风格嵌入的区别

概念 是什么 比喻
码本 1024 个格子的表,每格一个 64 维向量 调料包编号表
索引 格子的编号,只是名字 88 号
向量 编号对应的 64 维数字串 调料包内容
风格嵌入 196 个索引查码本得到的 196 个 64 维向量序列 196 包调料合在一起

关键:
索引不能直接和向量比,比较发生在 64 维向量之间。
ViT 输出维度高,编码器先压到 64 维,再和码本格子比。


2. 为什么是 196 个索引?

图像被切成 14×14 = 196 个 patch。
每个 patch 量化成一个索引。
所以一张图有 196 个索引,不是 1 个。

常见混淆:

  • 训练第三步输入是 196 个索引序列,不是原始图像。
  • 推理路线 A 输入是一个数字码。
  • 推理路线 B 输入是一张参考图。

3. 数字码 = 随机种子

  • 相同数字码 → 相同随机种子 → 相同 196 个索引 → 相同 196×64 风格嵌入。
    ✅ 风格嵌入完全一样。
  • 最终图像不一定完全一样,因为扩散模型还有随机噪声。
  • 想完全复现同一张图,需要把扩散的随机种子也固定。

比喻:
数字码是种子,决定树种;扩散噪声决定每棵树的具体形状。


4. 谁负责创造?谁负责映射?谁负责画图?

组件 作用
编码器 + 码本 图像 ↔ 索引,索引 ↔ 向量
自回归生成器 数字码 → 新索引序列(创造)
扩散模型 风格嵌入 + 文本 → 图像

关键澄清:

  • 数字码和风格的对应,是自回归生成器在推理时建立的。
  • 码本只负责查表。
  • 扩散模型用的是风格嵌入,不是数字码。

5. 监督方式:不是纯无监督

  • 不需要人工标“水墨风”“油画风”。
  • 但需要:
    • 同风格图像对(弱监督);
    • 文本-图像对(训练扩散);
    • 索引序列(自监督训练自回归)。
  • 准确说法:弱监督 + 自监督,不是完全无监督。
  • 图像本身可以当监督信号,但需要粗粒度分组/配对关系。

6. ViT 是 CLIP 里的那个模块吗?

  • CLIP 有两个部分:ViT 是“眼睛”,文本编码器是“嘴巴”。
  • ViT 可以单独拿出来用。
  • CoTyle 用 ViT 提图像特征,再用编码器压到 64 维,去码本找索引。

7. 数字码和风格没有预先对应表

  • 用户不是输入“水墨风”然后自动得到 12345。
  • 用户先给数字,试出风格,喜欢就记住。
  • 想要特定风格,可以给参考图,走路线 B。
  • 目前没有“水墨风 = 12345”的字典,这正是可以创新的方向。

六、一句话总结

训练:先学码本把图像变索引,再教扩散模型看风格嵌入画图,最后训自回归模型学索引序列分布。
推理:数字码当种子 → 自回归编索引 → 查码本 → 风格嵌入 → 扩散画图;或参考图直接提索引 → 查码本 → 扩散画图。
核心:一个数字码就是风格控制器,同一码风格一致,但图像细节可因噪声不同。

posted @ 2026-10-23 22:38  来杯whiskey  阅读(6)  评论(0)    收藏  举报