#!/usr/bin/env python3 """按已登记的分类,从固定版本的团队预览池分层抽样。 python tools/import_team_previews.py --per 12 来源与版本见 data/preview_sources.json;完整素材池见 data/preview_pool.json。 主分类在数据集内部轮转,分类内部均衡来源已提供的手别和视角。 """ from pathlib import Path from collections import Counter import argparse, hashlib, json SITE=Path(__file__).resolve().parent.parent ap=argparse.ArgumentParser(description=__doc__) ap.add_argument('--per',type=int,default=12) quota=ap.parse_args().per data=json.loads((SITE/'data/preview_pool.json').read_text()) selected={} audit={'target_per_dataset':quota,'seed':'20261027','scope':'已取得的公开预览池','strategy':f'各数据集最多 {quota} 组;按主分类轮转,分类内部再均衡已提供的手别、视角等分类。素材不足时全部展示。','dimensions_note':'分类来自来源子集、序列、相机和手别元数据。姿态与抓握类别尚未建立统一标签。','datasets':{}} for key,items in data.items(): dimensions=['来源子集','序列','视角','手别','受试者'] primary=next((dim for dim in dimensions if len({p['strata'].get(dim) for p in items if p['strata'].get(dim)})>1),None) chosen=[];remaining=items.copy();counts={dim:Counter() for dim in dimensions};conditional=Counter();primary_counts=Counter() while len(chosen)