File size: 4,075 Bytes
2c784e0 966f1f2 a1f45db 2c784e0 a1f45db 2c784e0 a1f45db 2c784e0 a1f45db 2c784e0 a1f45db 2c784e0 966f1f2 2c784e0 966f1f2 2c784e0 a1f45db 2c784e0 a1f45db 966f1f2 2c784e0 a1f45db 2c784e0 a1f45db 966f1f2 a1f45db 2c784e0 a1f45db 2c784e0 a1f45db 966f1f2 a1f45db 966f1f2 a1f45db 966f1f2 a1f45db | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | ---
language: ko
library_name: pytorch
tags:
- anomaly-detection
- wearable-sensors
- elderly-monitoring
- imu
- heart-rate
- edge-deployment
- onnx
- jetson-nano
license: mit
---
# SISA-RoutineGuard v5b — ONNX Edition
**노인 일상 패턴 이상 감지** (Galaxy Watch + Jetson Orin Nano Super)
**ONNX exports** for fast Jetson inference (TensorRT compatible).
## 📦 ONNX Models (Jetson deploy)
| File | Size | Stage | Input | Output |
|---|---:|---|---|---|
| **patch_encoder.onnx** | 0.9 MB | 1 (Phone) | acc [6, 250, 3] | tokens [6, 256] |
| **minute_encoder.onnx** | 192.5 MB | 2 | patch_tokens [B, 6, 256] | minute_embed [B, 768] |
| **feature_adapter.onnx** | 2.7 MB | 2 | feature [B, 12] | embed [B, 768] |
| **hourslot_encoder.onnx** | 570.9 MB | 3 | minute_embeds [B, 60, 768] | slot [B, 1024], slot_minutes [B, 60, 1024] |
| **history_encoder.onnx** | 567.7 MB | 4 | slot_embeds [B, 90, 1024] + meta | history_embeds [B, 90, 1024] |
| **vitalguard.onnx** | 48.2 MB | 6 | vital_features [B, 60, 5] + hrv | hr_residual_z + trend + context |
| **output_heads.onnx** | 6.3 MB | — | cls_pooled [B, 1024] | anomaly + reason + confidence |
> **QueryRefiner ONNX** 는 cross-attention shape 복잡으로 미지원 (PyTorch ckpt만).
**Total ONNX: ~1.4 GB**
## 🚀 Jetson Inference Example
```python
import onnxruntime as ort
import numpy as np
# TensorRT EP (Jetson에서 자동 가속)
providers = [
'TensorrtExecutionProvider', # Jetson Orin Nano TensorRT
'CUDAExecutionProvider', # fallback CUDA
'CPUExecutionProvider', # last resort
]
# 1. Phone 측 PatchEncoder (Phone ONNX)
phone_sess = ort.InferenceSession("patch_encoder.onnx", providers=['CPUExecutionProvider'])
patches = phone_sess.run(None, {"acc": acc_array}) # [6, 250, 3] → [6, 256]
# 2. Jetson Pipeline
me_sess = ort.InferenceSession("minute_encoder.onnx", providers=providers)
minute = me_sess.run(None, {"patch_tokens": patches.reshape(1, 6, 256)})[0]
hs_sess = ort.InferenceSession("hourslot_encoder.onnx", providers=providers)
slot, slot_minutes = hs_sess.run(None, {"minute_embeds": minute_batch}) # [B, 60, 768]
# ... history, query, heads chain
```
## 🎯 모델 사이즈 — **444.66M params**
| Component | Params | Deploy |
|---|---:|---|
| PatchEncoder | 0.22M | **Phone (ONNX)** |
| MinuteEncoder | 48.09M | Jetson |
| FeatureAdapter | 0.66M | Jetson |
| HourSlotEncoder | 142.60M | Jetson |
| HistoryEncoder | 141.86M | Jetson |
| QueryRefiner | 97.65M | Jetson |
| VitalGuard | 12.01M | Jetson |
| OutputHeads | 1.58M | Jetson |
| **Total** | **444.66M** | — |
## 📊 성능 (OOD: HAR-70+ 노인 70-95세, 학습 X)
| 시나리오 | Score | AUC | Reason |
|---|---:|---:|---:|
| Normal | 0.0004 | — | — |
| walk_missing | 0.9995 | **1.000** | 0% |
| prolonged_inactivity | 0.9987 | **1.000** | 5% |
| routine_time_shift | 0.9995 | **1.000** | **100%** ✓ |
| activity_drop | 0.7145 | 0.950 | 28% |
| **Overall** | — | **0.987** | — |
## 🔧 Train/Val Split + Early Stopping
- Train/Val: 80/20 (3,277 / 819 samples)
- **Best epoch = 1, val_loss = 0.2814** (saved)
- Early stop at epoch 13 (patience=10)
- Overfitting 방지 검증됨
## 📁 PyTorch checkpoints (학습 reproducibility용)
| File | Size | Purpose |
|---|---:|---|
| stage1_patch.pt | 879 KB | PatchEncoder (also ONNX) |
| stage2_minute.pt | 192 MB | MinuteEncoder (also ONNX) |
| stage2_adapter.pt | 2.7 MB | FeatureAdapter (also ONNX) |
| stage3_hourslot.pt | 570 MB | HourSlotEncoder (also ONNX) |
| stage4_history.pt | 567 MB | HistoryEncoder (also ONNX) |
| stage4_refiner.pt | 390 MB | QueryRefiner (PyTorch only) |
| stage5_full.pt | 1.78 GB | Full model (val-split best) |
| stage6_vitalguard.pt | 48 MB | VitalGuard (also ONNX) |
| normalizer.pkl | 405 B | Feature normalizer |
## 학습 데이터
CAPTURE-24 (151) + ArWISE V3 (10명/76일) + PPG-DaLiA (15) + WESAD (15) + MHEALTH (10).
**HAR-70+ (18명 70-95세)는 OOD 평가에만 사용.**
## Code
https://github.com/tlstngud/sisa-routineguard (PRESENTATION.md 포함)
|