TTSAM / README.md
jimmy60504's picture
docs: add project overview and data contract specifications for earthquake model demo
1628958
---
title: TTSAM
emoji: 🏢
colorFrom: blue
colorTo: gray
sdk: gradio
sdk_version: 5.49.1
app_file: app.py
pinned: false
license: gpl-3.0
---
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
## 專案簡介
TTSAM(Taiwan Transformer-based Shake Alert Model)是一個以 Transformer 為核心的地震預警/震度推估原型,提供互動式 GUI 用於載入歷史事件、查看波形、並在地圖上比對「預測震度」與「實際震度」。
## 主要功能
- 互動式 GUI(`app.py`):
- 選擇歷史事件、時間窗、震央座標並載入波形。
- 顯示輸入測站分布與波形(按震央距離排序)。
- 執行模型推論並在 Folium 地圖上顯示預測震度(高度固定 800px)。
- 若有實際震度圖,支援與預測對照;若缺失則以空白占位並提示。
- 穩健的資料處理:
- 取樣率固定 100 Hz;模型輸入固定 30 秒(不足補 0)。
- 輸入測站最多 25 站;不足仍可推論並在 UI 顯示警告。
- N/E 分量缺失時以 Z 替代,並統計缺分站數於摘要。
- 目標點批次推論:
- 目標測站每批最多 25 點,最後合併結果。
- 場址參數與降級:
- Vs30 以 `SeisBlue/TaiwanVs30` 下載為主;查詢/下載失敗時使用預設值 600 m/s 並記錄 log。
- 易於擴充:
- 不需改模型與核心流程即可新增事件與目標測站(更新資料檔即可)。
## 設計思路
### 🎯 Project Scope: 互動式教育展示 Demo
本專案為地震模型的 **展覽演示系統**,而非生產級的早期預警系統。因此設計理念強調:
- **互動性優先**:使用者操作立即反饋視覺化結果(波形圖、地圖、統計)
- **教育性為中心**:清晰的介面與步驟引導,讓非地震專業人士理解「波形 → 模型 → 預測」的流程
- **功能簡潔化**:無需追求完整覆蓋或極限性能;易於操作與理解最重要
- **預裝化設計**:所有關鍵資源(模型權重、Vs30 資料庫、波形、測站表)預裝於 HF Space,無需運行時下載或外部依賴
### 📦 預裝架構
| 資源 | 位置 | 用途 | 預裝狀態 |
|-----|-----|------|--------|
| 模型權重 | `ttsam_trained_model_11.pt` | 推論核心 | ✅ 預裝 |
| Vs30 資料庫 | `Vs30ofTaiwan.nc` | 場址參數 | ✅ 預裝 |
| 波形資料 | `waveform/*.mseed` | 輸入資料 | ✅ 預裝(≥2 事件) |
| 測站表 | `station/site_info.csv`, `station/eew_target.csv` | 元資料 | ✅ 預裝 |
| 實際震度圖 | `intensity_map/YYYYMMDD.png` | 對照參考 | ✅ 預裝(可選) |
### 🛡️ 容錯設計
系統採用「**預裝優先,降級不中斷**」的容錯策略:
- **預裝資源失敗**(模型損毀、測站表缺失)→ 應用無法啟動(提前發現問題)
- **非關鍵資源失敗**(Vs30 初始化失敗、實際圖缺失)→ 使用預設值或占位,應用正常運作
- **單點資料缺失**(缺分量、測站不足)→ 使用替代值或降級處理,UI 明示警告,推論繼續
- **結果異常**(PGA 為 NaN)→ 記錄日誌,仍顯示於地圖
詳見 `spec/03-error-handling.md`
### 🧪 展覽前檢查清單
在部署至 HF Space 前:
- [ ] 驗證所有預裝檔案完整(模型、Vs30、波形、測站表)
- [ ] 本地測試啟動流程(無外部網路依賴)
- [ ] 測試各事件的波形載入與預測
- [ ] 確認實際震度圖路徑與檔名正確
- [ ] 檢查日誌輸出(無錯誤訊息)
需求
- Python 3.10–3.11(建議)
- 主要套件見 `requirements.txt`
安裝與執行
- 安裝相依套件
- `pip install -r requirements.txt`
- 執行 GUI
- `python app.py`
- 或使用腳本:`./run_local.sh`
資料與資源
- 事件波形:`waveform/*.mseed`
- 實際震度圖(選用):`intensity_map/YYYYMMDD.png`
- 站台資料:`station/site_info.csv`, `station/eew_target.csv`
## 常見任務
- 新增事件:
-`.mseed` 放入 `waveform/`,並更新 `app.py``EARTHQUAKE_EVENTS`
- 若有實際震度圖,放入 `intensity_map/`,檔名 `YYYYMMDD.png`
- 新增目標測站:
-`station/eew_target.csv` 增補列,欄位:`station, latitude, longitude, elevation`
- 新增輸入測站:
-`station/site_info.csv` 增補列,欄位:`Station, Latitude, Longitude, Elevation`;去除重複站名列。
## 核心不變條件(摘要)
**波形處理**
- 取樣率:100 Hz;輸入長度:30 秒(3000 點,不足補 0)
- 分量順序:Z, N, E;N/E 缺失時以 Z 代替
**測站處理**
- 輸入測站:最多 25;不足允許但 UI 會顯示警告
- 目標測站批次:每批最多 25 點
- 缺分量統計:計數並在摘要中顯示
**資源管理**
- 地圖高度:Folium 地圖固定 800px
- 實際震度圖缺失:以空白占位(不中止)
- Vs30 查詢失敗:使用預設值 600 m/s
**詳細規格**:見 `spec/00-overview.md``spec/01-data-contract.md`**容錯與降級決策**`spec/03-error-handling.md`
## 專案結構
- `app.py`:Gradio GUI 與推論主流程
- `ttsam_realtime.py`:即時流程樣板(非 GUI 主流程)
- `station/site_info.csv`:輸入測站表
- `station/eew_target.csv`:目標測站表
- `waveform/`:事件波形(.mseed)
- `intensity_map/`:實際震度圖(可選)
- `spec/`:模塊化規格檔案
- `00-overview.md`:核心目標、架構、設計原則
- `01-data-contract.md`:資料結構、必填欄位
- `02-processing-rules.md`:批次策略、處理規則
- `03-error-handling.md`:故障場景、容錯設計
- `04-extensions.md`:擴充空間、向後相容
- `.github/copilot-instructions.md`:生成程式碼指南
- `changelog.md`:變更摘要
## 疑難排解(Troubleshooting)
- Vs30 下載失敗或查無資料
- 行為:使用預設值 600 m/s;log 會有 WARNING 訊息。
- 檢查網路或稍後再試;必要時在 UI/設定中調整預設值。
- 實際震度圖缺失
- 行為:左側顯示空白占位與提示;不影響預測地圖。
- 少於 25 個輸入測站
- 行為:UI 顯示警告,仍可推論。
- 缺少 N/E 分量
- 行為:以 Z 分量代替並在摘要統計。
## 授權
- License:GPL-3.0
## 進一步閱讀
- `spec/00-overview.md`(核心目標、架構、不變條件)
- `spec/01-data-contract.md`(資料結構、必填欄位、冷啟動流程)
- `spec/02-processing-rules.md`(批次策略、輸入限制、資源限制)
- `spec/03-error-handling.md`(故障場景、降級策略、UI 訊息設計)
- `spec/04-extensions.md`(擴充空間、向後相容性)
- `.github/copilot-instructions.md`(開發與貢獻指南)
- `changelog.md`(歷次變更摘要)