把 coding agent 当生图模型用的 benchmark(草案)。
给一段文字描述,coding agent 写代码、渲染、看图、再改,最后交一张静态图,和生图模型放在一起比。工具不限(SVG、Canvas、Three.js、Blender、numpy……),唯一的禁令是不能调用生图模型。目标用户是做后训练的模型公司:在这类任务上训练,在这个 benchmark 上测。
📄 报告:yaxin9luo.github.io/Code2Pixel/report(单个 HTML,图片都嵌在里面;也可以下载 report/index.html 直接打开)
大家默认生图必须用生图模型。我们的试跑里,coding agent 只拿到一句文字,就画出了带光影、倒影、透视的完整场景。我们不说它现在比扩散模型好,只说这是另一条路,而且这条路有扩散模型没有的性质:精确、可改、可复现、分辨率无关、不需要图像训练数据。
| 任务 | 只做静态图。输入文字,交最终 PNG + 生成它的代码 + 一条能重跑的命令 |
| 主赛道 | 只给文字;不联网,不读现成图片、素材、模型 |
| 素材赛道 | 可用授权照片、贴图、HDRI、3D 模型 |
| 辅助赛道 | 给参考图,用代码复刻,按像素相似度客观打分(适合当 RL 奖励) |
| harness | 直接用现成的 Claude Code 和 Codex(订阅账号登录),在统一镜像里 headless 运行;以后需要再加别的 agent |
| 档位 | 测一次正常调用、一轮长程运行的效果,harness 不强制多试。分不看图(禁止看任何图片)和正常运行(可看图)两档;上限都是 100 万 token、90 分钟,只防失控;报实际用的 token(只算新增输入和输出)、时间、看图次数 |
| 评测 | ① 程序化规则当门槛:能渲染、路径尺寸对、无嵌入位图、没联网没调模型、能复现、题目约束满足;任一条不过总分归零 ② VLM 裁判:细则写成能核对的具体说法,逐条判是或否(不打 1–5 分);与固定图池两两比较(隐去作者、位置平衡);读代码抓硬编码像素等作弊 ③ 人工校准:上线前先人工读一批打过分的样本;按类别公布裁判与人的一致率 |
| 题目 | 风景、街景、动物、人物、静物、多物体、指定画风,外加”代码该赢”的题:精确数量、画面文字、几何布局、精确修改 |
| 题目来源 | 优先用人们真实让 coding agent 画图的 prompt,其次人写,再次以真实 prompt 为锚的合成题;难度由人判定,不专挑当前模型做不好的题;所有模型都失败的题人工复查 |
| 数据格式 | 每条任务一行 prompt / reward_model / extra_info(任务 id、Docker 镜像);统一渲染镜像,可直接接 verl |
| 数据划分 | train 公开、自动出题;dev 公开、细则人工核对;test 不公开、人写细则、定期更换、不进训练。三份共用一套环境 |
| 训练 vs 评测 | 训练:同题一组 rollout 组内比较给相对分(适合 GRPO)。评测:与生图模型和参考 agent 的固定图池比,报胜率或 Elo |
| 防刷分 | 断网;静态扫描 + 运行时检查(base64 位图、下载图片、调生图模型、加载权重);重跑和 agent 作答全过程都用 strace 跟踪,读了现成图片就判违规;judge 只看像素并用对抗样本测试;作弊归零 |
| 效率 | 每档报 token、轮数、时间;分数接近饱和时比同等质量下的成本 |
| 评测自检 | 指标上线前要过:分数随模型能力和 effort 上升;最强模型离满分很远;多次运行的噪声小于要关心的差距(报置信区间);judge 判两次结论稳定;对抗样本得 0 分。dev 涨而 test 不动视为过拟合 |
所有赛道禁止调用生图模型。
还没定:VLM 裁判选型、生图模型基线、test 集规模。
当前进度(2026-10-03):阶段 1–3 已完成(阶段 1 剩 amd64 镜像);阶段 4 VLM 裁判进行中:裁判、两两比较、读代码、对抗测试和标注页都已做好,在 60 次实跑上跑过;用 5 个 agent 验证过区分度:两个裁判都排成 {Claude Code + Opus 5.5, Codex + GPT-6.1-sol} > Claude Code + Fable 5.1 > {Claude Code + Opus 4.8, Claude Code + Sonnet 5}(effort 都是 medium),Opus 5.5 和 GPT-6.1-sol 谁强等人工标注定(见 docs/PHASE4.md)。逐项清单见 TASKS.md。
环境打包、组内比较评分和门槛式奖励参考了 MiMo-V2.6 开源的 RL 环境和 GAGAR。它们没有公布 judge 和人的一致性,这是我们要补上的部分。评测自检、题目来源和细则格式参考了 Automating eval design and hillclimbing。
完整方案见 docs/PLAN.md:任务和输出约定、题库、三层评分、评测自检、数据格式、实现步骤、还没定的问题。步骤概要:
12 个事先定好的题目,每题两张:A 只给文字,B 可用 Wikimedia Commons 授权照片。每张最多 6 轮。
CLIP 认对率分不出好坏(原始照片也全部认对),所以正式 benchmark 要换成上面的三层评测。
demo/ 试跑:prompts.json(题目)、RULES.md(规则)、A/ B/(每张图的代码、log.json、各轮代码快照)
verify.py(重跑比对)、score.py(CLIP 打分)、scores.json、verify.json
qianli/ 前期探索:first_attempt/ 从零画千里江山图;fit/ 给参考图用三角形 SVG 复刻
autoresearch/ agent 自动优化三角形拟合算法(SSIM 0.764 → 0.818,58 秒 → 26 秒)
stylize/ 照片风格化工具(水墨、水彩、油画等,传统算法 + C 内核,无神经网络)
docs/ PLAN.md:设计与实现方案;PHASE1.md:阶段 1 进度和验收;PHASE2.md:阶段 2 门槛;PHASE3.md:阶段 3 题库;PHASE4.md:阶段 4 裁判
env/ 统一 Docker 镜像(Dockerfile、c2p-render)、出口代理(proxy/)、门槛镜像(gate/,加了 strace)
harness/ run.py:在镜像里跑 Claude Code 或 Codex、监控预算、收集产出;batch.sh:批量运行;
check.py:断网重跑比对和汇总;gate.py:门槛;gate_validate.py:门槛自检;
redteam/:手写对抗样本;tasks/:题目;judge.py、pairwise.py、code_grader.py、judge_redteam.py:裁判;
label/:人工标注页;label_export.py、agreement.py:标注导出和一致率
report/ 报告 index.html 及生成脚本
仓库不含图片。重跑 B 赛道需要先按 log.json 里的 credits 下载照片到对应的 refs/。
代码 MIT。报告中的图片按 CC BY-SA 4.0 分享(B01、B02、B08、B10、B12 用到了 CC BY-SA 照片);第三方照片的署名和许可见各题 log.json。