From 3a17e62dcd44446c39497a5dcf29e69577ec98c6 Mon Sep 17 00:00:00 2001 From: ParrotXray Date: Wed, 20 May 2026 06:23:08 +0000 Subject: [PATCH] feat: require full window fill before ONNX inference --- config.toml | 4 +- net-guardia/src/core/system.rs | 2 +- net-guardia/src/detection/ml/config_loader.rs | 19 +++- net-guardia/src/detection/ml/engine.rs | 46 ++------ .../src/detection/ml/feature_extractor.rs | 106 +++++++++--------- net-guardia/src/detection/ml/flow_tracker.rs | 10 +- net-guardia/src/detection/ml/inference.rs | 55 +++++++-- net-guardia/src/model/config.rs | 9 ++ net-guardia/src/model/error/ml.rs | 4 + net-guardia/src/model/log/ml.rs | 3 + .../static/artifacts/deep_autoencoder.onnx | Bin 3930691 -> 4001673 bytes net-guardia/static/artifacts/full_config.json | 2 +- 12 files changed, 146 insertions(+), 114 deletions(-) diff --git a/config.toml b/config.toml index 882413d..7a1a68c 100644 --- a/config.toml +++ b/config.toml @@ -41,4 +41,6 @@ xsk_cpu_base = 0 # # Pin ML inference (ONNX spawn_blocking) to this core. # Example: on an 8-core machine, reserve core 7 for inference. -ml_cpu = 7 \ No newline at end of file +ml_cpu = 7 + +ae_threshold_method = "94" \ No newline at end of file diff --git a/net-guardia/src/core/system.rs b/net-guardia/src/core/system.rs index 73f6a64..02c7b65 100644 --- a/net-guardia/src/core/system.rs +++ b/net-guardia/src/core/system.rs @@ -41,7 +41,7 @@ impl System { let (mut egress_ebpf, egress_program_array) = System::get_egress_ebpf()?; let app_config = Arc::new(AppConfig::new()?); - let inference_config = Arc::new(InferenceConfig::load_file(&app_config.models_config_name)?); + let inference_config = Arc::new(InferenceConfig::load_file(&app_config.models_config_name, &app_config.ae_threshold_method)?); let ebpf_services = Arc::new(EbpfServices::new( app_config.clone(), diff --git a/net-guardia/src/detection/ml/config_loader.rs b/net-guardia/src/detection/ml/config_loader.rs index f70f699..b2e6646 100644 --- a/net-guardia/src/detection/ml/config_loader.rs +++ b/net-guardia/src/detection/ml/config_loader.rs @@ -3,6 +3,7 @@ use std::fs; use std::path::PathBuf; use serde::{Deserialize, Serialize}; +use macros::log; use crate::model::error::ml::MLError; use crate::model::ml_detection::ClipParams; @@ -14,18 +15,28 @@ pub struct InferenceConfig { pub ae_scaler_std: Vec, pub ae_post_clip_min: f64, pub ae_post_clip_max: f64, - pub ae_threshold: f32, - pub ae_threshold_method: Option, + pub ae_thresholds: HashMap, pub window_size: usize, + /// Selected threshold method name, set at load time from config.toml. + #[serde(skip)] + pub ae_threshold_method: String, } impl InferenceConfig { - pub fn load_file(file: &str) -> Result { + pub fn load_file(file: &str, method: &str) -> Result { let path = PathBuf::from(env!("ARTIFACTCS_PATH")).join(file); let content = fs::read_to_string(&path) .map_err(|_| MLError::ConfigLoadFailed { path: path.clone() })?; - let config: InferenceConfig = serde_json::from_str(&content) + let mut config: InferenceConfig = serde_json::from_str(&content) .map_err(|e| MLError::ConfigParseFailed { reason: e.to_string() })?; + + // Validate the method exists at startup — fail fast rather than at inference time. + if !config.ae_thresholds.contains_key(method) { + log!(MLError::ThresholdMethodNotFound { method: method.to_string() }); + return Err(MLError::ThresholdMethodNotFound { method: method.to_string() }); + } + + config.ae_threshold_method = method.to_string(); Ok(config) } diff --git a/net-guardia/src/detection/ml/engine.rs b/net-guardia/src/detection/ml/engine.rs index b1d2ed8..f358496 100644 --- a/net-guardia/src/detection/ml/engine.rs +++ b/net-guardia/src/detection/ml/engine.rs @@ -90,7 +90,7 @@ impl Engine { _ = ticker.tick() => {} } - let (total_flows, packet_counts, flows) = { + let (total_flows, packet_counts, flows, active_ips) = { let Ok(mut t) = self.tracker.lock() else { log!(MLError::TrackerLockPoisoned); continue; @@ -100,12 +100,13 @@ impl Engine { .iter() .map(|f| f.packet_count()) .collect(); - let flows = if self.traffic_logger.is_some() { - t.drain_flows(self.min_packets) - } else { - t.get_flows_for_inference(self.min_packets) - }; - (total_flows, packet_counts, flows) + let flows = t.drain_flows(self.min_packets); + t.cleanup_old_flows(self.flow_timeout_us); + let active_ips: std::collections::HashSet = t + .get_flows_snapshot().iter() + .map(|f| f.flow_key.src_ip.clone()) + .collect(); + (total_flows, packet_counts, flows, active_ips) }; log!(MLLog::FlowStats( @@ -116,19 +117,7 @@ impl Engine { )); if flows.is_empty() { - if self.traffic_logger.is_none() { - if let Ok(mut t) = self.tracker.lock() { - t.cleanup_old_flows(self.flow_timeout_us); - let active_ips: std::collections::HashSet = t - .get_flows_snapshot().iter() - .map(|f| f.flow_key.src_ip.clone()) - .collect(); - drop(t); - self.inference_pipeline.cleanup_buffers(&active_ips); - } else { - log!(MLError::TrackerLockPoisoned); - } - } + self.inference_pipeline.cleanup_buffers(&active_ips); continue; } @@ -138,11 +127,6 @@ impl Engine { let features = FlowFeatures::extract(flow, &feature_names); logger.log_row(features.to_csv_record()); } - if let Ok(mut t) = self.tracker.lock() { - t.cleanup_old_flows(self.flow_timeout_us); - } else { - log!(MLError::TrackerLockPoisoned); - } continue; } @@ -209,17 +193,7 @@ impl Engine { aggregator.cleanup(); } - if let Ok(mut t) = self.tracker.lock() { - t.cleanup_old_flows(self.flow_timeout_us); - let active_ips: std::collections::HashSet = t - .get_flows_snapshot().iter() - .map(|f| f.flow_key.src_ip.clone()) - .collect(); - drop(t); - self.inference_pipeline.cleanup_buffers(&active_ips); - } else { - log!(MLError::TrackerLockPoisoned); - } + self.inference_pipeline.cleanup_buffers(&active_ips); } } diff --git a/net-guardia/src/detection/ml/feature_extractor.rs b/net-guardia/src/detection/ml/feature_extractor.rs index 98bdf66..1344681 100644 --- a/net-guardia/src/detection/ml/feature_extractor.rs +++ b/net-guardia/src/detection/ml/feature_extractor.rs @@ -95,72 +95,72 @@ impl FlowFeatures { "Total Backward Packets" | "Tot Bwd Pkts" | "bwd_packets" => bwd_count, "Total Length of Fwd Packets" | "TotLen Fwd Pkts" | "fwd_bytes" => flow.fwd_total_bytes as f64, "Total Length of Bwd Packets" | "TotLen Bwd Pkts" | "bwd_bytes" => flow.bwd_total_bytes as f64, - "Fwd Packet Length Max" => fwd_max, - "Fwd Packet Length Min" => fwd_min, + "Fwd Packet Length Max" | "fwd_pkt_len_max" => fwd_max, + "Fwd Packet Length Min" | "fwd_pkt_len_min" => fwd_min, "Fwd Packet Length Mean" | "Fwd Pkt Len Mean" | "fwd_pkt_len_mean" => fwd_mean, "Fwd Packet Length Std" | "Fwd Pkt Len Std" | "fwd_pkt_len_std" => fwd_std, - "Bwd Packet Length Max" => bwd_max, - "Bwd Packet Length Min" => bwd_min, + "Bwd Packet Length Max" | "bwd_pkt_len_max" => bwd_max, + "Bwd Packet Length Min" | "bwd_pkt_len_min" => bwd_min, "Bwd Packet Length Mean" | "Bwd Pkt Len Mean" | "bwd_pkt_len_mean" => bwd_mean, "Bwd Packet Length Std" | "Bwd Pkt Len Std" | "bwd_pkt_len_std" => bwd_std, "Flow Bytes/s" | "Flow Byts/s" | "flow_bytes_per_sec" => safe_div(total_bytes, duration_s), "Flow Packets/s" | "Flow Pkts/s" | "flow_pkts_per_sec" => safe_div(total_count, duration_s), "Flow IAT Mean" | "flow_iat_mean" => flow_iat_mean, - "Flow IAT Std" => flow_iat_std, - "Flow IAT Max" => flow_iat_max, - "Flow IAT Min" => flow_iat_min, - "Fwd IAT Total" => fwd_iat_total, + "Flow IAT Std" | "flow_iat_std" => flow_iat_std, + "Flow IAT Max" | "flow_iat_max" => flow_iat_max, + "Flow IAT Min" | "flow_iat_min" => flow_iat_min, + "Fwd IAT Total" | "fwd_iat_total" => fwd_iat_total, "Fwd IAT Mean" | "fwd_iat_mean" => fwd_iat_mean, - "Fwd IAT Std" => fwd_iat_std, - "Fwd IAT Max" => fwd_iat_max, - "Fwd IAT Min" => fwd_iat_min, - "Bwd IAT Total" => bwd_iat_total, + "Fwd IAT Std" | "fwd_iat_std" => fwd_iat_std, + "Fwd IAT Max" | "fwd_iat_max" => fwd_iat_max, + "Fwd IAT Min" | "fwd_iat_min" => fwd_iat_min, + "Bwd IAT Total" | "bwd_iat_total" => bwd_iat_total, "Bwd IAT Mean" | "bwd_iat_mean" => bwd_iat_mean, - "Bwd IAT Std" => bwd_iat_std, - "Bwd IAT Max" => bwd_iat_max, - "Bwd IAT Min" => bwd_iat_min, - "Fwd PSH Flags" => fwd_psh, - "Bwd PSH Flags" => bwd_psh, - "Fwd URG Flags" => fwd_urg, - "Bwd URG Flags" => bwd_urg, - "Fwd Header Length" => flow.fwd_header_bytes as f64, - "Bwd Header Length" => flow.bwd_header_bytes as f64, - "Fwd Packets/s" => safe_div(fwd_count, duration_s), - "Bwd Packets/s" => safe_div(bwd_count, duration_s), - "Min Packet Length" => min_len, - "Max Packet Length" => max_len, + "Bwd IAT Std" | "bwd_iat_std" => bwd_iat_std, + "Bwd IAT Max" | "bwd_iat_max" => bwd_iat_max, + "Bwd IAT Min" | "bwd_iat_min" => bwd_iat_min, + "Fwd PSH Flags" | "fwd_psh_flags" => fwd_psh, + "Bwd PSH Flags" | "bwd_psh_flags" => bwd_psh, + "Fwd URG Flags" | "fwd_urg_flags" => fwd_urg, + "Bwd URG Flags" | "bwd_urg_flags" => bwd_urg, + "Fwd Header Length" | "fwd_header_length" => flow.fwd_header_bytes as f64, + "Bwd Header Length" | "bwd_header_length" => flow.bwd_header_bytes as f64, + "Fwd Packets/s" | "fwd_pkts_per_sec" => safe_div(fwd_count, duration_s), + "Bwd Packets/s" | "bwd_pkts_per_sec" => safe_div(bwd_count, duration_s), + "Min Packet Length" | "pkt_len_min" => min_len, + "Max Packet Length" | "pkt_len_max" => max_len, "Packet Length Mean" | "Pkt Len Mean" | "pkt_len_mean" => mean_len, "Packet Length Std" | "Pkt Len Std" | "pkt_len_std" => std_len, - "Packet Length Variance" => std_len * std_len, + "Packet Length Variance" | "pkt_len_var" => std_len * std_len, "FIN Flag Count" | "FIN Flag Cnt" | "fin_flag_cnt" => flow.fin_count as f64, "SYN Flag Count" | "SYN Flag Cnt" | "syn_flag_cnt" => flow.syn_count as f64, "RST Flag Count" | "RST Flag Cnt" | "rst_flag_cnt" => flow.rst_count as f64, "PSH Flag Count" | "PSH Flag Cnt" | "psh_flag_cnt" => flow.psh_count as f64, "ACK Flag Count" | "ACK Flag Cnt" | "ack_flag_cnt" => flow.ack_count as f64, - "URG Flag Count" => flow.urg_count as f64, - "CWE Flag Count" => flow.cwe_count as f64, - "ECE Flag Count" => flow.ece_count as f64, - "Down/Up Ratio" => safe_div(bwd_count, fwd_count), - "Average Packet Size" => safe_div(total_bytes, total_count), - "Avg Fwd Segment Size" => safe_div(flow.fwd_total_bytes as f64, fwd_count), - "Avg Bwd Segment Size" => safe_div(flow.bwd_total_bytes as f64, bwd_count), - "Fwd Header Length.1" => flow.fwd_header_bytes as f64, - "Fwd Avg Bytes/Bulk" => safe_div(fwd_bulk.total_bytes as f64, fwd_bulk.bulk_count as f64), - "Fwd Avg Packets/Bulk" => safe_div(fwd_bulk.total_packets as f64, fwd_bulk.bulk_count as f64), - "Fwd Avg Bulk Rate" => safe_div( + "URG Flag Count" | "urg_flag_cnt" => flow.urg_count as f64, + "CWE Flag Count" | "cwe_flag_cnt" => flow.cwe_count as f64, + "ECE Flag Count" | "ece_flag_cnt" => flow.ece_count as f64, + "Down/Up Ratio" | "down_up_ratio" => safe_div(bwd_count, fwd_count), + "Average Packet Size" | "avg_pkt_size" => safe_div(total_bytes, total_count), + "Avg Fwd Segment Size" | "avg_fwd_seg_size" => safe_div(flow.fwd_total_bytes as f64, fwd_count), + "Avg Bwd Segment Size" | "avg_bwd_seg_size" => safe_div(flow.bwd_total_bytes as f64, bwd_count), + "Fwd Header Length.1" | "fwd_header_length_1" => flow.fwd_header_bytes as f64, + "Fwd Avg Bytes/Bulk" | "fwd_avg_bytes_bulk" => safe_div(fwd_bulk.total_bytes as f64, fwd_bulk.bulk_count as f64), + "Fwd Avg Packets/Bulk" | "fwd_avg_pkts_bulk" => safe_div(fwd_bulk.total_packets as f64, fwd_bulk.bulk_count as f64), + "Fwd Avg Bulk Rate" | "fwd_avg_bulk_rate" => safe_div( fwd_bulk.total_bytes as f64, fwd_bulk.total_duration_us as f64 / 1_000_000.0, ), - "Bwd Avg Bytes/Bulk" => safe_div(bwd_bulk.total_bytes as f64, bwd_bulk.bulk_count as f64), - "Bwd Avg Packets/Bulk" => safe_div(bwd_bulk.total_packets as f64, bwd_bulk.bulk_count as f64), - "Bwd Avg Bulk Rate" => safe_div( + "Bwd Avg Bytes/Bulk" | "bwd_avg_bytes_bulk" => safe_div(bwd_bulk.total_bytes as f64, bwd_bulk.bulk_count as f64), + "Bwd Avg Packets/Bulk" | "bwd_avg_pkts_bulk" => safe_div(bwd_bulk.total_packets as f64, bwd_bulk.bulk_count as f64), + "Bwd Avg Bulk Rate" | "bwd_avg_bulk_rate" => safe_div( bwd_bulk.total_bytes as f64, bwd_bulk.total_duration_us as f64 / 1_000_000.0, ), - "Subflow Fwd Packets" => fwd_count, - "Subflow Fwd Bytes" => flow.fwd_total_bytes as f64, - "Subflow Bwd Packets" => bwd_count, - "Subflow Bwd Bytes" => flow.bwd_total_bytes as f64, + "Subflow Fwd Packets" | "subflow_fwd_packets" => fwd_count, + "Subflow Fwd Bytes" | "subflow_fwd_bytes" => flow.fwd_total_bytes as f64, + "Subflow Bwd Packets" | "subflow_bwd_packets" => bwd_count, + "Subflow Bwd Bytes" | "subflow_bwd_bytes" => flow.bwd_total_bytes as f64, "Init_Win_bytes_forward" | "Init Fwd Win Byts" | "fwd_win_bytes" => flow.init_win_bytes_fwd as f64, "Init_Win_bytes_backward" | "Init Bwd Win Byts" | "bwd_win_bytes" => flow.init_win_bytes_bwd as f64, "act_data_pkt_fwd" | "Fwd Act Data Pkts" | "fwd_act_data_pkts" => flow.act_data_pkt_fwd as f64, @@ -169,14 +169,14 @@ impl FlowFeatures { .min_by(|a, b| a.total_cmp(b)) .copied() .unwrap_or(0.0), - "Active Mean" => active_mean, - "Active Std" => active_std, - "Active Max" => active_max, - "Active Min" => active_min, - "Idle Mean" => idle_mean, - "Idle Std" => idle_std, - "Idle Max" => idle_max, - "Idle Min" => idle_min, + "Active Mean" | "active_mean" => active_mean, + "Active Std" | "active_std" => active_std, + "Active Max" | "active_max" => active_max, + "Active Min" | "active_min" => active_min, + "Idle Mean" | "idle_mean" => idle_mean, + "Idle Std" | "idle_std" => idle_std, + "Idle Max" | "idle_max" => idle_max, + "Idle Min" | "idle_min" => idle_min, _ => 0.0, } } @@ -358,4 +358,4 @@ fn compute_flow_iats(fwd_packets: &[PacketData], bwd_packets: &[PacketData]) -> .windows(2) .map(|w| (w[1].timestamp_us - w[0].timestamp_us) as f64) .collect() -} +} \ No newline at end of file diff --git a/net-guardia/src/detection/ml/flow_tracker.rs b/net-guardia/src/detection/ml/flow_tracker.rs index 76684a3..15ff66f 100644 --- a/net-guardia/src/detection/ml/flow_tracker.rs +++ b/net-guardia/src/detection/ml/flow_tracker.rs @@ -311,14 +311,6 @@ impl FlowTracker { self.flows.values().cloned().collect() } - pub fn get_flows_for_inference(&self, min_packets: usize) -> Vec { - self.flows - .values() - .filter(|flow| flow.packet_count() >= min_packets) - .cloned() - .collect() - } - pub fn cleanup_old_flows(&mut self, max_age_us: u64) { let now = time::SystemTime::now() .duration_since(time::UNIX_EPOCH) @@ -378,4 +370,4 @@ fn detect_initiator(payload: &[u8], protocol: u8, src_port: u16, dst_port: u16) } None -} +} \ No newline at end of file diff --git a/net-guardia/src/detection/ml/inference.rs b/net-guardia/src/detection/ml/inference.rs index 02f2c7e..227e731 100644 --- a/net-guardia/src/detection/ml/inference.rs +++ b/net-guardia/src/detection/ml/inference.rs @@ -18,15 +18,24 @@ use crate::model::ml_detection::DetectionResult; pub struct Inference { pub models: Arc, pub config: Arc, + pub threshold: f32, + // Must equal window_size: only a fully-filled buffer is in-distribution. + // Zero-padded sequences are OOD for the autoencoder; any pad > 0 produces + // inflated MSE regardless of traffic type, causing false positives. + min_window_fill: usize, // per-src_ip sliding window buffer: src_ip -> deque of feature vectors flow_buffers: Mutex>>>, } impl Inference { pub fn new(models: Arc, config: Arc) -> Self { + let threshold = config.ae_thresholds[&config.ae_threshold_method] as f32; + let min_window_fill = config.window_size; Self { models, config, + threshold, + min_window_fill, flow_buffers: Mutex::new(HashMap::new()), } } @@ -49,7 +58,9 @@ impl Inference { let t1 = Instant::now(); let window_size = self.config.window_size; - let sequence = { + let feat_len = self.config.num_ae_features(); + + let (sequence, buf_len_snapshot) = { let Ok(mut buffers) = self.flow_buffers.lock() else { log!(MLError::InferenceLockPoisoned); return None; @@ -62,14 +73,23 @@ impl Inference { if buf.len() > window_size { buf.pop_front(); } - if buf.len() < window_size { - return None; - } - buf.iter().cloned().collect::>() + + // Zero-pad on the left (scaled space) when fewer than window_size + // flows have been seen for this src_ip — matches Python's + // _make_per_flow_sequences which initialises sequences to zeros + // before filling from the right. + let buf_len = buf.len(); + let pad = window_size - buf_len; + let mut seq: Vec> = (0..pad).map(|_| vec![0.0f32; feat_len]).collect(); + seq.extend(buf.iter().cloned()); + (seq, buf_len) }; + if buf_len_snapshot < self.min_window_fill { + return None; + } + let t2 = Instant::now(); - let feat_len = self.config.num_ae_features(); let ae_input = Array3::from_shape_fn( (1, window_size, feat_len), |(_, t, f)| sequence[t][f], @@ -93,7 +113,24 @@ impl Inference { t4.duration_since(t3).as_millis() as u64, )); - let is_attack = ae_score >= self.config.ae_threshold; + let pad = window_size - buf_len_snapshot; + let rows = sequence.iter().enumerate().map(|(t, row)| { + if t < pad { + format!(" t{t:02}: [pad]") + } else { + let vals = row.iter().map(|v| format!("{v:7.3}")).collect::>().join(" "); + format!(" t{t:02}: [{vals}]") + } + }).collect::>().join("\n"); + log!(MLLog::WindowDebug( + flow.flow_key.src_ip.clone(), + pad, + window_size, + ae_score, + rows, + )); + + let is_attack = ae_score >= self.threshold; let flow_key = format!( "{}:{} -> {}:{} (proto {}) [{}]", flow.flow_key.src_ip, @@ -112,7 +149,7 @@ impl Inference { attack_type: if is_attack { Some("ANOMALY".to_string()) } else { None }, confidence: ae_score, ae_score, - threshold: self.config.ae_threshold, + threshold: self.threshold, }) } @@ -143,4 +180,4 @@ impl Inference { Ok(mse) } -} +} \ No newline at end of file diff --git a/net-guardia/src/model/config.rs b/net-guardia/src/model/config.rs index 2479917..4b5a4ea 100644 --- a/net-guardia/src/model/config.rs +++ b/net-guardia/src/model/config.rs @@ -52,6 +52,11 @@ pub struct Config { /// Only used in "or" (corroboration window) and "and" modes. Defaults to 10. #[serde(default = "default_fusion_window_secs")] pub fusion_window_secs: u64, + /// Key into ae_thresholds in inference_config.json that selects the active + /// anomaly detection threshold. Valid values: "90".."99", "mean+2std", + /// "mean+1std", "Q3+1.5IQR", "Q3+3.0IQR". Defaults to "95" when absent. + #[serde(default = "default_ae_threshold_method")] + pub ae_threshold_method: String, } fn default_fusion_mode() -> String { @@ -60,4 +65,8 @@ fn default_fusion_mode() -> String { fn default_fusion_window_secs() -> u64 { 10 +} + +fn default_ae_threshold_method() -> String { + "95".to_string() } \ No newline at end of file diff --git a/net-guardia/src/model/error/ml.rs b/net-guardia/src/model/error/ml.rs index 21806a4..a22bb4b 100644 --- a/net-guardia/src/model/error/ml.rs +++ b/net-guardia/src/model/error/ml.rs @@ -20,6 +20,10 @@ traceable! { #[error("Failed to parse inference configuration: {reason}")] ConfigParseFailed { reason: String } => tracing::Level::ERROR, + #[no_source] + #[error("Threshold method '{method}' not found in ae_thresholds map")] + ThresholdMethodNotFound { method: String } => tracing::Level::ERROR, + #[no_source] #[error("Tracker mutex poisoned; skipping operation")] TrackerLockPoisoned => tracing::Level::ERROR, diff --git a/net-guardia/src/model/log/ml.rs b/net-guardia/src/model/log/ml.rs index 5ecad54..0709fb3 100644 --- a/net-guardia/src/model/log/ml.rs +++ b/net-guardia/src/model/log/ml.rs @@ -81,5 +81,8 @@ loggable! { #[error("Timing [{src}]: feature={feature_ms}ms buffer={buffer_ms}ms tensor={tensor_ms}ms onnx={onnx_ms}ms")] InferenceTiming { src: String, feature_ms: u64, buffer_ms: u64, tensor_ms: u64, onnx_ms: u64 } => tracing::Level::INFO, + #[error("Window [{src}] pad={pad}/{window_size} ae={ae_score:.6}\n{rows}")] + WindowDebug { src: String, pad: usize, window_size: usize, ae_score: f32, rows: String } => tracing::Level::DEBUG, + } } \ No newline at end of file diff --git a/net-guardia/static/artifacts/deep_autoencoder.onnx b/net-guardia/static/artifacts/deep_autoencoder.onnx index 8275cb18e2e1d509a374fa70193d344cf4f63bf5..831e6d9ba98e86cc5344221e4456b1b8f21d4903 100644 GIT binary patch delta 54111 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 delta 26507 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 i9jd3PR