MOSS-Image 批量出图前 / 先用脚本固定种子和尺寸再落盘

文章导读
批量出图最容易出问题的地方,往往不是模型本身,而是参数和产物对不上:同一批跑几十张,回头只记得“大概是那组描述”,种子没记、尺寸忘了、文件名是默认哈希,结果既挑不出可复现的图,也没法确认哪张对应哪条提示词。要解决这件事,比较稳妥的做法是在批量跑之前先写一个很小的脚本:提示词放外部文件,种子、尺寸、输出目录在脚本里固定成变量,输出文件名带上序号和关键参数。这样每张图在命令行和文件名里都能反查到输入。
📋 目录
  1. Ⅰ 把提示词列表写成外部文件,一行一条并留出参数字段
  2. Ⅱ 在脚本里固定种子、尺寸、输出目录三个变量,循环逐条读入
  3. Ⅲ 输出文件名带上序号和关键参数,确认能反查回原始提示词
  4. Ⅳ 先跑两条试运行,核对产物数量与命名后再放量
A A

批量出图最容易出问题的地方,往往不是模型本身,而是参数和产物对不上:同一批跑几十张,回头只记得“大概是那组描述”,种子没记、尺寸忘了、文件名是默认哈希,结果既挑不出可复现的图,也没法确认哪张对应哪条提示词。要解决这件事,比较稳妥的做法是在批量跑之前先写一个很小的脚本:提示词放外部文件,种子、尺寸、输出目录在脚本里固定成变量,输出文件名带上序号和关键参数。这样每张图在命令行和文件名里都能反查到输入。这里的边界是:脚本写法要配合你本机 MOSS-Image 的实际调用方式调整,接口名、参数名以本地可用的版本为准,先用两条试跑验证,再放量。

批量出图前的准备重点,是把“内容”和“参数”拆开并固化:提示词一行一条放在外部列表文件,种子、尺寸、输出目录在脚本顶部统一定义,循环逐条读入;输出文件名带序号、种子和尺寸,保证产物能反查回原始提示词和参数。适用场景是一次跑十几条以上的批量任务。验证方式是先只跑两条,核对产物数量、命名和覆盖情况;风险边界是脚本里的调用接口必须与本机实际可用的 MOSS-Image 入口一致,不确定的参数不要写死,先试跑确认。

把提示词列表写成外部文件,一行一条并留出参数字段

先做的不是写循环,而是把提示词从代码里挪出去。放一个纯文本列表文件,一行对应一条任务,字段之间用制表符或竖线分隔,避免提示词里本来就有逗号导致切分错位。建议至少保留三列:提示词、可选的附加描述或负向词、可选的备注标签。备注标签用来在文件名里做短标识,方便肉眼看懂哪张图属于哪组。

# prompts.txt
# 字段约定:prompt | tag | note(用竖线分隔,每行一条,空行和 # 开头行跳过)
一只白瓷咖啡杯放在木桌上,清晨侧光 | cup_wood | 静物测试 A
雨后的城市街角,霓虹反光,35mm 视角 | street_rain | 街景测试 B
纯色背景下的金属齿轮特写,工业质感 | gear_macro | 材质测试

字段分隔约定要说清楚:第一列必须是提示词本体;第二列是短标签,只允许字母、数字和下划线,因为它要进文件名;第三列是给人看的备注,可以含空格和中文。改提示词时只动这个文本文件,脚本不用碰。需要结合环境确认的一点是,如果你的 MOSS-Image 调用需要把负向词单独传参,就在文件里再加一列,而不是塞进第一列用自然语言描述。

MOSS-Image 批量出图前 / 先用脚本固定种子和尺寸再落盘

在脚本里固定种子、尺寸、输出目录三个变量,循环逐条读入

批量任务里,除提示词外其他条件保持一致,才有对照价值。所以种子、尺寸、输出目录不要写在循环内部,也不要在循环里随机生成,而是统一放在脚本顶部作为常量。下面是一个通用骨架,调用那一行是占位,替换成本机实际可用的 MOSS-Image 命令或接口即可,不要照抄不存在的接口名。

import os
import subprocess

# ===== 固定参数区:同一批任务只改这里 =====
SEED = 20240101
WIDTH = 1024
HEIGHT = 1024
OUT_DIR = "./output/moss_batch_01"
PROMPT_FILE = "./prompts.txt"
# =========================================

os.makedirs(OUT_DIR, exist_ok=True)

