Mage-Flow 出图糊成一片 / 是提示词没写清还是推理步数不够?

文章导读
同一段提示词反复出图都糊,通常不是单一原因造成的。把「糊」当成四个互相独立的环节来看会更省事:采样步数不够、提示词信息密度不足、输入在文本编码前被截断、输出分辨率或解码环节被默认值覆盖。要判断到底是文字没写清还是步数不够,最直接的做法是做控制变量对照——固定种子和提示词只改步数,固定步数只替换提示词里的一层,同时把真正送进文本编码的长度和实际输出尺寸打印出来,最后用中间结果确认细节是在生成阶段就丢
📋 目录
  1. Ⅰ 固定种子只改步数,看画质在哪一档之后趋于稳定
  2. Ⅱ 把提示词拆成主体、风格、细节三层分别替换
  3. Ⅲ 在脚本里打印真正送进文本编码的输入长度和输出尺寸
  4. Ⅳ 用中间结果判断细节丢在生成阶段还是解码阶段
A A

同一段提示词反复出图都糊,通常不是单一原因造成的。把「糊」当成四个互相独立的环节来看会更省事:采样步数不够、提示词信息密度不足、输入在文本编码前被截断、输出分辨率或解码环节被默认值覆盖。要判断到底是文字没写清还是步数不够,最直接的做法是做控制变量对照——固定种子和提示词只改步数,固定步数只替换提示词里的一层,同时把真正送进文本编码的长度和实际输出尺寸打印出来,最后用中间结果确认细节是在生成阶段就丢了,还是解码阶段被抹掉的。跳过其中任何一步,都容易出现改了半天文字、问题其实在参数的情况。

适用场景:同一提示词连续出图发糊、小物体粘连成片、边缘发虚。操作动作:先固定种子与提示词只改采样步数并记录参数;再把提示词拆成主体、风格、细节三层单层替换;同时打印送入文本编码的实际长度与实际输出尺寸;必要时保存最后一步中间张量单独解码对比。验证方式:每一步都留下参数与图的对应记录,用同一视角目测。风险边界:若所用模型本身分辨率上限较低、或解码器是轻量版本,调步数只能改善收敛,补不回没有生成出来的细节。

固定种子只改步数,看画质在哪一档之后趋于稳定

采样步数不足是最常见也最容易排除的原因。做法是把种子、提示词、引导系数、分辨率全部锁死,只让推理步数取三档,例如偏低、居中、偏高三个值,其余参数一个字不改。下面是一段通用骨架,函数名和参数名按你实际使用的库替换即可,重点是循环体内除步数外不要有任何变化。

import torch

SEED = 12345
PROMPT = "一段固定的提示词,三次实验保持完全一致"
GUIDANCE = 3.5
W, H = 1024, 1024
STEPS = [12, 24, 40]   # 三档,跨度拉开一点更容易看出拐点

for s in STEPS:
    g = torch.Generator(device="cuda").manual_seed(SEED)
    image = pipe(
        prompt=PROMPT,
        num_inference_steps=s,   # 唯一变量
        guidance_scale=GUIDANCE,
        width=W, height=H,
        generator=g,
    ).images[0]
    image.save(f"out/steps{s}_seed{SEED}_g{GUIDANCE}_{W}x{H}.png")
    print("saved", s, image.size)

出图后不要凭印象说「好一点」,把参数和图对应成表,逐张看轮廓、边缘过渡、小纹理和画面里的细小文字这几处:

文件名步数引导系数分辨率种子轮廓/边缘小纹理与小字备注
steps12_...123.51024x102412345
steps24_...243.51024x102412345
steps40_...403.51024x102412345

判读方式:如果从低档到中档有肉眼可见的收敛改善,而中档到高档几乎看不出差别,说明在当前模型和引导系数下,中档附近已经进入稳定区间,继续加步数收益有限,糊的原因要往别处找;如果三档都糊且差别很小,基本可以先把步数这个嫌疑排除掉。需要提醒的是,引导系数偏高时增加步数也可能加剧过曝和边缘硬化,所以引导系数不要在这一轮里跟着改。

把提示词拆成主体、风格、细节三层分别替换

确认步数不是主因后,再判断是描述信息不足,还是模型没接住描述。把提示词按三层写,每层单独成行,先固定另外两层只替换一层,看画面哪部分发生了变化:

Mage-Flow 出图糊成一片 / 是提示词没写清还是推理步数不够?
主体层:一位穿深灰工装外套的中年男性,坐在靠窗的木桌前,手里握着一支笔
风格层:纪实摄影,自然侧光,浅景深,柔和对比,整体色调偏冷
细节层:外套袖口有磨损毛边,桌面有细木纹,窗玻璃上有雨点痕迹,笔尖有金属反光

