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 포함)