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)
This commit is contained in:
86
platform/as_platform/labeling/scope.py
Normal file
86
platform/as_platform/labeling/scope.py
Normal file
@@ -0,0 +1,86 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user