DarthSoluke commited on
Commit
1a36f9f
·
verified ·
1 Parent(s): 8aabba6

发布 SOMA 手部数据图谱:46 个数据集、100 对样例、服务器同步脚本

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +12 -0
  2. README.md +10 -0
  3. data/datasets.json +12 -12
  4. data/previews.json +652 -1
  5. index.html +250 -228
  6. media/arctic/6057bab38e74308c02be_gt.jpg +0 -0
  7. media/arctic/6057bab38e74308c02be_rgb.jpg +0 -0
  8. media/arctic/a213dd95256ccccad7bc_gt.jpg +0 -0
  9. media/arctic/a213dd95256ccccad7bc_rgb.jpg +0 -0
  10. media/arctic/c4d53a1b79549c84e96d_gt.jpg +0 -0
  11. media/arctic/c4d53a1b79549c84e96d_rgb.jpg +0 -0
  12. media/arctic/e68425daa275c68f6f5d_gt.jpg +0 -0
  13. media/arctic/e68425daa275c68f6f5d_rgb.jpg +0 -0
  14. media/cocowb/780684ce08a2af76ddc4_gt.jpg +0 -0
  15. media/cocowb/780684ce08a2af76ddc4_rgb.jpg +0 -0
  16. media/cocowb/7e7716c112039185cc5e_gt.jpg +0 -0
  17. media/cocowb/7e7716c112039185cc5e_rgb.jpg +0 -0
  18. media/cocowb/9fcab59ec353483a0635_gt.jpg +3 -0
  19. media/cocowb/9fcab59ec353483a0635_rgb.jpg +3 -0
  20. media/cocowb/f59aa0ba82e64839e596_gt.jpg +0 -0
  21. media/cocowb/f59aa0ba82e64839e596_rgb.jpg +0 -0
  22. media/dexycb/6df9d4ead4d92a187a28_gt.jpg +0 -0
  23. media/dexycb/6df9d4ead4d92a187a28_rgb.jpg +0 -0
  24. media/dexycb/7e32dcf09cb0a2254256_gt.jpg +0 -0
  25. media/dexycb/7e32dcf09cb0a2254256_rgb.jpg +0 -0
  26. media/dexycb/8ffc14f49fff4b06cc73_gt.jpg +0 -0
  27. media/dexycb/8ffc14f49fff4b06cc73_rgb.jpg +0 -0
  28. media/dexycb/a128fbe7b45844ebb4e8_gt.jpg +0 -0
  29. media/dexycb/a128fbe7b45844ebb4e8_rgb.jpg +0 -0
  30. media/egodex/team_egodex_0_gt.jpg +0 -0
  31. media/egodex/team_egodex_0_rgb.jpg +0 -0
  32. media/egodex/team_egodex_1_gt.jpg +0 -0
  33. media/egodex/team_egodex_1_rgb.jpg +0 -0
  34. media/egodex/team_egodex_2_gt.jpg +0 -0
  35. media/egodex/team_egodex_2_rgb.jpg +0 -0
  36. media/egodex/team_egodex_3_gt.jpg +0 -0
  37. media/egodex/team_egodex_3_rgb.jpg +0 -0
  38. media/egoemg/team_egoemg_0_gt.jpg +0 -0
  39. media/egoemg/team_egoemg_0_rgb.jpg +0 -0
  40. media/egoemg/team_egoemg_1_gt.jpg +0 -0
  41. media/egoemg/team_egoemg_1_rgb.jpg +0 -0
  42. media/egoemg/team_egoemg_2_gt.jpg +0 -0
  43. media/egoemg/team_egoemg_2_rgb.jpg +0 -0
  44. media/egoemg/team_egoemg_3_gt.jpg +0 -0
  45. media/egoemg/team_egoemg_3_rgb.jpg +0 -0
  46. media/egopressure/team_egopressure_0_gt.jpg +0 -0
  47. media/egopressure/team_egopressure_0_rgb.jpg +0 -0
  48. media/egopressure/team_egopressure_1_gt.jpg +0 -0
  49. media/egopressure/team_egopressure_1_rgb.jpg +0 -0
  50. media/egopressure/team_egopressure_2_gt.jpg +0 -0
.gitattributes CHANGED
@@ -33,3 +33,15 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ media/cocowb/9fcab59ec353483a0635_gt.jpg filter=lfs diff=lfs merge=lfs -text
37
+ media/cocowb/9fcab59ec353483a0635_rgb.jpg filter=lfs diff=lfs merge=lfs -text
38
+ media/genhumanego/team_gen-humanego_0_gt.jpg filter=lfs diff=lfs merge=lfs -text
39
+ media/genhumanego/team_gen-humanego_0_rgb.jpg filter=lfs diff=lfs merge=lfs -text
40
+ media/genhumanego/team_gen-humanego_1_gt.jpg filter=lfs diff=lfs merge=lfs -text
41
+ media/genhumanego/team_gen-humanego_1_rgb.jpg filter=lfs diff=lfs merge=lfs -text
42
+ media/genhumanego/team_gen-humanego_2_gt.jpg filter=lfs diff=lfs merge=lfs -text
43
+ media/genhumanego/team_gen-humanego_2_rgb.jpg filter=lfs diff=lfs merge=lfs -text
44
+ media/genhumanego/team_gen-humanego_3_gt.jpg filter=lfs diff=lfs merge=lfs -text
45
+ media/genhumanego/team_gen-humanego_3_rgb.jpg filter=lfs diff=lfs merge=lfs -text
46
+ media/mpiinzsl/mpiinzsl_047704994_01_r_native2d_gt.jpg filter=lfs diff=lfs merge=lfs -text
47
+ media/mpiinzsl/mpiinzsl_047704994_01_r_native2d_rgb.jpg filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -33,6 +33,9 @@ data/previews.json # 样例登记
33
  media/<id>/ # 样例图片
34
  tools/make_data.py # 编辑数据集信息的地方
35
  tools/add_preview.py # 添加一对 RGB / GT 叠加样例
 
 
 
36
  tools/build.py # 由 src/page.html 生成 index.html
37
  ```
38
 
@@ -46,6 +49,13 @@ vim tools/make_data.py && python tools/make_data.py
46
  python tools/add_preview.py hograspnet --rgb s01_rgb.png --gt s01_gt.png \
47
  --caption "受试者 01,侧捏" --source "官方 MANO → SOMA"
48
 
 
 
 
 
 
 
 
49
  # 改了页面源码后
50
  python tools/build.py
51
 
 
33
  media/<id>/ # 样例图片
34
  tools/make_data.py # 编辑数据集信息的地方
35
  tools/add_preview.py # 添加一对 RGB / GT 叠加样例
36
+ tools/import_team_previews.py # 从团队 Space 导入已有叠加样例
37
+ tools/server_sync.py # 在数据服务器上批量生成样例,传到 HF Dataset 仓库并登记
38
+ tools/render_overlay.py # 把 MANO / SOMA 网格投影到 RGB 上生成叠加图
39
  tools/build.py # 由 src/page.html 生成 index.html
40
  ```
41
 
 
49
  python tools/add_preview.py hograspnet --rgb s01_rgb.png --gt s01_gt.png \
50
  --caption "受试者 01,侧捏" --source "官方 MANO → SOMA"
51
 
52
+ # 在数据服务器上批量同步样例(推荐,见 tools/server_sync.py 顶部说明)
53
+ export HF_TOKEN=hf_xxx
54
+ python tools/server_sync.py manifest.jsonl --replace
55
+
56
+ # 从团队图册同步已有样例
57
+ python tools/import_team_previews.py --per 4
58
+
59
  # 改了页面源码后
60
  python tools/build.py
61
 
data/datasets.json CHANGED
@@ -1012,6 +1012,7 @@
1012
  "depth": true
1013
  },
1014
  "fills": "手与表面接触的压力,带第一视角。",
 
1015
  "links": [
1016
  {
1017
  "label": "论文 arXiv:2409.02224",
@@ -1024,7 +1025,6 @@
1024
  "url": "https://yangzijing-nine-source-hand-data-browser.static.hf.space/egocentric_embodied_datasets_20261020/index.html"
1025
  }
1026
  ],
1027
- "risk": "",
1028
  "subjects": "",
1029
  "scale": ""
1030
  },
@@ -1038,15 +1038,14 @@
1038
  ],
1039
  "source": "ego",
1040
  "method": "marker",
1041
- "gt": "手部 3D(光学动捕)",
1042
  "tier": "S2",
1043
  "route": "R1",
1044
- "camera": "第一视角 + 26 相机光学动捕",
1045
  "rig": {
1046
  "ego": true
1047
  },
1048
  "fills": "第一视角与肌电同步,光学动捕真值。",
1049
- "risk": "手部模型格式待核。",
1050
  "links": [
1051
  {
1052
  "label": "论文 arXiv:2605.05712",
@@ -1059,6 +1058,7 @@
1059
  "url": "https://yangzijing-nine-source-hand-data-browser.static.hf.space/egocentric_embodied_datasets_20261020/index.html"
1060
  }
1061
  ],
 
1062
  "subjects": "",
1063
  "scale": ""
1064
  },
@@ -1075,14 +1075,14 @@
1075
  "gt": "MANO",
1076
  "tier": "S3",
1077
  "route": "R1",
1078
- "camera": "多台 RGB-D + 头显第一视角",
1079
  "rig": {
1080
  "ego": true,
1081
  "exo": 8,
1082
  "depth": true
1083
  },
1084
  "fills": "手物交互,含第一视角。",
1085
- "risk": "标注细节待核。",
1086
  "team": [
1087
  {
1088
  "label": "团队图册:第一人称具身数据集",
@@ -1112,7 +1112,7 @@
1112
  "exo": 12
1113
  },
1114
  "fills": "双手使用工具的交互。",
1115
- "risk": "标注方式待核,暂归入关键点三角化。",
1116
  "team": [
1117
  {
1118
  "label": "团队图册:第一人称具身数据集",
@@ -1720,10 +1720,10 @@
1720
  "第一人称图册"
1721
  ],
1722
  "source": "norgb",
1723
- "method": "pseudo",
1724
- "gt": "自动标注为主",
1725
- "tier": "S5",
1726
- "route": "R7",
1727
  "camera": "黑白鱼眼",
1728
  "rig": {
1729
  "ego": true,
@@ -1731,7 +1731,7 @@
1731
  "mono": true
1732
  },
1733
  "fills": "团队已排除。",
1734
- "risk": "主标注自动生成,人工核验子集不具代表性;黑白鱼眼不满足真实 RGB 条件。",
1735
  "team": [
1736
  {
1737
  "label": "团队图册:第一人称具身数据集",
 
1012
  "depth": true
1013
  },
1014
  "fills": "手与表面接触的压力,带第一视角。",
1015
+ "risk": "HaMeR 初始化后用多视角 RGB-D、分割、压力和时序约束拟合 MANO,手上没有 marker。",
1016
  "links": [
1017
  {
1018
  "label": "论文 arXiv:2409.02224",
 
1025
  "url": "https://yangzijing-nine-source-hand-data-browser.static.hf.space/egocentric_embodied_datasets_20261020/index.html"
1026
  }
1027
  ],
 
1028
  "subjects": "",
1029
  "scale": ""
1030
  },
 
1038
  ],
1039
  "source": "ego",
1040
  "method": "marker",
1041
+ "gt": "MANO(光捕 marker 经 markers2mano 拟合)",
1042
  "tier": "S2",
1043
  "route": "R1",
1044
+ "camera": "头戴 GoPro 60 FPS + 26 相机光学动捕",
1045
  "rig": {
1046
  "ego": true
1047
  },
1048
  "fills": "第一视角与肌电同步,光学动捕真值。",
 
1049
  "links": [
1050
  {
1051
  "label": "论文 arXiv:2605.05712",
 
1058
  "url": "https://yangzijing-nine-source-hand-data-browser.static.hf.space/egocentric_embodied_datasets_20261020/index.html"
1059
  }
1060
  ],
1061
+ "risk": "",
1062
  "subjects": "",
1063
  "scale": ""
1064
  },
 
1075
  "gt": "MANO",
1076
  "tier": "S3",
1077
  "route": "R1",
1078
+ "camera": "多台 RGB-D + HoloLens 第一视角 RGB",
1079
  "rig": {
1080
  "ego": true,
1081
  "exo": 8,
1082
  "depth": true
1083
  },
1084
  "fills": "手物交互,含第一视角。",
