File size: 30,149 Bytes
8aabba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8d93a57
8aabba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84afe80
8aabba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84afe80
8aabba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8d93a57
 
8aabba6
8d93a57
8aabba6
8d93a57
8aabba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a36f9f
8aabba6
 
1a36f9f
 
8aabba6
 
 
 
1a36f9f
8aabba6
1a36f9f
8aabba6
 
 
 
 
1a36f9f
8aabba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a36f9f
8aabba6
 
1a36f9f
8aabba6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
#!/usr/bin/env python3
"""生成 data/datasets.json。改数据集信息就改这个文件,然后重新运行:
    python tools/make_data.py
"""
import json
from pathlib import Path

ROOT = Path(__file__).resolve().parent.parent

TEAM = "https://yangzijing-nine-source-hand-data-browser.static.hf.space"
T_WILOR = {"label": "团队图册:WiLoR 14 源 + 合成数据", "url": f"{TEAM}/hand_dataset_browser_20261013/index.html"}
T_EGO = {"label": "团队图册:第一人称具身数据集", "url": f"{TEAM}/egocentric_embodied_datasets_20261020/index.html"}
T_2D = {"label": "团队图册:2D 数据集", "url": f"{TEAM}/hand_2d_dataset_browser_20261013/index.html"}
T_VID = {"label": "团队视频:九源 MANO GT 叠加(20s)", "url": "https://huggingface.co/datasets/yangzijing/nine-source-hand-data-review-videos-20s/tree/main"}


def arxiv(i, label="论文"):
    return {"label": f"{label} arXiv:{i}", "url": f"https://arxiv.org/abs/{i}"}


