Files
HSAP/platform/as_platform/labeling/scope.py
Chengfang Lu e72bc061c5 feat: HSAP platform v2 — modular navigation, quality review, audit log, world model simulation
Major changes:
- New frontend (platform/web/): Vite + React 18 + TypeScript + Tailwind
- 4-module navigation: 数据送标 / 模型管理 / 车队管理 / 系统管理
- Data catalog with charts (DMS/ADAS/Lane 3-tab view)
- Quality review workflow (标注质检): Good/Fine/Bad scoring with auto-advance
- Audit enhancements: batch operations, rejection categories, Feishu notifications
- Operation audit log (操作日志)
- World model simulation studio (仿真工坊)
- Dataset version management with snapshots and diff
- ADAS 7-class dataset integration (138K images organized + compressed)
- User management with Feishu integration and pagination
- CRUD/search/filter on all pages, card layout redesign
- PIL-optimized image overlay rendering
- Auto-snapshot on build, in_review workflow stage
- Removed embedded algorithm code (now in workspace)
2026-06-03 11:40:21 +08:00

87 lines
3.0 KiB
Python

"""CatalogScope 与 registry 对齐。"""
from __future__ import annotations
from typing import Any
import yaml
from as_platform.config import WORKSPACE
DOMAIN_LABELS = {"dms": "舱内 DMS", "forward": "前向 ADAS"}
def format_scope_key(project: str, task: str, mode: str | None = None) -> str:
if project == "lane":
return f"lane:{task}"
if mode:
return f"dms:{task}:{mode}"
return f"dms:{task}"
def _dms_registry_api():
import sys
from pathlib import Path
p = WORKSPACE / "datasets" / "dms" / "scripts"
if str(p) not in sys.path:
sys.path.insert(0, str(p))
from task_registry import get_mode_config, resolve_task_id, train_yaml_key
return get_mode_config, resolve_task_id, train_yaml_key
def load_dms_registry() -> dict:
path = WORKSPACE / "datasets" / "dms" / "datasets.registry.yaml"
return yaml.safe_load(path.read_text(encoding="utf-8"))
def load_labeling_registry() -> dict[str, Any]:
path = WORKSPACE / "datasets" / "labeling.registry.yaml"
if not path.is_file():
return {"profiles": {}}
return yaml.safe_load(path.read_text(encoding="utf-8")) or {"profiles": {}}
def labeling_profile_key(project: str, task: str, mode: str | None, reg: dict | None = None) -> str:
if project == "lane":
return f"lane__{task}"
get_mode_config, resolve_task_id, train_yaml_key = _dms_registry_api()
reg = reg or load_dms_registry()
task, mode = resolve_task_id(task, mode)
return train_yaml_key(task, mode, reg)
def enrich_batch_labels(batch: dict[str, Any], reg: dict | None = None) -> dict[str, Any]:
project = batch.get("project") or "dms"
task = batch.get("task") or ""
mode = batch.get("mode")
out = dict(batch)
out["scope_key"] = format_scope_key(project, task, mode)
if project == "dms":
reg = reg or load_dms_registry()
get_mode_config, resolve_task_id, _ = _dms_registry_api()
try:
task_r, mode_r = resolve_task_id(task, mode)
mcfg = get_mode_config(task_r, mode_r, reg)
domain = mcfg.get("domain") or "dms"
out["domain"] = domain
out["domain_label"] = DOMAIN_LABELS.get(domain, domain)
out["task_label"] = mcfg.get("label") or task
if mode_r:
modes = (reg.get("tasks") or {}).get(task_r, {}).get("modes") or {}
out["mode_label"] = (modes.get(mode_r) or {}).get("label") or mode_r
except Exception:
out["domain"] = "dms"
out["domain_label"] = DOMAIN_LABELS["dms"]
else:
out["domain_label"] = "车道线 Lane"
out["task_label"] = task
try:
pk = labeling_profile_key(project, task, mode, reg if project == "dms" else None)
out["labeling_profile"] = pk
prof = (load_labeling_registry().get("profiles") or {}).get(pk)
if prof:
out["export_default"] = prof.get("export_default")
out["ml_adapter"] = prof.get("ml_adapter")
except Exception:
out["labeling_profile"] = None
return out