Engineering

Engineering

The acquisition platform, processing pipeline and proposed alert interface.

Signal acquisition hardware

An Arduino UNO R3 acquisition stack with selectable EEG, ECG and EMG modes, live waveform preview and CSV/JSON/PNG export. Firmware checksums are pinned; a hardware verification report (2026-10-03) covers transport, recording and export. Public on GitHub ↗.

Concept render: a bench kit of boards, leads and sensor patches laid out for the prototype stage.
Prototype bench. Concept render (AI-generated) The research prototype stage. Not the final device.
Concept render: a close view of a silver electrode disc set into a patch.
Electrode contact. Concept render (AI-generated) Where the signal starts. Shown for scale; the real contact design is still being tested.
Photograph of an Arduino Uno R3 board, showing its microcontroller, headers and USB connector.
Arduino Uno R3 · Photograph by MakeMagazinDE, CC BY-SA 4.0. Component reference, not a photograph of the assembled ICTRA prototype. Source & license

SeizeIT2: the actual recording setup

Two Sensor Dots. One recorder connects to the behind-ear EEG electrodes. The other records chest ECG and deltoid EMG. These are the research devices used for the dataset, separate from the ICTRA Arduino prototype.

EEG
Recorder 1 · upper back / neck
Wired electrodes behind both ears provide two EEG channels. The montage depends on the suspected seizure onset.
ECG + EMG
Recorder 2 · left chest
Chest ECG and left-deltoid EMG electrodes connect to the same recorder. There is no separate arm recorder.
ACC + GYR
Movement sensing inside the recorders
Both Sensor Dots contain an accelerometer and gyroscope; motion sensing does not require another wearable.
Original SeizeIT2 Figure 1: panel A shows behind-ear electrodes wired to a neck recorder; panel B shows chest ECG and deltoid EMG wired to a second recorder
The published configuration. Swinnen et al., 2026, Figure 1 (A and B). Original figure, unchanged. Paper and figure ↗ · CC BY-NC-ND 4.0

Acquisition and processing are different. The study acquired EEG, ECG and EMG at 250 Hz, and movement at 25 Hz. ICTRA resamples signals to 256 Hz for processing. Sources and image provenance

How the EEG montage varies

For focal onset, the published setup uses two electrodes behind the suspected side and one behind the opposite ear. Generalized-onset configurations use two behind each ear. The manufacturer photograph and the paper show different examples; they are not interchangeable placement instructions.

ModeSamplingBand-passWhy these numbers
EEG256 Hz0.5–29.5 HzMatches the 256 Hz the model is trained at; the model then applies its own 1–25 Hz band
ECG125 Hz → 256 Hz0.5–44.5 HzEnough for R-peak timing; resampled to 256 Hz in software today, sampled at 256 Hz in the next firmware
EMG500 Hz → 256 Hz60–100 Hz → 20–100 Hz + 60 Hz notchThe 60 Hz lower edge sits on North-American mains, so the next firmware widens the band and notches the hum, matching the training pipeline

What is in the box

Read details

Arduino UNO R3 boards (one per modality in the current prototype), EEG/ECG/EMG analog front-end modules, gel snap and dry electrodes, USB cables. All modes use the UNO's A0 input at 115,200 baud. Measurements are ADC counts; microvolt calibration is a listed next step, which is why the models train on per-recording normalised signals.

Bill of materials: cost TBD · target: buildable from the repository in one afternoon.

Safety by design

Read details

Body acquisition only with the laptop on battery and no mains peripherals (the README rule). Firmware uploads verify source and HEX checksums in profiles.json. Lead-off detection marks data as missing rather than normal, so a fallen electrode degrades sensitivity visibly, never silently.

Next revision

Read details

All channels at 256 Hz with the training pipeline's filters, an accelerometer (SeizeIT2 has one and it is the cheapest strong signal for convulsions), then a single ESP32-class board with a three-channel front end, Bluetooth to a phone and on-device inference for the tree models. Honest status: the current board still saturates on part of its range, so model results come from SeizeIT2 and the board demonstrates feasibility.

Components up close

An Arduino Uno and an empty solderless breadboard mounted together on a base

Bench prototyping hardware