1085
+ "risk": "多视角 RGB-D 与关键点约束拟合 MANO,不使用光捕。",
1086
  "team": [
1087
  {
1088
  "label": "团队图册:第一人称具身数据集",
 
1112
  "exo": 12
1113
  },
1114
  "fills": "双手使用工具的交互。",
1115
+ "risk": "多视角 MMPose 三角化后做 MANO 接触与时序拟合,手上没有光捕。",
1116
  "team": [
1117
  {
1118
  "label": "团队图册:第一人称具身数据集",
 
1720
  "第一人称图册"
1721
  ],
1722
  "source": "norgb",
1723
+ "method": "mvkp",
1724
+ "gt": "UmeTrack(另提供 MANO / MHR 转换)",
1725
+ "tier": "S4",
1726
+ "route": "R1",
1727
  "camera": "黑白鱼眼",
1728
  "rig": {
1729
  "ego": true,
 
1731
  "mono": true
1732
  },
1733
  "fills": "团队已排除。",
1734
+ "risk": "无标记多视角自动拟合,人工核验子集不具代表性;黑白鱼眼不满足真实 RGB 条件。",
1735
  "team": [
1736
  {
1737
  "label": "团队图册:第一人称具身数据集",
data/previews.json CHANGED
@@ -1 +1,652 @@
1
- {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "egodex": [
3
+ {
4
+ "rgb": "media/egodex/team_egodex_0_rgb.jpg",
5
+ "gt": "media/egodex/team_egodex_0_gt.jpg",
6
+ "caption": "test/stock_unstock_fridge/1 / frame 201 · Vision Pro RGB · Apple EgoDex · 来源 CC-BY-NC-ND 4.0 · 复用已有研究对照画面",
7
+ "source": "RGB + 官方 ARKit 3D 骨架投影(估计标签)(团队图册 2026-10-22)"
8
+ },
9
+ {
10
+ "rgb": "media/egodex/team_egodex_1_rgb.jpg",
11
+ "gt": "media/egodex/team_egodex_1_gt.jpg",
12
+ "caption": "test/stock_unstock_fridge/1 / frame 321 · Vision Pro RGB · Apple EgoDex · 来源 CC-BY-NC-ND 4.0 · 复用已有研究对照画面",
13
+ "source": "RGB + 官方 ARKit 3D 骨架投影(估计标签)(团队图册 2026-10-22)"
14
+ },
15
+ {
16
+ "rgb": "media/egodex/team_egodex_2_rgb.jpg",
17
+ "gt": "media/egodex/team_egodex_2_gt.jpg",
18
+ "caption": "test/braid_unbraid/3 / frame 413 · Vision Pro RGB · Apple EgoDex · 来源 CC-BY-NC-ND 4.0 · 复用已有研究对照画面",
19
+ "source": "RGB + 官方 ARKit 3D 骨架投影(估计标签)(团队图册 2026-10-22)"
20
+ },
21
+ {
22
+ "rgb": "media/egodex/team_egodex_3_rgb.jpg",
23
+ "gt": "media/egodex/team_egodex_3_gt.jpg",
24
+ "caption": "test/braid_unbraid/3 / frame 533 · Vision Pro RGB · Apple EgoDex · 来源 CC-BY-NC-ND 4.0 · 复用已有研究对照画面",
25
+ "source": "RGB + 官方 ARKit 3D 骨架投影(估计标签)(团队图册 2026-10-22)"
26
+ }
27
+ ],
28
+ "egoemg": [
29
+ {
30
+ "rgb": "media/egoemg/team_egoemg_0_rgb.jpg",
31
+ "gt": "media/egoemg/team_egoemg_0_gt.jpg",
32
+ "caption": "episode_000028 · frame 600 · 10.00 s · 头戴 GoPro · 60 FPS · CC-BY-NC-4.0(论文 A.3);作者公开旧版镜像;本页作抽帧、缩放和 MANO 叠加",
33
+ "source": "RGB + 光捕重建 MANO(团队图册 2026-10-22)"
34
+ },
35
+ {
36
+ "rgb": "media/egoemg/team_egoemg_1_rgb.jpg",
37
+ "gt": "media/egoemg/team_egoemg_1_gt.jpg",
38
+ "caption": "episode_000000 · frame 25139 · 418.98 s · gesture ID 40 · 头戴 GoPro · 60 FPS · CC-BY-NC-4.0(论文 A.3);Ziheng Xi et al.;作者公开旧版镜像;抽帧、缩放和 MANO 叠加",
39
+ "source": "RGB + 光捕重建 MANO(团队图册 2026-10-22)"
40
+ },
41
+ {
42
+ "rgb": "media/egoemg/team_egoemg_2_rgb.jpg",
43
+ "gt": "media/egoemg/team_egoemg_2_gt.jpg",
44
+ "caption": "episode_000023 · frame 41250 · 687.50 s · gesture ID 12 · 头戴 GoPro · 60 FPS · CC-BY-NC-4.0(论文 A.3);Ziheng Xi et al.;作者公开旧版镜像;抽帧、缩放和 MANO 叠加",
45
+ "source": "RGB + 光捕重建 MANO(团队图册 2026-10-22)"
46
+ },
47
+ {
48
+ "rgb": "media/egoemg/team_egoemg_3_rgb.jpg",
49
+ "gt": "media/egoemg/team_egoemg_3_gt.jpg",
50
+ "caption": "episode_000037 · frame 50260 · 837.67 s · gesture ID 59 · 手指姿态不贴合(原因未确认) · 头戴 GoPro · 60 FPS · CC-BY-NC-4.0(论文 A.3);Ziheng Xi et al.;作者公开旧版镜像;抽帧、缩放和 MANO 叠加",
51
+ "source": "RGB + 光捕重建 MANO(团队图册 2026-10-22)"
52
+ }
53
+ ],
54
+ "egopressure": [
55
+ {
56
+ "rgb": "media/egopressure/team_egopressure_0_rgb.jpg",
57
+ "gt": "media/egopressure/team_egopressure_0_gt.jpg",
58
+ "caption": "p_001_index_press_low_x5_left · frame 28 · cam-d · 头戴 RGB-D 相机 · CC-BY-NC-SA-4.0;Zhao, Kwon, Streli, Pollefeys, Holz;MANO: Romero et al.;仅渲染图",
59
+ "source": "RGB + 官方拟合 MANO 网格(团队图册 2026-10-22)"
60
+ },
61
+ {
62
+ "rgb": "media/egopressure/team_egopressure_1_rgb.jpg",
63
+ "gt": "media/egopressure/team_egopressure_1_gt.jpg",
64
+ "caption": "p_002_pinch_thumb-down_high_5x_left · frame 248 · cam-d · 头戴 RGB-D 相机 · CC-BY-NC-SA-4.0;Zhao, Kwon, Streli, Pollefeys, Holz;MANO: Romero et al.;仅渲染图",
65
+ "source": "RGB + 官方拟合 MANO 网格(团队图册 2026-10-22)"
66
+ },
67
+ {
68
+ "rgb": "media/egopressure/team_egopressure_2_rgb.jpg",
69
+ "gt": "media/egopressure/team_egopressure_2_gt.jpg",
70
+ "caption": "p_003_press_fingers_high_5x_right · frame 115 · cam-d · 头戴 RGB-D 相机 · CC-BY-NC-SA-4.0;Zhao, Kwon, Streli, Pollefeys, Holz;MANO: Romero et al.;仅渲染图",
71
+ "source": "RGB + 官方拟合 MANO 网格(团队图册 2026-10-22)"
72
+ },
73
+ {
74
+ "rgb": "media/egopressure/team_egopressure_3_rgb.jpg",
75
+ "gt": "media/egopressure/team_egopressure_3_gt.jpg",
76
+ "caption": "p_004_type_ipad_5x_right · frame 291 · cam-d · 头戴 RGB-D 相机 · CC-BY-NC-SA-4.0;Zhao, Kwon, Streli, Pollefeys, Holz;MANO: Romero et al.;仅渲染图",
77
+ "source": "RGB + 官方拟合 MANO 网格(团队图册 2026-10-22)"
78
+ }
79
+ ],
80
+ "egoverse": [
81
+ {
82
+ "rgb": "media/egoverse/team_egoverse_0_rgb.jpg",
83
+ "gt": "media/egoverse/team_egoverse_0_gt.jpg",
84
+ "caption": "2025-09-20-18-44-29-000000 / frame 60 · Aria · front_1 · CC BY-SA 4.0 · RL2 / EgoVerse",
85
+ "source": "RGB + 官方 Aria 3D 关键点投影(估计标签)(团队图册 2026-10-22)"
86
+ },
87
+ {
88
+ "rgb": "media/egoverse/team_egoverse_1_rgb.jpg",
89
+ "gt": "media/egoverse/team_egoverse_1_gt.jpg",
90
+ "caption": "2025-09-20-18-44-29-000000 / frame 150 · Aria · front_1 · CC BY-SA 4.0 · RL2 / EgoVerse",
91
+ "source": "RGB + 官方 Aria 3D 关键点投影(估计标签)(团队图册 2026-10-22)"
92
+ },
93
+ {
94
+ "rgb": "media/egoverse/team_egoverse_2_rgb.jpg",
95
+ "gt": "media/egoverse/team_egoverse_2_gt.jpg",
96
+ "caption": "2025-09-20-18-44-29-000000 / frame 300 · Aria · front_1 · CC BY-SA 4.0 · RL2 / EgoVerse",
97
+ "source": "RGB + 官方 Aria 3D 关键点投影(估计标签)(团队图册 2026-10-22)"
98
+ },
99
+ {
100
+ "rgb": "media/egoverse/team_egoverse_3_rgb.jpg",
101
+ "gt": "media/egoverse/team_egoverse_3_gt.jpg",
102
+ "caption": "2025-09-20-18-44-29-000000 / frame 600 · Aria · front_1 · CC BY-SA 4.0 · RL2 / EgoVerse",
103
+ "source": "RGB + 官方 Aria 3D 关键点投影(估计标签)(团队图册 2026-10-22)"
104
+ }
105
+ ],
106
+ "hocap": [
107
+ {
108
+ "rgb": "media/hocap/team_hocap_0_rgb.jpg",
109
+ "gt": "media/hocap/team_hocap_0_gt.jpg",
110
+ "caption": "subject_7-20231022_192832 · frame 45 · HoloLens 第一视角 RGB · CC-BY-4.0;署名 Jikai Wang 等;已抽帧并叠加",
111
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
112
+ },
113
+ {
114
+ "rgb": "media/hocap/team_hocap_1_rgb.jpg",
115
+ "gt": "media/hocap/team_hocap_1_gt.jpg",
116
+ "caption": "subject_7-20231022_192832 · frame 175 · HoloLens 第一视角 RGB · CC-BY-4.0;署名 Jikai Wang 等;已抽帧并叠加",
117
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
118
+ },
119
+ {
120
+ "rgb": "media/hocap/team_hocap_2_rgb.jpg",
121
+ "gt": "media/hocap/team_hocap_2_gt.jpg",
122
+ "caption": "subject_7-20231022_192832 · frame 240 · HoloLens 第一视角 RGB · CC-BY-4.0;署名 Jikai Wang 等;已抽帧并叠加",
123
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
124
+ },
125
+ {
126
+ "rgb": "media/hocap/team_hocap_3_rgb.jpg",
127
+ "gt": "media/hocap/team_hocap_3_gt.jpg",
128
+ "caption": "subject_7-20231022_192832 · frame 370 · HoloLens 第一视角 RGB · CC-BY-4.0;署名 Jikai Wang 等;已抽帧并叠加",
129
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
130
+ }
131
+ ],
132
+ "interhand": [
133
+ {
134
+ "rgb": "media/interhand/interhand_test_C1_f27268_right_cam400375_rgb.jpg",
135
+ "gt": "media/interhand/interhand_test_C1_f27268_right_cam400375_gt.jpg",
136
+ "caption": "ROM07_Rt_Finger_Occlusions · 帧 27268 · 右手 · test",
137
+ "source": "MANO(团队图册 2026-10-13)"
138
+ },
139
+ {
140
+ "rgb": "media/interhand/interhand_test_C1_f27502_right_cam400375_rgb.jpg",
141
+ "gt": "media/interhand/interhand_test_C1_f27502_right_cam400375_gt.jpg",
142
+ "caption": "ROM07_Rt_Finger_Occlusions · 帧 27502 · 右手 · test",
143
+ "source": "MANO(团队图册 2026-10-13)"
144
+ },
145
+ {
146
+ "rgb": "media/interhand/interhand_test_C1_f28108_right_cam400285_rgb.jpg",
147
+ "gt": "media/interhand/interhand_test_C1_f28108_right_cam400285_gt.jpg",
148
+ "caption": "ROM07_Rt_Finger_Occlusions · 帧 28108 · 右手 · test",
149
+ "source": "MANO(团队图册 2026-10-13)"
150
+ },
151
+ {
152
+ "rgb": "media/interhand/interhand_test_C1_f27376_right_cam400285_rgb.jpg",
153
+ "gt": "media/interhand/interhand_test_C1_f27376_right_cam400285_gt.jpg",
154
+ "caption": "ROM07_Rt_Finger_Occlusions · 帧 27376 · 右手 · test",
155
+ "source": "MANO(团队图册 2026-10-13)"
156
+ }
157
+ ],
158
+ "mpiinzsl": [
159
+ {
160
+ "rgb": "media/mpiinzsl/mpiinzsl_025270786_01_l_native2d_rgb.jpg",
161
+ "gt": "media/mpiinzsl/mpiinzsl_025270786_01_l_native2d_gt.jpg",
162
+ "caption": "静态图像 · 帧 025270786.jpg · 左手 · manual_train",
163
+ "source": "2D(团队图册 2026-10-13)"
164
+ },
165
+ {
166
+ "rgb": "media/mpiinzsl/mpiinzsl_047704994_01_r_native2d_rgb.jpg",
167
+ "gt": "media/mpiinzsl/mpiinzsl_047704994_01_r_native2d_gt.jpg",
168
+ "caption": "静态图像 · 帧 047704994.jpg · 右手 · manual_train",
169
+ "source": "2D(团队图册 2026-10-13)"
170
+ },
171
+ {
172
+ "rgb": "media/mpiinzsl/mpiinzsl_Ricki_unit_8_flv_000040_l_native2d_rgb.jpg",
173
+ "gt": "media/mpiinzsl/mpiinzsl_Ricki_unit_8_flv_000040_l_native2d_gt.jpg",
174
+ "caption": "静态图像 · 帧 Ricki_unit_8.flv_000040 · 左手 · manual_train",
175
+ "source": "2D(团队图册 2026-10-13)"
176
+ },
177
+ {
178
+ "rgb": "media/mpiinzsl/mpiinzsl_Jackie_unit_10_flv_000118_r_native2d_rgb.jpg",
179
+ "gt": "media/mpiinzsl/mpiinzsl_Jackie_unit_10_flv_000118_r_native2d_gt.jpg",
180
+ "caption": "静态图像 · 帧 Jackie_unit_10.flv_000118 · 右手 · manual_train",
181
+ "source": "2D(团队图册 2026-10-13)"
182
+ }
183
+ ],
184
+ "openaoe": [
185
+ {
186
+ "rgb": "media/openaoe/team_openaoe_0_rgb.jpg",
187
+ "gt": "media/openaoe/team_openaoe_0_gt.jpg",
188
+ "caption": "aoe_20260131_193028_p000 · frame 400 · 第一视角 RGB(官方去畸变) · Open-AoE Dataset License;仅发布抽帧与叠加图",
189
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
190
+ },
191
+ {
192
+ "rgb": "media/openaoe/team_openaoe_1_rgb.jpg",
193
+ "gt": "media/openaoe/team_openaoe_1_gt.jpg",
194
+ "caption": "aoe_20260131_193028_p000 · frame 1800 · 第一视角 RGB(官方去畸变) · Open-AoE Dataset License;仅发布抽帧与叠加图",
195
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
196
+ },
197
+ {
198
+ "rgb": "media/openaoe/team_openaoe_2_rgb.jpg",
199
+ "gt": "media/openaoe/team_openaoe_2_gt.jpg",
200
+ "caption": "aoe_20260131_193028_p000 · frame 2600 · 第一视角 RGB(官方去畸变) · Open-AoE Dataset License;仅发布抽帧与叠加图",
201
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
202
+ },
203
+ {
204
+ "rgb": "media/openaoe/team_openaoe_3_rgb.jpg",
205
+ "gt": "media/openaoe/team_openaoe_3_gt.jpg",
206
+ "caption": "aoe_20260131_193028_p000 · frame 4300 · 第一视角 RGB(官方去畸变) · Open-AoE Dataset License;仅发布抽帧与叠加图",
207
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
208
+ }
209
+ ],
210
+ "show3d": [
211
+ {
212
+ "rgb": "media/show3d/team_show3d_0_rgb.jpg",
213
+ "gt": "media/show3d/team_show3d_0_gt.jpg",
214
+ "caption": "ASC023/aria_inspecting_f5e9 · frame 100 · headset0 · CC-BY-NC-4.0;缩放/裁出对应相机",
215
+ "source": "原图 + 官方 MANO mesh(团队图册 2026-10-22)"
216
+ },
217
+ {
218
+ "rgb": "media/show3d/team_show3d_1_rgb.jpg",
219
+ "gt": "media/show3d/team_show3d_1_gt.jpg",
220
+ "caption": "LSU826/cancoke_opening_d68c · frame 1492 · headset0 · 单色 ego · CC-BY-NC-4.0;Meta SHOW3D;裁出对应相机、缩放",
221
+ "source": "原图 + 官方 MANO mesh(团队图册 2026-10-22)"
222
+ },
223
+ {
224
+ "rgb": "media/show3d/team_show3d_2_rgb.jpg",
225
+ "gt": "media/show3d/team_show3d_2_gt.jpg",
226
+ "caption": "HLU829/keyboard2_clean-keyboard_1d3c · frame 2088 · headset1 · 单色 ego · CC-BY-NC-4.0;Meta SHOW3D;裁出对应相机、缩放",
227
+ "source": "原图 + 官方 MANO mesh(团队图册 2026-10-22)"
228
+ },
229
+ {
230
+ "rgb": "media/show3d/team_show3d_3_rgb.jpg",
231
+ "gt": "media/show3d/team_show3d_3_gt.jpg",
232
+ "caption": "PRI519/balandabowl_covering-uncovering_1178 · frame 2386 · headset1 · 单色 ego · CC-BY-NC-4.0;Meta SHOW3D;裁出对应相机、缩放",
233
+ "source": "原图 + 官方 MANO mesh(团队图册 2026-10-22)"
234
+ }
235
+ ],
236
+ "taco": [
237
+ {
238
+ "rgb": "media/taco/team_taco_0_rgb.jpg",
239
+ "gt": "media/taco/team_taco_0_gt.jpg",
240
+ "caption": "(brush, brush, box) · 20230930_038 · frame 26 · 头戴 ego RGB · CC-BY-4.0;署名 Yun Liu 等;已抽帧并叠加",
241
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
242
+ },
243
+ {
244
+ "rgb": "media/taco/team_taco_1_rgb.jpg",
245
+ "gt": "media/taco/team_taco_1_gt.jpg",
246
+ "caption": "(brush, brush, box) · 20230930_038 · frame 106 · 头戴 ego RGB · CC-BY-4.0;署名 Yun Liu 等;已抽帧并叠加",
247
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
248
+ },
249
+ {
250
+ "rgb": "media/taco/team_taco_2_rgb.jpg",
251
+ "gt": "media/taco/team_taco_2_gt.jpg",
252
+ "caption": "(stir, spoon, bowl) · 20231104_190 · frame 26 · 头戴 ego RGB · CC-BY-4.0;署名 Yun Liu 等;已抽帧并叠加",
253
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
254
+ },
255
+ {
256
+ "rgb": "media/taco/team_taco_3_rgb.jpg",
257
+ "gt": "media/taco/team_taco_3_gt.jpg",
258
+ "caption": "(stir, spoon, bowl) · 20231104_190 · frame 105 · 头戴 ego RGB · CC-BY-4.0;署名 Yun Liu 等;已抽帧并叠加",
259
+ "source": "RGB + 官方 MANO 拟合标注(团队图册 2026-10-22)"
260
+ }
261
+ ],
262
+ "xperience": [
263
+ {
264
+ "rgb": "media/xperience/team_xperience_0_rgb.jpg",
265
+ "gt": "media/xperience/team_xperience_0_gt.jpg",
266
+ "caption": "coffee sample · frame 500 · stereo_left · CC-BY-NC-4.0;MANO 解码/投影",
267
+ "source": "RGB + 官方 MANO mesh(团队图册 2026-10-22)"
268
+ },
269
+ {
270
+ "rgb": "media/xperience/team_xperience_1_rgb.jpg",
271
+ "gt": "media/xperience/team_xperience_1_gt.jpg",
272
+ "caption": "coffee sample · frame 1500 · stereo_left · CC-BY-NC-4.0;MANO 解码/投影",
273
+ "source": "RGB + 官方 MANO mesh(团队图册 2026-10-22)"
274
+ },
275
+ {
276
+ "rgb": "media/xperience/team_xperience_2_rgb.jpg",
277
+ "gt": "media/xperience/team_xperience_2_gt.jpg",
278
+ "caption": "coffee sample · frame 3000 · stereo_left · CC-BY-NC-4.0;MANO 解码/投影",
279
+ "source": "RGB + 官方 MANO mesh(团队图册 2026-10-22)"
280
+ },
281
+ {
282
+ "rgb": "media/xperience/team_xperience_3_rgb.jpg",
283
+ "gt": "media/xperience/team_xperience_3_gt.jpg",
284
+ "caption": "coffee sample · frame 4500 · stereo_left · CC-BY-NC-4.0;MANO 解码/投影",
285
+ "source": "RGB + 官方 MANO mesh(团队图册 2026-10-22)"
286
+ }
287
+ ],
288
+ "arctic": [
289
+ {
290
+ "rgb": "media/arctic/a213dd95256ccccad7bc_rgb.jpg",
291
+ "gt": "media/arctic/a213dd95256ccccad7bc_gt.jpg",
292
+ "caption": "s02/ketchup_use_02 · 帧 212 · 左手 · train",
293
+ "source": "MANO(团队图册 2026-10-13)"
294
+ },
295
+ {
296
+ "rgb": "media/arctic/6057bab38e74308c02be_rgb.jpg",
297
+ "gt": "media/arctic/6057bab38e74308c02be_gt.jpg",
298
+ "caption": "s06/ketchup_use_01 · 帧 511 · 右手 · train",
299
+ "source": "MANO(团队图册 2026-10-13)"
300
+ },
301
+ {
302
+ "rgb": "media/arctic/c4d53a1b79549c84e96d_rgb.jpg",
303
+ "gt": "media/arctic/c4d53a1b79549c84e96d_gt.jpg",
304
+ "caption": "s08/ketchup_use_01 · 帧 451 · 右手 · train",
305
+ "source": "MANO(团队图册 2026-10-13)"
306
+ },
307
+ {
308
+ "rgb": "media/arctic/e68425daa275c68f6f5d_rgb.jpg",
309
+ "gt": "media/arctic/e68425daa275c68f6f5d_gt.jpg",
310
+ "caption": "s10/ketchup_use_01 · 帧 451 · 右手 · train",
311
+ "source": "MANO(团队图册 2026-10-13)"
312
+ }
313
+ ],
314
+ "cocowb": [
315
+ {
316
+ "rgb": "media/cocowb/f59aa0ba82e64839e596_rgb.jpg",
317
+ "gt": "media/cocowb/f59aa0ba82e64839e596_gt.jpg",
318
+ "caption": "COCO validation · 帧 785 · 右手 · official validation example; not WiLoR processed train members; excluded from training candidates",
319
+ "source": "2D(团队图册 2026-10-13)"
320
+ },
321
+ {
322
+ "rgb": "media/cocowb/9fcab59ec353483a0635_rgb.jpg",
323
+ "gt": "media/cocowb/9fcab59ec353483a0635_gt.jpg",
324
+ "caption": "COCO validation · 帧 1000 · 左手 · official validation example; not WiLoR processed train members; excluded from training candidates",
325
+ "source": "2D(团队图册 2026-10-13)"
326
+ },
327
+ {
328
+ "rgb": "media/cocowb/780684ce08a2af76ddc4_rgb.jpg",
329
+ "gt": "media/cocowb/780684ce08a2af76ddc4_gt.jpg",
330
+ "caption": "COCO validation · 帧 196141 · 左手 · official validation example; not WiLoR processed train members; excluded from training candidates",
331
+ "source": "2D(团队图册 2026-10-13)"
332
+ },
333
+ {
334
+ "rgb": "media/cocowb/7e7716c112039185cc5e_rgb.jpg",
335
+ "gt": "media/cocowb/7e7716c112039185cc5e_gt.jpg",
336
+ "caption": "COCO validation · 帧 197388 · 左手 · official validation example; not WiLoR processed train members; excluded from training candidates",
337
+ "source": "2D(团队图册 2026-10-13)"
338
+ }
339
+ ],
340
+ "dexycb": [
341
+ {
342
+ "rgb": "media/dexycb/a128fbe7b45844ebb4e8_rgb.jpg",
343
+ "gt": "media/dexycb/a128fbe7b45844ebb4e8_gt.jpg",
344
+ "caption": "20200709-subject-01/20200709_141841 · 帧 36 · 右手 · official_s0_train_proxy",
345
+ "source": "MANO(团队图册 2026-10-13)"
346
+ },
347
+ {
348
+ "rgb": "media/dexycb/8ffc14f49fff4b06cc73_rgb.jpg",
349
+ "gt": "media/dexycb/8ffc14f49fff4b06cc73_gt.jpg",
350
+ "caption": "20200820-subject-03/20200820_144644 · 帧 62 · 左手 · official_s0_train_proxy",
351
+ "source": "MANO(团队图册 2026-10-13)"
352
+ },
353
+ {
354
+ "rgb": "media/dexycb/6df9d4ead4d92a187a28_rgb.jpg",
355
+ "gt": "media/dexycb/6df9d4ead4d92a187a28_gt.jpg",
356
+ "caption": "20200903-subject-04/20200903_105306 · 帧 60 · 左手 · official_s0_train_proxy",
357
+ "source": "MANO(团队图册 2026-10-13)"
358
+ },
359
+ {
360
+ "rgb": "media/dexycb/7e32dcf09cb0a2254256_rgb.jpg",
361
+ "gt": "media/dexycb/7e32dcf09cb0a2254256_gt.jpg",
362
+ "caption": "20200928-subject-07/20200928_155118 · 帧 62 · 左手 · official_s0_train_proxy",
363
+ "source": "MANO(团队图册 2026-10-13)"
364
+ }
365
+ ],
366
+ "egorenderer": [
367
+ {
368
+ "rgb": "media/egorenderer/egorenderer_v005_s7_camera_browse_1_110_rgb.jpg",
369
+ "gt": "media/egorenderer/egorenderer_v005_s7_camera_browse_1_110_gt.jpg",
370
+ "caption": "s7/camera_browse_1 · 帧 110 · 已交付合成数据",
371
+ "source": "MANO 拟合(团队图册 2026-10-13)"
372
+ },
373
+ {
374
+ "rgb": "media/egorenderer/egorenderer_v005_s1_mug_drink_1_233_rgb.jpg",
375
+ "gt": "media/egorenderer/egorenderer_v005_s1_mug_drink_1_233_gt.jpg",
376
+ "caption": "s1/mug_drink_1 · 帧 233 · 已交付合成数据",
377
+ "source": "MANO 拟合(团队图册 2026-10-13)"
378
+ },
379
+ {
380
+ "rgb": "media/egorenderer/egorenderer_v005_s6_banana_peel_1_104_rgb.jpg",
381
+ "gt": "media/egorenderer/egorenderer_v005_s6_banana_peel_1_104_gt.jpg",
382
+ "caption": "s6/banana_peel_1 · 帧 104 · 已交付合成数据",
383
+ "source": "MANO 拟合(团队图册 2026-10-13)"
384
+ },
385
+ {
386
+ "rgb": "media/egorenderer/egorenderer_v005_s2_banana_peel_1_197_rgb.jpg",
387
+ "gt": "media/egorenderer/egorenderer_v005_s2_banana_peel_1_197_gt.jpg",
388
+ "caption": "s2/banana_peel_1 · 帧 197 · 已交付合成数据",
389
+ "source": "MANO 拟合(团队图册 2026-10-13)"
390
+ }
391
+ ],
392
+ "freihand": [
393
+ {
394
+ "rgb": "media/freihand/57c00fd54a204e690012_rgb.jpg",
395
+ "gt": "media/freihand/57c00fd54a204e690012_gt.jpg",
396
+ "caption": "image_6909 · 帧 6909 · 右手 · official_v2_training_proxy",
397
+ "source": "MANO(团队图册 2026-10-13)"
398
+ },
399
+ {
400
+ "rgb": "media/freihand/f66e6163a5a36bdd5ece_rgb.jpg",
401
+ "gt": "media/freihand/f66e6163a5a36bdd5ece_gt.jpg",
402
+ "caption": "image_17057 · 帧 17057 · 右手 · official_v2_training_proxy",
403
+ "source": "MANO(团队图册 2026-10-13)"
404
+ },
405
+ {
406
+ "rgb": "media/freihand/0172018ef83c148a9a1c_rgb.jpg",
407
+ "gt": "media/freihand/0172018ef83c148a9a1c_gt.jpg",
408
+ "caption": "image_8002 · 帧 8002 · 右手 · official_v2_training_proxy",
409
+ "source": "MANO(团队图册 2026-10-13)"
410
+ },
411
+ {
412
+ "rgb": "media/freihand/5d4682d7be033bd1ed70_rgb.jpg",
413
+ "gt": "media/freihand/5d4682d7be033bd1ed70_gt.jpg",
414
+ "caption": "image_8614 · 帧 8614 · 右手 · official_v2_training_proxy",
415
+ "source": "MANO(团队图册 2026-10-13)"
416
+ }
417
+ ],
418
+ "genhumanego": [
419
+ {
420
+ "rgb": "media/genhumanego/team_gen-humanego_0_rgb.jpg",
421
+ "gt": "media/genhumanego/team_gen-humanego_0_gt.jpg",
422
+ "caption": "ee7adccdba994d8fbc1405d6e3f04edf · frame 30 · 1779872474945466000 ns · camera0 · CC-BY-SA-4.0;MANO 解码/投影/缩放",
423
+ "source": "RGB + 官方预测 MANO mesh(团队图册 2026-10-22)"
424
+ },
425
+ {
426
+ "rgb": "media/genhumanego/team_gen-humanego_1_rgb.jpg",
427
+ "gt": "media/genhumanego/team_gen-humanego_1_gt.jpg",
428
+ "caption": "ee7adccdba994d8fbc1405d6e3f04edf · frame 30 · 1779872474945456000 ns · camera2 · CC-BY-SA-4.0;MANO 解码/投影/缩放",
429
+ "source": "RGB + 官方预测 MANO mesh(团队图册 2026-10-22)"
430
+ },
431
+ {
432
+ "rgb": "media/genhumanego/team_gen-humanego_2_rgb.jpg",
433
+ "gt": "media/genhumanego/team_gen-humanego_2_gt.jpg",
434
+ "caption": "ee7adccdba994d8fbc1405d6e3f04edf · frame 150 · 1779872478945455000 ns · camera2 · CC-BY-SA-4.0;MANO 解码/投影/缩放",
435
+ "source": "RGB + 官方预测 MANO mesh(团队图册 2026-10-22)"
436
+ },
437
+ {
438
+ "rgb": "media/genhumanego/team_gen-humanego_3_rgb.jpg",
439
+ "gt": "media/genhumanego/team_gen-humanego_3_gt.jpg",
440
+ "caption": "ee7adccdba994d8fbc1405d6e3f04edf · frame 150 · 1779872478912150000 ns · camera4 · CC-BY-SA-4.0;MANO 解码/投影/缩放",
441
+ "source": "RGB + 官方预测 MANO mesh(团队图册 2026-10-22)"
442
+ }
443
+ ],
444
+ "h2o": [
445
+ {
446
+ "rgb": "media/h2o/a11122e7dd03fe259404_rgb.jpg",
447
+ "gt": "media/h2o/a11122e7dd03fe259404_gt.jpg",
448
+ "caption": "subject1/h2/6/cam4 · 帧 159 · 右手 · train",
449
+ "source": "MANO(团队图册 2026-10-13)"
450
+ },
451
+ {
452
+ "rgb": "media/h2o/09a705df66acd8de1d4c_rgb.jpg",
453
+ "gt": "media/h2o/09a705df66acd8de1d4c_gt.jpg",
454
+ "caption": "subject1/o1/4/cam4 · 帧 138 · 右手 · train",
455
+ "source": "MANO(团队图册 2026-10-13)"
456
+ },
457
+ {
458
+ "rgb": "media/h2o/f7c2550200511fea07b1_rgb.jpg",
459
+ "gt": "media/h2o/f7c2550200511fea07b1_gt.jpg",
460
+ "caption": "subject1/o1/7/cam4 · 帧 688 · 右手 · train",
461
+ "source": "MANO(团队图册 2026-10-13)"
462
+ },
463
+ {
464
+ "rgb": "media/h2o/a2a8c1c9e2b969d45ef4_rgb.jpg",
465
+ "gt": "media/h2o/a2a8c1c9e2b969d45ef4_gt.jpg",
466
+ "caption": "subject1/o2/0/cam4 · 帧 30 · 左手 · train",
467
+ "source": "MANO(团队图册 2026-10-13)"
468
+ }
469
+ ],
470
+ "h2o3d": [
471
+ {
472
+ "rgb": "media/h2o3d/h2o3d_train_MBC1_0104_rgb.jpg",
473
+ "gt": "media/h2o3d/h2o3d_train_MBC1_0104_gt.jpg",
474
+ "caption": "MBC1 · 帧 0104 · train",
475
+ "source": "MANO(团队图册 2026-10-13)"
476
+ },
477
+ {
478
+ "rgb": "media/h2o3d/h2o3d_train_SHM0_0179_rgb.jpg",
479
+ "gt": "media/h2o3d/h2o3d_train_SHM0_0179_gt.jpg",
480
+ "caption": "SHM0 · 帧 0179 · train",
481
+ "source": "MANO(团队图册 2026-10-13)"
482
+ },
483
+ {
484
+ "rgb": "media/h2o3d/h2o3d_train_SMB20_0218_rgb.jpg",
485
+ "gt": "media/h2o3d/h2o3d_train_SMB20_0218_gt.jpg",
486
+ "caption": "SMB20 · 帧 0218 · train",
487
+ "source": "MANO(团队图册 2026-10-13)"
488
+ },
489
+ {
490
+ "rgb": "media/h2o3d/h2o3d_train_SSPD0_0427_rgb.jpg",
491
+ "gt": "media/h2o3d/h2o3d_train_SSPD0_0427_gt.jpg",
492
+ "caption": "SSPD0 · 帧 0427 · train",
493
+ "source": "MANO(团队图册 2026-10-13)"
494
+ }
495
+ ],
496
+ "halpe": [
497
+ {
498
+ "rgb": "media/halpe/halpe_val_398905_485625_left_native2d_rgb.jpg",
499
+ "gt": "media/halpe/halpe_val_398905_485625_left_native2d_gt.jpg",
500
+ "caption": "静态图像 · 帧 398905 · 左手 · validation",
501
+ "source": "2D(团队图册 2026-10-13)"
502
+ },
503
+ {
504
+ "rgb": "media/halpe/halpe_val_281032_458683_left_native2d_rgb.jpg",
505
+ "gt": "media/halpe/halpe_val_281032_458683_left_native2d_gt.jpg",
506
+ "caption": "静态图像 · 帧 281032 · 左手 · validation",
507
+ "source": "2D(团队图册 2026-10-13)"
508
+ },
509
+ {
510
+ "rgb": "media/halpe/halpe_val_465179_514707_right_native2d_rgb.jpg",
511
+ "gt": "media/halpe/halpe_val_465179_514707_right_native2d_gt.jpg",
512
+ "caption": "静态图像 · 帧 465179 · 右手 · validation",
513
+ "source": "2D(团队图册 2026-10-13)"
514
+ },
515
+ {
516
+ "rgb": "media/halpe/halpe_val_3156_477234_right_native2d_rgb.jpg",
517
+ "gt": "media/halpe/halpe_val_3156_477234_right_native2d_gt.jpg",
518
+ "caption": "静态图像 · 帧 3156 · 右手 · validation",
519
+ "source": "2D(团队图册 2026-10-13)"
520
+ }
521
+ ],
522
+ "ho3d": [
523
+ {
524
+ "rgb": "media/ho3d/0d33dbb3cbe2379785a2_rgb.jpg",
525
+ "gt": "media/ho3d/0d33dbb3cbe2379785a2_gt.jpg",
526
+ "caption": "BB1 · 帧 572 · 右手 · v3_train_proxy",
527
+ "source": "MANO(团队图册 2026-10-13)"
528
+ },
529
+ {
530
+ "rgb": "media/ho3d/fa5f136813986a79dd61_rgb.jpg",
531
+ "gt": "media/ho3d/fa5f136813986a79dd61_gt.jpg",
532
+ "caption": "MC · 帧 0 · 右手 · v3_train_proxy",
533
+ "source": "MANO(团队图册 2026-10-13)"
534
+ },
535
+ {
536
+ "rgb": "media/ho3d/95d8470bf5dd56fde1c2_rgb.jpg",
537
+ "gt": "media/ho3d/95d8470bf5dd56fde1c2_gt.jpg",
538
+ "caption": "ND · 帧 703 · 右手 · v3_train_proxy",
539
+ "source": "MANO(团队图册 2026-10-13)"
540
+ },
541
+ {
542
+ "rgb": "media/ho3d/377560e17ccaf120f789_rgb.jpg",
543
+ "gt": "media/ho3d/377560e17ccaf120f789_gt.jpg",
544
+ "caption": "SMu · 帧 1264 · 右手 · v3_train_proxy",
545
+ "source": "MANO(团队图册 2026-10-13)"
546
+ }
547
+ ],
548
+ "hot3d": [
549
+ {
550
+ "rgb": "media/hot3d/e240c578abc5d1f941da_rgb.jpg",
551
+ "gt": "media/hot3d/e240c578abc5d1f941da_gt.jpg",
552
+ "caption": "P0002_59a84a3a · 帧 3416 · 左手 · train",
553
+ "source": "MANO(团队图册 2026-10-13)"
554
+ },
555
+ {
556
+ "rgb": "media/hot3d/9984faeda44316bef1a4_rgb.jpg",
557
+ "gt": "media/hot3d/9984faeda44316bef1a4_gt.jpg",
558
+ "caption": "P0012_af3dab9a · 帧 3470 · 左手 · train",
559
+ "source": "MANO(团队图册 2026-10-13)"
560
+ },
561
+ {
562
+ "rgb": "media/hot3d/cff8bd8ba9c8484f34a8_rgb.jpg",
563
+ "gt": "media/hot3d/cff8bd8ba9c8484f34a8_gt.jpg",
564
+ "caption": "P0015_3f46732d · 帧 1705 · 左手 · train",
565
+ "source": "MANO(团队图册 2026-10-13)"
566
+ },
567
+ {
568
+ "rgb": "media/hot3d/b0bdc415670d0451624f_rgb.jpg",
569
+ "gt": "media/hot3d/b0bdc415670d0451624f_gt.jpg",
570
+ "caption": "P0015_53358a64 · 帧 3146 · 右手 · train",
571
+ "source": "MANO(团队图册 2026-10-13)"
572
+ }
573
+ ],
574
+ "mtc": [
575
+ {
576
+ "rgb": "media/mtc/mtc_171204_pose2_f00023680_p4_right_0_rgb.jpg",
577
+ "gt": "media/mtc/mtc_171204_pose2_f00023680_p4_right_0_gt.jpg",
578
+ "caption": "171204_pose2 · 帧 23680 · 右手 · training_data",
579
+ "source": "3D → 2D(团队图册 2026-10-13)"
580
+ },
581
+ {
582
+ "rgb": "media/mtc/mtc_171204_pose2_f00023680_p4_right_6_rgb.jpg",
583
+ "gt": "media/mtc/mtc_171204_pose2_f00023680_p4_right_6_gt.jpg",
584
+ "caption": "171204_pose2 · 帧 23680 · 右手 · training_data",
585
+ "source": "3D → 2D(团队图册 2026-10-13)"
586
+ },
587
+ {
588
+ "rgb": "media/mtc/mtc_171204_pose2_f00028165_p5_right_3_rgb.jpg",
589
+ "gt": "media/mtc/mtc_171204_pose2_f00028165_p5_right_3_gt.jpg",
590
+ "caption": "171204_pose2 · 帧 28165 · 右手 · training_data",
591
+ "source": "3D → 2D(团队图册 2026-10-13)"
592
+ },
593
+ {
594
+ "rgb": "media/mtc/mtc_171204_pose2_f00028165_p5_right_12_rgb.jpg",
595
+ "gt": "media/mtc/mtc_171204_pose2_f00028165_p5_right_12_gt.jpg",
596
+ "caption": "171204_pose2 · 帧 28165 · 右手 · training_data",
597
+ "source": "3D → 2D(团队图册 2026-10-13)"
598
+ }
599
+ ],
600
+ "reinterhand": [
601
+ {
602
+ "rgb": "media/reinterhand/reinter_train_c0_f175271_right_400503_rgb.jpg",
603
+ "gt": "media/reinterhand/reinter_train_c0_f175271_right_400503_gt.jpg",
604
+ "caption": "m--20210701--1058--0000000--pilot--relightablehandsy--participant0--two-hands · 帧 175271 · 右手 · train",
605
+ "source": "3D → 2D(团队图册 2026-10-13)"
606
+ },
607
+ {
608
+ "rgb": "media/reinterhand/reinter_train_c0_f202212_right_400503_rgb.jpg",
609
+ "gt": "media/reinterhand/reinter_train_c0_f202212_right_400503_gt.jpg",
610
+ "caption": "m--20210701--1058--0000000--pilot--relightablehandsy--participant0--two-hands · 帧 202212 · 右手 · train",
611
+ "source": "3D → 2D(团队图册 2026-10-13)"
612
+ },
613
+ {
614
+ "rgb": "media/reinterhand/reinter_train_c0_f292944_right_400503_rgb.jpg",
615
+ "gt": "media/reinterhand/reinter_train_c0_f292944_right_400503_gt.jpg",
616
+ "caption": "m--20210701--1058--0000000--pilot--relightablehandsy--participant0--two-hands · 帧 292944 · 右手 · train",
617
+ "source": "3D → 2D(团队图册 2026-10-13)"
618
+ },
619
+ {
620
+ "rgb": "media/reinterhand/reinter_train_c0_f303030_right_400503_rgb.jpg",
621
+ "gt": "media/reinterhand/reinter_train_c0_f303030_right_400503_gt.jpg",
622
+ "caption": "m--20210701--1058--0000000--pilot--relightablehandsy--participant0--two-hands · 帧 303030 · 右手 · train",
623
+ "source": "3D → 2D(团队图册 2026-10-13)"
624
+ }
625
+ ],
626
+ "rhd": [
627
+ {
628
+ "rgb": "media/rhd/5807bcc820cac79abd07_rgb.jpg",
629
+ "gt": "media/rhd/5807bcc820cac79abd07_gt.jpg",
630
+ "caption": "image_30087 · 帧 30087 · 左手 · official_v1.1_training_proxy",
631
+ "source": "3D → 2D(团队图册 2026-10-13)"
632
+ },
633
+ {
634
+ "rgb": "media/rhd/0941a85c7723f23e66bc_rgb.jpg",
635
+ "gt": "media/rhd/0941a85c7723f23e66bc_gt.jpg",
636
+ "caption": "image_33342 · 帧 33342 · 右手 · official_v1.1_training_proxy",
637
+ "source": "3D → 2D(团队图册 2026-10-13)"
638
+ },
639
+ {
640
+ "rgb": "media/rhd/a8db512d6c52ae380d21_rgb.jpg",
641
+ "gt": "media/rhd/a8db512d6c52ae380d21_gt.jpg",
642
+ "caption": "image_13893 · 帧 13893 · 左手 · official_v1.1_training_proxy",
643
+ "source": "3D → 2D(团队图册 2026-10-13)"
644
+ },
645
+ {
646
+ "rgb": "media/rhd/14514fa31d01d7d4624b_rgb.jpg",
647
+ "gt": "media/rhd/14514fa31d01d7d4624b_gt.jpg",
648
+ "caption": "image_29917 · 帧 29917 · 左手 · official_v1.1_training_proxy",
649
+ "source": "3D → 2D(团队图册 2026-10-13)"
650
+ }
651
+ ]
652
+ }
index.html CHANGED
@@ -10,7 +10,7 @@
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Noto+Sans+SC:wght@400;500;700&family=Noto+Serif+SC:wght@600;700&display=swap">
12
  <style>
13
- /* 布局:顶部标签导航 + 单栏工作区;总览是「标注方法 × 数据来源」矩阵,行按 shape 真值可信度从高到低排 */
14
  :root {
15
  --bg: #f4f6f8;
16
  --surface: #ffffff;
@@ -18,7 +18,7 @@
18
  --ink: #17212b;
19
  --muted: #5a6573;
20
  --line: #d9dfe6;
21
- --accent: #a8560a; /* 反光 marker 的琥珀色,用于 P0 和当前项 */
22
  --accent-soft: #fbead7;
23
  --link: #1d4f8f;
24
  --t1: #0c3d5c; --t2: #1f6488; --t3: #4d8fb0; --t4: #8bbbd2; --t5: #c9dde8; --ty: #7a6aa8; --t0: #c3c9d1;
@@ -50,13 +50,15 @@ body::before { content: ""; position: fixed; inset: 0 0 auto; height: env(safe-a
50
  a { color: var(--link); text-underline-offset: 2px; }
51
  a:focus-visible, button:focus-visible, select:focus-visible, input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
52
  h1, h2, h3 { text-wrap: balance; margin: 0; }
53
- h1 { font-family: var(--f-display); font-size: 1.75rem; line-height: 1.3; }
54
- h2 { font-family: var(--f-display); font-size: 1.3rem; line-height: 1.35; }
55
- h3 { font-size: 1.02rem; font-weight: 700; }
56
  p { margin: 0; }
 
57
  .mono { font-family: var(--f-mono); font-variant-numeric: tabular-nums; }
58
  .muted { color: var(--muted); }
59
  .small { font-size: 0.86rem; }
 
60
 
61
  /* 顶栏 */
62
  .top { position: sticky; top: env(safe-area-inset-top, 0px); z-index: 5; background: var(--surface); border-bottom: 1px solid var(--line); }
@@ -69,9 +71,12 @@ nav.tabs a { display: block; padding: 8px 12px 10px; color: var(--muted); text-d
69
  nav.tabs a:hover { color: var(--ink); }
70
  nav.tabs a[aria-current="page"] { color: var(--ink); border-bottom-color: var(--accent); }
71
 
72
- main { max-width: 1240px; margin: 0 auto; padding-left: max(16px, env(safe-area-inset-left, 0px)); padding-right: max(16px, env(safe-area-inset-right, 0px)); padding-block: 28px 64px; display: grid; gap: 28px; }
73
- section.view { display: grid; gap: 24px; min-width: 0; }
74
- .lead { max-width: 68ch; display: grid; gap: 8px; }
 
 
 
75
  .lead p { color: var(--muted); }
76
 
77
  /* 标签 */
@@ -83,6 +88,7 @@ section.view { display: grid; gap: 24px; min-width: 0; }
83
  .st-p2 { background: transparent; color: var(--ink); border: 1px dashed var(--accent); }
84
  .st-own { background: var(--ink); color: var(--surface); font-weight: 700; }
85
  .st-no { background: transparent; color: var(--muted); border-color: var(--line); text-decoration: line-through; }
 
86
  .tier { display: inline-flex; align-items: center; justify-content: center; min-width: 2.4em; padding: 0 6px; border-radius: 4px; font-family: var(--f-mono); font-size: 0.78rem; font-weight: 500; line-height: 1.7; }
87
  .tier-S1 { background: var(--t1); color: var(--t-on-dark); }
88
  .tier-S2 { background: var(--t2); color: var(--t-on-dark); }
@@ -91,13 +97,15 @@ section.view { display: grid; gap: 24px; min-width: 0; }
91
  .tier-S5 { background: var(--t5); color: var(--t-on-light); }
92
  .tier-SY { background: var(--ty); color: var(--t-on-dark); }
93
  .tier-- { background: var(--t0); color: var(--t-on-light); }
 
 
 
 
94
 
95
  /* 总览 */
96
- .stats { display: flex; flex-wrap: wrap; gap: 8px 18px; }
97
  .stats div { display: flex; align-items: baseline; gap: 6px; }
98
- .stats b { font-family: var(--f-mono); font-size: 1.05rem; }
99
- .legend { display: flex; flex-wrap: wrap; gap: 8px 16px; font-size: 0.84rem; color: var(--muted); }
100
- .legend span { display: inline-flex; align-items: center; gap: 6px; }
101
  .scroll-x { overflow-x: auto; min-width: 0; border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); }
102
  table.matrix { border-collapse: collapse; width: 100%; min-width: 980px; font-size: 0.86rem; }
103
  .matrix th, .matrix td { border-bottom: 1px solid var(--line); border-right: 1px solid var(--line); padding: 8px; vertical-align: top; text-align: left; }
@@ -105,118 +113,129 @@ table.matrix { border-collapse: collapse; width: 100%; min-width: 980px; font-si
105
  .matrix tbody tr:last-child > * { border-bottom: 0; }
106
  .matrix thead th { background: var(--sunk); font-weight: 700; font-size: 0.82rem; }
107
  .matrix thead th small { display: block; font-weight: 400; color: var(--muted); }
108
- .matrix tbody th { width: 168px; background: var(--sunk); }
109
- .matrix tbody th a { color: var(--ink); text-decoration: none; font-weight: 700; }
110
  .matrix tbody th a:hover { text-decoration: underline; }
111
  .matrix tbody th .tier { margin-top: 4px; }
112
- .cell { display: flex; flex-wrap: wrap; gap: 4px; }
113
- .dchip { text-decoration: none; }
114
- .dchip:hover { filter: brightness(0.95); text-decoration: underline; }
115
  .empty-cell { color: var(--line); }
116
-
117
- .cols2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 24px; }
118
- .block { display: grid; gap: 10px; min-width: 0; }
119
  .tierbar { display: grid; gap: 6px; }
120
  .tierbar div { display: grid; grid-template-columns: 2.8em 7.5em 1fr; gap: 10px; align-items: center; font-size: 0.88rem; }
121
- ol.p0 { margin: 0; padding-left: 1.3em; display: grid; gap: 6px; }
 
 
 
 
122
 
123
  /* 目录 */
124
  .filters { display: flex; flex-wrap: wrap; gap: 10px 12px; align-items: end; padding: 14px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); }
125
- .filters label { display: grid; gap: 3px; font-size: 0.78rem; color: var(--muted); min-width: 0; }
126
- .filters select, .filters input { width: 100%; font: inherit; font-size: 0.88rem; color: var(--ink); background: var(--bg); border: 1px solid var(--line); border-radius: 4px; padding: 5px 8px; max-width: 100%; }
127
- .filters label:has(input) { width: 15em; }
 
128
  .filters button { font: inherit; font-size: 0.86rem; background: none; border: 1px solid var(--line); border-radius: 4px; padding: 5px 10px; color: var(--ink); cursor: pointer; }
129
  .count { font-size: 0.86rem; color: var(--muted); }
 
 
 
 
130
  .rows { display: grid; border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); overflow: hidden; }
131
- .row-h, .row { display: grid; grid-template-columns: minmax(170px, 1.6fr) 1fr 1.1fr 1.1fr 4.2em minmax(140px, 1.6fr) 6.5em; gap: 12px; padding: 10px 14px; align-items: start; border-bottom: 1px solid var(--line); }
132
- .row-h { background: var(--sunk); font-size: 0.78rem; color: var(--muted); font-weight: 500; }
133
- .row { text-decoration: none; color: inherit; font-size: 0.88rem; }
134
  .row:last-child { border-bottom: 0; }
135
  .row:hover { background: var(--sunk); }
136
- .row .nm b { display: block; }
137
- .row .nm span { font-size: 0.78rem; color: var(--muted); }
138
  .row > * { min-width: 0; }
139
- .row .lab { display: none; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
 
141
  /* 方法 */
142
- .method { display: grid; gap: 12px; padding: 18px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); scroll-margin-top: 90px; }
143
- .method-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; }
 
 
 
144
  .flow { display: flex; flex-wrap: wrap; align-items: stretch; gap: 6px; }
145
- .flow .step { background: var(--sunk); border: 1px solid var(--line); border-radius: 4px; padding: 6px 10px; font-size: 0.85rem; max-width: 100%; }
146
  .flow .arr { color: var(--muted); align-self: center; font-family: var(--f-mono); }
147
- .kv { display: grid; grid-template-columns: 6.5em 1fr; gap: 6px 12px; font-size: 0.9rem; }
 
148
  .kv dt { color: var(--muted); }
149
  .kv dd { margin: 0; min-width: 0; }
150
 
151
  /* SOMA */
152
- .pipe { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); overflow: hidden; }
153
  .pipe > div { padding: 14px; border-right: 1px solid var(--line); display: grid; gap: 6px; align-content: start; }
154
  .pipe > div:last-child { border-right: 0; }
155
- .pipe h3 { font-size: 0.82rem; color: var(--muted); font-weight: 500; letter-spacing: 0.04em; }
156
- .pipe ul { margin: 0; padding-left: 1.1em; font-size: 0.88rem; }
157
- .routes { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; }
158
  .route { padding: 14px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); display: grid; gap: 8px; align-content: start; }
159
  .route-h { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
160
  .route-h .mono { color: var(--accent); font-weight: 500; }
161
  .yes { color: var(--t2); font-weight: 700; }
162
  .nop { color: var(--muted); }
 
163
 
164
- /* 详情 */
165
- .crumb { font-size: 0.86rem; }
166
- .dhead { display: grid; gap: 8px; }
167
- .dhead .chips { display: flex; flex-wrap: wrap; gap: 6px; }
168
- .dgrid { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); gap: 24px; align-items: start; }
169
- .panel { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: 18px; display: grid; gap: 14px; min-width: 0; }
170
- .panel > h2 { font-size: 1.05rem; }
171
- .facts { display: grid; grid-template-columns: 7em 1fr; gap: 8px 14px; font-size: 0.92rem; margin: 0; }
172
- .facts dt { color: var(--muted); }
173
- .facts dd { margin: 0; min-width: 0; }
174
- .note { border-left: 3px solid var(--line); padding-left: 12px; display: grid; gap: 2px; }
175
- .note.warn { border-left-color: var(--accent); }
176
- .note b { font-size: 0.8rem; color: var(--muted); font-weight: 500; letter-spacing: 0.04em; }
177
- .rig { width: 100%; max-width: 360px; height: auto; display: block; }
178
- .rig text { font-family: var(--f-body); }
179
- .gallery { display: grid; gap: 14px; }
180
- .pair { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
181
- .pair figure { margin: 0; display: grid; gap: 4px; }
182
- .pair img { width: 100%; border-radius: 4px; border: 1px solid var(--line); background: var(--sunk); }
183
- .pair figcaption { font-size: 0.78rem; color: var(--muted); }
184
- .empty { border: 1px dashed var(--line); border-radius: var(--r); padding: 16px; display: grid; gap: 8px; font-size: 0.9rem; color: var(--muted); }
185
- .links { display: grid; gap: 6px; margin: 0; padding: 0; list-style: none; font-size: 0.92rem; }
186
- .pager { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; font-size: 0.9rem; }
187
-
188
- pre.code { background: var(--sunk); border: 1px solid var(--line); border-radius: var(--r); padding: 12px 14px; overflow-x: auto; font-family: var(--f-mono); font-size: 0.82rem; line-height: 1.6; margin: 0; }
189
- .tbl-wrap { overflow-x: auto; border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); }
190
- table.plain { border-collapse: collapse; width: 100%; font-size: 0.88rem; min-width: 560px; }
191
- .plain th, .plain td { padding: 8px 12px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; }
192
- .plain th { background: var(--sunk); font-size: 0.8rem; color: var(--muted); font-weight: 500; }
193
- .plain tr:last-child td { border-bottom: 0; }
194
  .err { padding: 16px; border: 1px solid var(--accent); border-radius: var(--r); background: var(--accent-soft); }
195
  footer { font-size: 0.8rem; color: var(--muted); border-top: 1px solid var(--line); padding-top: 16px; }
196
 
197
- @media (max-width: 900px) {
198
- .dgrid { grid-template-columns: 1fr; }
 
 
 
 
199
  .pipe { grid-template-columns: 1fr 1fr; }
200
  .pipe > div:nth-child(2) { border-right: 0; }
201
  .pipe > div:nth-child(-n+2) { border-bottom: 1px solid var(--line); }
202
- .row-h { display: none; }
203
- .row { grid-template-columns: 1fr 1fr; gap: 6px 12px; }
204
- .row .nm { grid-column: 1 / -1; display: flex; justify-content: space-between; gap: 8px; }
205
- .row .lab { display: block; font-size: 0.74rem; color: var(--muted); }
206
- .row .st { order: -1; }
207
- .filters label { flex: 1 1 140px; }
208
- .filters input { width: 100%; }
209
  }
210
  @media (max-width: 520px) {
211
- h1 { font-size: 1.45rem; }
212
  .pipe { grid-template-columns: 1fr; }
213
  .pipe > div { border-right: 0; border-bottom: 1px solid var(--line); }
214
  .pipe > div:last-child { border-bottom: 0; }
215
- .pair { grid-template-columns: 1fr; }
216
- .facts, .kv { grid-template-columns: 1fr; gap: 2px 0; }
217
  .facts dd, .kv dd { margin-bottom: 8px; }
218
- .filters input { width: 100%; }
219
- .filters label { flex: 1 1 140px; }
 
220
  }
221
  @media (prefers-reduced-motion: reduce) { * { scroll-behavior: auto !important; transition: none !important; } }
222
  </style>
@@ -229,10 +248,10 @@ footer { font-size: 0.8rem; color: var(--muted); border-top: 1px solid var(--lin
229
  <div class="brand"><b>SOMA 手部数据图谱</b><span id="upd"></span></div>
230
  <nav class="tabs" aria-label="页面">
231
  <a href="#overview" data-v="overview">总览</a>
232
- <a href="#catalog" data-v="catalog">数据集目录</a>
233
  <a href="#methods" data-v="methods">标注方法</a>
234
- <a href="#soma" data-v="soma">SOMA 转换</a>
235
- <a href="#samples" data-v="samples">样例素材</a>
236
  </nav>
237
  </div>
238
  </header>
@@ -246,17 +265,24 @@ footer { font-size: 0.8rem; color: var(--muted); border-top: 1px solid var(--lin
246
  "use strict";
247
  var DATA = null, PREV = {}, BYID = {}, M = {};
248
  var app = document.getElementById("app");
249
- var filt = { source: "", method: "", tier: "", status: "", q: "" };
 
 
250
 
251
  function esc(s) { return String(s == null ? "" : s).replace(/[&<>"']/g, function (c) { return { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[c]; }); }
252
  function by(list) { var o = {}; list.forEach(function (x) { o[x.id] = x; }); return o; }
253
- function stChip(id) { var s = M.status[id]; return '<span class="chip st-' + id + '">' + esc(s.name) + "</span>"; }
254
- function tierChip(id, title) { var t = M.tier[id]; return '<span class="tier tier-' + id + '" title="' + esc((title || t.name) + ":" + t.desc) + '">' + esc(id === "-" ? "—" : id) + "</span>"; }
255
- function dsLink(d, cls) { return '<a class="chip dchip st-' + d.status + (cls ? " " + cls : "") + '" href="#ds-' + d.id + '">' + esc(d.name) + "</a>"; }
256
- function statusOrder(s) { return ["own", "p0", "p1", "p2", "used", "surveyed", "no"].indexOf(s); }
257
- function sorted(list) { return list.slice().sort(function (a, b) { return statusOrder(a.status) - statusOrder(b.status) || a.name.localeCompare(b.name); }); }
 
 
 
 
 
258
 
259
- /* ---------- 采集装置示意图 ---------- */
260
  function rigSvg(d) {
261
  var r = d.rig || {}, W = 320, H = 200, cx = 160, cy = 118, out = [];
262
  out.push('<svg class="rig" viewBox="0 0 ' + W + " " + H + '" role="img" aria-label="' + esc(d.name + " 采集装置示意") + '">');
@@ -288,7 +314,6 @@ footer { font-size: 0.8rem; color: var(--muted); border-top: 1px solid var(--lin
288
  out.push('<rect x="' + (hx - 6) + '" y="' + (hy + 10) + '" width="12" height="8" rx="1.5" fill="' + col + '"/>');
289
  out.push('<text x="12" y="22" font-size="12" fill="var(--muted)">' + (r.pseudoEgo ? "固定于眼高(模拟第一视角)" : (r.fisheye ? "第一视角 · 宽视场" : "第一视角")) + (r.mono ? " · 黑白" : "") + "</text>");
290
  }
291
- // 手
292
  var hx2 = cx, hy2 = cy + 10;
293
  out.push('<g fill="var(--surface)" stroke="var(--ink)" stroke-width="1.4" stroke-linejoin="round">');
294
  out.push('<path d="M' + (hx2 - 15) + " " + (hy2 + 22) + " Q" + (hx2 - 19) + " " + (hy2 + 2) + " " + (hx2 - 14) + " " + (hy2 - 6) + " L" + (hx2 + 14) + " " + (hy2 - 6) + " Q" + (hx2 + 19) + " " + (hy2 + 4) + " " + (hx2 + 15) + " " + (hy2 + 22) + ' Z"/>');
@@ -301,194 +326,191 @@ footer { font-size: 0.8rem; color: var(--muted); border-top: 1px solid var(--lin
301
  out.push('<g transform="translate(40 40)"><rect x="-12" y="-9" width="22" height="18" rx="2" fill="none" stroke="var(--muted)" stroke-width="1.5"/><line x1="-16" y1="-14" x2="16" y2="14" stroke="var(--accent)" stroke-width="2"/></g>');
302
  out.push('<text x="62" y="45" font-size="12" fill="var(--muted)">��� RGB 图像</text>');
303
  }
304
- if (r.synth) out.push('<text x="12" y="' + (H - 12) + '" font-size="12" fill="var(--muted)">渲染生成</text>');
305
- if (r.wild && !r.ego) out.push('<text x="12" y="' + (H - 12) + '" font-size="12" fill="var(--muted)">网络 / 日常图像</text>');
306
- if (r.scanner) out.push('<text x="12" y="' + (H - 12) + '" font-size="12" fill="var(--muted)">扫描仪多相机环</text>');
307
  out.push("</svg>");
308
  return out.join("");
309
  }
 
310
 
311
- function flow(steps) {
312
- return '<div class="flow">' + steps.map(function (s, i) { return (i ? '<span class="arr" aria-hidden="true">→</span>' : "") + '<span class="step">' + esc(s) + "</span>"; }).join("") + "</div>";
313
- }
314
-
315
- /* ---------- 视图:总览 ---------- */
316
  function vOverview() {
317
  var ds = DATA.datasets, cnt = {};
318
  ds.forEach(function (d) { cnt[d.status] = (cnt[d.status] || 0) + 1; });
319
- var h = [];
320
- h.push('<section class="view"><div class="lead"><h1>按数据来源和标注方法看手部数据</h1><p>' + esc(DATA.meta.goal) + " 矩阵的行按 shape 真值的可信度从高到低排列,列是数据来源;点任一数据集看详情、采集示意和样例。</p></div>");
321
- h.push('<div class="stats">' + DATA.meta.statuses.map(function (s) { return "<div>" + stChip(s.id) + '<b>' + (cnt[s.id] || 0) + "</b></div>"; }).join("") + '<div class="muted small">共 <b class="mono">' + ds.length + "</b> 个</div></div>");
322
- h.push('<div class="scroll-x"><table class="matrix"><thead><tr><th>标注方法 \ 数据来源</th>');
 
 
 
323
  DATA.meta.sources.forEach(function (s) { h.push("<th>" + esc(s.name) + "<small>" + esc(s.desc) + "</small></th>"); });
324
  h.push("</tr></thead><tbody>");
325
- var tierOf = { scan: "S1", marker: "S2", rgbd: "S3", mvkp: "S4", device: "-", synth: "SY", manual2d: "-", pseudo: "S5" };
326
  DATA.meta.methods.forEach(function (m) {
327
- h.push('<tr><th><a href="#methods" data-jump="m-' + m.id + '">' + esc(m.name) + "</a><br>" + tierChip(tierOf[m.id]) + "</th>");
328
  DATA.meta.sources.forEach(function (s) {
329
  var list = sorted(ds.filter(function (d) { return d.method === m.id && d.source === s.id; }));
330
- h.push("<td>" + (list.length ? '<div class="cell">' + list.map(function (d) { return dsLink(d); }).join("") + "</div>" : '<span class="empty-cell" aria-label="无">·</span>') + "</td>");
331
  });
332
  h.push("</tr>");
333
  });
334
- h.push("</tbody></table></div>");
335
- h.push('<div class="legend"><span>标签颜色表示状态:</span>' + DATA.meta.statuses.map(function (s) { return "<span>" + stChip(s.id) + esc(s.desc) + "</span>"; }).join("") + "</div>");
336
 
337
- h.push('<div class="cols2"><div class="block"><h2>shape 真值分层</h2><p class="muted small">大部分数据集的 β 是从图像或关键点拟合的。监督 SOMA shape 时只用 S1 到 S3 和合成数据,S4 当弱监督,S5 和“—”不参与 shape。</p><div class="tierbar">');
338
- DATA.meta.tiers.forEach(function (t) { h.push("<div>" + tierChip(t.id) + "<b>" + esc(t.name) + '</b><span class="muted">' + esc(t.desc) + "</span></div>"); });
339
- h.push("</div></div>");
340
  var p0 = ds.filter(function (d) { return d.status === "p0"; });
341
- h.push('<div class="block"><h2>建议先接入</h2><ol class="p0">');
342
- p0.forEach(function (d) { h.push('<li><a href="#ds-' + d.id + '"><b>' + esc(d.name) + "</b></a> " + esc(d.fills) + "</li>"); });
343
- h.push('</ol><p class="muted small">完整理由和其余新增项见<a href="#catalog">数据集目录</a>,状态筛选选「P0 新增」到「P2 新增」。</p></div></div>');
344
- h.push("</section>");
 
 
345
  return h.join("");
346
  }
347
 
348
- /* ---------- 视图:目录 ---------- */
349
  function opts(list, cur, all) { return '<option value="">' + all + "</option>" + list.map(function (x) { return '<option value="' + x.id + '"' + (x.id === cur ? " selected" : "") + ">" + esc(x.name) + "</option>"; }).join(""); }
350
  function vCatalog() {
351
- var h = [];
352
- h.push('<section class="view"><div class="lead"><h1>数据集目录</h1><p>按数据来源、标注方法、shape 层级和状态筛选。每行是一个数据集,点开看完整信息。</p></div>');
353
- h.push('<form class="filters" id="ff" role="search">');
354
- h.push('<label for="f-source">数据来源<select id="f-source">' + opts(DATA.meta.sources, filt.source, "全部来源") + "</select></label>");
355
- h.push('<label for="f-method">标注方法<select id="f-method">' + opts(DATA.meta.methods, filt.method, "全部方法") + "</select></label>");
356
- h.push('<label for="f-tier">shape 层级<select id="f-tier">' + opts(DATA.meta.tiers.map(function (t) { return { id: t.id, name: (t.id === "-" ? "—" : t.id) + " " + t.name }; }), filt.tier, "全部层级") + "</select></label>");
357
- h.push('<label for="f-status">状态<select id="f-status">' + opts(DATA.meta.statuses, filt.status, "全部状态") + "</select></label>");
358
- h.push('<label for="f-q">搜索<input id="f-q" type="search" placeholder="名称、相机、真值…" value="' + esc(filt.q) + '"></label>');
359
- h.push('<button type="button" id="f-reset">清除筛选</button></form>');
360
- h.push('<p class="count" id="cnt" aria-live="polite"></p><div class="rows" id="rows"></div></section>');
361
  return h.join("");
362
  }
363
  function renderRows() {
364
  var q = filt.q.trim().toLowerCase();
365
- var list = sorted(DATA.datasets.filter(function (d) {
366
  if (filt.source && d.source !== filt.source) return false;
367
  if (filt.method && d.method !== filt.method) return false;
368
  if (filt.tier && d.tier !== filt.tier) return false;
369
- if (filt.status && d.status !== filt.status) return false;
370
  if (q) { var hay = [d.name, d.camera, d.gt, d.fills, d.risk, d.scale, d.subjects, (d.tags || []).join(" ")].join(" ").toLowerCase(); if (hay.indexOf(q) < 0) return false; }
371
  return true;
372
- }));
373
- document.getElementById("cnt").textContent = "显示 " + list.length + " / " + DATA.datasets.length + " 个数据集";
374
- var h = ['<div class="row-h"><span>数据集</span><span>数据来源</span><span>标注方法</span><span>真值</span><span>shape</span><span>规模</span><span>状态</span></div>'];
375
- if (!list.length) h.push('<div class="row"><span>没有符合条件的数据集。换一个筛选条件,或点「清除筛选」。</span></div>');
376
- list.forEach(function (d) {
377
- h.push('<a class="row" href="#ds-' + d.id + '">');
378
- h.push('<span class="nm"><span><b>' + esc(d.name) + "</b><span>" + esc(d.year) + "</span></span></span>");
379
- h.push('<span><span class="lab">数据来源</span>' + esc(M.source[d.source].name) + "</span>");
380
- h.push('<span><span class="lab">标注方法</span>' + esc(M.method[d.method].name) + "</span>");
381
- h.push('<span><span class="lab">真值</span>' + esc(d.gt) + "</span>");
382
- h.push('<span><span class="lab">shape</span>' + tierChip(d.tier) + "</span>");
383
- h.push('<span class="small"><span class="lab">规模</span>' + esc([d.subjects, d.scale].filter(Boolean).join(";") || "—") + "</span>");
384
- h.push('<span class="st">' + stChip(d.status) + "</span>");
385
- h.push("</a>");
386
  });
387
- document.getElementById("rows").innerHTML = h.join("");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
388
  }
389
  function bindCatalog() {
390
- ["source", "method", "tier", "status"].forEach(function (k) {
391
- document.getElementById("f-" + k).addEventListener("change", function (e) { filt[k] = e.target.value; renderRows(); });
392
- });
393
  document.getElementById("f-q").addEventListener("input", function (e) { filt.q = e.target.value; renderRows(); });
 
394
  document.getElementById("ff").addEventListener("submit", function (e) { e.preventDefault(); });
395
- document.getElementById("f-reset").addEventListener("click", function () { filt = { source: "", method: "", tier: "", status: "", q: "" }; render(); });
396
  renderRows();
397
  }
398
 
399
- /* ---------- 视图:标注方法 ---------- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400
  function vMethods() {
401
- var h = ['<section class="view"><div class="lead"><h1>标注方法</h1><p>同一种标注方法得到的真值,可信度和适用范围相近。下面按 shape 真值可信度从高到低排列,每种方法给出流程、可信度、常见问题和转到 SOMA 的路线。</p></div>'];
402
- var tierOf = { scan: "S1", marker: "S2", rgbd: "S3", mvkp: "S4", device: "-", synth: "SY", manual2d: "-", pseudo: "S5" };
403
  DATA.meta.methods.forEach(function (m) {
404
  var list = sorted(DATA.datasets.filter(function (d) { return d.method === m.id; }));
405
- h.push('<article class="method" id="m-' + m.id + '"><div class="method-head"><h2>' + esc(m.name) + "</h2>" + tierChip(tierOf[m.id]) + '<span class="muted small">' + list.length + " 个数据集</span></div>");
406
- h.push(flow(m.steps));
407
- h.push('<dl class="kv"><dt>可信度</dt><dd>' + esc(m.trust) + "</dd><dt>常见问题</dt><dd>" + esc(m.issues) + '</dd><dt>SOMA 路线</dt><dd><a href="#soma">' + esc(m.route) + "</a></dd></dl>");
408
- h.push('<div class="cell">' + list.map(function (d) { return dsLink(d); }).join("") + "</div></article>");
409
  });
410
  h.push("</section>");
411
  return h.join("");
412
  }
413
 
414
- /* ---------- 视图:SOMA 转换 ---------- */
415
  function vSoma() {
416
- var h = ['<section class="view"><div class="lead"><h1>转到 SOMA hand</h1><p>���有公开数据集原生使用 SOMA 标注。SOMA-X 的 <span class="mono">SOMAHandLayer</span> 官方支持三种手部后端:SOMA 原生(20 维手型 identity)、MANO 和 MHR,许可为 Apache-2.0。转到 SOMA 拓扑之后,要监督原生 shape 还需要再拟合一次。</p></div>'];
417
- h.push('<div class="pipe">');
418
- h.push('<div><h3>原始真值</h3><ul><li>扫描网格</li><li>MANO 参数或网格</li><li>SMPL-X / SMPL-H</li><li>MHR 参数</li><li>3D 关键点</li><li>2D 关键点</li></ul></div>');
419
- h.push('<div><h3>映射到 SOMA 拓扑</h3><ul><li>SOMAHandLayer 的 MANO 后端</li><li>SOMAHandLayer 的 MHR 后端</li><li>SMPL-X 先取手部 MANO 部分</li><li>关键点先定关节对应</li></ul></div>');
420
- h.push('<div><h3>SOMA 原生重拟合</h3><ul><li>拟合 20 维 identity 和 pose</li><li>按数据集统计顶点残差</li><li>残差超阈值的帧不监督 shape</li></ul></div>');
421
- h.push('<div><h3>训练监督</h3><ul><li>shape:S1 到 S3、合成数据</li><li>pose:所有 3D 来源</li><li>2D 重投影:全部带 2D 的来源</li><li>伪标签只做弱监督</li></ul></div>');
422
- h.push("</div>");
423
- h.push('<h2>转换路线</h2><div class="routes">');
424
  DATA.meta.routes.forEach(function (r) {
425
- var n = DATA.datasets.filter(function (d) { return d.route === r.id; }).length;
426
- h.push('<div class="route"><div class="route-h"><span class="mono">' + r.id + "</span><h3>" + esc(r.name) + '</h3></div><p class="small muted">来源:' + esc(r.from) + "</p><p class=\"small\">" + esc(r.how) + '</p><p class="small">' + (r.shape ? '<span class="yes">可监督 shape</span>' : '<span class="nop">不监督 shape</span>') + ' · <span class="muted">' + n + " 个数据集</span></p></div>");
427
  });
428
- h.push("</div>");
429
- h.push('<div class="cols2"><div class="block"><h2>需要注意</h2><ul class="small" style="margin:0;padding-left:1.2em;display:grid;gap:6px">');
430
- h.push("<li>MANO 的 21 点里指尖取的是网格顶点,与 SOMA 关节定义不同,关键点类数据集必须先定对应表。</li>");
431
- h.push("<li>EgoRenderer 已经做过一次原始网格到 MANO 的 778 顶点拟合,再转 SOMA 是第二次转换,残差要分开记录。</li>");
432
- h.push("<li>shape 和尺度在单目里是耦合的;有内参时,shape 误差会表现为绝对尺度误差,评测时建议单独报标准姿态下的顶点误差和骨长误差。</li>");
433
  h.push("<li>SAM 3D Body 输出 MHR,可以走 R5 给野外图像生成伪标签;它的训练数据是否公开未查到。</li>");
434
- h.push('</ul></div><div class="block"><h2>参考</h2><ul class="links"><li><a href="https://github.com/NVlabs/SOMA-X" target="_blank" rel="noopener">NVlabs/SOMA-X(代码与手部资产)</a></li><li><a href="https://arxiv.org/abs/2603.16858" target="_blank" rel="noopener">SOMA: Unifying Parametric Human Body Models,arXiv:2603.16858</a></li><li><a href="https://arxiv.org/abs/2602.15989" target="_blank" rel="noopener">SAM 3D Body,arXiv:2602.15989</a></li></ul></div></div>');
435
- h.push("</section>");
436
  return h.join("");
437
  }
438
 
439
- /* ---------- 视图:样例素材 ---------- */
440
  function vSamples() {
441
- var h = ['<section class="view"><div class="lead"><h1>样例素材</h1><p>每个数据集的详情页会显示「RGB / GT 叠加」样例对。样例登记在 <span class="mono">data/previews.json</span>,图片放在 <span class="mono">media/&lt;数据集 id&gt;/</span>。用脚本添加,不需要改页面代码。</p></div>'];
442
- h.push('<div class="cols2"><div class="block"><h2>添加一对样例</h2><pre class="code">python tools/add_preview.py hograspnet \\\n --rgb /data/hograspnet/s01_0042_rgb.png \\\n --gt /data/hograspnet/s01_0042_gt.png \\\n --caption "受试者 01,侧捏,第一视角相机" \\\n --source "官方 MANO,经 R1 转为 SOMA 后渲染"</pre><p class="small muted">脚本会把图片转成最长边 960 像素的 JPEG 复制到 media 目录,并追加到 previews.json。同名样例会被覆盖。</p></div>');
443
- h.push('<div class="block"><h2>previews.json 格式</h2><pre class="code">{\n "hograspnet": [\n {\n "rgb": "media/hograspnet/s01_0042_rgb.jpg",\n "gt": "media/hograspnet/s01_0042_gt.jpg",\n "caption": "受试者 01,侧捏",\n "source": "官方 MANO → SOMA"\n }\n ]\n}</pre></div></div>');
444
- h.push('<h2>当前样例覆盖</h2><div class="tbl-wrap"><table class="plain"><thead><tr><th>数据集</th><th>状态</th><th>本站样例</th><th>团队已有可视化</th></tr></thead><tbody>');
445
- sorted(DATA.datasets).forEach(function (d) {
446
- var n = (PREV[d.id] || []).length;
447
- h.push('<tr><td><a href="#ds-' + d.id + '">' + esc(d.name) + "</a></td><td>" + stChip(d.status) + '</td><td class="mono">' + (n || "—") + "</td><td>" + ((d.team || []).map(function (t) { return '<a href="' + esc(t.url) + '" target="_blank" rel="noopener">' + esc(t.label.replace("团队图册:", "").replace("团队视频:", "视频:")) + "</a>"; }).join("<br>") || '<span class="muted">无</span>') + "</td></tr>");
448
- });
449
- h.push("</tbody></table></div></section>");
450
- return h.join("");
451
- }
452
-
453
- /* ---------- 视图:详情 ---------- */
454
- function vDetail(id) {
455
- var d = BYID[id];
456
- if (!d) return '<section class="view"><p class="err">找不到数据集「' + esc(id) + '」。回到<a href="#catalog">数据集目录</a>。</p></section>';
457
- var m = M.method[d.method], s = M.source[d.source], rt = M.route[d.route], t = M.tier[d.tier];
458
- var all = sorted(DATA.datasets), idx = all.indexOf(d), prev = all[idx - 1], next = all[idx + 1];
459
- var h = ['<section class="view"><p class="crumb"><a href="#catalog">数据集目录</a> / ' + esc(s.name) + " / " + esc(m.name) + "</p>"];
460
- h.push('<div class="dhead"><h1>' + esc(d.name) + '</h1><div class="chips">' + stChip(d.status) + (d.tags || []).map(function (x) { return '<span class="chip st-surveyed">' + esc(x) + "</span>"; }).join("") + '<span class="chip st-surveyed">' + esc(d.year) + "</span></div></div>");
461
- h.push('<div class="dgrid"><div class="panel"><h2>基本信息</h2><dl class="facts">');
462
- h.push("<dt>数据来源</dt><dd>" + esc(s.name) + '<br><span class="muted small">' + esc(s.desc) + "</span></dd>");
463
- h.push("<dt>相机</dt><dd>" + esc(d.camera || "—") + "</dd>");
464
- h.push('<dt>标注方法</dt><dd><a href="#methods" data-jump="m-' + m.id + '">' + esc(m.name) + "</a></dd>");
465
- h.push("<dt>真值格式</dt><dd>" + esc(d.gt) + "</dd>");
466
- h.push("<dt>shape 层级</dt><dd>" + tierChip(d.tier) + " " + esc(t.name) + '<span class="muted small">,' + esc(t.desc) + "</span></dd>");
467
- h.push('<dt>SOMA 路线</dt><dd><a href="#soma">' + esc(rt.id + " " + rt.name) + "</a>" + (rt.shape ? "" : '<span class="muted small">,不监督 shape</span>') + "</dd>");
468
- h.push("<dt>受试者</dt><dd>" + esc(d.subjects || "—") + "</dd>");
469
- h.push("<dt>规模</dt><dd>" + esc(d.scale || "—") + "</dd></dl>");
470
- h.push('<div class="note"><b>补什么</b><p>' + esc(d.fills) + "</p></div>");
471
- if (d.risk) h.push('<div class="note warn"><b>注意</b><p>' + esc(d.risk) + "</p></div>");
472
- h.push("</div>");
473
- h.push('<div class="panel"><h2>采集与标注示意</h2>' + rigSvg(d) + flow(m.steps) + '<p class="small muted">示意图按数据集的相机配置绘制,不是真实画面。琥珀色圆点表示手上贴有光学 marker。</p></div></div>');
474
- var pv = PREV[d.id] || [];
475
- h.push('<div class="panel"><h2>样例:RGB 与 GT 叠加</h2>');
476
- if (pv.length) {
477
- h.push('<div class="gallery">');
478
- pv.forEach(function (p, i) {
479
- h.push('<div class="pair"><figure><img loading="lazy" src="' + esc(p.rgb) + '" alt="' + esc(d.name + " 样例 " + (i + 1) + " RGB") + '"><figcaption>RGB</figcaption></figure><figure><img loading="lazy" src="' + esc(p.gt) + '" alt="' + esc(d.name + " 样例 " + (i + 1) + " GT 叠加") + '"><figcaption>GT 叠加' + (p.source ? ":" + esc(p.source) : "") + "</figcaption></figure></div>");
480
- if (p.caption) h.push('<p class="small muted">' + esc(p.caption) + "</p>");
481
- });
482
- h.push("</div>");
483
- } else {
484
- h.push('<div class="empty"><p>本站还没有这个数据集的样例。用 <span class="mono">tools/add_preview.py ' + esc(d.id) + "</span> 添加,步骤见<a href=\"#samples\">样例素材</a>。</p>");
485
- if ((d.team || []).length) h.push("<p>团队已有的可视化:" + d.team.map(function (x) { return '<a href="' + esc(x.url) + '" target="_blank" rel="noopener">' + esc(x.label) + "</a>"; }).join(",") + "</p>");
486
- h.push("</div>");
487
- }
488
- h.push("</div>");
489
- if ((d.links || []).length) h.push('<div class="panel"><h2>链接</h2><ul class="links">' + d.links.map(function (x) { return '<li><a href="' + esc(x.url) + '" target="_blank" rel="noopener">' + esc(x.label) + "</a></li>"; }).join("") + "</ul></div>");
490
- h.push('<div class="pager"><span>' + (prev ? '← <a href="#ds-' + prev.id + '">' + esc(prev.name) + "</a>" : "") + "</span><span>" + (next ? '<a href="#ds-' + next.id + '">' + esc(next.name) + "</a> →" : "") + "</span></div>");
491
- h.push("</section>");
492
  return h.join("");
493
  }
494
 
@@ -502,7 +524,7 @@ footer { font-size: 0.8rem; color: var(--muted); border-top: 1px solid var(--lin
502
  else if (hash === "soma") html = vSoma();
503
  else if (hash === "samples") html = vSamples();
504
  else { html = vOverview(); view = "overview"; }
505
- app.innerHTML = html + '<footer>数据整理于 ' + esc(DATA.meta.updated) + "。数值来自论文、项目页和团队已有图册;标为「待核」的字段尚未确认。修改数据请编辑 <span class=\"mono\">tools/make_data.py</span> 后重新生成。</footer>";
506
  document.querySelectorAll("nav.tabs a").forEach(function (a) { if (a.getAttribute("data-v") === view) a.setAttribute("aria-current", "page"); else a.removeAttribute("aria-current"); });
507
  if (hash === "catalog") bindCatalog();
508
  if (pendingJump) { var el = document.getElementById(pendingJump); pendingJump = null; if (el) { el.scrollIntoView(); return; } }
@@ -525,7 +547,7 @@ footer { font-size: 0.8rem; color: var(--muted); border-top: 1px solid var(--lin
525
  fetch("data/datasets.json").then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }),
526
  fetch("data/previews.json").then(function (r) { return r.ok ? r.json() : {}; }).catch(function () { return {}; })
527
  ]).then(function (x) { boot(x[0], x[1]); }).catch(function () {
528
- app.innerHTML = '<p class="err">没能读取 data/datasets.json。直接双击打开 HTML 文件时浏览器会拦截读取,请用 <span class="mono">python -m http.server</span> 在本目录启动后访问,或部署到 Hugging Face Space。</p>';
529
  });
530
  })();
531
  </script>
 
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Noto+Sans+SC:wght@400;500;700&family=Noto+Serif+SC:wght@600;700&display=swap">
12
  <style>
13
+ /* 布局:顶部标签导航 + 单栏工作区;每页先给结论(一句话 + 关键字段),再分组给细节 */
14
  :root {
15
  --bg: #f4f6f8;
16
  --surface: #ffffff;
 
18
  --ink: #17212b;
19
  --muted: #5a6573;
20
  --line: #d9dfe6;
21
+ --accent: #a8560a; /* 反光 marker 的琥珀色:P0 与当前项 */
22
  --accent-soft: #fbead7;
23
  --link: #1d4f8f;
24
  --t1: #0c3d5c; --t2: #1f6488; --t3: #4d8fb0; --t4: #8bbbd2; --t5: #c9dde8; --ty: #7a6aa8; --t0: #c3c9d1;
 
50
  a { color: var(--link); text-underline-offset: 2px; }
51
  a:focus-visible, button:focus-visible, select:focus-visible, input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
52
  h1, h2, h3 { text-wrap: balance; margin: 0; }
53
+ h1 { font-family: var(--f-display); font-size: 1.7rem; line-height: 1.3; }
54
+ h2 { font-family: var(--f-display); font-size: 1.2rem; line-height: 1.35; }
55
+ h3 { font-size: 0.98rem; font-weight: 700; }
56
  p { margin: 0; }
57
+ ul { margin: 0; }
58
  .mono { font-family: var(--f-mono); font-variant-numeric: tabular-nums; }
59
  .muted { color: var(--muted); }
60
  .small { font-size: 0.86rem; }
61
+ .label { font-size: 0.74rem; color: var(--muted); letter-spacing: 0.04em; }
62
 
63
  /* 顶栏 */
64
  .top { position: sticky; top: env(safe-area-inset-top, 0px); z-index: 5; background: var(--surface); border-bottom: 1px solid var(--line); }
 
71
  nav.tabs a:hover { color: var(--ink); }
72
  nav.tabs a[aria-current="page"] { color: var(--ink); border-bottom-color: var(--accent); }
73
 
74
+ main { max-width: 1240px; margin: 0 auto; padding-left: max(16px, env(safe-area-inset-left, 0px)); padding-right: max(16px, env(safe-area-inset-right, 0px)); padding-block: 28px 64px; display: grid; gap: 32px; }
75
+ section.view { display: grid; gap: 32px; min-width: 0; }
76
+ .part { display: grid; gap: 12px; min-width: 0; }
77
+ .part-h { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; }
78
+ .part-h p { color: var(--muted); font-size: 0.86rem; }
79
+ .lead { max-width: 70ch; display: grid; gap: 8px; }
80
  .lead p { color: var(--muted); }
81
 
82
  /* 标签 */
 
88
  .st-p2 { background: transparent; color: var(--ink); border: 1px dashed var(--accent); }
89
  .st-own { background: var(--ink); color: var(--surface); font-weight: 700; }
90
  .st-no { background: transparent; color: var(--muted); border-color: var(--line); text-decoration: line-through; }
91
+ .tag { background: transparent; color: var(--muted); border-color: var(--line); }
92
  .tier { display: inline-flex; align-items: center; justify-content: center; min-width: 2.4em; padding: 0 6px; border-radius: 4px; font-family: var(--f-mono); font-size: 0.78rem; font-weight: 500; line-height: 1.7; }
93
  .tier-S1 { background: var(--t1); color: var(--t-on-dark); }
94
  .tier-S2 { background: var(--t2); color: var(--t-on-dark); }
 
97
  .tier-S5 { background: var(--t5); color: var(--t-on-light); }
98
  .tier-SY { background: var(--ty); color: var(--t-on-dark); }
99
  .tier-- { background: var(--t0); color: var(--t-on-light); }
100
+ .chips { display: flex; flex-wrap: wrap; gap: 6px; }
101
+ .dchip { text-decoration: none; }
102
+ .dchip:hover { text-decoration: underline; }
103
+ .dchip .n { font-family: var(--f-mono); opacity: 0.75; }
104
 
105
  /* 总览 */
106
+ .stats { display: flex; flex-wrap: wrap; gap: 8px 18px; align-items: center; }
107
  .stats div { display: flex; align-items: baseline; gap: 6px; }
108
+ .stats b { font-family: var(--f-mono); font-size: 1.02rem; }
 
 
109
  .scroll-x { overflow-x: auto; min-width: 0; border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); }
110
  table.matrix { border-collapse: collapse; width: 100%; min-width: 980px; font-size: 0.86rem; }
111
  .matrix th, .matrix td { border-bottom: 1px solid var(--line); border-right: 1px solid var(--line); padding: 8px; vertical-align: top; text-align: left; }
 
113
  .matrix tbody tr:last-child > * { border-bottom: 0; }
114
  .matrix thead th { background: var(--sunk); font-weight: 700; font-size: 0.82rem; }
115
  .matrix thead th small { display: block; font-weight: 400; color: var(--muted); }
116
+ .matrix tbody th { width: 160px; background: var(--sunk); }
117
+ .matrix tbody th a { color: var(--ink); text-decoration: none; font-weight: 700; display: block; }
118
  .matrix tbody th a:hover { text-decoration: underline; }
119
  .matrix tbody th .tier { margin-top: 4px; }
120
+ .matrix .chips { gap: 4px; }
 
 
121
  .empty-cell { color: var(--line); }
122
+ .legend { display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: center; font-size: 0.8rem; color: var(--muted); }
123
+ .cols2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 32px; }
 
124
  .tierbar { display: grid; gap: 6px; }
125
  .tierbar div { display: grid; grid-template-columns: 2.8em 7.5em 1fr; gap: 10px; align-items: center; font-size: 0.88rem; }
126
+ .pick { display: grid; gap: 10px; }
127
+ .pick a { display: grid; grid-template-columns: auto 1fr; gap: 2px 10px; padding: 10px 12px; border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); text-decoration: none; color: inherit; }
128
+ .pick a:hover { border-color: var(--accent); }
129
+ .pick b { font-size: 0.95rem; }
130
+ .pick span.d { grid-column: 1 / -1; font-size: 0.86rem; color: var(--muted); }
131
 
132
  /* 目录 */
133
  .filters { display: flex; flex-wrap: wrap; gap: 10px 12px; align-items: end; padding: 14px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); }
134
+ .filters label { display: grid; gap: 3px; font-size: 0.78rem; color: var(--muted); min-width: 0; flex: 1 1 150px; max-width: 240px; }
135
+ .filters label.q { max-width: 320px; flex-basis: 200px; }
136
+ .filters label.ck { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; font-size: 0.86rem; color: var(--ink); padding-bottom: 6px; }
137
+ .filters select, .filters input[type="search"] { width: 100%; font: inherit; font-size: 0.88rem; color: var(--ink); background: var(--bg); border: 1px solid var(--line); border-radius: 4px; padding: 5px 8px; }
138
  .filters button { font: inherit; font-size: 0.86rem; background: none; border: 1px solid var(--line); border-radius: 4px; padding: 5px 10px; color: var(--ink); cursor: pointer; }
139
  .count { font-size: 0.86rem; color: var(--muted); }
140
+ .groups { display: grid; gap: 28px; }
141
+ .group { display: grid; gap: 8px; }
142
+ .group-h { display: flex; align-items: center; gap: 10px; }
143
+ .group-h .muted { font-size: 0.84rem; }
144
  .rows { display: grid; border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); overflow: hidden; }
145
+ .row { display: grid; grid-template-columns: 96px minmax(150px, 1.3fr) minmax(150px, 1.3fr) minmax(120px, 1fr) minmax(140px, 1.4fr); gap: 14px; padding: 10px 14px; align-items: center; border-bottom: 1px solid var(--line); text-decoration: none; color: inherit; font-size: 0.88rem; }
 
 
146
  .row:last-child { border-bottom: 0; }
147
  .row:hover { background: var(--sunk); }
 
 
148
  .row > * { min-width: 0; }
149
+ .thumb { width: 96px; aspect-ratio: 16 / 10; max-width: 100%; border-radius: 4px; background: var(--sunk); border: 1px solid var(--line); object-fit: cover; display: block; }
150
+ .thumb.none { display: grid; place-items: center; font-size: 0.7rem; color: var(--muted); }
151
+ .row .nm b { display: block; font-size: 0.95rem; }
152
+ .row .two span { display: block; }
153
+ .row .clip { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
154
+
155
+ /* 详情 */
156
+ .crumb { font-size: 0.86rem; }
157
+ .dhead { display: grid; gap: 10px; }
158
+ .keys { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); }
159
+ .keys > div { padding: 12px 14px; border-right: 1px solid var(--line); display: grid; gap: 4px; align-content: start; min-width: 0; }
160
+ .keys > div:last-child { border-right: 0; }
161
+ .keys .v { font-size: 0.92rem; }
162
+ .panel { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: 18px; display: grid; gap: 14px; min-width: 0; align-content: start; }
163
+ .dgrid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 24px; align-items: start; }
164
+ .facts { display: grid; grid-template-columns: 5em 1fr; gap: 8px 14px; font-size: 0.92rem; margin: 0; }
165
+ .facts dt { color: var(--muted); }
166
+ .facts dd { margin: 0; min-width: 0; }
167
+ .note { border-left: 3px solid var(--accent); padding-left: 12px; display: grid; gap: 2px; font-size: 0.92rem; }
168
+ .rig { width: 100%; max-width: 380px; height: auto; display: block; }
169
+ .rig text { font-family: var(--f-body); }
170
+ .gallery { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 500px), 1fr)); gap: 18px 24px; }
171
+ .sample { display: grid; gap: 6px; align-content: start; min-width: 0; }
172
+ .pair { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
173
+ .pair figure { margin: 0; display: grid; gap: 3px; }
174
+ .pair img { width: 100%; border-radius: 4px; border: 1px solid var(--line); background: var(--sunk); }
175
+ .pair figcaption { font-size: 0.74rem; color: var(--muted); }
176
+ .empty { border: 1px dashed var(--line); border-radius: var(--r); padding: 14px; font-size: 0.9rem; color: var(--muted); display: grid; gap: 6px; }
177
+ .links { display: grid; gap: 6px; padding: 0; list-style: none; font-size: 0.92rem; }
178
+ .pager { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; font-size: 0.9rem; border-top: 1px solid var(--line); padding-top: 14px; }
179
 
180
  /* 方法 */
181
+ .toc { display: flex; flex-wrap: wrap; gap: 6px; }
182
+ .toc a { font-size: 0.85rem; padding: 3px 10px; border: 1px solid var(--line); border-radius: 999px; text-decoration: none; color: var(--ink); background: var(--surface); }
183
+ .toc a:hover { border-color: var(--accent); }
184
+ .method { display: grid; gap: 14px; padding: 18px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); scroll-margin-top: 90px; }
185
+ .method-h { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; }
186
  .flow { display: flex; flex-wrap: wrap; align-items: stretch; gap: 6px; }
187
+ .flow .step { background: var(--sunk); border: 1px solid var(--line); border-radius: 4px; padding: 5px 10px; font-size: 0.85rem; max-width: 100%; }
188
  .flow .arr { color: var(--muted); align-self: center; font-family: var(--f-mono); }
189
+ .mgrid { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 20px; }
190
+ .kv { display: grid; grid-template-columns: 5.5em 1fr; gap: 6px 12px; font-size: 0.9rem; margin: 0; }
191
  .kv dt { color: var(--muted); }
192
  .kv dd { margin: 0; min-width: 0; }
193
 
194
  /* SOMA */
195
+ .pipe { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); overflow: hidden; }
196
  .pipe > div { padding: 14px; border-right: 1px solid var(--line); display: grid; gap: 6px; align-content: start; }
