This cookbook details how to deploy a localized 12-lead electrocardiogram (ECG) processing engine to detect acute ST-segment elevation myocardial infarction (STEMI), atrial fibrillation, and ventricular arrhythmias directly from raw WFDB signals without cloud API latency.
In emergency triage, pre-hospital ambulances, and intensive care units (ICUs), rapid detection of acute coronary syndromes (ACS) and fatal arrhythmias saves critical cardiac tissue.
This engine enables:
[ 12-Lead Raw ECG Signal / WFDB File ]
│
▼
[ ECGNet-12Lead-v1 ]
├── Wavelet Noise Filtering
└── P-QRS-T Landmark Detection
│
▼
[ STEMI-Detection-CLI ]
├── ST-Segment Elevation Micrometry (mV)
└── Lead Location Mapping (Anterior/Inferior)
│
▼
[ Structured Emergency Cardiac Summary JSON ]
Ensure Python 3.10+, wfdb, scipy, torch, and numpy are installed:
pip install wfdb scipy torch numpy
Clone the offline model weights:
git clone https://github.com/OpenPHRorg/ecgnet-12lead-local.git
cd ecgnet-12lead-local
Butterworth bandpass filter (0.5–45 Hz) and notch filtering (60 Hz powerline interference removal):
import wfdb
import numpy as np
from scipy.signal import butter, filtfilt, iirnotch
def preprocess_ecg(record_path):
record = wfdb.rdrecord(record_path)
signals = record.p_signal # [samples, leads]
fs = record.fs
# 1. Bandpass filter 0.5Hz to 45Hz
nyq = 0.5 * fs
b, a = butter(3, [0.5 / nyq, 45.0 / nyq], btype='band')
filtered_signals = filtfilt(b, a, signals, axis=0)
# 2. 60Hz Notch filter
b_notch, a_notch = iirnotch(60.0, 30.0, fs)
clean_signals = filtfilt(b_notch, a_notch, filtered_signals, axis=0)
return clean_signals, fs
# Example preprocessing
clean_ecg, sampling_rate = preprocess_ecg("sample_12lead_stemi")
print(f"Preprocessed 12-lead ECG signal shape: {clean_ecg.shape}")
Execute localized 12-lead ST-segment micrometry and arrhythmia scoring:
import torch
def evaluate_cardiac_signal(clean_signals):
model = torch.hub.load('OpenPHRorg/ecgnet-12lead-local', 'ecgnet_v1', pretrained=True)
model.eval()
# Shape: [batch=1, leads=12, time_steps]
tensor_input = torch.from_numpy(clean_signals.T).unsqueeze(0).float()
with torch.no_grad():
rhythm_logits, st_elevations = model(tensor_input)
rhythm_idx = torch.argmax(rhythm_logits, dim=1).item()
rhythms = ["Normal Sinus Rhythm", "Atrial Fibrillation", "ST-Elevation Myocardial Infarction (STEMI)", "Ventricular Tachycardia"]
st_max_mv = float(torch.max(st_elevations).item())
return {
"primary_rhythm": rhythms[rhythm_idx],
"st_elevation_max_mv": round(st_max_mv, 3),
"stemi_alert": st_max_mv >= 0.15, # Alert threshold >= 0.15 mV
"affected_territory": "Anterior Wall (V1-V4)" if rhythm_idx == 2 else "None"
}
# Run diagnostic assessment
result = evaluate_cardiac_signal(clean_ecg)
print(f"Emergency Cardiac Summary: {result}")
This engine delivers instant, offline emergency cardiology triaging conforming to AHA/ACC 12-lead ECG interpretative criteria.