meta = {
    "title": "SOMA 手部数据图谱",
    "updated": "2026-11-02",
    "goal": "从单目 RGB 恢复 SOMA hand 的 shape 与 pose:按数据来源和标注方法整理可用的手部数据集。",
    "sources": [
        {"id": "ego", "name": "第一视角", "desc": "头戴或胸前相机拍的真实视频"},
        {"id": "egoexo", "name": "第一视角 + 外视角", "desc": "同步的头戴相机和固定相机"},
        {"id": "exo", "name": "外视角多相机", "desc": "棚内固定多相机,没有头戴视角"},
        {"id": "scan", "name": "扫描仪", "desc": "静态手势的多相机三维扫描"},
        {"id": "wild", "name": "野外图像 / 视频", "desc": "网络或日常拍摄,没有标定装置"},
        {"id": "synth", "name": "合成渲染", "desc": "渲染或重光照生成的图像"},
        {"id": "norgb", "name": "无 RGB", "desc": "只有动捕、事件相机或黑白相机"},
    ],
    "methods": [
        {"id": "scan", "name": "三维扫描配准", "short": "扫描",
         "steps": ["多相机扫描仪拍静态手势", "重建亚毫米级网格", "关键点三角化", "配准 MANO"],
         "trust": "最高。直接测得手的表面,是目前最可靠的 shape 真值。",
         "issues": "只有静态手势,没有手物交互,也没有第一视角。",
         "route": "R6"},
        {"id": "marker", "name": "光学 marker 动捕 + 拟合", "short": "光学动捕",
         "steps": ["手上贴反光 marker", "Vicon / OptiTrack 跟踪", "逐人标定 shape", "拟合 MANO 或 SMPL-X"],
         "trust": "高。shape 逐人标定,pose 不受相机遮挡影响。",
         "issues": "marker 会出现在 RGB 里;人数通常很少;重遮挡时 marker 丢失。",
         "route": "R1"},
        {"id": "rgbd", "name": "多视角 RGB-D 拟合", "short": "RGB-D 拟合",
         "steps": ["多台 RGB-D 同步拍摄", "2D 关键点(人工或模型)+ 深度", "多视角联合优化", "拟合 MANO,人工核验"],
         "trust": "中。受深度噪声和 2D 精度限制,shape 可用但偏粗。",
         "issues": "物体遮挡时手指误差大;HOnnotate 一类方法依赖初始化。",
         "route": "R1"},
        {"id": "mvkp", "name": "多视角关键点三角化", "short": "关键点三角化",
         "steps": ["多相机 RGB", "2D 关键点(人工或模型)", "三角化得到 3D 关键点", "可选:拟合 MANO"],
         "trust": "中低。shape 只由关键点约束;只给关键点时没有 shape。",
         "issues": "模型预标注会带入 HaMeR 等方法的偏差。",
         "route": "R1 / R3"},
        {"id": "device", "name": "设备追踪", "short": "设备追踪",
         "steps": ["头显、手套或 IMU", "设备内置手部追踪", "输出关节或设备自带手模型"],
         "trust": "低。精度依赖设备,通常没有公开误差。",
         "issues": "关节定义因设备而异,需要逐个对齐。",
         "route": "R3"},
        {"id": "synth", "name": "合成渲染", "short": "合成",
         "steps": ["参数化手 + 动作库", "渲染(光照、材质、相机)", "直接导出真值"],
         "trust": "真值精确,但 shape 分布取决于采样方式。",
         "issues": "外观和光照与真实图像有域差。",
         "route": "R1 / R2"},
        {"id": "manual2d", "name": "人工 2D 标注", "short": "人工 2D",
         "steps": ["图像", "模型预标注(可选)", "人工标注或修正 2D 关键点"],
         "trust": "没有 3D 信息,只提供 2D 监督。",
         "issues": "遮挡点的标注口径不一。",
         "route": "R4"},
        {"id": "pseudo", "name": "单目模型伪标签", "short": "伪标签",
         "steps": ["单目视频", "HaMeR 或自研管线预测 MANO", "可选:修复与筛选"],
         "trust": "最低。不能当 shape 真值,只适合弱监督或预训练。",
         "issues": "继承预测模型自身的系统偏差。",
         "route": "R7"},
    ],
    "tiers": [
        {"id": "S1", "name": "扫描配准", "desc": "直接测得表面"},
        {"id": "S2", "name": "动捕逐人标定", "desc": "marker 约束的逐人 shape"},
        {"id": "S3", "name": "RGB-D 拟合", "desc": "深度约束,偏粗"},
        {"id": "S4", "name": "关键点拟合", "desc": "只靠关键点约束"},
        {"id": "S5", "name": "伪标签", "desc": "不可作为 shape 真值"},
        {"id": "SY", "name": "合成精确", "desc": "精确,但分布看采样"},
        {"id": "-", "name": "无 shape", "desc": "只有关节或 2D"},
    ],
    "statuses": [
        {"id": "used", "name": "已在使用", "desc": "九源、WiLoR 14 源或基准中已经用到"},
        {"id": "surveyed", "name": "团队已调研", "desc": "已在团队图册中,尚未进训练"},
        {"id": "retired", "name": "不再使用", "desc": "当前不再使用"},
        {"id": "p0", "name": "P0 新增", "desc": "建议优先接入"},
        {"id": "p1", "name": "P1 新增", "desc": "P0 之后接入"},
        {"id": "p2", "name": "P2 新增", "desc": "有余力时接入"},
        {"id": "own", "name": "自采", "desc": "我们自己的采集"},
        {"id": "no", "name": "不建议", "desc": "不满足真实 RGB 或真值条件"},
    ],
    "routes": [
        {"id": "R0", "name": "原生 SOMA", "from": "SOMA 拟合结果", "how": "直接使用。", "shape": True},
        {"id": "R1", "name": "MANO → SOMA", "from": "MANO 参数或网格",
         "how": "用 SOMAHandLayer 的 MANO 后端映射到 SOMA 拓扑,再重拟合 SOMA 原生 20 维 identity 和 pose;按数据集统计顶点残差,残差大的帧不监督 shape。",
         "shape": True},
        {"id": "R2", "name": "SMPL-X → SOMA", "from": "SMPL-X / SMPL-H",
         "how": "取手部 MANO 部分走 R1;或用 SOMA-X 的 SMPL-X 身体后端整体转换。手型跟随身体 shape,分布偏窄。",
         "shape": True},
        {"id": "R3", "name": "3D 关键点 → SOMA pose", "from": "21 / 25 点 3D 关节",
         "how": "先定 MANO 21 点(指尖为网格顶点)与 SOMA 关节的对应,只拟合 pose;shape 固定,不参与监督。",
         "shape": False},
        {"id": "R4", "name": "2D 关键点", "from": "2D 关键点",
         "how": "不转换。训练时用重投影损失监督。",
         "shape": False},
        {"id": "R5", "name": "MHR → SOMA", "from": "MHR 参数",
         "how": "SOMAHandLayer 原生支持 MHR 后端,可直接映射。SAM 3D Body 输出 MHR,可当野外图像的伪标签教师。",
         "shape": True},
        {"id": "R6", "name": "扫描 → SOMA", "from": "扫描网格",
         "how": "直接把 SOMA 原生 shape + pose 拟合到扫描网格,是最好的 shape 监督和评测来源。",
         "shape": True},
        {"id": "R7", "name": "伪标签", "from": "预测的 MANO",
         "how": "可走 R1 转换,但只作弱监督或预训练,不监督 shape。",
         "shape": False},
    ],
    "teamLinks": [T_WILOR, T_EGO, T_2D, T_VID],
}