替换时的记录方式建议按「版本 - 改动层 - 改动内容 - 画面结构是否变化 - 目标细节是否出现 - 整体清晰度是否变化」六列记,一次只填一行。经验上可以这样判断:只替换细节层时目标细节出现或消失、而整体构图基本不动,说明模型能接住这一层的描述,之前的糊更可能是细节描述缺失,而不是参数问题;只替换主体层时构图大变但清晰度没有变化,说明主体描述不是糊的主因;三层都写得比较具体仍然糊,就要怀疑提示词在进入编码器前已经被截断,或者细节超出了当前分辨率能承载的信息量,这时继续堆形容词往往无效。

另外,中文提示词在不同分词器下的切分粒度差别较大,同样的意思,有的写法会占用明显更多的 token。如果模型对中文描述响应一般,可以先保持主体层用中文、把风格层和细节层换成更短的短语来对比一次,看清晰度是否随表述长度变化。

在脚本里打印真正送进文本编码的输入长度和输出尺寸

提示词被截断和分辨率被默认值覆盖这两件事都不会报错,只会安静地让画面变糊,所以要在编码前和解码后各打印一次。下面是需要插入打印语句的位置,具体字段名按你的库调整:

Mage-Flow 出图糊成一片 / 是提示词没写清还是推理步数不够?
# 1) 编码前,看原始提示词有多长、分词器上限是多少
raw = tokenizer(PROMPT, truncation=False)
print("原始 token 数:", len(raw["input_ids"]), "上限:", tokenizer.model_max_length)

# 2) 编码后,看真正送进模型的长度(这里才体现截断)
enc = tokenizer(PROMPT, truncation=True, max_length=tokenizer.model_max_length)
print("实际送入 token 数:", len(enc["input_ids"]))

# 3) 生成后,看实际输出尺寸,注意 PIL 是 (宽, 高)
print("实际输出尺寸:", image.size, "期望:", (W, H))

两处数字和期望不一致时,按这个顺序查:一,pipeline 是否还有独立的文本长度参数(例如 max_sequence_length 之类),它和 tokenizer 的上限不是同一个值;二,提示词模板里是否自动拼接了质量词、触发词或负向提示,占掉了本就不多的长度配额;三,宽高是否被强制对齐到 VAE 下采样倍数,非整数倍通常会被向下取整,尺寸变小后细节自然变糊;四,配置文件中是否有默认分辨率覆盖了调用时传的值;五,是否有多余的 webui 或服务端中间层改写了请求参数,这种情况要以中间层日志里的实际入参为准。打印结果建议随每张图一起落到日志里,便于回看。

用中间结果判断细节丢在生成阶段还是解码阶段

前面三步都排除后,就需要确认糊是发生在生成阶段还是解码阶段,这决定了你还要不要继续调采样参数。做法是在采样结束回调里保存最后一步的隐变量,然后用同一个解码器单独解一次,和 pipeline 直接输出的成图对比:

saved = {}

def cb(pipe, step, timestep, kwargs):
    saved["latents"] = kwargs["latents"].detach().clone()
    return kwargs

out = pipe(
    prompt=PROMPT,
    num_inference_steps=STEPS[-1],
    guidance_scale=GUIDANCE,
    width=W, height=H,
    generator=g,
    callback_on_step_end=cb,
)
out.images[0].save("out/final_pipeline.png")
torch.save(saved["latents"], "out/final_latent.pt")

# 单独解码,绕开 pipeline 里的后处理
with torch.no_grad():
    dec = pipe.vae.decode(saved["latents"] / pipe.vae.config.scaling_factor).sample
to_pil(dec)[0].save("out/decoded_from_latent.png")

对比标准要说清楚:中间隐变量直接解码出来的图分辨率只有原图的若干分之一,本身不适合评价纹理,所以要看的是轮廓、结构和小物体是否还在。如果从隐变量解码出来的图同样糊、小物体同样粘连,说明细节在生成阶段就没有被采样出来,继续调解码或换保存格式没有意义;如果隐变量解码后结构和小物体清楚,而 pipeline 输出的成图明显更糊,问题就落在解码之后,需要检查是否经过了缩放、重新编码为有损格式、颜色空间转换或锐化处理。保存对照图时统一用无损格式,避免把压缩损失误判成模型问题。

走完这四步,通常会得到一个明确归属:步数、提示词、输入长度、输出尺寸、生成阶段、解码阶段,其中哪一环出了问题。把每一步的参数和文件命名固定下来,下次遇到同类糊图就能直接复用这套对照,而不是从头改文字碰运气。