-
Feature Extraction: 25 engineered features per frame
- Temporal: Inter-arrival time, time-since-last, sequence position
- Payload: Entropy, mean, std, Hamming distance
- Statistical: Per-ID aggregates, DLC variance, ID diversity
-
Normalization: StandardScaler (μ=0, σ=1)
-
Augmentation (training only):
- Bit-flip injection (5% probability)
- Temporal jitter (±2ms)
- Random masking (10% features)
1import torch
2from secids.models import TemporalCNN
3from secids.data import CANPreprocessor
4
5# Load model
6model = TemporalCNN.load_from_checkpoint("final_model.ckpt")
7model.eval()
8
9# Preprocess CAN data
10preprocessor = CANPreprocessor()
11features = preprocessor.transform(can_frames) # [128, 25]
12
13# Inference
14with torch.no_grad():
15 logits = model(features.unsqueeze(0)) # [1, 128, 25]
16 pred = torch.argmax(logits, dim=-1)
17
18print(f"Attack Detected: {pred.item() == 1}")
1import onnxruntime as ort
2
3# Load ONNX model
4session = ort.InferenceSession("secids_v2.onnx")
5
6# Run inference
7outputs = session.run(None, {"input": features.numpy()})
8prediction = outputs[0].argmax()
1# Start REST API server
2cd serving
3python app.py
4
5# Make prediction request
6curl -X POST http://localhost:8080/predict \
7 -H "Content-Type: application/json" \
8 -d @can_sample.json
1# Start web dashboard
2cd serving
3streamlit run dashboard.py --server.port 5060
1pip install torch torchvision pytorch-lightning
2pip install pandas numpy pyarrow
3pip install scikit-learn wandb
1python scripts/train.py \
2 --model tcn \
3 --data data/processed/train.parquet \
4 --batch_size 32 \
5 --epochs 50 \
6 --gpus 1 \
7 --precision 16
1from secids.models import TemporalCNN
2import torch
3
4model = TemporalCNN.load_from_checkpoint("model.ckpt")
5dummy_input = torch.randn(1, 128, 25)
6
7torch.onnx.export(
8 model,
9 dummy_input,
10 "secids_v2.onnx",
11 input_names=["input"],
12 output_names=["output"],
13 dynamic_axes={"input": {0: "batch"}}
14)
1# Convert ONNX to TensorRT (FP16)
2trtexec --onnx=secids_v2.onnx \
3 --saveEngine=secids_v2_fp16.trt \
4 --fp16
5
6# Convert to INT8 (requires calibration data)
7trtexec --onnx=secids_v2.onnx \
8 --saveEngine=secids_v2_int8.trt \
9 --int8 \
10 --calib=calibration.cache
1python scripts/evaluate.py \
2 --model outputs/tcn_production/final_model.ckpt \
3 --data data/processed/test.parquet \
4 --output results/
1@software{secids_v2_2025,
2 author = {Hardani, Keyvan},
3 title = {SecIDS-v2: Next-Generation Automotive Intrusion Detection System},
4 year = {2025},
5 url = {https://github.com/Keyvanhardani/SecIDS-v2},
6 note = {Production-ready CAN-bus intrusion detection with Temporal CNNs}
7}