- 统一标注引擎为 CVAT:客户端/配置/格式转换、iframe 标注页、docker-compose.cvat.yml 与 no_auth 补丁 - 移除 Label Studio 相关配置与构建脚本,清理 embedded.bak 备份与误提交的 node_modules - 新增「我的标注」:跨 Campaign 收件箱、逐张清单、CVAT frame 跳转 - 飞书任务分配:通讯录同步选人、按量分配、分配后 DM 通知(含 my-tasks 链接) - ADAS cuboid_7cls 数据湖接入:workflow 路径、register-batch、开标上传与标注同步 - 数据湖挂载 AS_DATA_LAKE_ROOT、datasets/adas 符号链接、reset_labeling 运维脚本 - 补充 docs/HANDOVER.md 项目交接文档 Co-authored-by: Cursor <cursoragent@cursor.com>
95 lines
3.3 KiB
Python
95 lines
3.3 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 == "adas":
|
|
return f"adas:{task}"
|
|
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 == "adas":
|
|
return task
|
|
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"]
|
|
elif project == "adas":
|
|
out["domain"] = "adas"
|
|
out["domain_label"] = "前向 ADAS"
|
|
out["task_label"] = task
|
|
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
|