JiaHuang01 commited on
Commit
42ca2e8
·
verified ·
1 Parent(s): 359e0b9

Add VIGIL trigger inference artifacts for ROS integration

Browse files
PUBLIC_MANIFEST.json ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "balanced_manifest_sha256": "549134e307f21470cb942acd44c2c27d2b29fcaa8527b9e7f8e2722e3232b58e",
3
+ "bundle_dir": "finetune/model_bundles/vigil_latest_optimized_20260626_085405",
4
+ "code_commit": "132ead0",
5
+ "dataset_fingerprint": "2b78e211183d47fb",
6
+ "dataset_zip_sha256": "e2e38518d6725449653138e0ee484c4b5903467e418e8968d4b98ada5fd41701",
7
+ "fold_sha256": "7c1c65da28f87922f111ee1549b61c053323fc876d2cd26346544de0b37b2a5e",
8
+ "include_qwen_weights": false,
9
+ "selected_config": {
10
+ "fewshot_recipe": "no_adaptation_zero_shot_fallback",
11
+ "top_k": 1,
12
+ "variant": "stage2_bce_supcon"
13
+ },
14
+ "stage1_checkpoint": {
15
+ "committed": false,
16
+ "exists": true,
17
+ "path": "finetune/model_bundles/vigil_latest_optimized_20260626_085405/stage1/checkpoint_best.pt",
18
+ "sha256": "5439a089c8aabf3eda0e02e6d44b1a3ab190c9e6b2252be4374231fd3f63a58a"
19
+ },
20
+ "stage1_metrics": {
21
+ "device": "cuda:0",
22
+ "feature_backend": "official_openwakeword",
23
+ "input_feature_dim": 96,
24
+ "official_openwakeword_used": true,
25
+ "parameters": {
26
+ "frozen": 0,
27
+ "total": 56321,
28
+ "trainable": 56321
29
+ },
30
+ "pos_weight": 0.8333333134651184,
31
+ "status": "ok",
32
+ "test_metrics": {
33
+ "defined": false,
34
+ "n": 0
35
+ },
36
+ "test_rows": 0,
37
+ "theta_1": 0.9973222613334656,
38
+ "threshold_selection": {
39
+ "metrics": {
40
+ "auprc": 0.9999981958576892,
41
+ "auroc": 0.9999978321193201,
42
+ "balanced_accuracy": 0.9751344086021505,
43
+ "f1": 0.9745003445899381,
44
+ "false_positive_rate": 0.0,
45
+ "false_reject_rate": 0.04973118279569892,
46
+ "fn": 37,
47
+ "fp": 0,
48
+ "n": 1364,
49
+ "negative": 620,
50
+ "positive": 744,
51
+ "precision": 1.0,
52
+ "recall": 0.9502688172043011,
53
+ "specificity": 1.0,
54
+ "threshold": 0.9973222613334656,
55
+ "tn": 620,
56
+ "tp": 707
57
+ },
58
+ "reason": "met_recall_target_0.95",
59
+ "threshold": 0.9973222613334656
60
+ },
61
+ "train_rows": 1364,
62
+ "val_rows": 1364
63
+ },
64
+ "stage1_threshold": {
65
+ "metrics": {
66
+ "auprc": 0.9999981958576892,
67
+ "auroc": 0.9999978321193201,
68
+ "balanced_accuracy": 0.9751344086021505,
69
+ "f1": 0.9745003445899381,
70
+ "false_positive_rate": 0.0,
71
+ "false_reject_rate": 0.04973118279569892,
72
+ "fn": 37,
73
+ "fp": 0,
74
+ "n": 1364,
75
+ "negative": 620,
76
+ "positive": 744,
77
+ "precision": 1.0,
78
+ "recall": 0.9502688172043011,
79
+ "specificity": 1.0,
80
+ "threshold": 0.9973222613334656,
81
+ "tn": 620,
82
+ "tp": 707
83
+ },
84
+ "reason": "met_recall_target_0.95",
85
+ "threshold": 0.9973222613334656
86
+ },
87
+ "stage2_checkpoint": {
88
+ "committed": false,
89
+ "exists": true,
90
+ "path": "finetune/model_bundles/vigil_latest_optimized_20260626_085405/stage2_bce_supcon/checkpoint_best.pt",
91
+ "sha256": "c5850274a752db91b529119a65fcc19ff90d60a682c2c78f46d7b5b3d0062efb"
92
+ },
93
+ "stage2_metrics": {
94
+ "device": "cuda:0",
95
+ "input_feature_dim": 2048,
96
+ "lambda_supcon": 0.1,
97
+ "no_pair_batches": 156,
98
+ "qwen_integrity": {
99
+ "checksums_unchanged": true,
100
+ "qwen_parameters_modified": false,
101
+ "representative_checksums_after": {
102
+ "thinker.audio_tower.layers.0.self_attn.k_proj.bias": -59.839073181152344,
103
+ "thinker.audio_tower.layers.0.self_attn.k_proj.weight": -6.748814582824707,
104
+ "thinker.audio_tower.layers.0.self_attn.out_proj.bias": -0.5344572067260742,
105
+ "thinker.audio_tower.layers.0.self_attn.out_proj.weight": -2.1157467365264893,
106
+ "thinker.audio_tower.layers.0.self_attn.q_proj.bias": -57.97587585449219,
107
+ "thinker.audio_tower.layers.0.self_attn.q_proj.weight": -9.140356063842773,
108
+ "thinker.audio_tower.layers.0.self_attn.v_proj.bias": -1.118425726890564,
109
+ "thinker.audio_tower.layers.0.self_attn.v_proj.weight": 16.02427101135254
110
+ },
111
+ "representative_checksums_before": {
112
+ "thinker.audio_tower.layers.0.self_attn.k_proj.bias": -59.839073181152344,
113
+ "thinker.audio_tower.layers.0.self_attn.k_proj.weight": -6.748814582824707,
114
+ "thinker.audio_tower.layers.0.self_attn.out_proj.bias": -0.5344572067260742,
115
+ "thinker.audio_tower.layers.0.self_attn.out_proj.weight": -2.1157467365264893,
116
+ "thinker.audio_tower.layers.0.self_attn.q_proj.bias": -57.97587585449219,
117
+ "thinker.audio_tower.layers.0.self_attn.q_proj.weight": -9.140356063842773,
118
+ "thinker.audio_tower.layers.0.self_attn.v_proj.bias": -1.118425726890564,
119
+ "thinker.audio_tower.layers.0.self_attn.v_proj.weight": 16.02427101135254
120
+ },
121
+ "status": "ok",
122
+ "total_qwen_parameters": 2038052480,
123
+ "trainable_qwen_parameters": 0
124
+ },
125
+ "status": "ok",
126
+ "test_metrics": {
127
+ "defined": false,
128
+ "n": 0
129
+ },
130
+ "test_rows": 0,
131
+ "theta_2": 0.9877771735191345,
132
+ "threshold_selection": {
133
+ "metrics": {
134
+ "auprc": 1.0,
135
+ "auroc": 1.0,
136
+ "balanced_accuracy": 0.950268817204301,
137
+ "f1": 0.9476661951909477,
138
+ "false_positive_rate": 0.0,
139
+ "false_reject_rate": 0.09946236559139784,
140
+ "fn": 74,
141
+ "fp": 0,
142
+ "n": 1364,
143
+ "negative": 620,
144
+ "positive": 744,
145
+ "precision": 1.0,
146
+ "recall": 0.9005376344086021,
147
+ "specificity": 1.0,
148
+ "threshold": 0.9877771735191345,
149
+ "tn": 620,
150
+ "tp": 670
151
+ },
152
+ "reason": "met_recall_target_0.9",
153
+ "threshold": 0.9877771735191345
154
+ },
155
+ "train_rows": 1364,
156
+ "val_rows": 1364,
157
+ "variant": "bce_supcon",
158
+ "verifier_parameters": 561922,
159
+ "verifier_trainable_parameters": 561922
160
+ },
161
+ "stage2_threshold": {
162
+ "metrics": {
163
+ "auprc": 1.0,
164
+ "auroc": 1.0,
165
+ "balanced_accuracy": 0.950268817204301,
166
+ "f1": 0.9476661951909477,
167
+ "false_positive_rate": 0.0,
168
+ "false_reject_rate": 0.09946236559139784,
169
+ "fn": 74,
170
+ "fp": 0,
171
+ "n": 1364,
172
+ "negative": 620,
173
+ "positive": 744,
174
+ "precision": 1.0,
175
+ "recall": 0.9005376344086021,
176
+ "specificity": 1.0,
177
+ "threshold": 0.9877771735191345,
178
+ "tn": 620,
179
+ "tp": 670
180
+ },
181
+ "reason": "met_recall_target_0.9",
182
+ "threshold": 0.9877771735191345
183
+ },
184
+ "status": "trained_deployment_candidate_not_scientific_test",
185
+ "training_policy": "All balanced windows duplicated as train and val for deployment-only final fit/calibration; not a held-out scientific estimate."
186
+ }
README.md ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: other
3
+ private: true
4
+ tags:
5
+ - vigil
6
+ - wake-word
7
+ - inference-artifacts
8
+ - ros
9
+ - qwen-asr
10
+ ---
11
+
12
+ # VIGIL Trigger Inference Artifacts
13
+
14
+ Private integration bundle for the VIGIL two-stage trigger used by the ROS `medical_agent` integration.
15
+
16
+ This repository contains only the small VIGIL inference heads and public configuration needed for integration testing. It does not contain raw audio, feature caches, predictions, datasets, Qwen weights, openWakeWord weights, logs, or private participant metadata.
17
+
18
+ ## Contents
19
+
20
+ ```text
21
+ PUBLIC_MANIFEST.json
22
+ stage1/checkpoint_best.pt
23
+ stage1/model_config.json
24
+ stage1/threshold.json
25
+ stage1/metrics.json
26
+ stage2_bce_supcon/checkpoint_best.pt
27
+ stage2_bce_supcon/threshold.json
28
+ stage2_bce_supcon/metrics.json
29
+ stage2_bce_supcon/frozen_qwen_integrity.json
30
+ ```
31
+
32
+ ## Selected Runtime Configuration
33
+
34
+ - Stage 1 feature backend: official openWakeWord speech embedding backbone.
35
+ - Stage 1 trainable head: LayerNorm -> 2-layer GRU -> Linear.
36
+ - Stage 1 threshold: `0.9973222613334656`.
37
+ - Stage 2 variant: `stage2_bce_supcon`.
38
+ - Stage 2 input: frozen Qwen audio encoder features.
39
+ - Stage 2 threshold: `0.9877771735191345`.
40
+ - Qwen model: load separately from `Qwen/Qwen3-ASR-1.7B`.
41
+ - Qwen trainable parameters: zero.
42
+
43
+ ## Intended Integration Shape
44
+
45
+ The ROS node should run raw audio in parallel with ASR:
46
+
47
+ ```text
48
+ 16 kHz microphone audio
49
+ -> rolling windows
50
+ -> Stage 1 candidate detector
51
+ -> Stage 2 verifier
52
+ -> VIGIL trigger event
53
+
54
+ ASR transcript
55
+ -> command/question text after trigger
56
+ ```
57
+
58
+ After VIGIL is confirmed, `medical_agent` can classify the transcript as a command or question and route it to command handling, VQA, or the medical LLM.
59
+
60
+ ## Safety Notes
61
+
62
+ - Do not treat this repository as a training dataset.
63
+ - Do not publish publicly until the VIGIL team approves sharing trained voice-trigger heads.
64
+ - Do not add raw participant audio, feature caches, predictions, exports, or local logs.
stage1/checkpoint_best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5439a089c8aabf3eda0e02e6d44b1a3ab190c9e6b2252be4374231fd3f63a58a
3
+ size 229169
stage1/metrics.json ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "device": "cuda:0",
3
+ "feature_backend": "official_openwakeword",
4
+ "input_feature_dim": 96,
5
+ "official_openwakeword_used": true,
6
+ "parameters": {
7
+ "frozen": 0,
8
+ "total": 56321,
9
+ "trainable": 56321
10
+ },
11
+ "pos_weight": 0.8333333134651184,
12
+ "status": "ok",
13
+ "test_metrics": {
14
+ "defined": false,
15
+ "n": 0
16
+ },
17
+ "test_rows": 0,
18
+ "theta_1": 0.9973222613334656,
19
+ "threshold_selection": {
20
+ "metrics": {
21
+ "auprc": 0.9999981958576892,
22
+ "auroc": 0.9999978321193201,
23
+ "balanced_accuracy": 0.9751344086021505,
24
+ "f1": 0.9745003445899381,
25
+ "false_positive_rate": 0.0,
26
+ "false_reject_rate": 0.04973118279569892,
27
+ "fn": 37,
28
+ "fp": 0,
29
+ "n": 1364,
30
+ "negative": 620,
31
+ "positive": 744,
32
+ "precision": 1.0,
33
+ "recall": 0.9502688172043011,
34
+ "specificity": 1.0,
35
+ "threshold": 0.9973222613334656,
36
+ "tn": 620,
37
+ "tp": 707
38
+ },
39
+ "reason": "met_recall_target_0.95",
40
+ "threshold": 0.9973222613334656
41
+ },
42
+ "train_rows": 1364,
43
+ "val_rows": 1364
44
+ }
stage1/model_config.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "allow_acoustic_fallback_when_openwakeword_missing": false,
3
+ "batch_size": 32,
4
+ "dropout": 0.1,
5
+ "early_stopping_patience": 5,
6
+ "epochs": 20,
7
+ "feature_backend": "openwakeword",
8
+ "gradient_clip_norm": 5.0,
9
+ "gru_hidden_size": 64,
10
+ "gru_layers": 2,
11
+ "input_dim": 96,
12
+ "learning_rate": 0.001,
13
+ "recall_target": 0.95,
14
+ "weight_decay": 0.0001
15
+ }
stage1/threshold.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "metrics": {
3
+ "auprc": 0.9999981958576892,
4
+ "auroc": 0.9999978321193201,
5
+ "balanced_accuracy": 0.9751344086021505,
6
+ "f1": 0.9745003445899381,
7
+ "false_positive_rate": 0.0,
8
+ "false_reject_rate": 0.04973118279569892,
9
+ "fn": 37,
10
+ "fp": 0,
11
+ "n": 1364,
12
+ "negative": 620,
13
+ "positive": 744,
14
+ "precision": 1.0,
15
+ "recall": 0.9502688172043011,
16
+ "specificity": 1.0,
17
+ "threshold": 0.9973222613334656,
18
+ "tn": 620,
19
+ "tp": 707
20
+ },
21
+ "reason": "met_recall_target_0.95",
22
+ "threshold": 0.9973222613334656
23
+ }
stage2_bce_supcon/checkpoint_best.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c5850274a752db91b529119a65fcc19ff90d60a682c2c78f46d7b5b3d0062efb
3
+ size 2252485
stage2_bce_supcon/frozen_qwen_integrity.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checksums_unchanged": true,
3
+ "qwen_parameters_modified": false,
4
+ "representative_checksums_after": {
5
+ "thinker.audio_tower.layers.0.self_attn.k_proj.bias": -59.839073181152344,
6
+ "thinker.audio_tower.layers.0.self_attn.k_proj.weight": -6.748814582824707,
7
+ "thinker.audio_tower.layers.0.self_attn.out_proj.bias": -0.5344572067260742,
8
+ "thinker.audio_tower.layers.0.self_attn.out_proj.weight": -2.1157467365264893,
9
+ "thinker.audio_tower.layers.0.self_attn.q_proj.bias": -57.97587585449219,
10
+ "thinker.audio_tower.layers.0.self_attn.q_proj.weight": -9.140356063842773,
11
+ "thinker.audio_tower.layers.0.self_attn.v_proj.bias": -1.118425726890564,
12
+ "thinker.audio_tower.layers.0.self_attn.v_proj.weight": 16.02427101135254
13
+ },
14
+ "representative_checksums_before": {
15
+ "thinker.audio_tower.layers.0.self_attn.k_proj.bias": -59.839073181152344,
16
+ "thinker.audio_tower.layers.0.self_attn.k_proj.weight": -6.748814582824707,
17
+ "thinker.audio_tower.layers.0.self_attn.out_proj.bias": -0.5344572067260742,
18
+ "thinker.audio_tower.layers.0.self_attn.out_proj.weight": -2.1157467365264893,
19
+ "thinker.audio_tower.layers.0.self_attn.q_proj.bias": -57.97587585449219,
20
+ "thinker.audio_tower.layers.0.self_attn.q_proj.weight": -9.140356063842773,
21
+ "thinker.audio_tower.layers.0.self_attn.v_proj.bias": -1.118425726890564,
22
+ "thinker.audio_tower.layers.0.self_attn.v_proj.weight": 16.02427101135254
23
+ },
24
+ "status": "ok",
25
+ "total_qwen_parameters": 2038052480,
26
+ "trainable_qwen_parameters": 0
27
+ }
stage2_bce_supcon/metrics.json ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "device": "cuda:0",
3
+ "input_feature_dim": 2048,
4
+ "lambda_supcon": 0.1,
5
+ "no_pair_batches": 156,
6
+ "qwen_integrity": {
7
+ "checksums_unchanged": true,
8
+ "qwen_parameters_modified": false,
9
+ "representative_checksums_after": {
10
+ "thinker.audio_tower.layers.0.self_attn.k_proj.bias": -59.839073181152344,
11
+ "thinker.audio_tower.layers.0.self_attn.k_proj.weight": -6.748814582824707,
12
+ "thinker.audio_tower.layers.0.self_attn.out_proj.bias": -0.5344572067260742,
13
+ "thinker.audio_tower.layers.0.self_attn.out_proj.weight": -2.1157467365264893,
14
+ "thinker.audio_tower.layers.0.self_attn.q_proj.bias": -57.97587585449219,
15
+ "thinker.audio_tower.layers.0.self_attn.q_proj.weight": -9.140356063842773,
16
+ "thinker.audio_tower.layers.0.self_attn.v_proj.bias": -1.118425726890564,
17
+ "thinker.audio_tower.layers.0.self_attn.v_proj.weight": 16.02427101135254
18
+ },
19
+ "representative_checksums_before": {
20
+ "thinker.audio_tower.layers.0.self_attn.k_proj.bias": -59.839073181152344,
21
+ "thinker.audio_tower.layers.0.self_attn.k_proj.weight": -6.748814582824707,
22
+ "thinker.audio_tower.layers.0.self_attn.out_proj.bias": -0.5344572067260742,
23
+ "thinker.audio_tower.layers.0.self_attn.out_proj.weight": -2.1157467365264893,
24
+ "thinker.audio_tower.layers.0.self_attn.q_proj.bias": -57.97587585449219,
25
+ "thinker.audio_tower.layers.0.self_attn.q_proj.weight": -9.140356063842773,
26
+ "thinker.audio_tower.layers.0.self_attn.v_proj.bias": -1.118425726890564,
27
+ "thinker.audio_tower.layers.0.self_attn.v_proj.weight": 16.02427101135254
28
+ },
29
+ "status": "ok",
30
+ "total_qwen_parameters": 2038052480,
31
+ "trainable_qwen_parameters": 0
32
+ },
33
+ "status": "ok",
34
+ "test_metrics": {
35
+ "defined": false,
36
+ "n": 0
37
+ },
38
+ "test_rows": 0,
39
+ "theta_2": 0.9877771735191345,
40
+ "threshold_selection": {
41
+ "metrics": {
42
+ "auprc": 1.0,
43
+ "auroc": 1.0,
44
+ "balanced_accuracy": 0.950268817204301,
45
+ "f1": 0.9476661951909477,
46
+ "false_positive_rate": 0.0,
47
+ "false_reject_rate": 0.09946236559139784,
48
+ "fn": 74,
49
+ "fp": 0,
50
+ "n": 1364,
51
+ "negative": 620,
52
+ "positive": 744,
53
+ "precision": 1.0,
54
+ "recall": 0.9005376344086021,
55
+ "specificity": 1.0,
56
+ "threshold": 0.9877771735191345,
57
+ "tn": 620,
58
+ "tp": 670
59
+ },
60
+ "reason": "met_recall_target_0.9",
61
+ "threshold": 0.9877771735191345
62
+ },
63
+ "train_rows": 1364,
64
+ "val_rows": 1364,
65
+ "variant": "bce_supcon",
66
+ "verifier_parameters": 561922,
67
+ "verifier_trainable_parameters": 561922
68
+ }
stage2_bce_supcon/threshold.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "metrics": {
3
+ "auprc": 1.0,
4
+ "auroc": 1.0,
5
+ "balanced_accuracy": 0.950268817204301,
6
+ "f1": 0.9476661951909477,
7
+ "false_positive_rate": 0.0,
8
+ "false_reject_rate": 0.09946236559139784,
9
+ "fn": 74,
10
+ "fp": 0,
11
+ "n": 1364,
12
+ "negative": 620,
13
+ "positive": 744,
14
+ "precision": 1.0,
15
+ "recall": 0.9005376344086021,
16
+ "specificity": 1.0,
17
+ "threshold": 0.9877771735191345,
18
+ "tn": 620,
19
+ "tp": 670
20
+ },
21
+ "reason": "met_recall_target_0.9",
22
+ "threshold": 0.9877771735191345
23
+ }