visionA/docs/autoflow/02-prd/features/feature-inference.md
jim800121chen fb7da5d180 chore(autoflow): migrate .autoflow/ 共享層文件至 docs/autoflow/
依 autoflow-agent workspace v2 設計把 PRD / 設計 / 架構 / 交付類
共享文件從個人層 .autoflow/(ignored)搬到 docs/autoflow/(進 git),
讓團隊可共享產品與架構文件,個人層只留 progress / review / testing 等
per-branch 筆記。

- 02-prd/        21 個檔(PRD、features、market-analysis 等)
- 03-design/     18 個檔(design-spec、wireframes、flows 等)
- 04-architecture/ 31 個檔(TDD、design-doc、ADR×14、API 規格等)
- 07-delivery/   3 個檔(project-summary、phase-0.6-handover、stage-deployment-setup)

合計 73 檔。原檔已從 .autoflow/ 移除(migration 工具執行 git mv,
但因 .autoflow/ 在 .gitignore 中、git 將此操作視為新增、無 rename history)。
2026-05-04 16:55:55 +08:00

134 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Feature推論操作P0CameraP1Image / Video / Batch
> 父文件:[PRD.md](../PRD.md) | 對應 User StoriesUS-10、US-11、US-15
---
## 概述
使用者選裝置 + 模型 + 來源後能啟動推論並即時看到結果bounding box / 分類結果)。
這是**visionA Cloud 最核心的價值體驗**。推論結果要即時、低延遲、UI 和 local-tool 一致。
---
## 使用者行為
### Workspace 進入點(`/workspace` 或 `/workspace/[deviceId]`
三段式選擇:
1. **選裝置**:從已配對的裝置列表挑一個
2. **選模型**:從模型庫挑一個(需和裝置型號相容)
3. **選來源**
- **CameraPhase 0**:使用者 agent 端的 USB / IP camera
- **ImagePhase 1**:從瀏覽器上傳單張圖片
- **VideoPhase 1**從瀏覽器上傳影片MP4/AVI/MOV 等)
- **Batch ImagesPhase 1**:批次上傳多張圖片
選完後進推論工作區。
### 推論工作區
**UI 沿用 local-tool 的設計**
- 左上:即時 MJPEG 畫面 + overlaybounding box + label + confidence
- 右側:控制面板
- 信心度門檻 slider
- 推論 FPS / 延遲顯示
- 開始 / 停止按鈕
- 底下:分類結果 / 偵測框列表
- 右上 headerTunnel 延遲顯示visionA Cloud 獨有)
### Camera 推論流程Phase 0 重點)
```
┌────────────────────────────────────────────────────────────┐
│ Camera 推論資料流 │
│ │
│ 1. Browser 呼叫 api-serverPOST /workspace/start │
│ { deviceId, modelId, source: "camera", cameraId } │
│ ▼ │
│ 2. api-server 找到對應的 tunnel session │
│ 透過 remote-proxy 轉發到 local agent │
│ ▼ │
│ 3. local agent 啟動 KneronPLUS inference pipeline │
│ Camera → 幀捕捉 → Kneron → 推論結果 │
│ ▼ │
│ 4. local agent 把 MJPEG stream 推給 tunnel │
│ tunnel ─yamux stream─> remote-proxy ─> api-server │
│ ▼ │
│ 5. Browser 透過 /api/camera/stream 拿到 MJPEG │
│ (遠端 stream 經過 api-server proxy 到瀏覽器) │
│ ▼ │
│ 6. Browser 透過 WebSocket /ws/inference 拿到推論結果 │
│ Canvas overlay bounding box │
└────────────────────────────────────────────────────────────┘
```
### 關鍵技術挑戰(給 Architect 參考)
1. **MJPEG binary stream 要能過 tunnel**yamux 支援,但需要測試吞吐量
2. **WebSocket推論結果也要過 tunnel**:雲端前端的 WebSocket 連到 api-serverapi-server 的對應連線再過 tunnel 到 local agent
3. **多 client 存取同一個 stream**local-tool 支援多 client multipart MJPEG。visionA Cloud 可能一個使用者開多個 tab要處理並發
4. **Tunnel 斷線處理**:推論中 tunnel 斷線UI 要明確提示並自動重連
### 延遲預算
| 路徑段 | 延遲 |
|--------|-----|
| Camera → local agent 幀捕捉 | ~10ms |
| local agent → Kneron 推論 | ~30msmodel 而異)|
| local agent → remote-proxytunnel經 WAN| ~50-200ms RTT |
| remote-proxy → api-server | ~5ms同機房|
| api-server → Browser | ~10-50ms |
| **端到端總延遲P95 目標)** | **< 500ms** |
local-tool 端到端 ~150-250ms多的部分主要是 tunnel WAN RTT
---
## 驗收條件Phase 0Camera only
- [ ] 能從 Workspace 頁選裝置 + 模型 + Camera 來源
- [ ] 開始MJPEG 畫面在 2 秒內出現
- [ ] Bounding box / 分類結果 overlay 正確即時更新
- [ ] 信心度門檻調整立即反映在畫面
- [ ] 推論 FPS 顯示正確大約 10-30 fps
- [ ] 端到端延遲 P95 < 500ms內網測試
- [ ] Tunnel 延遲顯示正確header
- [ ] Tunnel 斷線時立即提示使用者並自動嘗試重連
- [ ] 重連成功後推論自動恢復
- [ ] 停止推論後畫面停在最後一幀 + 有明確已停止狀態
- [ ] 同一使用者開兩個 tab 看同一裝置推論 都能看 client multipart
- [ ] 不同使用者之間互相隔離不會看到別人的推論畫面
---
## Phase 1 擴充Image / Video / Batch
Image / Video / Batch 推論**不需要即時 stream**使用者上傳檔案到 api-server透過 tunnel 把檔案送到 local agentagent 做完回傳結果
技術挑戰
- 大檔案傳輸的 tunnel 效率
- 檔案臨時儲存策略api-server 記憶體 or 暫存磁碟
- 影片 seek 操作的 tunnel 往返
---
## Phase 0 的 TODO
- **TODO 1**Image / Video / Batch 推論Phase 1
- **TODO 2**推論結果的 history / 回放Phase 1 DB
- **TODO 3** client 同時看同一推論的效能優化Phase 1
- **TODO 4**推論結果下載 / exportPhase 1
- **TODO 5**Camera 來源的使用者選擇 UI local agent 可能有多個 camera要讓使用者選
- **TODO 6**推論 logging / analyticsPhase 2用於叢集指標追蹤
---
## 連結
- [PRD 索引](../PRD.md)
- 相關[叢集推論](feature-cluster-inference.md)[工作區](feature-workspace.md)[非功能性需求 — 效能](../nonfunctional.md)