D = []


def add(**kw):
    kw.setdefault("tags", [])
    kw.setdefault("links", [])
    kw.setdefault("team", [])
    kw.setdefault("risk", "")
    kw.setdefault("subjects", "")
    kw.setdefault("scale", "")
    kw.setdefault("year", "")
    kw.setdefault("rig", {})
    D.append(kw)


# ---------- 已在使用 ----------
add(id="arctic", name="ARCTIC", year="CVPR 2023", status="used", tags=["九源", "WiLoR 14 源", "基准"],
    source="egoexo", method="marker", gt="MANO + SMPL-X", tier="S2", route="R1",
    camera="8 个固定 RGB + 1 个第一视角 RGB", rig={"ego": True, "exo": 8},
    subjects="10 人", scale="约 210 万张图,339 个序列",
    fills="双手操作铰接物体,带第一视角和光学真值。",
    risk="人数少,shape 分布窄。",
    links=[arxiv("2204.13662")], team=[T_WILOR, T_VID])
add(id="hot3d", name="HOT3D", year="CVPR 2025", status="used", tags=["九源", "WiLoR 14 源", "基准"],
    source="ego", method="marker", gt="MANO / UmeTrack", tier="S2", route="R1",
    camera="Aria RGB 鱼眼 + Quest 3 黑白", rig={"ego": True, "fisheye": True},
    subjects="19 人", scale="370 万张以上,约 833 分钟",
    fills="真实第一视角鱼眼数据,光学动捕真值。",
    risk="我们的模型在这里 RR 偏差大,先核对裁剪和去畸变与相机模型是否一致。",
    links=[{"label": "项目主页", "url": "https://facebookresearch.github.io/hot3d/"}], team=[T_WILOR, T_VID])
add(id="h2o", name="H2O", year="ICCV 2021", status="used", tags=["九源", "基准"],
    source="egoexo", method="rgbd", gt="MANO", tier="S3", route="R1",
    camera="5 台 Azure Kinect RGB-D,其中 1 台头戴", rig={"ego": True, "exo": 4, "depth": True},
    subjects="4 人", scale="571,645 张图,184 个序列",
    fills="头戴相机与 Femto Bolt 同一传感器族,相机域最接近我们的采集。",
    risk="人数很少。",
    links=[arxiv("2104.11181")], team=[T_VID])
add(id="hoi4d", name="HOI4D", year="CVPR 2022", status="retired", tags=["九源"],
    source="ego", method="rgbd", gt="MANO", tier="S3", route="R1",
    camera="头戴 RGB-D", rig={"ego": True, "depth": True},
    subjects="9 人", scale="约 240 万帧,4,000 个序列",
    fills="第一视角的类别级手物交互。",
    risk="右手偏置明显,左手只占约 10%。",
    links=[arxiv("2203.01577")], team=[T_VID])
add(id="dexycb", name="DexYCB", year="CVPR 2021", status="used", tags=["九源", "WiLoR 14 源"],
    source="exo", method="rgbd", gt="MANO", tier="S3", route="R1",
    camera="8 台 RGB-D", rig={"exo": 8, "depth": True},
    subjects="10 人", scale="约 58.2 万张图,1,000 个序列",
    fills="抓取 YCB 物体,人工多视角 2D 加深度拟合。",
    links=[arxiv("2104.04631")], team=[T_WILOR, T_VID])
add(id="ho3d", name="HO3D v3", year="CVPR 2020", status="used", tags=["九源", "WiLoR 14 源"],
    source="exo", method="rgbd", gt="MANO", tier="S3", route="R1",
    camera="1 到 5 台 RGB-D", rig={"exo": 5, "depth": True},
    subjects="10 人", scale="103,462 张图",
    fills="单手与物体交互,HOnnotate 联合拟合。",
    links=[arxiv("1907.01481")], team=[T_WILOR, T_VID])