197
  .pipe > div:last-child { border-right: 0; }
198
+ .pipe ul { padding-left: 1.1em; font-size: 0.88rem; }
199
+ .routes { display: grid; grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); gap: 12px; }
 
200
  .route { padding: 14px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); display: grid; gap: 8px; align-content: start; }
201
  .route-h { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
202
  .route-h .mono { color: var(--accent); font-weight: 500; }
203
  .yes { color: var(--t2); font-weight: 700; }
204
  .nop { color: var(--muted); }
205
+ .bul { padding-left: 1.2em; display: grid; gap: 6px; font-size: 0.9rem; }
206
 
207
+ /* 样例来源 */
208
+ .ways { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 14px; }
209
+ .way { padding: 16px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); display: grid; gap: 10px; align-content: start; min-width: 0; }
210
+ .way.rec { border-color: var(--accent); }
211
+ pre.code { background: var(--sunk); border: 1px solid var(--line); border-radius: var(--r); padding: 10px 12px; overflow-x: auto; font-family: var(--f-mono); font-size: 0.8rem; line-height: 1.6; margin: 0; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
  .err { padding: 16px; border: 1px solid var(--accent); border-radius: var(--r); background: var(--accent-soft); }
213
  footer { font-size: 0.8rem; color: var(--muted); border-top: 1px solid var(--line); padding-top: 16px; }
214
 
215
+ @media (max-width: 960px) {
216
+ .keys { grid-template-columns: repeat(2, minmax(0, 1fr)); }
217
+ .keys > div { border-bottom: 1px solid var(--line); }
218
+ .keys > div:nth-child(2n) { border-right: 0; }
219
+ .keys > div:last-child { grid-column: 1 / -1; border-bottom: 0; }
220
+ .dgrid, .mgrid { grid-template-columns: 1fr; }
221
  .pipe { grid-template-columns: 1fr 1fr; }
222
  .pipe > div:nth-child(2) { border-right: 0; }
223
  .pipe > div:nth-child(-n+2) { border-bottom: 1px solid var(--line); }
224
+ .row { grid-template-columns: 84px minmax(0, 1fr); gap: 4px 12px; align-items: start; }
225
+ .row .thumb { grid-row: span 4; width: 84px; }
226
+ .row .two span { display: inline; }
227
+ .row .two span + span::before { content: " · "; color: var(--muted); }
 
 
 
228
  }
229
  @media (max-width: 520px) {
230
+ h1 { font-size: 1.42rem; }
231
  .pipe { grid-template-columns: 1fr; }
232
  .pipe > div { border-right: 0; border-bottom: 1px solid var(--line); }
233
  .pipe > div:last-child { border-bottom: 0; }
234
+ .facts, .kv { grid-template-columns: 1fr; gap: 0; }
 
235
  .facts dd, .kv dd { margin-bottom: 8px; }
236
+ .filters label, .filters label.q { max-width: none; flex-basis: 100%; }
237
+ .row { grid-template-columns: 72px minmax(0, 1fr); }
238
+ .row .thumb { width: 72px; }
239
  }
240
  @media (prefers-reduced-motion: reduce) { * { scroll-behavior: auto !important; transition: none !important; } }
241
  </style>
 
248
  <div class="brand"><b>SOMA 手部数据图谱</b><span id="upd"></span></div>
249
  <nav class="tabs" aria-label="页面">
250
  <a href="#overview" data-v="overview">总览</a>
251
+ <a href="#catalog" data-v="catalog">数据集</a>
252
  <a href="#methods" data-v="methods">标注方法</a>
253
+ <a href="#soma" data-v="soma">转到 SOMA</a>
254
+ <a href="#samples" data-v="samples">样例</a>
255
  </nav>
256
  </div>
257
  </header>
 
265
  "use strict";
266
  var DATA = null, PREV = {}, BYID = {}, M = {};
267
  var app = document.getElementById("app");
268
+ var filt = { source: "", method: "", tier: "", q: "", hasPrev: false };
269
+ var ORDER = ["own", "p0", "p1", "p2", "used", "surveyed", "no"];
270
+ var TIER_OF = { scan: "S1", marker: "S2", rgbd: "S3", mvkp: "S4", device: "-", synth: "SY", manual2d: "-", pseudo: "S5" };
271
 
272
  function esc(s) { return String(s == null ? "" : s).replace(/[&<>"']/g, function (c) { return { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[c]; }); }
273
  function by(list) { var o = {}; list.forEach(function (x) { o[x.id] = x; }); return o; }
274
+ function stChip(id) { return '<span class="chip st-' + id + '" title="' + esc(M.status[id].desc) + '">' + esc(M.status[id].name) + "</span>"; }
275
+ function tierChip(id) { var t = M.tier[id]; return '<span class="tier tier-' + id + '" title="' + esc(t.name + ":" + t.desc) + '">' + (id === "-" ? "—" : esc(id)) + "</span>"; }
276
+ function nPrev(d) { return (PREV[d.id] || []).length; }
277
+ function dsLink(d, showN) { var n = nPrev(d); return '<a class="chip dchip st-' + d.status + '" href="#ds-' + d.id + '">' + esc(d.name) + (showN && n ? ' <span class="n">' + n + "</span>" : "") + "</a>"; }
278
+ function sorted(list) { return list.slice().sort(function (a, b) { return ORDER.indexOf(a.status) - ORDER.indexOf(b.status) || a.name.localeCompare(b.name); }); }
279
+ function partHead(title, note) { return '<div class="part-h"><h2>' + esc(title) + "</h2>" + (note ? "<p>" + note + "</p>" : "") + "</div>"; }
280
+ function thumb(d) {
281
+ var p = (PREV[d.id] || [])[0];
282
+ return p ? '<img class="thumb" loading="lazy" src="' + esc(p.gt) + '" alt="">' : '<span class="thumb none">暂无样例</span>';
283
+ }
284
 
285
+ /* ---------- 采集装置示意 ---------- */
286
  function rigSvg(d) {
287
  var r = d.rig || {}, W = 320, H = 200, cx = 160, cy = 118, out = [];
288
  out.push('<svg class="rig" viewBox="0 0 ' + W + " " + H + '" role="img" aria-label="' + esc(d.name + " 采集装置示意") + '">');
 
314
  out.push('<rect x="' + (hx - 6) + '" y="' + (hy + 10) + '" width="12" height="8" rx="1.5" fill="' + col + '"/>');
315
  out.push('<text x="12" y="22" font-size="12" fill="var(--muted)">' + (r.pseudoEgo ? "固定于眼高(模拟第一视角)" : (r.fisheye ? "第一视角 · 宽视场" : "第一视角")) + (r.mono ? " · 黑白" : "") + "</text>");
316
  }
 
317
  var hx2 = cx, hy2 = cy + 10;
318
  out.push('<g fill="var(--surface)" stroke="var(--ink)" stroke-width="1.4" stroke-linejoin="round">');
319
  out.push('<path d="M' + (hx2 - 15) + " " + (hy2 + 22) + " Q" + (hx2 - 19) + " " + (hy2 + 2) + " " + (hx2 - 14) + " " + (hy2 - 6) + " L" + (hx2 + 14) + " " + (hy2 - 6) + " Q" + (hx2 + 19) + " " + (hy2 + 4) + " " + (hx2 + 15) + " " + (hy2 + 22) + ' Z"/>');
 
326
  out.push('<g transform="translate(40 40)"><rect x="-12" y="-9" width="22" height="18" rx="2" fill="none" stroke="var(--muted)" stroke-width="1.5"/><line x1="-16" y1="-14" x2="16" y2="14" stroke="var(--accent)" stroke-width="2"/></g>');
327
  out.push('<text x="62" y="45" font-size="12" fill="var(--muted)">��� RGB 图像</text>');
328
  }
329
+ var foot = r.synth ? "渲染生成" : (r.wild && !r.ego) ? "网络 / 日常图像" : r.scanner ? "扫描仪多相机环" : "";
330
+ if (foot) out.push('<text x="12" y="' + (H - 12) + '" font-size="12" fill="var(--muted)">' + foot + "</text>");
 
331
  out.push("</svg>");
332
  return out.join("");
333
  }
334
+ function flow(steps) { return '<div class="flow">' + steps.map(function (s, i) { return (i ? '<span class="arr" aria-hidden="true">→</span>' : "") + '<span class="step">' + esc(s) + "</span>"; }).join("") + "</div>"; }
335
 
336
+ /* ---------- 总览 ---------- */
 
 
 
 
337
  function vOverview() {
338
  var ds = DATA.datasets, cnt = {};
339
  ds.forEach(function (d) { cnt[d.status] = (cnt[d.status] || 0) + 1; });
340
+ var withPrev = ds.filter(function (d) { return nPrev(d); }).length;
341
+ var h = ['<section class="view">'];
342
+ h.push('<div class="lead"><h1>手部数据集,按来源和标注方法分类</h1><p>' + esc(DATA.meta.goal) + "</p></div>");
343
+ h.push('<div class="stats"><div><b>' + ds.length + '</b><span class="muted">个数据集</span></div><div><b>' + withPrev + '</b><span class="muted">个有样例</span></div>' + ORDER.map(function (s) { return "<div>" + stChip(s) + "<b>" + (cnt[s] || 0) + "</b></div>"; }).join("") + "</div>");
344
+
345
+ h.push('<div class="part">' + partHead("分布矩阵", "行是标注方法,按 shape 真值可信度从高到低;列是数据来源。点名称看详情。"));
346
+ h.push('<div class="scroll-x"><table class="matrix"><thead><tr><th>标注方法</th>');
347
  DATA.meta.sources.forEach(function (s) { h.push("<th>" + esc(s.name) + "<small>" + esc(s.desc) + "</small></th>"); });
348
  h.push("</tr></thead><tbody>");
 
349
  DATA.meta.methods.forEach(function (m) {
350
+ h.push('<tr><th><a href="#methods" data-jump="m-' + m.id + '">' + esc(m.name) + "</a>" + tierChip(TIER_OF[m.id]) + "</th>");
351
  DATA.meta.sources.forEach(function (s) {
352
  var list = sorted(ds.filter(function (d) { return d.method === m.id && d.source === s.id; }));
353
+ h.push("<td>" + (list.length ? '<div class="chips">' + list.map(function (d) { return dsLink(d); }).join("") + "</div>" : '<span class="empty-cell" aria-label="无">·</span>') + "</td>");
354
  });
355
  h.push("</tr>");
356
  });
357
+ h.push('</tbody></table></div><div class="legend"><span>状态:</span>' + ORDER.map(stChip).join("") + "</div></div>");
 
358
 
 
 
 
359
  var p0 = ds.filter(function (d) { return d.status === "p0"; });
360
+ h.push('<div class="cols2"><div class="part">' + partHead("建议先接入") + '<div class="pick">');
361
+ p0.forEach(function (d) { h.push('<a href="#ds-' + d.id + '">' + stChip(d.status) + "<b>" + esc(d.name) + '</b><span class="d">' + esc(d.fills) + "</span></a>"); });
362
+ h.push("</div></div>");
363
+ h.push('<div class="part">' + partHead("shape 真值分层", "只有 S1 到 S3 和合成数据用来监督 SOMA shape。") + '<div class="tierbar">');
364
+ DATA.meta.tiers.forEach(function (t) { h.push("<div>" + tierChip(t.id) + "<b>" + esc(t.name) + '</b><span class="muted">' + esc(t.desc) + "</span></div>"); });
365
+ h.push("</div></div></div></section>");
366
  return h.join("");
367
  }
368
 
369
+ /* ---------- 数据集目录 ---------- */
370
  function opts(list, cur, all) { return '<option value="">' + all + "</option>" + list.map(function (x) { return '<option value="' + x.id + '"' + (x.id === cur ? " selected" : "") + ">" + esc(x.name) + "</option>"; }).join(""); }
371
  function vCatalog() {
372
+ var h = ['<section class="view"><div class="lead"><h1>数据集</h1><p>按状态分组。缩略图是 GT 叠加样例,点开看完整信息。</p></div>'];
373
+ h.push('<div class="part"><form class="filters" id="ff" role="search">');
374
+ h.push('<label for="f-source">数据来源<select id="f-source">' + opts(DATA.meta.sources, filt.source, "全部") + "</select></label>");
375
+ h.push('<label for="f-method">标注方法<select id="f-method">' + opts(DATA.meta.methods, filt.method, "全部") + "</select></label>");
376
+ h.push('<label for="f-tier">shape 层级<select id="f-tier">' + opts(DATA.meta.tiers.map(function (t) { return { id: t.id, name: (t.id === "-" ? "—" : t.id) + " " + t.name }; }), filt.tier, "全部") + "</select></label>");
377
+ h.push('<label class="q" for="f-q">搜索<input id="f-q" type="search" placeholder="名称、相机、真值…" value="' + esc(filt.q) + '"></label>');
378
+ h.push('<label class="ck" for="f-prev"><input id="f-prev" type="checkbox"' + (filt.hasPrev ? " checked" : "") + ">只看有样例</label>");
379
+ h.push('<button type="button" id="f-reset">清除</button></form><p class="count" id="cnt" aria-live="polite"></p></div>');
380
+ h.push('<div id="groups" class="groups"></div></section>');
 
381
  return h.join("");
382
  }
383
  function renderRows() {
384
  var q = filt.q.trim().toLowerCase();
385
+ var list = DATA.datasets.filter(function (d) {
386
  if (filt.source && d.source !== filt.source) return false;
387
  if (filt.method && d.method !== filt.method) return false;
388
  if (filt.tier && d.tier !== filt.tier) return false;
389
+ if (filt.hasPrev && !nPrev(d)) return false;
390
  if (q) { var hay = [d.name, d.camera, d.gt, d.fills, d.risk, d.scale, d.subjects, (d.tags || []).join(" ")].join(" ").toLowerCase(); if (hay.indexOf(q) < 0) return false; }
391
  return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
392
  });
393
+ document.getElementById("cnt").textContent = "显示 " + list.length + " / " + DATA.datasets.length + " 个";
394
+ var h = [];
395
+ if (!list.length) h.push('<p class="empty">没有符合条件的数据集。换个条件,或点「清除」。</p>');
396
+ ORDER.forEach(function (st) {
397
+ var g = list.filter(function (d) { return d.status === st; }).sort(function (a, b) { return a.name.localeCompare(b.name); });
398
+ if (!g.length) return;
399
+ h.push('<div class="group"><div class="group-h">' + stChip(st) + '<span class="muted">' + esc(M.status[st].desc) + " · " + g.length + ' 个</span></div><div class="rows">');
400
+ g.forEach(function (d) {
401
+ h.push('<a class="row" href="#ds-' + d.id + '">' + thumb(d));
402
+ h.push('<span class="nm"><b>' + esc(d.name) + '</b><span class="muted small">' + esc(d.year) + "</span></span>");
403
+ h.push('<span class="two small"><span>' + esc(M.source[d.source].name) + '</span><span class="muted">' + esc(M.method[d.method].name) + "</span></span>");
404
+ h.push('<span class="small">' + tierChip(d.tier) + " " + esc(d.gt) + "</span>");
405
+ h.push('<span class="small muted clip">' + esc([d.subjects, d.scale].filter(Boolean).join(";") || "规模未列") + "</span></a>");
406
+ });
407
+ h.push("</div></div>");
408
+ });
409
+ document.getElementById("groups").innerHTML = h.join("");
410
  }
411
  function bindCatalog() {
412
+ ["source", "method", "tier"].forEach(function (k) { document.getElementById("f-" + k).addEventListener("change", function (e) { filt[k] = e.target.value; renderRows(); }); });
 
 
413
  document.getElementById("f-q").addEventListener("input", function (e) { filt.q = e.target.value; renderRows(); });
414
+ document.getElementById("f-prev").addEventListener("change", function (e) { filt.hasPrev = e.target.checked; renderRows(); });
415
  document.getElementById("ff").addEventListener("submit", function (e) { e.preventDefault(); });
416
+ document.getElementById("f-reset").addEventListener("click", function () { filt = { source: "", method: "", tier: "", q: "", hasPrev: false }; render(); });
417
  renderRows();
418
  }
419
 
420
+ /* ---------- 详情 ---------- */
421
+ function vDetail(id) {
422
+ var d = BYID[id];
423
+ if (!d) return '<section class="view"><p class="err">找不到数据集「' + esc(id) + '」。回到<a href="#catalog">数据集</a>。</p></section>';
424
+ var m = M.method[d.method], s = M.source[d.source], rt = M.route[d.route], t = M.tier[d.tier];
425
+ var all = sorted(DATA.datasets), idx = all.indexOf(d), prev = all[idx - 1], next = all[idx + 1];
426
+ var h = ['<section class="view"><p class="crumb"><a href="#catalog">数据集</a> / ' + esc(M.status[d.status].name) + "</p>"];
427
+
428
+ h.push('<div class="dhead"><h1>' + esc(d.name) + '</h1><div class="chips">' + stChip(d.status) + (d.year ? '<span class="chip tag">' + esc(d.year) + "</span>" : "") + (d.tags || []).filter(function (x) { return x !== "新增" && x !== "不建议"; }).map(function (x) { return '<span class="chip tag">' + esc(x) + "</span>"; }).join("") + '</div><p class="lead"><span>' + esc(d.fills) + "</span></p></div>");
429
+
430
+ h.push('<div class="keys">');
431
+ h.push('<div><span class="label">数据来源</span><span class="v">' + esc(s.name) + "</span></div>");
432
+ h.push('<div><span class="label">标注方法</span><span class="v"><a href="#methods" data-jump="m-' + m.id + '">' + esc(m.name) + "</a></span></div>");
433
+ h.push('<div><span class="label">真值</span><span class="v">' + esc(d.gt) + "</span></div>");
434
+ h.push('<div><span class="label">shape 层级</span><span class="v">' + tierChip(d.tier) + " " + esc(t.name) + "</span></div>");
435
+ h.push('<div><span class="label">转到 SOMA</span><span class="v"><a href="#soma">' + esc(rt.id + " " + rt.name) + "</a>" + (rt.shape ? "" : '<br><span class="muted small">不监督 shape</span>') + "</span></div>");
436
+ h.push("</div>");
437
+
438
+ var pv = PREV[d.id] || [];
439
+ h.push('<div class="part">' + partHead("样例", pv.length ? "左:原始 RGB;右:GT 叠加。" : ""));
440
+ if (pv.length) {
441
+ h.push('<div class="gallery">');
442
+ pv.forEach(function (p, i) {
443
+ h.push('<div class="sample"><div class="pair"><figure><img loading="lazy" src="' + esc(p.rgb) + '" alt="' + esc(d.name + " 样例 " + (i + 1) + " RGB") + '"><figcaption>RGB</figcaption></figure><figure><img loading="lazy" src="' + esc(p.gt) + '" alt="' + esc(d.name + " 样例 " + (i + 1) + " GT 叠加") + '"><figcaption>' + esc(p.source || "GT 叠加") + "</figcaption></figure></div>" + (p.caption ? '<p class="small muted">' + esc(p.caption) + "</p>" : "") + "</div>");
444
+ });
445
+ h.push("</div>");
446
+ } else {
447
+ h.push('<div class="empty"><p>还没有样例。添加方法见<a href="#samples">样例</a>页。</p>' + ((d.team || []).length ? "<p>团队已有可视化:" + d.team.map(function (x) { return '<a href="' + esc(x.url) + '" target="_blank" rel="noopener">' + esc(x.label.replace(/^团队(图册|视频):/, "")) + "</a>"; }).join(",") + "</p>" : "") + "</div>");
448
+ }
449
+ h.push("</div>");
450
+
451
+ h.push('<div class="dgrid"><div class="panel"><h2>相机与规模</h2><dl class="facts">');
452
+ h.push("<dt>相机</dt><dd>" + esc(d.camera || "未列") + "</dd>");
453
+ h.push("<dt>受试者</dt><dd>" + esc(d.subjects || "未列") + "</dd>");
454
+ h.push("<dt>规模</dt><dd>" + esc(d.scale || "未列") + "</dd></dl>");
455
+ if (d.risk) h.push('<div class="note"><span class="label">注意</span><p>' + esc(d.risk) + "</p></div>");
456
+ h.push('</div><div class="panel"><h2>采集与标注流程</h2>' + rigSvg(d) + flow(m.steps) + '<p class="small muted">按相机配置绘制的示意,不是真实画面;琥珀色圆点表示手上贴了光学 marker。</p></div></div>');
457
+
458
+ var links = (d.links || []).concat((d.team || []).map(function (x) { return { label: x.label, url: x.url }; }));
459
+ if (links.length) h.push('<div class="part">' + partHead("链接") + '<ul class="links">' + links.map(function (x) { return '<li><a href="' + esc(x.url) + '" target="_blank" rel="noopener">' + esc(x.label) + "</a></li>"; }).join("") + "</ul></div>");
460
+ h.push('<div class="pager"><span>' + (prev ? '← <a href="#ds-' + prev.id + '">' + esc(prev.name) + "</a>" : "") + "</span><span>" + (next ? '<a href="#ds-' + next.id + '">' + esc(next.name) + "</a> →" : "") + "</span></div></section>");
461
+ return h.join("");
462
+ }
463
+
464
+ /* ---------- 标注方法 ---------- */
465
  function vMethods() {
466
+ var h = ['<section class="view"><div class="lead"><h1>标注方法</h1><p>按 shape 真值可信度从高到低排列。每种方法列出流程、可信度、常见问题、转到 SOMA 的路线和用到它的数据集。</p></div>'];
467
+ h.push('<nav class="toc" aria-label="方法目录">' + DATA.meta.methods.map(function (m) { return '<a href="#methods" data-jump="m-' + m.id + '">' + esc(m.name) + "</a>"; }).join("") + "</nav>");
468
  DATA.meta.methods.forEach(function (m) {
469
  var list = sorted(DATA.datasets.filter(function (d) { return d.method === m.id; }));
470
+ h.push('<article class="method" id="m-' + m.id + '"><div class="method-h"><h2>' + esc(m.name) + "</h2>" + tierChip(TIER_OF[m.id]) + '<span class="muted small">' + list.length + " 个数据集</span></div>" + flow(m.steps));
471
+ h.push('<div class="mgrid"><dl class="kv"><dt>可信度</dt><dd>' + esc(m.trust) + "</dd><dt>常见问题</dt><dd>" + esc(m.issues) + '</dd><dt>转到 SOMA</dt><dd><a href="#soma">' + esc(m.route) + '</a></dd></dl><div class="chips" style="align-content:start">' + list.map(function (d) { return dsLink(d); }).join("") + "</div></div></article>");
 
 
472
  });
473
  h.push("</section>");
474
  return h.join("");
475
  }
476
 
477
+ /* ---------- 转到 SOMA ---------- */
478
  function vSoma() {
479
+ var h = ['<section class="view"><div class="lead"><h1>转到 SOMA hand</h1><p>没有公开数据集原生使用 SOMA 标注。SOMA-X 的 <span class="mono">SOMAHandLayer</span> 官方支持 SOMA 原生、MANO、MHR 三种手部后端(Apache-2.0)。映射到 SOMA 拓扑后,要监督原生 shape 还需要再拟合一次。</p></div>'];
480
+ h.push('<div class="part">' + partHead("四步流程") + '<div class="pipe">');
481
+ h.push('<div><span class="label">1 · 原始真值</span><ul><li>扫描网格</li><li>MANO 参数或网格</li><li>SMPL-X / SMPL-H</li><li>MHR 参数</li><li>3D / 2D 关键点</li></ul></div>');
482
+ h.push('<div><span class="label">2 · 映射到 SOMA 拓扑</span><ul><li>SOMAHandLayer 的 MANO 后端</li><li>SOMAHandLayer 的 MHR 后端</li><li>SMPL-X 先取手部</li><li>关键点先定关节对应</li></ul></div>');
483
+ h.push('<div><span class="label">3 · SOMA 原生重拟合</span><ul><li>拟合 20 维 identity 和 pose</li><li>按数据集统计顶点残差</li><li>残差超阈值不监督 shape</li></ul></div>');
484
+ h.push('<div><span class="label">4 · 训练监督</span><ul><li>shape:S1 到 S3、合成</li><li>pose:所有 3D 来源</li><li>2D 重投影:带 2D 的来源</li><li>伪标签只做弱监督</li></ul></div>');
485
+ h.push("</div></div>");
486
+ h.push('<div class="part">' + partHead("转换路线", "每张卡片对应一种原始真值格式。") + '<div class="routes">');
487
  DATA.meta.routes.forEach(function (r) {
488
+ var list = DATA.datasets.filter(function (d) { return d.route === r.id; });
489
+ h.push('<div class="route"><div class="route-h"><span class="mono">' + r.id + "</span><h3>" + esc(r.name) + '</h3></div><p class="small">' + esc(r.how) + '</p><p class="small">' + (r.shape ? '<span class="yes">可监督 shape</span>' : '<span class="nop">不监督 shape</span>') + ' · <span class="muted">' + list.length + " 个数据集</span></p></div>");
490
  });
491
+ h.push("</div></div>");
492
+ h.push('<div class="cols2"><div class="part">' + partHead("注意事项") + '<ul class="bul">');
493
+ h.push("<li>MANO 21 点的指尖是网格顶点,与 SOMA 关节定义不同;关键点类数据集要先定对应表。</li>");
494
+ h.push("<li>EgoRenderer 已经做过一次原始网格到 MANO 的拟合,再转 SOMA 是第二次,残差分开记录。</li>");
495
+ h.push("<li>单目下 shape 和尺度耦合;评测单独报标准姿态下的顶点误差和骨长误差。</li>");
496
  h.push("<li>SAM 3D Body 输出 MHR,可以走 R5 给野外图像生成伪标签;它的训练数据是否公开未查到。</li>");
497
+ h.push('</ul></div><div class="part">' + partHead("参考") + '<ul class="links"><li><a href="https://github.com/NVlabs/SOMA-X" target="_blank" rel="noopener">NVlabs/SOMA-X(代码与手部资产)</a></li><li><a href="https://arxiv.org/abs/2603.16858" target="_blank" rel="noopener">SOMA,arXiv:2603.16858</a></li><li><a href="https://arxiv.org/abs/2602.15989" target="_blank" rel="noopener">SAM 3D Body,arXiv:2602.15989</a></li></ul></div></div></section>');
 
498
  return h.join("");
499
  }
500
 
501
+ /* ---------- 样例 ---------- */
502
  function vSamples() {
503
+ var ds = sorted(DATA.datasets), have = ds.filter(nPrev), none = ds.filter(function (d) { return !nPrev(d); });
504
+ var pairs = have.reduce(function (a, d) { return a + nPrev(d); }, 0);
505
+ var h = ['<section class="view"><div class="lead"><h1>样例</h1><p>每对样例是同一帧的原始 RGB 和 GT 叠加。图片放在独立的 HF Dataset 仓库或本站 media 目录,登记在 <span class="mono">data/previews.json</span>。</p></div>'];
506
+ h.push('<div class="part">' + partHead("覆盖情况", have.length + " 个数据集共 " + pairs + " 对;" + none.length + " 个还没有。") );
507
+ h.push('<div class="group"><span class="label">已有样例(数字为对数)</span><div class="chips">' + have.map(function (d) { return dsLink(d, true); }).join("") + "</div></div>");
508
+ h.push('<div class="group"><span class="label">暂无样例</span><div class="chips">' + none.map(function (d) { return dsLink(d); }).join("") + "</div></div></div>");
509
+ h.push('<div class="part">' + partHead("怎么添加", "三种方式,按场景选一种。") + '<div class="ways">');
510
+ h.push('<div class="way rec"><h3>在数据所在的服务器上批量同步(推荐)</h3><p class="small">在存放数据集的机器上运行。图片传到独立的 HF Dataset 仓库并固定版本,Space 只登记 URL,网页不依赖 SSH。可以直接给已渲染好的叠加图,也可以给原图加网格(MANO 或 SOMA)由脚本渲染。</p><pre class="code">export HF_TOKEN=hf_xxx\npython tools/server_sync.py manifest.jsonl \\\n --media-repo DarthSoluke/EgoNetDatasetResearch-media \\\n --space DarthSoluke/EgoNetDatasetResearch</pre><pre class="code">{"dataset": "hograspnet",\n "rgb": "/SSD/hograspnet/s01/0042.png",\n "mesh": "/SSD/hograspnet/s01/0042_soma.npz",\n "caption": "受试者 01,侧捏",\n "source": "官方 MANO → R1 → SOMA"}</pre></div>');
511
+ h.push('<div class="way"><h3>从团队图册导入</h3><p class="small">复用 nine-source Space 里已经做好的叠加图,每个数据集取若干对。</p><pre class="code">python tools/import_team_previews.py --per 4</pre></div>');
512
+ h.push('<div class="way"><h3>手动加一对</h3><p class="small">已有一张 RGB 和一张叠加图时用。</p><pre class="code">python tools/add_preview.py hograspnet \\\n --rgb a_rgb.png --gt a_gt.png \\\n --caption "说明" --source "GT 来源"</pre></div>');
513
+ h.push("</div></div></section>");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
514
  return h.join("");
515
  }
516
 
 
524
  else if (hash === "soma") html = vSoma();
525
  else if (hash === "samples") html = vSamples();
526
  else { html = vOverview(); view = "overview"; }
527
+ app.innerHTML = html + '<footer>整理于 ' + esc(DATA.meta.updated) + "。数值来自论文、项目页和团队图册;标「待���」的字段尚未确认。</footer>";
528
  document.querySelectorAll("nav.tabs a").forEach(function (a) { if (a.getAttribute("data-v") === view) a.setAttribute("aria-current", "page"); else a.removeAttribute("aria-current"); });
529
  if (hash === "catalog") bindCatalog();
530
  if (pendingJump) { var el = document.getElementById(pendingJump); pendingJump = null; if (el) { el.scrollIntoView(); return; } }
 
547
  fetch("data/datasets.json").then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }),
