feat: 合并 Docker Compose、标注表格优化与部署文档

将 platform + CVAT 合并为单文件 docker-compose.yml,完善 .env 与 init/dev_up 脚本;
新增 docs/DEPLOY.md 与更新 README 以支持新机器部署;含数据湖示例、车队地图、
紧凑表格 UI、ADAS det_7cls 路径与批次台账等近期改动。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-16 17:06:31 +08:00
parent 0b8ade048e
commit 483e027482
117 changed files with 5933 additions and 1499 deletions

View File

@@ -6,20 +6,35 @@ from pathlib import Path
from as_platform.data.promote.base import PackPromoteAdapter, PromoteContext, PromoteResult
from as_platform.data.promote.manifest import refresh_dms_yaml
from as_platform.data.promote.validate.dms_yolo import validate_dms_task
from as_platform.data.promote.validate.dms_yolo import validate_dms_inbox_batch
_DMS_SCRIPTS = Path(__file__).resolve().parents[4] / "datasets" / "dms" / "scripts"
if str(_DMS_SCRIPTS) not in sys.path:
sys.path.insert(0, str(_DMS_SCRIPTS))
def _resolve_promote_pack_dir(project_root: Path, pack: str) -> Path:
"""解析 pack 目录;损坏的 workspace 软链则回退为 HSAP 内真实目录。"""
candidate = project_root / "packs" / pack
if candidate.is_symlink():
try:
resolved = candidate.resolve()
if resolved.is_dir():
return resolved
except OSError:
pass
candidate.unlink()
candidate.mkdir(parents=True, exist_ok=True)
return candidate
class DmsYoloPromoteAdapter(PackPromoteAdapter):
project = "dms"
def validate(self, ctx: PromoteContext) -> list[str]:
if ctx.skip_validate:
return []
return validate_dms_task(ctx.task)
return validate_dms_inbox_batch(ctx.batch_dir)
def promote(self, ctx: PromoteContext) -> PromoteResult:
from ingest_incremental import promote_inbox_batch
@@ -34,8 +49,7 @@ class DmsYoloPromoteAdapter(PackPromoteAdapter):
warnings=[f"batch_dir missing: {ctx.batch_dir}"],
)
pack_dir = ctx.project_root / "packs" / ctx.pack
pack_dir.mkdir(parents=True, exist_ok=True)
pack_dir = _resolve_promote_pack_dir(ctx.project_root, ctx.pack)
detail = promote_inbox_batch(
root=ctx.project_root,
@@ -46,7 +60,7 @@ class DmsYoloPromoteAdapter(PackPromoteAdapter):
dry_run=ctx.dry_run,
refresh=ctx.refresh and not ctx.dry_run,
)
if ctx.refresh and not ctx.dry_run and not ctx.skip_validate:
if ctx.refresh and not ctx.dry_run:
refresh_dms_yaml(task=ctx.task)
added = int(detail.get("added") or 0)

View File

@@ -8,6 +8,17 @@ from pathlib import Path
from as_platform.config import WORKSPACE
def validate_dms_inbox_batch(batch_dir: Path) -> list[str]:
"""Promote 前校验单个 inbox 批次(不要求 pack 目录已存在)。"""
from as_platform.labeling.batch_stage import batch_has_yolo_labels
if not batch_dir.is_dir():
return [f"batch_dir missing: {batch_dir}"]
if not batch_has_yolo_labels(batch_dir):
return [f"no YOLO labels under {batch_dir} (先执行 labeling_export)"]
return []
def validate_dms_task(task: str | None) -> list[str]:
cmd = [sys.executable, str(WORKSPACE / "scripts" / "validate_dms_tasks.py")]
if task: