Taichung City Pulse · ARCH · v3.1 · 2026-09-21

臺中城市脈動 系統架構書

兩大平台:地端 Jetson Thor 影像資料分析平台(可多台),與雲端儀表系統(監控後台+城市儀表+AI 語音答詢)。互動架構圖可點選元件查看職責與 .env 設定。

臺中城市脈動 展示系統 系統架構書

項目 內容
版本 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/市府座標覆蓋
底圖圖磚服務需金鑰或變更條款 免金鑰底圖為預設,正式版自架圖磚;離線降級純色底不影響指標