548
  fetch("data/previews.json").then(function (r) { return r.ok ? r.json() : {}; }).catch(function () { return {}; })
549
  ]).then(function (x) { boot(x[0], x[1]); }).catch(function () {
550
+ app.innerHTML = '<p class="err">没能读取 data/datasets.json。直接双击打开 HTML 时浏览器会拦截读取,请在本目录运行 <span class="mono">python -m http.server</span> 后访问,或部署到 Hugging Face Space。</p>';
551
  });
552
  })();
553
  </script>
media/arctic/6057bab38e74308c02be_gt.jpg ADDED
media/arctic/6057bab38e74308c02be_rgb.jpg ADDED
media/arctic/a213dd95256ccccad7bc_gt.jpg ADDED
media/arctic/a213dd95256ccccad7bc_rgb.jpg ADDED
media/arctic/c4d53a1b79549c84e96d_gt.jpg ADDED
media/arctic/c4d53a1b79549c84e96d_rgb.jpg ADDED
media/arctic/e68425daa275c68f6f5d_gt.jpg ADDED
media/arctic/e68425daa275c68f6f5d_rgb.jpg ADDED
media/cocowb/780684ce08a2af76ddc4_gt.jpg ADDED
media/cocowb/780684ce08a2af76ddc4_rgb.jpg ADDED
media/cocowb/7e7716c112039185cc5e_gt.jpg ADDED
media/cocowb/7e7716c112039185cc5e_rgb.jpg ADDED
media/cocowb/9fcab59ec353483a0635_gt.jpg ADDED