add(id="h2o3d", name="H2O3D", year="2022", status="used", tags=["WiLoR 14 源"],
    source="exo", method="rgbd", gt="MANO", tier="S3", route="R1",
    camera="5 台 RGB-D", rig={"exo": 5, "depth": True},
    subjects="待核", scale="76,340 张图,85 个序列",
    fills="双手与物体交互。",
    team=[T_WILOR])
add(id="interhand", name="InterHand2.6M", year="ECCV 2020", status="used", tags=["WiLoR 14 源"],
    source="exo", method="mvkp", gt="MANO", tier="S4", route="R1",
    camera="棚内多相机 RGB", rig={"exo": 12},
    subjects="待核", scale="5 fps 版 2,590,347 张",
    fills="双手交互和丰富的手指姿态。",
    links=[arxiv("2008.09309")], team=[T_WILOR])
add(id="reinterhand", name="Re:InterHand", year="NeurIPS 2023", status="used", tags=["WiLoR 14 源"],
    source="synth", method="mvkp", gt="MANO", tier="S4", route="R1",
    camera="真实动作重光照渲染,含第一视角", rig={"synth": True, "ego": True},
    scale="1,526,795 张图,有效 147,745 帧",
    fills="真实双手动作配多样光照,含第一视角渲染。",
    team=[T_WILOR])
add(id="freihand", name="FreiHAND", year="ICCV 2019", status="used", tags=["WiLoR 14 源"],
    source="exo", method="mvkp", gt="MANO", tier="S4", route="R1",
    camera="棚内多相机,绿幕换背景", rig={"exo": 8},
    subjects="32 人", scale="训练 130,240 张,测试 3,960 张",
    fills="单手姿态与 shape 的经典基准。",
    links=[arxiv("1909.04349")], team=[T_WILOR])
add(id="mtc", name="MTC", year="CVPR 2019", status="used", tags=["WiLoR 14 源"],
    source="exo", method="mvkp", gt="3D 关键点", tier="-", route="R3",
    camera="Panoptic 棚内多相机", rig={"exo": 12},
    subjects="40 人", scale="清洗后约 11.1 万个手样本",
    fills="全身动作中的手,视角多样。",
    links=[arxiv("1812.01598")], team=[T_WILOR])
add(id="bedlam", name="BEDLAM", year="CVPR 2023", status="used", tags=["WiLoR 14 源"],
    source="synth", method="synth", gt="SMPL-X", tier="SY", route="R2",
    camera="合成渲染,非第一视角", rig={"synth": True},
    scale="10,450 个序列,约 160 万张,约 15 小时",
    fills="全身场景中的手,背景与光照多样。",
    risk="手型跟随 SMPL-X 身体 shape,分布偏窄。",
    links=[arxiv("2306.16940")], team=[T_WILOR])
add(id="rhd", name="RHD", year="ICCV 2017", status="used", tags=["WiLoR 14 源"],
    source="synth", method="synth", gt="3D 关键点", tier="-", route="R3",
    camera="合成渲染", rig={"synth": True},
    scale="训练 41,258 张,测试 2,728 张",
    fills="早期合成手部关键点数据。",
    links=[arxiv("1705.01389")], team=[T_WILOR])
add(id="egorenderer", name="EgoRenderer V005 / V006", year="2026", status="used", tags=["自有合成"],
    source="synth", method="synth", gt="原生手部参数;拟合 MANO / SOMA 为非 GT 辅助标注", tier="SY", route="R1",
    camera="第一视角合成渲染", rig={"synth": True, "ego": True},
    scale="V005:1,314 源组 / 2,425 历史包;V006 ARCTIC:301 源动作,每条只生产 1 份",
    fills="可控的第一视角合成数据。",
    risk="V005 参数附件更新沿用原 RGB;V006 渲染使用原生手,不使用拟合参数生成像素。当前只保留每动作一份生产目标,历史额外变体不计入目标。辅助拟合与训练资格另行登记。",
    team=[T_WILOR])
add(id="cocowb", name="COCO-WholeBody", year="ECCV 2020", status="used", tags=["WiLoR 14 源"],
    source="wild", method="manual2d", gt="2D 关键点", tier="-", route="R4",
    camera="网络图像", rig={"wild": True},
    scale="约 20 万张图",
    fills="野外图像的 2D 监督。",
    links=[arxiv("2007.11858")], team=[T_WILOR])
