臺中城市脈動 展示系統
系統架構書
| 項目 |
內容 |
| 版本 |
v3.1,2026-09-21 |
| 專案 |
兩大平台:影像資料分析平台(地端 Jetson AGX
Thor,可多台)與雲端儀表系統(影像分析監控後台+城市儀表+AI
語音答詢) |
| 提案方 |
好友電智慧科技 Sonice AIoE × 湛積 LSC |
| 定位 |
白皮書「空間智慧」方法論的可展示原型:只回傳指標、不做人臉辨識、影像不離開邊緣節點 |
v3.1 變更摘要:2-B 城市儀表版面定案為 04
儀表原型排版(12 欄格線、八個區塊),原「29
行政區色階方塊」改為城市道路地圖(每支相機一個點,顏色與大小為擁擠指數,可切偏離倍數、區名下鑽、點相機看指標、摘要表點列聚焦);新增相機座標服務(網關無座標時以道路名稱地理編碼近似並標註精度,正式版以
TDX/市府開放資料座標為準);新增純 HTML POC
交付(三頁單檔、不需伺服器、資料與地圖內嵌)。
v3.0
變更摘要:影像改由本地「影像來源網關」逐張取得(GET /cameras、GET /image/{cctv_id}),不再直接拉
MJPEG 串流;新增 Thor
資源監控(CPU、GPU、記憶體、儲存)與分析進度並上傳雲端;支援多台 Thor
平行運算(每台為一個 node);VLM 以 vLLM 執行、預設 Qwen3.8,模型與雲端
host 皆由 .env 設定;雲端拆為 2-A 影像分析監控後台、2-B
城市儀表、2-C AI 語音答詢三個子系統,各有對應上傳 API。
1. 系統總覽
┌── 影像來源網關(:8200,既有或由本團隊以開放資料包裝) ─────────────────────────────────────────┐
│ GET /cameras → 台中市相機列表 GET /image/{cctv_id} → 一張 JPEG │
└───────────────┬───────────────────────────────────────────────────────────────────────────────┘
│ 逐張輪詢(每路 1 至 2 張/秒,可設)
┌───────────────▼── 平台一:影像資料分析平台(地端 Jetson AGX Thor,node-01 … node-N) ───────────┐
│ 相機同步 ─► 影像取得 ─► 解碼 ─► 偵測 YOLO26 ─► 追蹤 ─► 去識別化 ─► 指標與基線 ─► 事件 │
│ └─► 情境摘要 VLM(vLLM,預設 Qwen3.8) │
│ 節點監控:分析中相機數、已分析時長、CPU/GPU/記憶體/儲存 ─► 每 10 秒心跳 │
│ 本地保存:SQLite + Parquet + 事件縮圖(原始影像不保存) │
│ 上傳:CLOUD_HOST(.env)─► 系統狀態、分析結果、事件、縮圖 │
└───────────────┬───────────────────────────────────────────────────────────────────────────────┘
│ HTTPS(REST)+ MQTT over TLS
┌───────────────▼── 平台二:雲端儀表系統(雲端,台灣區域) ─────────────────────────────────────────┐
│ 2-A 影像分析監控後台:多節點心跳、資源曲線、分析進度、相機在線表;上傳 API │
│ 2-B 城市儀表:指標、事件、治理資訊接收 API;聚合與六分項指數;三層視角儀表;對外唯讀頁 │
│ 2-C AI 語音答詢:OpenAI Realtime 語音對話;工具呼叫即時調閱 2-A/2-B 資料並以酷炫畫面呈現;可文字輸入 │
└───────────────────────────────────────────────────────────────────────────────────────────────┘
| 平台 |
部署 |
職責 |
不做的事 |
| 平台一 影像資料分析平台 |
地端 Jetson AGX Thor,1 至 N 台 |
逐張取像、偵測、追蹤、去識別化、指標、事件、情境摘要、節點監控、本地保存、上傳 |
不保存原始影像、不辨識個人、不對外提供影像 |
| 平台二 雲端儀表系統 |
雲端 |
接收多節點狀態與結果、聚合、監控後台、城市儀表、語音答詢 |
不接觸原始影像、不直接呼叫相機或網關 |
2. 影像來源網關(:8200)
| API |
說明 |
回應 |
GET http://localhost:8200/cameras |
台中市相機列表 |
[{cctv_id, name, district, lat, lon, source, status}](欄位以實際
API 為準,缺欄位由 cameras.override.json 補
tier、group、roi_m2) |
GET http://localhost:8200/image/{cctv_id} |
該相機當下一張影像 |
image/jpeg,實測 640×360 約 20 KB,公路局 320×240 約 7
KB |
- 網關由市府或 TDX 提供;若無,本團隊以開放資料包裝一個相容服務部署在
Thor 同機。
- 相機數以
GET /cameras 即時值為準(目前 356;POC
期間以公開來源快照 392 路驗證流程);平台一每 10
分鐘同步,儀表路數皆為即時值。
- 逐張取像的流量:356 路 × 1 張/秒 × 20 KB ≈ 57 Mbps,遠低於 MJPEG
串流(約 0.45 Gbps),且可精準控制每路取樣率;代價是每張一次 HTTP
請求,網關需承受約 356 至 712 req/s,平台一以 keep-alive
連線池與每主機併發上限保護網關。
2.1 相機座標服務(新增)
道路地圖需要每支相機的經緯度,但 GET /cameras
目前不一定回傳 lat、lon。處理順序:
| 優先 |
來源 |
精度標註 geo_precision |
| 1 |
網關或 TDX/市府開放資料提供的座標(正式版唯一真相) |
exact |
| 2 |
由相機名稱解析「路口」(兩條路名交會)做地理編碼 |
intersection |
| 3 |
由單一路名做地理編碼 |
road |
| 4 |
行政區中心點回退 |
district |
- 地理編碼一次性離線執行(POC 用 Nominatim,1 req/s
並遵守使用條款;正式版改用 TDX 或市府圖資),結果存
cameras_geo.json,超出臺中市範圍框(緯 24.03 至 24.48、經
120.45 至 121.05)的結果視為錯誤並回退到行政區中心點。
- 儀表只呈現座標,不改變分析;
geo_precision
隨相機資料上傳,地圖上以點的樣式區分。
3.
平台一:影像資料分析平台(地端)
3.1 硬體與部署單元
- 每台 Jetson AGX Thor 為一個
node(
NODE_ID 由 .env
設定),可多台平行,各自負責一組相機(由雲端 2-A 分派或
.env 的 CAMERA_FILTER 指定行政區/ID
範圍)。
- 規格:Blackwell GPU 2,560 CUDA、96 Tensor Core,2,070 TFLOPS
FP4/1,050 TFLOPS FP8;14 核 Arm;128 GB LPDDR5X;NVJPG ×2;40 至 130
W。外接 NVMe 4 TB、10GbE、UPS。
3.2 模組
| 模組 |
職責 |
關鍵設定(.env) |
camera_sync |
每 10 分鐘 GET {GATEWAY_URL}/cameras,差異比對;套用
override 補欄位;依 CAMERA_FILTER 決定本節點負責清單 |
GATEWAY_URL=http://localhost:8200、CAMERA_FILTER |
fetcher |
每路依取樣率呼叫 GET /image/{cctv_id};aiohttp
連線池、每主機併發 ≤ MAX_CONN=64、逾時 2
秒、退避重試;連續失敗標 offline |
SAMPLE_FPS=1、PEAK_SAMPLE_FPS=2、PEAK_WINDOWS、TIER2_FPS=2 |
decode |
libjpeg-turbo 多程序解碼;每 60
秒品質判定(dark、blur、frozen、offline) |
DECODE_WORKERS=12 |
detector |
YOLO26(NMS-free 端到端)INT8 TensorRT,輸入
640,動態批次;8 類;預設 yolo26s,可切
yolo26m 求準或 yolo26n 求快 |
YOLO_MODEL=yolo26s、YOLO_PRECISION=int8 |
tracker |
ByteTrack,僅 tier 2 相機 |
— |
privacy |
人頭區與車牌候選區模糊後才產縮圖;原始幀處理後釋放;frames_persisted
永為 0 |
— |
metrics |
每路每分鐘 12 項指標;群組基線;偏離事件與固定語句 |
EVENT_WARN=2.0/10、EVENT_CRIT=3.0/20 |
vlm |
vLLM 服務(OpenAI 相容 API);預設
Qwen3.8(Qwen/Qwen3.8-27B,FP8);可切
Qwen/Qwen3-VL-8B-Instruct、nvidia/Cosmos-Reason2-8B;每事件
1 則、每路每小時 1 則;禁詞過濾 |
VLM_ENABLED=true、VLM_MODEL=Qwen/Qwen3.8-27B、VLM_URL=http://localhost:8000/v1、VLM_MAX_CONCURRENCY=4、VLM_MODE=live|after_capture |
monitor |
每 10 秒採集:分析中相機數、已分析時長(自
run_started_at)、已處理幀數、每路平均延遲、CPU%、GPU%、GPU
記憶體、系統記憶體、儲存使用率、溫度、功耗(tegrastats/jtop
或 /sys) |
HEARTBEAT_SEC=10 |
store |
SQLite(即時)+ 每小時匯出 Parquet;事件縮圖;保留期 |
RETENTION_DAYS=7 |
uplink |
上傳至 CLOUD_HOST:心跳與資源 →
2-A;指標、事件、治理資訊、縮圖 → 2-B;離線緩衝重送 |
CLOUD_HOST=https://pulse.example.tw、EDGE_TOKEN、UPLINK_MODE=rest|mqtt |
3.3 情境摘要模型(vLLM)
模型(VLM_MODEL) |
定位 |
說明 |
| Qwen/Qwen3.8-27B(預設) |
最新、品質最高 |
2026-08-14 開放權重,Apache
2.0;早期融合多模態,官方稱原生影像與影片輸入且優於 Qwen3-VL;vLLM
支援、262K 上下文、reasoning_effort 可調。FP8 約 28
GB,Thor 可載入;吞吐約 800 則/小時,建議
VLM_MODE=after_capture 或事件觸發為主 |
| Qwen/Qwen3-VL-8B-Instruct |
即時模式首選 |
Apache 2.0;約 2,400 則/小時;中文強 |
| nvidia/Cosmos-Reason2-8B |
異常情境推理 |
NVIDIA Open Model License;Jetson AI Lab 有 Thor vLLM FP8 流程 |
| Qwen/Qwen3-VL-4B-Instruct |
輕量 |
與偵測共用 GPU 時負載最低 |
提示詞固定:繁體中文 60 至 120
字,只描述空間狀態與交通行為,禁止描述人的外貌、性別、年齡、車牌;禁詞命中重生一次,再命中捨棄。
3.4 本地保存與上傳
- 本地:
metric_1m、event、node_status、hourly_summary
於 SQLite;每小時 Parquet;事件縮圖 JPEG;RETENTION_DAYS
後自動清理並產生銷毀紀錄。
- 上傳:REST
為主(
POST {CLOUD_HOST}/v1/nodes/{node_id}/heartbeat 每 10
秒;/v1/ingest/metric_1m
每分鐘;/v1/ingest/event
即時;/v1/ingest/governance 每小時;/v1/thumbs
事件觸發),MQTT 為選配;離線寫入 outbox 依序重送。
3.5 隱私與治理
五項不做(同前版);/health 回報
frames_persisted=0、reid_disabled=true;對外人數
<5 由平台二遮罩。
4. 平台二:雲端儀表系統(雲端)
4.1 元件
| 元件 |
選型 |
| API |
FastAPI;REST + WebSocket;邊緣以
X-Edge-Token+node_id 認證,使用者以 Bearer
展示金鑰 |
| 儲存 |
TimescaleDB(node_status、metric_1m、agg_5m、index_1h)、PostGIS、S3
相容(縮圖)、Redis(WS fan-out、節點在線狀態) |
| 2-A 監控後台 |
Next.js 管理頁;多節點總覽、節點詳情、相機在線表、告警 |
| 2-B 城市儀表 |
Next.js;市長/局處/現場三層視角;對外唯讀頁 |
| 2-C 語音答詢 |
Node 後端(短效金鑰)+瀏覽器 WebRTC 連 OpenAI Realtime;工具讀
2-A、2-B REST;純 HTML 腳本備援 |
4.2 2-A 影像分析監控後台
- 多節點:以
node_id
區分;節點註冊、心跳(10 秒)、離線判定(60
秒無心跳)、相機分派(可由後台指定各節點負責的行政區或 ID
清單,平台一下次同步生效)。
- 監控內容:每節點分析中相機數、已分析時長、已處理幀數、平均延遲、CPU、GPU、GPU
記憶體、系統記憶體、儲存使用率、溫度、功耗;全體節點合計相機數與吞吐;相機在線/離線/品質異常表。
- 告警:GPU >85% 持續 5 分鐘、儲存
>90%、節點離線、相機在線率 <95%。
- 上傳
API:
POST /v1/nodes/{node_id}/register、POST /v1/nodes/{node_id}/heartbeat、GET /v1/nodes、GET /v1/nodes/{node_id}/status?from&to。
4.3 2-B 城市儀表
- 上傳
API:
POST /v1/ingest/metric_1m(批次)、POST /v1/ingest/event(upsert)、POST /v1/ingest/governance(治理資訊:派工、結案、重複發生、誤報標記)、POST /v1/thumbs。
- 聚合:每 5
分鐘分區與全市;每小時六分項與複合指數(權重公開可調)。
- 讀取
API:
/v1/aggregate/city|district、/v1/index、/v1/events、/v1/ranking、/v1/cameras、/v1/public/summary;WS /v1/ws。
- 儀表版面(定案,沿用 04 儀表原型):12
欄格線,依序為 ① 城市空間健康指數(5 欄:儀表環、大數字、六分項走勢)②
全市脈動每 5 分鐘(7 欄:車流/人流/偏離分頁)③ 29 行政區擁擠指數(4
欄:城市道路地圖)④ 熱點排行前 10(4 欄)⑤ 事件流(4
欄)⑥ 影像牆去識別化縮圖(8 欄)⑦ 設備與資料健康(4 欄,連到 2-A
節點心跳)⑧ 分區摘要表(12 欄)。
- 城市道路地圖:Leaflet 向量點圖層疊在深色底圖上(POC
用 Esri World Dark Gray,免金鑰;正式版可自架 OSM 圖磚或 TDX
底圖,離線時降級為純色底)。每支相機一個點,顏色四級(順暢 <50、略擠
50 至 69、擁擠 70 至 84、嚴重
≥85)、半徑隨指數;可切換「擁擠指數/偏離倍數」;行政區標籤可下鑽(縮放到該區並顯示區摘要);點相機顯示單路指標;分區摘要表點列聚焦地圖;「全市」鍵回到全市視野。
- 純 HTML POC:2-A、2-B、2-C 各一個單檔
HTML(
poc/POC_01…03),內嵌
Leaflet、相機清單與座標、示範資料,雙擊即可開啟、不需伺服器;由
poc/build_poc.py
產生,作為投標展示與正式版的版面規格。
4.4 2-C AI 語音答詢
- 語音:OpenAI Realtime
gpt-realtime,語音
marin,辨識
gpt-4o-transcribe(zh),semantic_vad
可打斷;文字輸入送同一會話。
- 工具(即時調閱):
show_city_index、show_district、show_timeline、list_events、show_ranking、compare_districts、show_health(改讀
2-A 多節點狀態)、新增 show_nodes(各 Thor
節點資源與相機數)、show_camera(單路指標與最新去識別化縮圖)。
- 畫面:音訊球隨音量變形;舞台以進場動畫、數字跳動、曲線描繪切換視圖;節點資源以即時環形量表呈現。
- 備援:純 HTML 腳本版。
5. 資料模型(新增與變更)
create table node(node_id text primary key, name text, site text, registered_at timestamptz, last_seen timestamptz,
camera_filter jsonb, versions jsonb /* jetpack, yolo_model, vlm_model */);
create table node_status(node_id text references node(node_id), ts timestamptz, cameras_active int, cameras_total int,
run_started_at timestamptz, analyzed_seconds bigint, frames_processed bigint, avg_latency_ms real,
cpu_pct real, gpu_pct real, gpu_mem_used_gb real, gpu_mem_total_gb real, mem_used_gb real, mem_total_gb real,
disk_used_pct real, temp_c real, power_w real, primary key(node_id, ts));
select create_hypertable('node_status','ts');
create table governance(id text primary key, event_id text, ts timestamptz, action text check (action in ('dispatch','close','repeat','false_alarm')), actor text, note text);
-- metric_1m、event 增加 node_id 欄位
6. 設定檔(.env)總表
| 平台一(每台 Thor) |
平台二 |
NODE_ID、NODE_NAME、SITE |
DATABASE_URL、REDIS_URL、S3_* |
GATEWAY_URL=http://localhost:8200、CAMERA_FILTER |
EDGE_TOKENS(node_id → token) |
SAMPLE_FPS、PEAK_SAMPLE_FPS、PEAK_WINDOWS、TIER2_FPS、MAX_CONN |
INDEX_WEIGHTS |
YOLO_MODEL=yolo26s、YOLO_PRECISION=int8 |
OPENAI_API_KEY、REALTIME_MODEL=gpt-realtime、REALTIME_VOICE=marin |
VLM_ENABLED、VLM_MODEL=Qwen/Qwen3.8-27B、VLM_URL、VLM_MODE、VLM_MAX_CONCURRENCY |
ALERT_GPU_PCT=85、ALERT_DISK_PCT=90、NODE_OFFLINE_SEC=60 |
CLOUD_HOST、EDGE_TOKEN、UPLINK_MODE、HEARTBEAT_SEC=10 |
PUBLIC_MASK_MIN_PERSONS=5 |
RETENTION_DAYS=7、DECODE_WORKERS=12 |
— |
7. 部署與時程
| 週 |
平台一 |
平台二 |
| 1 |
網關 API 對接(/cameras、/image)、Thor 環境、逐張取像壓測 50 → 200
→ 全數、監控採集 |
2-A 節點註冊與心跳 API、資料模型 |
| 2 |
YOLO26 INT8、追蹤、去識別化、指標與事件、本地保存、上傳 |
2-B 接收與聚合、儀表元件;2-A 監控頁 |
| 3 |
vLLM + Qwen3.8 部署與吞吐測試、離線緩衝、第二台 Thor 平行驗證 |
2-C 語音工具接 REST、酷炫視圖、彩排 |
| 4 |
24 小時正式擷取分析 |
現場展示 |
8. 風險
| 風險 |
因應 |
網關 /image 逐張取像延遲高或限流 |
連線池與併發上限、逾時 2 秒、降取樣;量測 p95 延遲寫入監控 |
| 網關本身成為單點 |
網關與 Thor 同機部署;或每台 Thor 各自一個網關實例 |
| Qwen3.8-27B 吞吐不足即時 |
預設 VLM_MODE=after_capture 或事件觸發;可切
Qwen3-VL-8B |
| 多台 Thor 相機分派重疊 |
2-A 分派為唯一真相,平台一啟動時拉取;重疊以 node_id
去重 |
| 監控資料量 |
每節點每 10 秒 1 列,10 台一年約 3,150 萬列,Timescale 壓縮即可 |
| Realtime 模型或事件格式變動 |
模型名可設;純 HTML 腳本版保底 |
| 網關無座標,地理編碼把路名對到外縣市或錯位 |
範圍框過濾+行政區中心點回退+精度標註;正式版以
TDX/市府座標覆蓋 |
| 底圖圖磚服務需金鑰或變更條款 |
免金鑰底圖為預設,正式版自架圖磚;離線降級純色底不影響指標 |