一张图来回改五六轮后颜色发灰、细节发糊,通常是两件事叠在一起:一是每次导出都要重新编码和调色,二是把上一轮输出当成下一轮输入时,误差会一层压一层。要分清是哪一种,最直接的做法是固定同一张原图,分别跑一组「链式输入」和一组「每轮回原图」,逐轮把输出单独存盘再对照。下面给的是记录口径和脚本骨架,目的是让你在同一张图、同一组参数、同一台机器上跑一遍,自己看出漂移从第几轮开始变得不可接受。
多轮改图变灰变糊,多数情况下是链式输入在放大重编码损失,而不是模型单次能力不够。建议先固定同一张原图连跑五轮建立基线,再改成每轮以上一轮输出为输入连跑五轮,两组都逐轮单独保存并按同一坐标裁剪对比。判断依据优先看三处:非编辑区域是否也开始变化、整体色调是否相对原图偏移、细线条和文字边缘是否出现重影。具体可接受轮数受原图内容、导出格式和分辨率影响,需要用自己的图跑一遍确认,不要直接照搬别人的轮数。
固定同一张原图,连续跑五轮相同的局部修改
这一组的输入永远是同一张原始文件,五轮的改动描述和改动区域保持完全一致。它回答的是「同一原图重复跑,结果本身稳不稳」,只有这组稳定,后面链式输入看到的差异才能归因到多轮累积上。
选图时优先挑含有大面积渐变、暗部、细纹理或文字边缘的原图,这几类区域通常最先暴露漂移。每轮输出必须另存为新文件,不要覆盖上一轮,也不要在对话窗口里接着上一轮继续改,否则后面无法回退。
- 命名模板:
orig.png、r01-reset-{area}.png……r05-reset-{area}.png,轮次和输入来源都写进文件名。 - 像素尺寸:每轮用同一方式读取宽高并记录,出现尺寸变化说明导出环节被改了参数。
- 文件体积:记录字节数,体积异常变小往往对应纹理被抹平,可作为辅助线索。
- 参数留痕:把该轮的提示词、遮罩区域、种子、尺寸写进同名
.json,便于回溯和重跑。
| 轮次 | 输入来源 | 文件名 | 像素尺寸 | 文件体积 | 颜色偏移 | 细节清晰度 | 边缘状态 |
|---|---|---|---|---|---|---|---|
| 第 1 轮 | orig.png | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
| 第 2 轮 | orig.png | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
| 第 3 轮 | orig.png | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
| 第 4 轮 | orig.png | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
| 第 5 轮 | orig.png | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 |
把每轮输出当作下一轮输入,观察画质变化
第二组把第 N 轮的输入换成第 N-1 轮的输出文件,改动描述仍然一致,只让编辑位置逐轮挪动。每轮结束后,把该轮结果与原始文件在同一坐标裁一块、放大到同一倍数并排看,比在整图上扫一眼更容易判断漂移。
差异不会平均分布,通常先出现在几个固定位置:大面积渐变和暗部先出现色块或脏边;细纹理(毛发、织物、砂石)先糊;细线条和文字边缘先出现毛刺或重影;还有一种更要紧的情况是编辑区域之外的背景也开始变化,说明改动溢出了预期范围。
明显程度建议用四级文字描述,避免凭印象说「有点差」:看不出 / 放大后可见 / 1:1 下可见 / 缩略图就可见。逐轮记录差异位置和级别,通常能看到级别随轮数单调上升;如果某一轮突然跳级,优先怀疑该轮的遮罩或提示词改动过大,而不是模型本身。
改成每轮都回退原图再改另一处
第三组每轮都从 orig.png 重新开始,只改当轮需要改的那一处,改完直接导出,不再把结果喂回下一轮。两组用同一批改动、同一个顺序,唯一变量就是输入来源。
| 对比维度 | 链式输入 | 回原图输入 |
|---|---|---|
| 漂移累积 | 随轮数叠加 | 每轮只承担一次编码损失 |
| 颜色一致性 | 整体色调容易逐轮偏移 | 相对原图稳定 |
| 细节保留 | 纹理逐轮变软 | 未编辑区域基本不动 |
| 编辑连贯性 | 上一轮结果可继续沿用 | 每轮改动需要重新描述 |
| 可回退性 | 只能回到某一轮中间态 | 随时可退回原图重做 |
| 适用场景 | 同一处反复微调、需要承接前轮上下文 | 一张图多处独立修改、需要交付干净成品 |
经验上,一张图要改多处独立位置时,回原图输入更省心;只有同一处需要连续微调、且每轮改动都建立在上一轮效果之上时,链式输入才有意义,而且这种场景建议把链长压到两三步以内。
用脚本按固定轮数循环提交,减少手工误差
手工一轮一轮点,最容易出问题的不是画质,而是「这轮到底喂的是哪张图」。把轮数和输入来源写进脚本参数,两组对照才有可比性。下面只是通用骨架,接口字段名以你实际对接的服务为准。
import os, json
API_ENDPOINT = '{API_ENDPOINT}' # 替换为实际服务地址
API_KEY = '{API_KEY}'
MODEL = '{MODEL_NAME}'
ORIGINAL = 'input/orig.png'
ROUNDS = 5
MODE = 'chain' # chain=上一轮输出作输入;reset=每轮回原图
PROMPT = '{EDIT_PROMPT}' # 每轮改动描述
MASK = '{MASK_OR_REGION}' # 局部区域,可为空
SEED = '{SEED}' # 固定种子便于复现
os.makedirs('out', exist_ok=True)
os.makedirs('logs', exist_ok=True)
src = ORIGINAL
for i in range(1, ROUNDS + 1):
if MODE == 'reset':
src = ORIGINAL
out = 'out/round-%02d-%s.png' % (i, MODE)
payload = {
'image': src,
'prompt': PROMPT,
'mask': MASK,
'seed': SEED,
'size': '{WIDTH}x{HEIGHT}'
}
resp = call_api(API_ENDPOINT, API_KEY, MODEL, payload) # 自行实现
save_image(resp, out) # 自行实现
with open('logs/round-%02d.json' % i, 'w') as f:
json.dump(payload, f, ensure_ascii=False)
print(i, out, os.path.getsize(out))
src = out
跑之前确认三件事:MODE 与要验证的路线一致、每轮的 PROMPT 和 MASK 已按轮次替换而不是复用同一份、失败轮次直接跳过重跑而不是留下半张图。输出目录建议保持固定结构,便于两组并排比较:
workspace/
├── input/
│ └── orig.png
├── out/
│ ├── round-01-chain.png
│ └── round-05-chain.png
├── logs/
│ └── round-01.json
└── compare/
├── crop-round-01.png
└── side-by-side.png
给出多轮改图的操作建议与回退点
综合两组结果,可以给一个保守区间:同一张图上的局部修改,经验上控制在 2 到 4 轮内比较稳妥;接近第 5 轮时,建议逐轮放大检查颜色和边缘,确认是否已经出现可见偏移。这个区间不是模型的上限,具体能撑几轮取决于原图内容、导出格式、分辨率和单轮改动面积,需要自己跑一遍确认。
出现下面任意一条,就建议退回原图重做,而不是继续往下改:未编辑的背景区域也开始变化;整体色调相对原图明显偏移且调不回来;同一处细节连续两轮变糊;细线条或文字边缘出现重影;同一组参数两次运行结果差异明显,说明当前轮数已经不可复现。
验证方式不需要复杂工具:把每轮结果和原图在同一坐标裁出等大区域,按同一倍数放大并排看;对未编辑区域做一次差分,确认没有非预期变化;用相同种子重跑一轮,确认差异是否可复现。如果是需要交付的成品,最终版本建议直接从原图重新生成,而不是拿链式链尾的文件继续导出。