# Benchmark100 评估集中文一页通

这份说明是给另一个 Codex 或研究同学直接接手用的。当前评估集用于研究“多张非正交图片输入时，TRELLIS / TRELLIS.2 / ReconViaGen 等方法生成 3D mesh 的质量”。

## 入口

主清单：

```text
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/benchmark_manifest_v0.json
```

输入图、20 个测试视角和相机参数：

```text
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/rendered_benchmark_v0
```

各方法生成的 mesh 和评测结果：

```text
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/method_eval
```

中文 case 浏览网页：

```text
http://38.94.129.6:8768/report/benchmark100_case_browser_zh.html
```

本说明网页：

```text
http://38.94.129.6:8768/report/codex_benchmark100_onepage_zh.html
```

## 数据集规模

- 总对象数：100。
- 数据来源：50 个 GSO，50 个 Toys4K。
- 每个对象都有 GT mesh。
- 每个对象都有 2、4、6、8 四档非正交输入视角。
- 每个对象都有 20 个独立保留测试视角。
- 输入视角不是 TRELLIS 偏好的正交视图，而是随机非正交透视视角。

## 主清单怎么读

注意：主清单里对象列表字段是 `objects`，不是 `cases`。

```python
import json
from pathlib import Path

manifest_path = Path("/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/benchmark_manifest_v0.json")
manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
objects = manifest["objects"]
print(len(objects))  # 应该输出 100
```

每个对象常用字段：

- `benchmark_id`：评估集 ID，例如 `gso_000`、`toys4k_034`。
- `dataset`：`GSO` 或 `Toys4K`。
- `object_id`：原始数据集对象名。
- `gt_mesh`：GT mesh 来源路径。
- `input_protocols`：2/4/6/8 输入视角配置。
- `eval_views`：20 个测试视角配置。

## 图片和相机参数

单个对象目录：

```text
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/rendered_benchmark_v0/<benchmark_id>
```

例如：

```text
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/rendered_benchmark_v0/gso_000
```

里面包含：

- `input_2/*.png`：2 张非正交输入图。
- `input_4/*.png`：4 张非正交输入图。
- `input_6/*.png`：6 张非正交输入图。
- `input_8/*.png`：8 张非正交输入图。
- `eval_20/*.png`：20 张测试视角 GT 渲染图。
- 每个目录下的 `transforms.json`：相机参数。

## 方法输出 mesh

路径模式：

```text
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/method_eval/<method_dir>/<benchmark_id>_input<N>/mesh_raw.obj
```

例子：

```text
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/method_eval/trellis2_protocol4_all100/gso_000_input4/mesh_raw.obj
```

常用方法目录：

- `trellis_protocol2_all100`、`trellis_protocol4_all100`、`trellis_protocol6_all100`、`trellis_protocol8_all100`
- `trellis2_protocol2_all100`、`trellis2_protocol4_all100`、`trellis2_protocol6_all100`、`trellis2_protocol8_all100`
- `reconviagen_protocol2_all100`、`reconviagen_protocol4_all100`、`reconviagen_protocol6_all100`、`reconviagen_protocol8_all100`
- `tripo_direct_protocol2_all100`、`tripo_direct_protocol4_all100`、`tripo_direct_protocol6_all100`、`tripo_direct_protocol8_all100`
- `tripo_gpt_ortho_protocol2_all100`、`tripo_gpt_ortho_protocol4_all100`、`tripo_gpt_ortho_protocol6_all100`、`tripo_gpt_ortho_protocol8_all100`

## 聚合指标

完整 2/4/6/8 输入视角矩阵：

```text
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/method_eval/benchmark100_full_matrix_aggregate.json
```

单方法逐 case 指标：

```text
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/method_eval/<method_dir>/geometry_eval.json
```

常用指标：

- `chamfer_mean`：预测 mesh 和 GT mesh 的双向最近邻距离均值，越低越好。
- `hausdorff_approx`：近似最大表面误差，越低越好。
- `fscore_1pct/2pct/5pct/10pct`：不同距离阈值下的 F-score，越高越好。
- `precision_*`：预测表面落在 GT 附近的比例，越高越好。
- `recall_*`：GT 表面被预测覆盖的比例，越高越好。
- `pred_faces`：预测 mesh 面片数，用于衡量复杂度。
- `watertight`、`boundary_edges`、`nonmanifold_edges`：拓扑质量指标。

## 为什么可能加载不了

1. HTTP 服务根目录不对。网页资源路径假设服务从这个目录启动：

   ```text
   /home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs
   ```

2. 直接双击 HTML。Three.js 模块、OBJLoader 或相对资源路径可能被浏览器本地安全策略影响。请用 HTTP URL 打开。

3. GT mesh 是 `zip://...!...` 路径。普通 OBJ loader 不能直接读取这种路径。优先使用：

   ```text
   /home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/rendered_benchmark_v0/render_summary.json
   ```

   其中记录了评测实际用过的 `mesh_path`。

4. TRELLIS.2 raw mesh 面片数很高。浏览器首次加载可能慢，可以先加载 TRELLIS 或 ReconViaGen mesh 验证 viewer 是否正常。

5. 代码字段名写错。主清单是 `objects`，不是 `cases`。

## 最小自检

```bash
test -f /home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/benchmark_manifest_v0.json
test -d /home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/rendered_benchmark_v0/gso_000/input_2
test -d /home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/rendered_benchmark_v0/gso_000/eval_20
test -f /home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/method_eval/trellis2_protocol4_all100/gso_000_input4/mesh_raw.obj
```

确认对象数：

```bash
python3 - <<'PY'
import json
from pathlib import Path
p = Path("/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/benchmark_manifest_v0.json")
data = json.loads(p.read_text(encoding="utf-8"))
print("objects =", len(data["objects"]))
PY
```

确认网页和 OBJ URL 能访问：

```bash
python3 - <<'PY'
import urllib.request
urls = [
    "http://38.94.129.6:8768/report/benchmark100_case_browser_zh.html",
    "http://38.94.129.6:8768/data_survey/method_eval/trellis2_protocol4_all100/gso_000_input4/mesh_raw.obj",
]
for url in urls:
    with urllib.request.urlopen(url, timeout=10) as resp:
        print(resp.status, resp.getheader("content-type"), url)
PY
```

## 可以直接发给另一个 Codex 的提示词

```text
请使用本机已有的 Benchmark100 多视角非正交 mesh 评估集。

中文一页通：
http://38.94.129.6:8768/report/codex_benchmark100_onepage_zh.html

主清单：
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/benchmark_manifest_v0.json

注意主清单对象列表字段是 objects，不是 cases。评估集有 100 个对象，每个对象有 input_2/input_4/input_6/input_8 四组非正交输入视角，以及 eval_20 的 20 个测试视角。

图片根目录：
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/rendered_benchmark_v0

方法输出 mesh 根目录：
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/method_eval

完整聚合指标：
/home/jiachen/TRELLIS/experiments/nonorthogonal_gpt_orthoview/outputs/data_survey/method_eval/benchmark100_full_matrix_aggregate.json

如果网页或 OBJ 加载失败，先确认 HTTP 服务是否从 outputs 目录启动，再检查目标 OBJ URL 是否返回 200。
```