An Arduino board beside a solderless breadboard. A general prototyping reference, not an assembled or body-connected biosignal circuit.

TreyDanger · CC BY 2.0 Source & license
Close-up of a blue and white ECG electrode with a metal snap connector

The electrode interface

A close-up of an ECG electrode and its snap connector. Component reference, not the project's specific electrode model.

Jud McCranie · CC BY-SA 4.0 Source & license
Supplied conceptual hardware overview
Supplied conceptual illustration of an acquisition board and electrodes
User-supplied visual reference. This illustration is not documentary evidence of the project hardware.

From acquisition to alert

Three signal sets, one classifier. EEG alone (A), EEG with ECG (B), and all four signals (C) each feed the same gradient-boosted model. Only its probability, after temporal filtering, can trigger an alert.

EEG electrodesbehind the ear · 2 channels · 256 Hz · 1–25 Hz ECG leadchest · 256 Hz · 0.5–40 Hz → R-peaks EMG pair + motiondeltoid or biceps · 256 Hz · 20–100 Hz · accelerometer 25 Hz Arduino UNO R3 + BioSignal Studio (open-source firmware and acquisition GUI) · same signal-processing code as trainingserial 115,200 baud · live waveform preview · CSV / JSON recordings · checksum-verified firmware · resampled to 256 Hz before any feature is computed EEG · features → boosted treesband powers, line length, entropy · 4 s windows, 2 s hop ECG · heart rate → boosted treesHR, HRV, rise vs the last 5 min · same 4 s windows EMG + motion → boosted treesenvelope, bursts, movement energy · same windows Feature sets: A → B → CA = EEG · B = + ECG · C = + EMG + motion · features from each signal concatenated into one classifier (early fusion) seizure probability Temporal decision · k of n3 of the last 5 windows above threshold τ (τ chosen on validation patients only), else no alert Caregiver phone alert · time + 60 s snapshot Clinician dashboard · review, confirm, export
Three models that differ by exactly one signal each (A: EEG · B: EEG + ECG · C: EEG + ECG + EMG + motion), so the value of every sensor is measured, not asserted. Four single-signal rules (heart-rate jump, EMG threshold, EEG line length, movement) are reported next to them in every table. A flat or missing signal is flagged, never filled in as "normal".
SenseBehind-the-ear or forehead EEG electrodes, a chest or arm ECG lead and a biceps EMG pair feed low-cost analog front-end modules wired to an Arduino UNO R3.
AcquireBioSignal Studio firmware streams each channel over serial at 115,200 baud. The current firmware samples EEG at 256 Hz, ECG at 125 Hz and EMG at 500 Hz; the training pipeline resamples everything to 256 Hz, and the next firmware revision will sample at 256 Hz directly so the device and the benchmark share one code path.
WindowEvery stream is cut into 4-second windows with a 2-second hop on one shared clock. Heart rate is also compared with its own rolling 5-minute baseline, so the model sees a jump, not an absolute number.
RecogniseGradient-boosted trees read EEG band powers and line length for ictal rhythms, heart-rate and variability features for ictal tachycardia, and EMG envelope and movement features for tonic and clonic activation. Trees train in minutes, run on a laptop, and their feature importances can be read by a clinician.
FuseModel C sees all signals at once (early fusion). A late-fusion variant trains one model per signal and averages their probabilities, re-weighting when a signal is flat or missing; the development folds decide which one is frozen.
DecideA k-of-n rule (3 of the last 5 windows above τ) suppresses isolated spikes before anything fires, trading a few seconds of latency for far fewer false alarms. τ is tuned on validation patients only and frozen before the test set is opened.
Alert and reviewThe caregiver's phone gets a push alert with the time and a 60-second signal snapshot; the clinician dashboard logs every event for confirm/reject and export.

Processing the complete recording

A seizure is under one percent of the recording time, so the only way to measure false alarms honestly is to process every hour. That made the data engineering the first real engineering problem of the project, before any model was trained.

