AI 图片属性串色:红帽子也把车染红了怎么办

一个主体的颜色或材质漏到另一个主体上。根因是注意力跨 token 渗漏。用权重、BREAK、分区提示词或 ControlNet 修。

你写 a woman in a red hat next to a blue car,结果一张图里女人戴红帽子、旁边的车也变红了。或者 a wooden chair and a metal table,两件家具全是木头。这就是”属性串色”,是 Stable Diffusion、SDXL、Flux 上最常见的失败模式之一。原因是文本编码器会把 token 含义在整段 Prompt 上做混合,结果颜色 “red” 漏到了附近的每个名词上。

修法有三条思路:用注意力权重把属性钉到对应主体上、用 BREAK 或分区提示词把主体放到独立的注意力区里、或者用 ControlNet / 分割图从空间上限制每个属性的作用范围。

常见原因

按命中率从高到低:

1. 主体在 Prompt 里距离太近

a red hat and a blue car 时,redhatbluecar 这几个 token 都在同一个 77-token CLIP 上下文里。cross-attention 没法稳定地区分哪个颜色绑哪个名词,SD 1.5 和 SDXL base 上尤其严重。先出现的属性往往会”赢”整张图。

如何判断:数一下 Prompt 里有几个主体。如果一句话里有 2 个以上主体且颜色 / 材质不同,几乎一定会串。

2. 没给绑定词加注意力权重

red hatred, hat 对模型来说不是一回事。没有权重加成,模型就只能取平均。

如何判断:Prompt 里没出现括号或权重符号。

3. Prompt 太长

超过 60-70 token,CLIP 开始压缩上下文,远端 token 的 attention 精度下降,串色更严重。

如何判断:把 Prompt 丢进 token 计数器。超过 60 就是问题。

4. 用 SDXL base 但没接 refiner

SDXL base 单跑比 base+refiner 更容易串色。refiner 在低 denoise 下会重新对齐 cross-attention,能修掉一部分串色。

如何判断:开/关 refiner 同 Prompt 对比,串色减轻就说明 refiner 不能少。

5. 没有空间约束

3 个以上不同主体的场景,光靠 Prompt 工程几乎不可能稳定分离。必须加空间约束(分区提示词或 ControlNet 分割图)。

如何判断:场景里有 3+ 主体,每个都有自己的颜色和材质。

最短修复路径

Step 1:给”属性 + 主体”加权重

SD 1.5 / SDXL / Forge / ComfyUI 都支持注意力权重。把每对”属性 + 主体”用括号包起来加权:

(red hat:1.3), woman wearing it, standing next to (blue car:1.3)

冒号-权重语法告诉 cross-attention 层把这两个 token 作为一个单位放大。权重 1.1-1.4 之间效果最稳,超过 1.5 会扭曲。

Step 2:用 BREAK 切开注意力区

SDXL 和 SD 1.5 的 webUI(Automatic1111、Forge、装了对应节点的 ComfyUI)都支持 BREAK,它会在段落之间清空注意力上下文:

(red hat:1.2), woman portrait, soft daylight
BREAK
(blue car:1.2), parked behind her, glossy paint

每个 BREAK 块拿到自己独立的 77-token attention 窗口,red 没法跨进来污染 car

Step 3:试 Attend-and-Excite 或分区 Prompt

更顽固的情况:

  • Attend-and-Excite(研究向插件):采样过程中强制 attention 必须关照特定 token
  • Regional Prompter 扩展(Automatic1111):在画面上画 mask 把”左半”和”右半”分配不同 Prompt
  • ComfyUI regional:用 Conditioning Combine + Conditioning Set Mask 把每段子 Prompt 限制在空间 mask 内

Regional Prompter 的左右分栏示例:

ADDCOMM
woman portrait, soft daylight
ADDBASE
(red hat:1.3), woman, urban street
ADDCOL
(blue car:1.3), parked, glossy paint

Step 4:硬场景上 ControlNet 分割图

主体必须固定在某些区域时:

  1. 在任意画图工具里随手画一张分割图(左边女人 = 粉色,右边车 = 绿色)
  2. seg 预处理器或 ADE20K 风格喂进 ControlNet
  3. ControlNet 权重 0.7-1.0
  4. 在分区 Prompt 基础上分别给每个分割区域写 Prompt

这样空间控制(每个主体在哪)和属性控制(每个主体长什么样)就同时锁住了。

Step 5:都不行时缩短 + 拆分

Prompt 超过 60 token 就砍。最顽固的串色,最干净的兜底是把场景分两次生成:

  1. 第一次用充足的 attention 预算只画第一个主体
  2. 第二次用 outpaint 或 inpaint 把第二个主体放进场景

每个主体都在自己独立的上下文里生成,串色问题被绕过。

预防建议

  • 任何含 2+ 不同颜色 / 材质主体的 Prompt,默认就上注意力权重
  • 核心 Prompt 控制在 60 token 内,风格词放到独立后缀
  • 把 Regional Prompter 的”左右主体分栏”存成 preset
  • 多 SKU 商品图:每个 SKU 单独出图,最后在 Photoshop / Affinity 里合成
  • 新 Prompt 在 4 个 seed 上各跑一遍;2 张以上串色就重构 Prompt,别死磕重 roll

相关阅读

标签: #ai-image #排查 #Prompt #attention