Git LFS Details

  • SHA256: 4352032c4be9d2fd2810ebba3e9f3c0a5fa7b0ec9aec3abd04b2be40897eb44f
  • Pointer size: 131 Bytes
  • Size of remote file: 118 kB
media/cocowb/9fcab59ec353483a0635_rgb.jpg ADDED

Git LFS Details

  • SHA256: 4b65ac777858dd0b7a58deaa12a6704d7b8381695ffa1d7f3d0417984b803e3a
  • Pointer size: 131 Bytes
  • Size of remote file: 118 kB
media/cocowb/f59aa0ba82e64839e596_gt.jpg ADDED
media/cocowb/f59aa0ba82e64839e596_rgb.jpg ADDED
media/dexycb/6df9d4ead4d92a187a28_gt.jpg ADDED
media/dexycb/6df9d4ead4d92a187a28_rgb.jpg ADDED
media/dexycb/7e32dcf09cb0a2254256_gt.jpg ADDED
media/dexycb/7e32dcf09cb0a2254256_rgb.jpg ADDED
media/dexycb/8ffc14f49fff4b06cc73_gt.jpg ADDED
media/dexycb/8ffc14f49fff4b06cc73_rgb.jpg ADDED
media/dexycb/a128fbe7b45844ebb4e8_gt.jpg ADDED
media/dexycb/a128fbe7b45844ebb4e8_rgb.jpg ADDED
media/egodex/team_egodex_0_gt.jpg ADDED
media/egodex/team_egodex_0_rgb.jpg ADDED
media/egodex/team_egodex_1_gt.jpg ADDED
media/egodex/team_egodex_1_rgb.jpg ADDED
media/egodex/team_egodex_2_gt.jpg ADDED
media/egodex/team_egodex_2_rgb.jpg ADDED
media/egodex/team_egodex_3_gt.jpg ADDED
media/egodex/team_egodex_3_rgb.jpg ADDED
media/egoemg/team_egoemg_0_gt.jpg ADDED
media/egoemg/team_egoemg_0_rgb.jpg ADDED
media/egoemg/team_egoemg_1_gt.jpg ADDED
media/egoemg/team_egoemg_1_rgb.jpg ADDED
media/egoemg/team_egoemg_2_gt.jpg ADDED
media/egoemg/team_egoemg_2_rgb.jpg ADDED
media/egoemg/team_egoemg_3_gt.jpg ADDED
media/egoemg/team_egoemg_3_rgb.jpg ADDED
media/egopressure/team_egopressure_0_gt.jpg ADDED
media/egopressure/team_egopressure_0_rgb.jpg ADDED
media/egopressure/team_egopressure_1_gt.jpg ADDED
media/egopressure/team_egopressure_1_rgb.jpg ADDED
media/egopressure/team_egopressure_2_gt.jpg ADDED