Aligned recordings are divided into 4-second windows with a 2-second hop, transformed into signal features and used by a gradient-boosted tree model.
Schematic drawn from the pipeline code. Aligned signals → overlapping windows → physical features → tree ensemble → window probability. Waveforms, feature cells and trees are schematic, not patient data or a fitted model. View full-size diagram ↗ · Image provenance
126 GBSeizeIT2 in full: 11,009 signal files, each verified against its SHA-256 before it is used
95 GBdevelopment set downloaded for training: every seizure hour first, then every seizure-free hour
2,850recording runs, up to 18 hours each, catalogued before a single byte of signal was downloaded
~3,800×real time: feature extraction streams each run in one-hour chunks so a 3 GB laptop copes
5 slive counters on the ICTRA Lab page that watches downloads, features and training jobs
Download

Resumable, verified, parallel

Read details

A catalog of every file with its size and checksum is built from the dataset's metadata first. The downloader then streams files to disk, resumes interrupted transfers, verifies each one, and lets several processes share the work through per-file locks that record their owner, so a crashed process never corrupts a file. Locked-test patients are refused until the pre-registration hash exists.

Features

One code path, every signal

Read details

Every stream is resampled to 256 Hz, filtered, cut into 4-second windows and turned into physical features by a single library that the live device will also run. Flat or saturated stretches (one ECG file sat at a constant value for eight hours) are flagged and blanked rather than learned as "normal". A change to that library forces every feature to be rebuilt, by rule.

Monitor

Scripts write numbers, the page only draws

Read details

The ICTRA Lab page shows download bars, files in flight with their speed, feature counters, the training-job grid, disk space and the log, and it refreshes itself. It never computes a metric: every script writes JSON and the page reads it, so the numbers on screen are the numbers in the report. A stall watch restarts any download that goes quiet for five minutes.

Inside the training run

The working pipeline, captured directly from ICTRA Lab. Follow the data preparation, the patient split and the experiment queue—not a mock dashboard or a concept render.

Static screenshots · captured 18 October 2026, 06:47–06:49 UTC. Dashboard clocks and log timestamps are preserved as displayed. Capture record

Downloads complete. Features ready.

Real ICTRA Lab screenshot: both development download stages complete and features available for all 2,072 development runs; locked-test download remains locked

Stage 1 contains 1,163 files / 24.846 GB; stage 2 adds 6,894 files / 69.982 GB of seizure-free recordings. Feature extraction has reached 2,072 / 2,072 development runs, including 305 seizure-containing and 1,767 seizure-free runs.

The bars show data availability, not detection accuracy. The red “no download is running” message is an idle-downloader warning; both download totals are already complete. The locked-test row remains locked.

Separate people, not random windows.

Real Data tab showing 96 development and 29 locked-test patients, modality coverage, EEG montages and three planned evaluation tiers

96 patients form the development set; 29 patients are reserved for the locked internal test. Development uses five patient-wise folds. Of 2,072 development runs, 2,048 have ECG + EMG files and 1,889 have a movement file.

File coverage is not proof that every sample is usable. The evaluation tiers describe the protocol, not three completed tests. Catalog hours are inventory totals, not the exposure denominator of every experiment; v01 uses only 2,288 hours of seizure-containing recordings.

A job grid, not a success score.

Real training dashboard excerpt: v02_full_hours has 68 completed, 2 running and 100 queued jobs; v03_threshold_stability has 110 completed jobs, with the process log below

At capture, v02_full_hours shows 68 done, 2 running and 100 queued. Each cell represents an input set, model family, patient fold and seed. v02 extends the baseline to seizure-free hours; v03 tests a different threshold-selection procedure and shows 110 completed jobs.

Filled cells mean jobs finished—not that a version passed the acceptance rule. These are development folds; the separate locked test remains unopened in this capture. The log preserves the script's recorded sequence. See version decisions and their limits →

From processing to interpretation: read the real signal and ablation screens →

