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)
262 lines
9.3 KiB
Markdown
262 lines
9.3 KiB
Markdown
# HSAP 开发计划(2026 Q2)
|
||
|
||
本文是 HSAP(Huaxu Sentinel Active Safety Platform)的**分期开发路线图**,与现有文档对齐:
|
||
|
||
- 标注验收:[PHASE_ROLLOUT_DMS.md](./PHASE_ROLLOUT_DMS.md)
|
||
- 送标 SOP:[LABELING_SOP.md](./LABELING_SOP.md)
|
||
- 缺口跟踪:[QA_GAP_REPORT.md](./QA_GAP_REPORT.md)、[DATA_LAKE_GAP.md](./DATA_LAKE_GAP.md)
|
||
- 本地开发:[DEVELOPMENT_GUIDE.md](./DEVELOPMENT_GUIDE.md)
|
||
|
||
---
|
||
|
||
## 1. 架构原则(维持当前技术栈)
|
||
|
||
**结论:现阶段不引入 RabbitMQ / Kafka;DB + thread/worker + Redis 足够。**
|
||
|
||
| 层级 | 选型 | 用途 |
|
||
|------|------|------|
|
||
| API | FastAPI + Label Studio Editor 壳 | 送标 / 标注 / 审核 / 训练 / 车队 |
|
||
| 持久化 | PostgreSQL(生产)/ SQLite(本机) | Job、Campaign、用户、审批 |
|
||
| 异步 Job | `thread`(本机)/ `worker`(Docker) | 导出、build、训练、入湖分析 |
|
||
| Redis | List 队列 + Pub/Sub + 标注锁 | 仅 worker 模式强依赖;本机可跳过 |
|
||
| 训练/数据 | `as.py` + DMS/Lane registry | inbox → pack → train |
|
||
|
||
```mermaid
|
||
flowchart TB
|
||
subgraph dev [本机开发 thread 模式]
|
||
RunLocal[run_local.sh]
|
||
ThreadExec[daemon Thread 跑 Job]
|
||
RunLocal --> ThreadExec
|
||
end
|
||
subgraph prod [生产 Docker worker 模式]
|
||
Platform[platform :8787]
|
||
RedisQ[Redis as:job_queue]
|
||
Worker[worker.py]
|
||
Platform -->|push_job| RedisQ
|
||
RedisQ -->|brpop| Worker
|
||
end
|
||
subgraph future [未来可选 触发条件见 §6]
|
||
MQ[RabbitMQ / Kafka]
|
||
MQ -.->|替换 Redis List| RedisQ
|
||
end
|
||
```
|
||
|
||
**环境对照**
|
||
|
||
| 场景 | 启动方式 | Job 执行 | Redis |
|
||
|------|----------|----------|-------|
|
||
| 本机快速开发 | `bash scripts/run_local.sh` | 进程内 thread | 可选(锁回退 memory) |
|
||
| 联调 / 演示 | `docker compose up -d platform worker redis postgres` | 独立 worker | 必须 |
|
||
| 训练机 | 仅 `worker.py` + Redis | GPU 节点消费队列 | 必须 |
|
||
|
||
---
|
||
|
||
## 2. 阶段总览
|
||
|
||
| 阶段 | 时间盒 | 目标 | 退出标准 |
|
||
|------|--------|------|----------|
|
||
| **A** 标注闭环 | 1~2 周 | dam/addw/addw_face 画布→导出→入库可 E2E | P0+P1 清单全绿 |
|
||
| **B** 生产运行态 | 1 周 | Docker worker + Redis 稳定跑导出/训练 Job | smoke + Jobs 页成功 |
|
||
| **C** 数据入湖 | 2 周 | 批次台账、飞书、MinIO 主路径打通 | DATA_LAKE checklist A~E |
|
||
| **D** 扩展任务 | 2~3 周 | forward / lane 画布 + 导出 | P2 清单 |
|
||
| **E** 体验与治理 | 持续 | 关键点 UX、审计、权限、文档 | 标注员可独立操作 |
|
||
| **F** 架构演进 | 按需 | MQ / 多 worker / 监控 | 见 §6 触发条件 |
|
||
|
||
---
|
||
|
||
## 3. 阶段 A:标注闭环(当前最高优先级)
|
||
|
||
### A.1 已完成(代码侧)
|
||
|
||
- [x] `dms_pose.xml`(face + 37 关键点)
|
||
- [x] `export_ls_to_yolo.py`(detect 5 字段 / pose 116 字段)
|
||
- [x] `runner.py` 导出前转换 + `as.py build`
|
||
- [x] `batch_stage.py` 有 txt 才设 `returned`
|
||
- [x] `test_export_ls_to_yolo.py` 单元测试
|
||
- [x] `run_local.sh` / `wait_for_db.py` thread 模式跳过 Redis 等待
|
||
|
||
### A.2 待完成(验收)
|
||
|
||
| # | 任务 | 负责人建议 | 验收 |
|
||
|---|------|------------|------|
|
||
| A2.1 | inbox 放入样例图(dam/addw_face 各 ≥3 张) | 数据/协调员 | `GET .../tasks` 非空 |
|
||
| A2.2 | 浏览器:dam 检测框标注保存 | 标注员 | `labels/ls_annotations/*.json` |
|
||
| A2.3 | 浏览器:addw_face 框 + 关键点保存 | 标注员 | JSON 含 `rectanglelabels` + `keypointlabels` |
|
||
| A2.4 | 导出 Job → `labels/train/*.txt` | 协调员 | dam 5 字段;addw_face 116 字段 |
|
||
| A2.5 | 提交入库审核 → build 进 pack | 工程师 | 数据目录可见新 sources |
|
||
| A2.6 | 审核预览叠加框 + 关键点 | 审核员 | preview 缩略图正确 |
|
||
| A2.7 | 更新 QA_GAP(export 已对接) | 开发 | 文档与代码一致 |
|
||
|
||
**命令**
|
||
|
||
```bash
|
||
# 离线
|
||
python3 /home/chengfanglu/DATA/HSAP/datasets/dms/scripts/test_export_ls_to_yolo.py
|
||
|
||
# 本机平台
|
||
cd /home/chengfanglu/DATA/HSAP && bash scripts/run_local.sh
|
||
|
||
# API 冒烟(平台起来后)
|
||
bash /home/chengfanglu/DATA/HSAP/scripts/smoke_labeling_api.sh
|
||
```
|
||
|
||
### A.3 addw_face 专项增强(可选,A 通过后)
|
||
|
||
| 任务 | 说明 |
|
||
|------|------|
|
||
| 关键点语义名 | 在 `addw_face_37.yaml` 补 `display_name`(若有外协规范) |
|
||
| 标注进度 | 进度 API 增加「已标 kpt 数/37」 |
|
||
| 多脸策略 | 文档化 bbox-关键点分配规则;必要时 UI 约束单脸 |
|
||
|
||
---
|
||
|
||
## 4. 阶段 B:生产运行态(worker + Redis)
|
||
|
||
### B.1 基础设施
|
||
|
||
```bash
|
||
cd /home/chengfanglu/DATA/HSAP
|
||
docker compose up -d postgres redis platform worker
|
||
# .env: AS_REDIS_PORT=6380 → run_local 已自动对齐
|
||
```
|
||
|
||
| 任务 | 说明 |
|
||
|------|------|
|
||
| B1.1 | 确认 `AS_JOB_EXECUTOR=worker` 在 compose 内生效 |
|
||
| B1.2 | 导出/训练 Job 仅 worker 消费,platform 不阻塞 |
|
||
| B1.3 | `/api/v1/health` 中 `redis_connected=true` |
|
||
| B1.4 | 标注锁走 Redis(多标注员并行时不抢标) |
|
||
|
||
### B.2 可观测性(轻量)
|
||
|
||
| 任务 | 说明 |
|
||
|------|------|
|
||
| B2.1 | Jobs 页:failed Job 展示 `export_convert` / stderr 摘要 |
|
||
| B2.2 | `manifests/trace_log.jsonl` 关键 span 文档化 |
|
||
| B2.3 | worker 日志:`执行 Job job-xxx` 与 platform 对齐 |
|
||
|
||
### B.3 本机 vs Docker 文档
|
||
|
||
在 [DEVELOPMENT_GUIDE.md](./DEVELOPMENT_GUIDE.md) 增加一节:
|
||
|
||
- 日常改代码 → `run_local.sh`(thread,无 Redis)
|
||
- 验证导出/训练链路 → `docker compose up worker`
|
||
- 禁止混用:thread 模式提交的 Job 不会被 Docker worker 消费(同一 Redis 时可消费,但 DB 需一致)
|
||
|
||
---
|
||
|
||
## 5. 阶段 C~E:数据入湖与任务扩展
|
||
|
||
### C. 数据入湖(见 DATA_LAKE_GAP.md)
|
||
|
||
- 批次台账 → 审批入湖 → inbox 出现在送标工作台
|
||
- 飞书多维表格同步(可选,`FEISHU_BITABLE_SYNC_ENABLED=0` 可关)
|
||
- MinIO staging(`docker compose --profile minio up`)
|
||
- 上传 ZIP → 分析 → promote inbox
|
||
|
||
### D. forward / lane(P2)
|
||
|
||
| 任务 | 文件/动作 |
|
||
|------|-----------|
|
||
| `forward_4cls.xml` / `forward_cls.xml` | 补 label_studio 模板 |
|
||
| `lane_ufld_mask.xml` + `export_ls_to_lane_gt.py` | **已实现**(BrushLabels → PNG + train_gt.txt) |
|
||
| registry profile `lane__lane_v1` | 导出 `lane_gt_txt` + `build lane` |
|
||
|
||
### E. 体验与治理
|
||
|
||
- 37 关键点侧栏分组(Header 分块)
|
||
- 角色权限:`internal_labeler` / `labeler` / `reviewer` 回归
|
||
- 外协 ZIP:`import-vendor` 与平台标注双轨说明([VENDOR_RETURN.md](./VENDOR_RETURN.md))
|
||
- 前端变更后:`bash scripts/build_hsap_ls_ui.sh` + 强刷
|
||
|
||
---
|
||
|
||
## 6. 阶段 F:何时引入 MQ(暂不实施)
|
||
|
||
**当前不引入。** 满足以下 **任意 2 条** 时再立项:
|
||
|
||
1. Job 入队 > 10/s sustained,或 Redis List 延迟明显
|
||
2. 需要优先级队列(训练插队、导出低优先级)
|
||
3. 需要死信队列 + 自动重试(现仅靠 Job 表 failed + 人工重跑)
|
||
4. 多机房 / 多 worker 池,Redis 单点成为瓶颈
|
||
5. 消息审计与回放成为合规要求
|
||
|
||
**迁移策略(预留,不改 API)**
|
||
|
||
- 保持 `enqueue_job` / `Job` 表不变
|
||
- 将 `redis/bus.py` 的 `push_job` / `pop_job` 抽象为 `JobTransport` 接口
|
||
- 实现 `RedisListTransport`(现逻辑)与 `RabbitMQTransport`(新)
|
||
- 事件 Pub/Sub 可迁至 MQ fanout,或保留 Redis
|
||
|
||
---
|
||
|
||
## 7. 里程碑与依赖
|
||
|
||
```mermaid
|
||
gantt
|
||
title HSAP 开发里程碑(示意)
|
||
dateFormat YYYY-MM-DD
|
||
section 标注闭环
|
||
A_inbox样例与浏览器E2E :a1, 2026-05-27, 7d
|
||
A_export_build验收 :a2, after a1, 5d
|
||
section 生产态
|
||
B_docker_worker稳定 :b1, after a2, 5d
|
||
section 入湖
|
||
C_批次台账与promote :c1, after a1, 14d
|
||
section 扩展
|
||
D_forward_lane :d1, after a2, 14d
|
||
```
|
||
|
||
**硬依赖**
|
||
|
||
- A 完成前:不启动 forward/lane 大改
|
||
- B 与 A 可并行:Docker 环境给工程师,标注 E2E 给协调员
|
||
- C 依赖 A 至少 dam 一条链路通
|
||
|
||
---
|
||
|
||
## 8. 风险与对策
|
||
|
||
| 风险 | 对策 |
|
||
|------|------|
|
||
| inbox 无图,tasks 为空 | A2.1 放样例;PILOT_BATCH 文档 |
|
||
| 本机无 Redis,误以为平台坏了 | 已改 thread 跳过等待;文档说明 |
|
||
| Redis 端口 6379 vs 6380 | `run_local.sh` 读 `.env` AS_REDIS_PORT |
|
||
| 37 点 UX 差、漏标 | maxUsages=1;后续进度 KPI |
|
||
| 关键点顺序与历史 pack 不一致 | 严格 `addw_face_37.yaml`;导出单测 |
|
||
| thread 与 worker 混用同一 DB | 开发指南写明一种 Job 执行器 |
|
||
| QA_GAP 过时 | A2.7 同步更新 |
|
||
|
||
---
|
||
|
||
## 9. 近期两周行动清单(可执行)
|
||
|
||
**第 1 周**
|
||
|
||
1. 协调员:dam/batch_0516、addw_face inbox 各放样例图
|
||
2. 标注员:各标 2 张,确认保存 JSON
|
||
3. 开发:`run_local.sh` 或 compose 起 platform,跑通 export → build
|
||
4. 全员:勾选 [BROWSER_QA_CHECKLIST.md](./BROWSER_QA_CHECKLIST.md)
|
||
|
||
**第 2 周**
|
||
|
||
1. compose 起 worker + redis,重复 export 验证 Job 在 worker 日志出现
|
||
2. addw_face 导出 txt 抽 1 条对照 `dms_v1/addw_face` 历史样本(116 字段)
|
||
3. 提交入库审核 → 数据目录刷新
|
||
4. 更新 QA_GAP / PHASE_ROLLOUT 勾选状态
|
||
|
||
---
|
||
|
||
## 10. 文档维护
|
||
|
||
| 文档 | 更新时机 |
|
||
|------|----------|
|
||
| PHASE_ROLLOUT_DMS.md | 每完成一个 pilot 勾选 |
|
||
| QA_GAP_REPORT.md | export/ML/入湖状态变化时 |
|
||
| DEVELOPMENT_ROADMAP.md(本文) | 阶段切换或 MQ 触发条件变化时 |
|
||
| LABELING_SOP.md | 标注流程或格式变更时 |
|
||
|
||
---
|
||
|
||
*版本:2026-05-27 · 与关键点接入、thread/worker 架构讨论对齐*
|