add(id="halpe", name="Halpe", year="2020", status="used", tags=["WiLoR 14 源"],
    source="wild", method="manual2d", gt="2D 关键点", tier="-", route="R4",
    camera="网络图像", rig={"wild": True},
    scale="约 4 万张训练图",
    fills="野外图像的 2D 监督。",
    team=[T_WILOR])
add(id="mpiinzsl", name="MPII + NZSL", year="CVPR 2017", status="used", tags=["WiLoR 14 源"],
    source="wild", method="manual2d", gt="2D 关键点", tier="-", route="R4",
    camera="网络图像与手语视频", rig={"wild": True},
    scale="2,800 只人工标注的手",
    fills="人工 2D 手部关键点。",
    links=[arxiv("1704.07809")], team=[T_WILOR])
add(id="ego4d", name="Ego4D(P3R3 伪标签)", year="CVPR 2022", status="used", tags=["九源(伪标签)"],
    source="wild", method="pseudo", gt="预测 MANO", tier="S5", route="R7",
    camera="多种头戴相机", rig={"ego": True, "wild": True},
    fills="海量真实第一视角外观。",
    risk="P3R3 管线预测的 MANO,不是训练真值。",
    team=[T_VID])
add(id="epic", name="EPIC-KITCHENS(P3R3 伪标签)", year="2018 / 2022", status="used", tags=["九源(伪标签)"],
    source="wild", method="pseudo", gt="预测 MANO", tier="S5", route="R7",
    camera="头戴 GoPro", rig={"ego": True, "wild": True},
    fills="厨房场景的真实第一视角。",
    risk="P3R3 管线预测的 MANO,不是训练真值。",
    team=[T_VID])
add(id="egodex", name="EgoDex", year="2025", status="used", tags=["九源(伪标签)", "第一人称图册"],
    source="ego", method="device", gt="25 个 3D 关节(ARKit)", tier="-", route="R3",
    camera="Apple Vision Pro", rig={"ego": True},
    scale="约 829 小时",
    fills="大规模第一视角灵巧操作,带设备追踪的关节。",
    risk="关节来自设备追踪,团队另有 P3R3 预测 MANO,都不能监督 shape。",
    links=[arxiv("2505.11709")], team=[T_EGO, T_VID])

# ---------- 团队已调研(第一人称图册中带手部 3D 的条目) ----------
add(id="egopressure", name="EgoPressure", year="CVPR 2025", status="surveyed", tags=["第一人称图册"],
    source="egoexo", method="rgbd", gt="MANO", tier="S3", route="R1",
    camera="头戴相机 + 多台外视角 RGB-D", rig={"ego": True, "exo": 7, "depth": True},
    fills="手与表面接触的压力,带第一视角。",
    risk="HaMeR 初始化后用多视角 RGB-D、分割、压力和时序约束拟合 MANO,手上没有 marker。",
    links=[arxiv("2409.02224")], team=[T_EGO])
add(id="egoemg", name="EgoEMG", year="2026", status="surveyed", tags=["第一人称图册"],
    source="ego", method="marker", gt="MANO(光捕 marker 经 markers2mano 拟合)", tier="S2", route="R1",
    camera="头戴 GoPro 60 FPS + 26 相机光学动捕", rig={"ego": True},
    fills="第一视角与肌电同步,光学动捕真值。",
    links=[arxiv("2605.05712")], team=[T_EGO])
add(id="hocap", name="HO-Cap", year="2024", status="surveyed", tags=["第一人称图册"],
    source="egoexo", method="rgbd", gt="MANO", tier="S3", route="R1",
    camera="多台 RGB-D + HoloLens 第一视角 RGB", rig={"ego": True, "exo": 8, "depth": True},
    fills="手物交互,含第一视角。",
    risk="多视角 RGB-D 与关键点约束拟合 MANO,不使用光捕。",
    team=[T_EGO])
add(id="taco", name="TACO", year="CVPR 2024", status="surveyed", tags=["第一人称图册"],
    source="egoexo", method="mvkp", gt="MANO", tier="S4", route="R1",
    camera="多台外视角 + 1 个第一视角", rig={"ego": True, "exo": 12},
    fills="双手使用工具的交互。",
    risk="多视角 MMPose 三角化后做 MANO 接触与时序拟合,手上没有光捕。",
    team=[T_EGO])
add(id="aceda0", name="ACE-Data-0", year="2026", status="surveyed", tags=["第一人称图册"],
    source="egoexo", method="marker", gt="手部动捕(格式待核)", tier="S2", route="R1",
    camera="环境多相机 + 第一视角", rig={"ego": True, "exo": 6},
    fills="身体与物体用 OptiTrack,手部附带动捕数据。",
    risk="官方叠加样例未逐帧配对;全量发布目标 150 小时,目前为快照。",
    team=[T_EGO])
add(id="xperience", name="Xperience-10M", year="2026", status="surveyed", tags=["第一人称图册"],
    source="ego", method="device", gt="手部动捕(类型待核)", tier="-", route="R3",
    camera="第一视角", rig={"ego": True},
    scale="约 1 万小时",
    fills="规模极大的第一视角数据。",
    risk="手部真值的采集方式和精度待核。",
    team=[T_EGO])
add(id="feel", name="FEEL", year="2026", status="surveyed", tags=["第一人称图册"],
    source="ego", method="device", gt="Aria MPS 手部追踪", tier="-", route="R3",
    camera="Aria", rig={"ego": True, "fisheye": True},
    fills="Aria 第一视角的设备追踪手部。",
    team=[T_EGO])
add(id="openaoe", name="Open-AoE", year="2026", status="surveyed", tags=["第一人称图册"],
    source="ego", method="pseudo", gt="自动重建 MANO", tier="S5", route="R7",
    camera="第一视角", rig={"ego": True},
    fills="第一视角操作,自动 MANO 重建。",
    team=[T_EGO])
add(id="genhumanego", name="Gen-HumanEgo", year="2026", status="surveyed", tags=["第一人称图册"],
    source="ego", method="pseudo", gt="DFM HandTrack 预测", tier="S5", route="R7",
    camera="第一视角", rig={"ego": True},
    fills="第一视角,模型预测的手部。",
    team=[T_EGO])
add(id="egolive", name="EgoLive", year="2026", status="surveyed", tags=["第一人称图册"],
    source="ego", method="pseudo", gt="HaMeR 预测 MANO", tier="S5", route="R7",
    camera="第一视角", rig={"ego": True},
    fills="第一视角,HaMeR 伪标签。",
    team=[T_EGO])
add(id="egoverse", name="EgoVerse", year="2026", status="surveyed", tags=["第一人称图册"],
    source="ego", method="device", gt="21 个 3D 关节", tier="-", route="R3",
    camera="第一视角", rig={"ego": True},
    fills="多地采集的第一视角人类示范。",
    risk="关节来源待核。",
    links=[arxiv("2604.07607")], team=[T_EGO])
add(id="ipnhands", name="IPN HandS", year="2020", status="surveyed", tags=["2D 图册"],
    source="exo", method="manual2d", gt="2D 关键点(21 点)", tier="-", route="R4",
    camera="单相机", rig={"exo": 1},
    scale="200 段视频,约 80 万帧",
    fills="MediaPipe 预标后人工修正的连续 2D。",
    risk="GT 配对和元数据校验未完成。",
    team=[T_2D])

# ---------- 新增建议 ----------
add(id="hograspnet", name="HOGraspNet", year="ECCV 2024", status="p0", tags=["新增"],
    source="exo", method="rgbd", gt="MANO + HALO", tier="S3", route="R1",
    camera="4 台 Azure Kinect RGB-D,其中 1 台在身后眼睛高度模拟第一视角", rig={"exo": 4, "depth": True, "pseudoEgo": True},
    subjects="99 人,10 到 74 岁", scale="1,489,112 帧,28 类抓取,30 个物体",
    fills="shape 多样性:作者的 t-SNE 显示比 HO3D、DexYCB、OakInk 更分散。相机与 Femto Bolt 同一传感器族。",
    risk="手上没有 marker,MANO 来自 MediaPipe 三角化加 RGB-D 拟合。",
    links=[{"label": "项目主页", "url": "https://hograspnet2024.github.io/"}, arxiv("2409.04033")])