Historical record · first download and first training run, 17 October
ICTRA Lab page, Now tab: progress bars for the seizure-run download at 1,011 of 1,163 files and the seizure-free download at 1,014 of 6,894 files, two files in flight with speeds, and 99 GB of disk free.
Historical download snapshot, 17 October: stage 1 at 24.5 of 24.8 GB, with seizure-free downloads still in progress. Both stages are complete in the newer capture above. The locked test stays greyed out.
ICTRA Lab page: feature extraction counter at 498 of 2,072 development runs, an empty training-job grid waiting for the first run, and a scrolling log of feature passes.
Feature extraction keeps pace with the download; the training grid fills in one cell per model, fold and seed once stage 1 completes. The log is the same file the scripts write.
ICTRA Lab page, Data tab: modality coverage table for development and locked-test runs, and the three evaluation tiers: development, locked internal test, external tests.
The Data tab: how many runs carry each signal (2,048 of 2,072 development runs have ECG and EMG; 1,889 have movement) and the three evaluation tiers, drawn from the same JSON the protocol document reads.
ICTRA Lab page, Now tab, 17 October 15:16: stage 1 download complete at 1,163 of 1,163 files; stage 2 at 1,502 of 6,894 files; feature extraction at 674 of 2,072 development runs; training grid for v01_baseline with all 15 Model A XGBoost cells finished, 3 LightGBM cells running and 92 jobs queued.
The first training run, v01_baseline, 17 October 15:16. Model A (EEG) with XGBoost on the GPU finished all 15 cells (5 patient folds × 3 seeds) in 14 minutes; LightGBM is running; 92 jobs for Models B and C and the four single-signal rules are queued. Every cell is a held-out patient fold. In the source dashboard, hovering a finished cell displayed its event F1, sensitivity and false alarms per 24 h. Hover details are not available in this static capture.

Historical screenshots taken on 17 October 2026 during the first download and the first training run. They are retained as a process record, not the current run state.

Patient, caregiver and clinician interfaces

The patient wants to forget the device exists. The caregiver wants to be woken only when it matters. The clinician wants evidence, not a diary. ICTRA gives each a different surface.

Concept render: a bedside hub with a status light, designed for the caregiver.
Bedside hub. Concept render (AI-generated) The caregiver-facing unit. It shows a single rising probability, not raw signals.
Concept render: a patch, a hub and a phone laid out together on a table.
Three surfaces. Concept render (AI-generated) The patch, the hub and the phone, the three places a person, caregiver and clinician each see the system.
Patient

Nothing to manage

Discreet behind-the-ear and under-sleeve electrodes, no on-body display, one button to start and stop, electrodes changed daily. The patient sees every alert sent about them and controls the device; there is no location tracking.

Caregiver

Woken reliably, told how serious

Two-stage tone: a soft chime for "possible", a continuous alarm for "confirmed". Elapsed time counts up. One tap, "I'm with them", silences the alarm and logs the response time. Night mode uses a 1–3 kHz band and a paired-watch vibration.

Clinician

Evidence behind every entry

A timeline of alerts with the three raw traces around each event, confirm/reject buttons, and CSV/PDF export for the appointment. Rejections feed the next training round.

Illustrative interface concept

23:47ICTRA · connected
Possible seizurestarted 00:12 ago · EEG + ECG + EMG agree
00:12
I'm with them
Mark as false alarm

One colour per signal, everywhere

EEG, ECG and EMG keep the same colour on the live waveform screen, in the alert snapshot and on the dashboard, so nobody re-learns the mapping. Colour is never the only cue: each state also has an icon and a word.

One number for the caregiver

The fused probability is the only quantity a caregiver sees, as a single rising bar. Per-signal detail lives one tap deeper, for the clinician.

Words that match what the system knows

"Possible seizure started 00:12 ago", never "Seizure detected". Setup is a four-screen wizard with electrode-placement photos, because placement is the step most likely to go wrong.

Wearable form-factor references

Published photographs of other research and monitoring devices. These examples do not establish the safety or performance of ICTRA.

Two photographs showing an in-ear EEG earpiece being worn and its dry-contact electrodes

Smaller EEG form factors

An in-ear EEG research earpiece and its dry-contact electrodes. This is a different design from ICTRA's proposed behind-ear electrodes.

Simon L. Kappel · CC BY-SA 4.0 Source & license
A person wearing a small Holter ECG recorder with three connected adhesive electrodes

Wearable ECG recording

A compact Holter recorder with three electrodes. External ECG-monitoring example, not an ICTRA device or seizure detector.

Faisandier · CC BY-SA 3.0 Source & license