def load_tasks(path):
    tasks = []
    with open(path, encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith("#"):
                continue
            parts = [p.strip() for p in line.split("|")]
            if len(parts) < 2:
                continue
            prompt = parts[0]
            tag = parts[1]
            note = parts[2] if len(parts) > 2 else ""
            tasks.append((prompt, tag, note))
    return tasks

for idx, (prompt, tag, note) in enumerate(load_tasks(PROMPT_FILE), start=1):
    name = f"{idx:03d}_{tag}_s{SEED}_{WIDTH}x{HEIGHT}.png"
    out_path = os.path.join(OUT_DIR, name)
    print(f"[task {idx:03d}] tag={tag} -> {out_path}")
    print(f"  prompt={prompt}")
    if note:
        print(f"  note={note}")
    # 替换为本机可用的 MOSS-Image 出图调用
    # subprocess.run(["moss-image", "`--prompt`", prompt,
    #                 "`--seed`", str(SEED),
    #                 "`--width`", str(WIDTH), "`--height`", str(HEIGHT),
    #                 "`--out`", out_path], check=True)

变量定义位置在脚本顶部,循环只负责读入提示词、拼出文件名、把固定参数原样传下去。这样做的直接好处是:同一批里所有图片的种子和尺寸一致,比较提示词差异时不会混进其他变量。如果确实需要每条用不同种子,建议在列表文件里增加一个可选种子列,而不是在循环里随机,否则重跑一定复现不出来。

MOSS-Image 批量出图前 / 先用脚本固定种子和尺寸再落盘

输出文件名带上序号和关键参数,确认能反查回原始提示词

命名规则的目标只有一个:拿到任意一张图,能顺着文件名回到列表文件里的那一行。示例规则是 序号_标签_种子_宽x高.png,例如 002_street_rain_s20240101_1024x1024.png。序号用三位补零,保证排序稳定;标签来自列表文件第二列;种子和尺寸放在末尾,一眼能看出这批图的固定条件。反向词、模型版本这类如果要记录,建议放长一点但保持顺序固定,不要今天放前面明天放后面。

一条反查演示:在输出目录里看到 003_gear_macro_s20240101_1024x1024.png,先取标签 gear_macro,回到 prompts.txt 搜这个标签,定位到对应行,得到提示词“纯色背景下的金属齿轮特写,工业质感”和备注“材质测试”;再从文件名取出种子 20240101 和尺寸 1024x1024,配合脚本顶部变量就能原样复现这条任务。整个过程不需要打开图片去猜。建议把这份对应关系在批量结束时随产物一起留着,比如把 prompts.txt 复制一份进输出目录;风险边界是如果脚本里改了分隔符或命名格式,旧产物就对不上新规则,所以同一批任务内不要改命名模板。

MOSS-Image 批量出图前 / 先用脚本固定种子和尺寸再落盘

先跑两条试运行,核对产物数量与命名后再放量

在跑全量之前,把任务数量限制住。最省事的办法是临时在列表文件里只留两行,或者给脚本加一个 `--limit` 2 之类的上限参数;如果不想改脚本,就直接复制一份两行的临时列表文件指向它。试运行要看的不是图好不好看,而是路径、数量、命名和覆盖。

$ python run_batch.py
[task 001] tag=cup_wood -> ./output/moss_batch_01/001_cup_wood_s20240101_1024x1024.png
  prompt=一只白瓷咖啡杯放在木桌上,清晨侧光
  note=静物测试 A
[task 002] tag=street_rain -> ./output/moss_batch_01/002_street_rain_s20240101_1024x1024.png
  prompt=雨后的城市街角,霓虹反光,35mm 视角
  note=街景测试 B

$ ls -1 ./output/moss_batch_01
001_cup_wood_s20240101_1024x1024.png
002_street_rain_s20240101_1024x1024.png

核对清单建议按顺序过一遍:产物数量是否等于列表文件里的非空非注释行数;文件名序号是否连续、标签是否与列表第二列一致;输出目录是否是预期路径,而不是当前工作目录;重复执行一次是否覆盖同名文件——覆盖本身可以接受,但你要知道它会发生,如果需要保留历史,就在输出目录里再套一层带批次名的子目录。发现序号跳号、标签含空格导致文件名异常、或者中文标签进文件名后在部分系统上显示乱码,都说明列表文件或命名规则要调,先改再放量。两条通过后再恢复完整列表跑全量,这样出问题时代价最小。