OPEN SOURCE DEEP DIVE
image-to-3d-pipeline:多模型图生3D的公平评测与浏览器探索流水线
同一组 AI 渲染图喂给 TRELLIS V1/V2 与 TripoSR,用写死的 Blender EEVEE 巡检轨道加 0–2 五轴评分卡逐个打分,胜出网格进 Three.js 浏览器探索器。Apache-2.0,仓库自带 1.5 MB 成品 GLB。
不是一个新模型,而是一把公平的量尺
图生 3D 的开源模型已经有十几个,却没有一个公认的赢家。image-to-3d-pipeline 给出的答案不是再训一个模型,而是搭一套能把它们放在同一条起跑线上比较的流水线:拿一组 AI 生成的虚构潜水器渲染图当唯一输入,让多个重建模型各自吐出网格,再用一套固定的 Blender 巡检协议逐个打分,最后把胜出者塞进浏览器里的 WebGL 探索器供人真实走动。项目由 Dreamers Inc 开发,代码 Apache-2.0 许可,主要语言 JavaScript,仓库内附带三张源图与一个约 1.5 MB 的成品 GLB,不跑任何推理也能先看输出长什么样。
作者对输入性质的判断很清醒:这些图是「视角条件下的美术作品」,不是相机标定过的照片。物体集共 15 张 1536×768 PNG,部分被遮挡面与底面细节在各视角之间互相矛盾。因此摄影测量式重建不可能因为「输入够多」就恢复出忠实闭合的资产——这条前提直接决定了后面所有评分只能是结构化目检,而不是像素级误差。
四段流水线:抠图 → 重建 → 评测 → 探索
| 阶段 | 脚本 | 做了什么 |
|---|---|---|
| 预处理 | tools/preprocess_object_masks.py | rembg(u2net)抠出透明纯物体图,长边压到 ≤1536,alpha 通道做 0.35 高斯羽化,另存棋盘格预览供人工核对 |
| 重建 | tools/run_trellis_multiview.py | TRELLIS 多图重建,支持 stochastic / multidiffusion 两种模式,导出 raw-mesh.ply、gaussian.ply、ship.glb 与一段外观对比法线的转台视频 |
| 评测 | tools/run_reconstruction_eval.sh | 先出 mesh-facts.json,再让 Blender 跑固定巡检轨道,最后合成带贴图与素模两张 contact sheet |
| 探索 | 05-web-explorer/ | Three.js + three-mesh-bvh 加载胜出 GLB,在可自由航行的水下场景里飞行,无需 WASM 物理运行时或外部服务 |
重建脚本写得像实验记录而不是 demo。它在跑之前先做一道硬校验:图片数量不能超过采样步数(TRELLIS 的多图路径要求步数 ≥ 图数,否则直接报错退出);跑完把每张输入图的 SHA-256、字节数、模型、模式、种子、步数、简化比例、贴图尺寸、主机名、PyTorch/CUDA 版本、GPU 型号,连同模型加载/推理/转台/导 GLB 四段耗时和峰值显存 GiB,全部写进 run-config.json 与 run-metrics.json。默认参数是 seed 42、12 步、简化比例 0.90、贴图 1024,稀疏结构采样器 cfg_strength 7.5、SLAT 采样器 3.0。换句话说,任何一次跑的结果都能被复现、被质疑、被对齐。
评测协议:把「好看」拆成可打分的轴
评测端的关键是固定变量。render_reconstruction_eval.py 用 Blender 4.3 EEVEE 渲染,10 个视角写死在代码里:方位角 0/45/90/135/180/225/270/315 配仰角 10 度,再加 az045_el35 与 az225_elm15 两个补角,正好覆盖艏艉与底部。每个候选网格先按最长边归一化到 4.8 单位,相机 55mm 镜头、半径 8.0,打光是一套固定的三盏面光(主光 1150、补光 700、暖色轮廓光 800),色彩管理统一 AgX - Medium High Contrast,分辨率 768。同一个视角渲两遍:一遍带原贴图,一遍换成统一的素模材质——素模那一遍存在的意义是把「贴图糊住了破面」这类作弊挡在外面。渲染清单 render-manifest.json 会把渲染器、分辨率与每个视角的角度一并落盘。
打分用一张 0–2 的五轴评分卡:全视角剪影、源特征保留、贴图连续性、新视角可信度、资产完整性。同时挂了四道护栏——GLB 必须能在 Blender 里导入、贴图节点必须存在、不允许出现灾难性缺面、远程 GPU 的 OOM 或失败必须被记录而不是静默重试。这五轴加护栏定义在 07-experiments/HUNYUAN_2MV_EXPERIMENT_PROTOCOL.md,新候选模型一律走同一把尺。
五个候选的排名与代价
| 名次 | 候选 | 输入 | 浏览器资产 | 主要缺陷 |
|---|---|---|---|---|
| 1 | TRELLIS V2 stochastic | 15 张纯物体视角,20 步 | 1.56 MB / 11,866 面 | 艏艉机械结构仍是推断出来的,细缝大多是贴图而非几何 |
| 2 | TRELLIS V2 multidiffusion | 同上 15 张,20 步 | 1.61 MB / 12,444 面 | 艏楼与底面过度平滑,部分视角专属细节消失 |
| 3 | TRELLIS V1 multidiffusion | 10 张 rembg 抠图,12 步 | 1.58 MB / 11,114 面 | 艉部模糊压平,上表面趋于通用化 |
| 4 | TRELLIS V1 stochastic | 同上 10 张,12 步 | 1.85 MB / 17,790 面 | 把艇体融成错误的蝠鲼式近似对称 |
| 5 | TripoSR 单视角 | 逐张场景图 | 0.8–2.3 MB | 只有薄浮雕外壳,背面空白或凭空捏造,不可用作这条船 |
结论写得很克制:TRELLIS V2 stochastic 在身份与细节之间平衡最好,长艇体、艏楼、侧向涡轮凹槽与鳍的语言都保住了,因此被选作探索器的占位资产;但它「是一个合理的视觉重建,不是工程意义上忠实的数字孪生」。Web 运行时随时可以换更好的 GLB,不需要改架构。单视角的 TripoSR 则直接被判不可用——这是这条流水线最有说服力的反例:快不等于能交付。
探索器:浏览器里的碰撞与飞行
探索器是一个自包含的 Vite 项目,依赖只有两条:three 0.179.1 与 three-mesh-bvh 0.9.1,Node 要求 ≥22.12。碰撞没有引入任何物理引擎:给每个船体网格建 MeshBVH(maxLeafTris: 10),再用一个玩家半径球体做穿透修正,把相机沿法线推出表面。移动手感按指数插值平滑——探索模式目标速度 6.2,驾驶模式 5.6,相机俯仰夹在 ±1.42 弧度,垂直位置夹在 −1.45 到 21,水平半径超过 58 就拉回,滚轮控制升降。世界由一张朝内的 360 度水下全景加一张可平铺的沙底微纹理构成,靠近水面时光照按高度插值增亮。
URL 参数就是实验开关:?mesh=trellis2 是默认候选,?mesh=v2-multidiffusion 是更平滑的 V2 替代,?mesh=v1-multidiffusion 是原始场景基线,?mode=pilot 切到追尾相机驾驶真实资产,?projection=starboard 则是一个刻意孤立的单图投影实验——作者明说这是受控对比,真正的升级要用标定过的多角度源图覆盖。仓库还带 Playwright 测试,覆盖资产加载、键盘移动、实心船体碰撞探针、控制台报错、驾驶模式与十种视口尺寸;移动端布局支持,但这一里程碑没做触控导航。
下一步该试什么:模型调研与协议
07-experiments/MODEL_RESEARCH_2026-08-07.md 把「换个更新的模型会不会更好」这个问题拆开逐个回答,核心建议是:不要因为某个模型宣传分辨率更高就换掉本地赢家。微软 TRELLIS.2(4B,输出 512³–1536³,需 Linux + NVIDIA ≥24GB 显存与独立试点环境)值得作为下一个受控的单参考图对比,但不能叫多图重建;腾讯 Hunyuan3D 2.1(3.3B Shape + 2B Paint,文档提到六视角贴图阶段)更适合做固定几何上的纯贴图质量测试;MapAnything / VGGT / MASt3R 这一类度量多视角重建是唯一真正把每张图当观测使用的路线,但需要先定义一个小的位姿/深度闸门——估计出的相机或投影特征一旦互相矛盾就在网格化之前中止,避免把 GPU 时间浪费在一个只会把冲突插画平均掉的资产上;NVIDIA 3D Object Reconstruction 期望标定立体视频或真实照片,前提不满足,不作为首选。
已经写好协议的 Hunyuan3D 2MV 实验只允许四张 RGBA 纯物体锚点(左舷剖面、正艏、正艉、右舷正交),对应 Hunyuan 的 front/left/back/right 输入契约,并设计成四组运行:H0 现有基线、H1 端到端换重建方法、H2 只换贴图阶段(几何沿用 H0)、H1R 把 H1 形状降到 40,000 面后再单独标注的 Paint 可行性运行——作者特意说明 H1R 不能被当作纯贴图证据来比较。同一个命名运行内不许改模型、锚点数、种子、网格分辨率或渲染器。
许可边界与复现须知
本仓库代码是 Apache-2.0,但 setup.sh 拉取的四个第三方工具各自带自己的许可,因此它们被克隆进 gitignored 的 tools/vendor/ 而不是 vendor 进仓库——你是在 fetch 的那一刻接受其条款:
| 工具 | 许可 | 固定 commit |
|---|---|---|
| TRELLIS(microsoft) | MIT | 442aa1e |
| TripoSR(VAST-AI-Research) | MIT | 107cefd |
| stable-fast-3d(Stability AI) | Stability AI Community License,限制商用 | ff21fc4 |
| Hunyuan3D-2(腾讯混元) | 腾讯混元社区许可,有地域限制 | f8db630 |
所有源图都是 AI 生成的虚构舰艇合成渲染,不涉及任何真实载具、船舶、人物或客户。大体积产物一律不入库:Python 环境、模型权重、中间 PLY/GLB、探索器的完整运行时资产都被排除,05-web-explorer/README.md 说明了如何自备资产,examples/ 里那一个 GLB 可以直接拷进 public/assets/ 跑起来。
git clone https://github.com/dreamers-laboratory/image-to-3d-pipeline && cd image-to-3d-pipeline
./setup.sh # 按固定 commit 克隆四个重建工具到 tools/vendor/
cd 05-web-explorer
cp ../examples/mesh/submersible-v2-stochastic.glb public/assets/ship-trellis2-starboard.glb
npm install && npm run build && npm run preview # 打开 http://127.0.0.1:4173/
这个项目真正的价值不在那个 1.5 MB 的潜水器网格,而在它把「哪个图生 3D 模型更好」从口水仗变成了一份可复现的记录:固定输入、固定渲染器、固定视角、固定评分卡、落盘的哈希与耗时,以及一句写进文档的边界声明——它给的是合理视觉重建,不是工程忠实的数字孪生。对做机器人仿真资产、数字孪生或三维内容生产的人来说,这套评测骨架比某个模型的输出更值得抄。