add(id="palm", name="PALM", year="2025", status="p0", tags=["新增"],
    source="scan", method="scan", gt="扫描网格 + MANO 配准", tier="S1", route="R6",
    camera="3dMD 扫描仪:7 台 RGB + 14 台黑白", rig={"scanner": True},
    subjects="263 人,男女各半,21 到 70 岁", scale="约 9 万张多视角 RGB,1.3 万次扫描,约 50 种右手手势",
    fills="目前能找到的最可靠 shape 真值,可做 shape 先验和 shape 评测集。",
    risk="作者称发表后公开;Voxel51 上有 1000 样本子集,完整版获取方式待确认。只有右手静态手势。",
    links=[arxiv("2511.05403"), {"label": "Voxel51 子集", "url": "https://docs.voxel51.com/dataset_zoo/datasets_hf/palm.html"}])
add(id="egoexo4d", name="Ego-Exo4D 手部姿态", year="CVPR 2024", status="p0", tags=["新增"],
    source="egoexo", method="mvkp", gt="21 个 3D 关键点", tier="-", route="R3",
    camera="Aria RGB(110° 视场,卷帘快门)+ 外视角相机", rig={"ego": True, "fisheye": True, "exo": 5},
    scale="约 6.8 万人工 2D、34 万人工 3D;自动 3D 约 2100 万",
    fills="真实场景的宽视场第一视角,对应 HOT3D 上暴露的相机域问题。",
    risk="没有 MANO,只能监督 pose。",
    links=[arxiv("2311.18259")])
add(id="gigahands", name="GigaHands", year="CVPR 2025", status="p1", tags=["新增"],
    source="exo", method="mvkp", gt="MANO", tier="S4", route="R1",
    camera="51 台 RGB,只有外视角", rig={"exo": 51},
    subjects="56 人", scale="34 小时,1.83 亿帧,8.4 万条文本描述",
    fills="双手动作的多样性。",
    risk="YOLO + HaMeR + ViTPose 初始化后三角化,再用 EasyMoCap 拟合,可能继承 HaMeR 的偏差,建议先抽检。",
    links=[{"label": "项目主页", "url": "https://ivl.cs.brown.edu/research/gigahands.html"}, arxiv("2412.04244")])
add(id="oakink2", name="OakInk2", year="CVPR 2024", status="p1", tags=["新增"],
    source="egoexo", method="marker", gt="SMPL-X → MANO", tier="S2", route="R2",
    camera="1 个第一视角 + 3 个外视角 RGB,848×480", rig={"ego": True, "exo": 3},
    subjects="9 人", scale="627 个序列,401 万帧",
    fills="第一视角加光学真值的双手复杂任务。",
    risk="团队 10.8 只用了它的动作分布,图像未入清单。画面中可能看得到 marker,需检查。分辨率低。",
    links=[{"label": "项目主页", "url": "https://oakink.net/v2"}, arxiv("2403.19417")])
add(id="hint", name="HInt", year="CVPR 2024", status="p1", tags=["新增"],
    source="wild", method="manual2d", gt="21 点 2D + 逐点遮挡标签", tier="-", route="R4",
    camera="Ego4D、EPIC VISOR、Hands23、NewDays 图像", rig={"wild": True, "ego": True},
    fills="野外第一视角的 2D 监督,以及按遮挡分层的评测。",
    risk="Ego4D 帧需单独申请许可。",
    links=[{"label": "GitHub(MIT)", "url": "https://github.com/ddshan/hint"}])
add(id="blurhand", name="BlurHand", year="CVPR 2023", status="p1", tags=["新增"],
    source="exo", method="mvkp", gt="首、中、尾三帧 3D 真值", tier="S4", route="R1",
    camera="由 InterHand2.6M 插帧合成运动模糊", rig={"exo": 12},
    scale="训练 121,839 张,测试 34,057 张",
    fills="运动模糊,对应 V7 台本里的快速动作。",
    links=[{"label": "GitHub", "url": "https://github.com/JaehaKim97/BlurHand_RELEASE"}, arxiv("2303.15417")])
add(id="dartset", name="DARTset", year="NeurIPS 2022", status="p1", tags=["新增"],
    source="synth", method="synth", gt="MANO 扩展(DART)", tier="SY", route="R1",
    camera="合成渲染", rig={"synth": True},
    scale="约 80 万张,50 种饰品,325 种皮肤纹理",
    fills="外观多样性:戒指、手表、美甲、纹身。",
    links=[{"label": "NeurIPS 论文", "url": "https://proceedings.neurips.cc/paper_files/paper/2022/hash/f06d5ebd4ff40b40dd97e30cee632123-Abstract-Datasets_and_Benchmarks.html"}])
