Files
HSAP/docs/DEVELOPMENT_ROADMAP.md

262 lines
9.3 KiB
Markdown
Raw Permalink Normal View History

# HSAP 开发计划2026 Q2
本文是 HSAPHuaxu 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 / KafkaDB + 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** 标注闭环 | 12 周 | dam/addw/addw_face 画布→导出→入库可 E2E | P0+P1 清单全绿 |
| **B** 生产运行态 | 1 周 | Docker worker + Redis 稳定跑导出/训练 Job | smoke + Jobs 页成功 |
| **C** 数据入湖 | 2 周 | 批次台账、飞书、MinIO 主路径打通 | DATA_LAKE checklist AE |
| **D** 扩展任务 | 23 周 | 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_GAPexport 已对接) | 开发 | 文档与代码一致 |
**命令**
```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. 阶段 CE数据入湖与任务扩展
### C. 数据入湖(见 DATA_LAKE_GAP.md
- 批次台账 → 审批入湖 → inbox 出现在送标工作台
- 飞书多维表格同步(可选,`FEISHU_BITABLE_SYNC_ENABLED=0` 可关)
- MinIO staging`docker compose --profile minio up`
- 上传 ZIP → 分析 → promote inbox
### D. forward / laneP2
| 任务 | 文件/动作 |
|------|-----------|
| `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 架构讨论对齐*