add(id="humbi", name="HUMBI Hand", year="CVPR 2020", status="p2", tags=["新增"],
    source="exo", method="mvkp", gt="MANO", tier="S4", route="R1",
    camera="手部 68 个视角", rig={"exo": 68},
    subjects="全集 772 人,性别均衡,多种肤色",
    fills="shape 分布广。",
    risk="每人 shape 取关键点拟合结果的时间中值,只能当弱监督。",
    links=[{"label": "项目主页", "url": "http://humbi-data.net"}, arxiv("2110.00119")])

# ---------- 自采 ----------
add(id="ourcapture", name="单人手部采集(V6 / V7)", year="2026", status="own", tags=["自采"],
    source="egoexo", method="marker", gt="SOMA(目标)", tier="S2", route="R0",
    camera="Femto Bolt 头戴 RGB(带 marker)+ 光学动捕", rig={"ego": True, "exo": 6},
    subjects="3 人(计划增加)", scale="V6 152 条 + V7 新增 51 条",
    fills="极端抓取、手内换抓、手手接触、注视与速度变化。",
    risk="手上 marker 出现在 RGB 中,需按已知位置做 inpainting。")

# ---------- 不建议 ----------
add(id="assemblyhands", name="AssemblyHands", year="CVPR 2023", status="no", tags=["不建议"],
    source="norgb", method="mvkp", gt="21 个 3D 关键点", tier="-", route="R3",
    camera="第一视角为黑白鱼眼;外视角为 RGB", rig={"ego": True, "fisheye": True, "mono": True, "exo": 8},
    subjects="34 人", scale="约 300 万张,其中第一视角约 49 万张",
    fills="只有外视角 RGB 可用。",
    risk="第一视角不是真实 RGB,与排除 SHOW3D 的理由相同。",
    links=[arxiv("2304.12301")])
add(id="show3d", name="SHOW3D", year="2026", status="no", tags=["不建议", "第一人称图册"],
    source="norgb", method="mvkp", gt="UmeTrack(另提供 MANO / MHR 转换)", tier="S4", route="R1",
    camera="黑白鱼眼", rig={"ego": True, "fisheye": True, "mono": True},
    fills="团队已排除。",
    risk="无标记多视角自动拟合,人工核验子集不具代表性;黑白鱼眼不满足真实 RGB 条件。",
    team=[T_EGO])
add(id="hiphi", name="HiPHI", year="2026", status="no", tags=["不建议"],
    source="norgb", method="marker", gt="BVH 骨架", tier="-", route="R3",
    camera="无 RGB", rig={"none": True},
    subjects="132 人", scale="617.5 小时(含镜像),约 2 亿帧",
    fills="大规模全身与物体交互动捕,可作动作先验。",
    risk="没有图像,手部细节未说明。",
    links=[arxiv("2608.16222")])
add(id="eventegohands", name="EventEgoHands++(EEH-R)", year="2026", status="no", tags=["不建议"],
    source="norgb", method="device", gt="MANO(手套关节拟合)", tier="S4", route="R1",
    camera="DAVIS346 事件相机", rig={"ego": True, "none": True},
    subjects="8 人", scale="1,019,716 帧,约 2.36 小时",
    fills="暗光与事件相机。",
    risk="没有 RGB,公开情况未说明。",
    links=[{"label": "alphaXiv", "url": "https://www.alphaxiv.org/abs/2609.17189"}])

out = {"meta": meta, "datasets": D}
(ROOT / "data").mkdir(exist_ok=True)
(ROOT / "data" / "datasets.json").write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8")
prev = ROOT / "data" / "previews.json"
if not prev.exists():
    prev.write_text("{}\n", encoding="utf-8")

# 校验
ids = [d["id"] for d in D]
assert len(ids) == len(set(ids)), "id 重复"
src = {s["id"] for s in meta["sources"]}
mth = {m["id"] for m in meta["methods"]}
tr = {t["id"] for t in meta["tiers"]}
st = {s["id"] for s in meta["statuses"]}
rt = {r["id"] for r in meta["routes"]}
for d in D:
    assert d["source"] in src, d["id"]
    assert d["method"] in mth, d["id"]
    assert d["tier"] in tr, d["id"]
    assert d["status"] in st, d["id"]
    assert d["route"] in rt, d["id"]
print(f"写出 {len(D)} 个数据集")