Biosignal › SNUH LYDUS ECG 50K › lydus-ecg-image-digitize@0
Digitisation of 12-lead paper-ECG images (rendered from SNUH ECGs; PhysioNet/CinC Challenge 2024 SNR) preview
Data: doi.org/10.23421/2025.0704 · CC BY 4.0 · signal · primary metric: mean_snr_db · spec 4dfa13477111
Download CSV
JSON
Agents: look up before you run
curl -s "https://medbench.kr/v1/lookup?model=MODEL&task=lydus-ecg-image-digitize@0"
No results yet.
How this benchmark is built
- Status
- published by the medbench.kr benchmark builder
- Adopted from
- Reyna MA, et al. Digitization and classification of ECG images: the George B. Moody PhysioNet Challenge 2024. Computing in Cardiology 2024. Challenge page: https://physionetchallenges.org/2024/
physionetchallenges/evaluation-2024 @9af7dfb - Data
- SNUH LYDUS ECG 50K on KHDP (
LYDUS-SNUH-ECG-50K1.1.1) - Code
- definition in medbench-kr/benchmarks (Apache-2.0)
- Deviations
8 deviations from the adopted protocol
- Data: SNUH ECGs (LYDUS-SNUH-ECG-50K 1.1.1) instead of PTB-XL; the test images and records are lydus-ecg-image@0's.
- Split: the test records come from the test part of the shared LYDUS split (medbench-made in lydus-ecg12-dx@0), by groups of likely repeat ECGs, because the release has no patient id. Checked: `select` refuses a split file whose sha256 differs from lydus-ecg-image@0's spec; no group spans test, training and validation (0 of the build's 12,234 groups).
- Records: the 2,000 test records of lydus-ecg-image@0, a seeded sample of the shared test split (cost per image run), not a full split; no test record is excluded. Checked: a test draws the sample from a toy split (the same records for the same seed whatever the row order; the test sample does not move when a training size changes); the build has 2,000 test records in 1,417 groups.
- Leads: the release stores I, II and V1-V6, so III, aVR, aVL and aVF are derived before rendering (III = II - I, aVR = -(I + II) / 2, aVL = I - II / 2, aVF = II - I / 2) and are part of the reference; PTB-XL stores all 12. Checked: a test derives the four leads from known I and II and compares them in mV.
- Images: lydus-ecg-image@0's pinned generator setting, without handwriting, wrinkles or rotation, seeded per record and stored as JPEG; the Challenge's images used random settings and its hidden set added real scans. Checked: a test compares the settings and kit commit with those the code passes (lydus_ecg_render.RENDER); a record rendered twice on one machine gave the same bytes; in the re-verification of 2026-10-30 the trace digitiser re-run on 25 images and scored by the vendored evaluate_model.py was within 0.0005 dB of the stored per-record values.
- Scorer commit: 9af7dfb (the Challenge's final scoring), not the repository head 1a51354, whose alignment truncates an early digitisation (lydus-ecg-image@0 protocol.commit_note).
- Intervals: a bootstrap over groups of likely repeat ECGs, 1,000 resamples, a record's leads kept together (the Challenge reports no interval). Checked: tests/test_cinc2024.py (whole groups are resampled; the interval brackets the mean).
- Summary of a run without any output: the Challenge's evaluate_model averages only when at least one record has a digitisation and reports NaN otherwise; medbench reports the mean of the per-record values, 0 dB, so the input-blind prior has a number. With at least one output the two agree. Checked: tests/test_cinc2024.py (a missing record scores 0 dB on every lead; a perfect copy gives NaN, left out of the mean); the prior scores 0 dB on every record.
- Problems
- Report an evaluation problem (public issue; fixes ship as a new task version)
Data
SNUH LYDUS ECG 50K (biosignal). License: CC BY 4.0. Source: https://doi.org/10.23421/2025.0704
Seoul National University Hospital. SNUH LYDUS ECG 50K (version 1.1.1). KHDP. 2025. doi:10.23421/2025.0704
Task specification
{
"baselines": {
"medbench/lydus-ecg-image-trace": {
"by_lead": {
"I": 4.92,
"II": 1.45,
"III": 5.37,
"V1": 4.65,
"V2": 7.28,
"V3": 5.94,
"V4": 6.42,
"V5": 5.55,
"V6": 6.97,
"aVF": 4.28,
"aVL": 3.35,
"aVR": 2.96
},
"ci": [
4.72,
5.13
],
"mean_snr_db": 4.93,
"method": "src/medbench/baselines/lydus_ecg_image_digitize.py (fixed page geometry, grid-period scale, ink tracing)"
},
"medbench/prior": {
"ci": [
0.0,
0.0
],
"mean_snr_db": 0.0,
"output": "no signal (0 dB on every record and lead by the Challenge's per-record rule; see deviations for the summary)"
}
},
"dataset": "lydus-snuh-ecg-50k",
"deviations": [
"Data: SNUH ECGs (LYDUS-SNUH-ECG-50K 1.1.1) instead of PTB-XL; the test images and records are lydus-ecg-image@0's.",
"Split: the test records come from the test part of the shared LYDUS split (medbench-made in lydus-ecg12-dx@0), by groups of likely repeat ECGs, because the release has no patient id. Checked: `select` refuses a split file whose sha256 differs from lydus-ecg-image@0's spec; no group spans test, training and validation (0 of the build's 12,234 groups).",
"Records: the 2,000 test records of lydus-ecg-image@0, a seeded sample of the shared test split (cost per image run), not a full split; no test record is excluded. Checked: a test draws the sample from a toy split (the same records for the same seed whatever the row order; the test sample does not move when a training size changes); the build has 2,000 test records in 1,417 groups.",
"Leads: the release stores I, II and V1-V6, so III, aVR, aVL and aVF are derived before rendering (III = II - I, aVR = -(I + II) / 2, aVL = I - II / 2, aVF = II - I / 2) and are part of the reference; PTB-XL stores all 12. Checked: a test derives the four leads from known I and II and compares them in mV.",
"Images: lydus-ecg-image@0's pinned generator setting, without handwriting, wrinkles or rotation, seeded per record and stored as JPEG; the Challenge's images used random settings and its hidden set added real scans. Checked: a test compares the settings and kit commit with those the code passes (lydus_ecg_render.RENDER); a record rendered twice on one machine gave the same bytes; in the re-verification of 2026-10-30 the trace digitiser re-run on 25 images and scored by the vendored evaluate_model.py was within 0.0005 dB of the stored per-record values.",
"Scorer commit: 9af7dfb (the Challenge's final scoring), not the repository head 1a51354, whose alignment truncates an early digitisation (lydus-ecg-image@0 protocol.commit_note).",
"Intervals: a bootstrap over groups of likely repeat ECGs, 1,000 resamples, a record's leads kept together (the Challenge reports no interval). Checked: tests/test_cinc2024.py (whole groups are resampled; the interval brackets the mean).",
"Summary of a run without any output: the Challenge's evaluate_model averages only when at least one record has a digitisation and reports NaN otherwise; medbench reports the mean of the per-record values, 0 dB, so the input-blind prior has a number. With at least one output the two agree. Checked: tests/test_cinc2024.py (a missing record scores 0 dB on every lead; a perfect copy gives NaN, left out of the mean); the prior scores 0 dB on every record."
],
"input": {
"image": "the 2,000 test images of lydus-ecg-image@0 (JPEG, 2200 x 1700, 200 dpi)"
},
"kind": "signal",
"limitations": [
"The images are synthetic with one fixed layout, so a digitiser that knows the layout reads them far more easily than scans; the classical baseline uses exactly that (medbench/lydus-ecg-image-trace) and is a floor for anything that learns.",
"The scorer's SNR rewards amplitude and timing together; a zero-noise copy gives NaN (left out of the mean), as in the Challenge."
],
"metrics": {
"bootstrap": {
"by": "group",
"n": 1000
},
"by_lead": [
"snr_db"
],
"code": "src/medbench/tasks/cinc2024.py (record_snr, snr_ci)",
"primary": "mean_snr_db"
},
"models": "image-to-signal models (none of the reference language models writes a 5,000-sample signal); results are recorded as baselines and, later, submissions",
"prediction": "a 5,000 x 12 signal in mV (leads I, II, III, aVR, aVL, aVF, V1-V6) per image; NaN where nothing is read. A missing record scores 0 dB on every lead, the Challenge's rule for each record.",
"preview": true,
"primary_metric": "mean_snr_db",
"protocol": {
"adopted": "The digitisation task of the George B. Moody PhysioNet Challenge 2024: from the image of a printed 12-lead ECG, recover each lead's signal in mV at the record's sampling rate; scored by the Challenge's signal-to-noise ratio (dB) per lead after its alignment (shifts of up to 0.5 s and 1 mV), averaged over every record and lead. Built together with lydus-ecg-image@0 from the same rendering (see that spec for the data, renderer, records and split); a protocol transfer like it.",
"built_with": "lydus-ecg-image@0",
"commit": "9af7dfbc3a8af209638d982b344cce28c67abe4e",
"medbench_made": [
"split",
"records",
"leads",
"images",
"intervals",
"summary of a run without any output"
],
"repository": "https://github.com/physionetchallenges/evaluation-2024",
"source": "Reyna MA, et al. Digitization and classification of ECG images: the George B. Moody PhysioNet Challenge 2024. Computing in Cardiology 2024. Challenge page: https://physionetchallenges.org/2024/",
"transfer": true
},
"reference": "the samples the renderer plotted, as it writes them with mask_unplotted_samples (ECG-Image-Kit's own WFDB output, refs/<instance_id>.hea and .dat): 12 leads, 500 Hz, 10 s, mV; each lead NaN outside its 2.5-second panel, lead II over the whole 10-second rhythm strip. Values come from the release's counts at 4.88 uV per count, stored at 1 uV.",
"slug": "lydus-ecg-image-digitize",
"title": "Digitisation of 12-lead paper-ECG images (rendered from SNUH ECGs; PhysioNet/CinC Challenge 2024 SNR)",
"version": 0,
"visibility": "hidden"
}
JSON: /v1/tasks/lydus-ecg-image-digitize · /v1/leaderboard?task=lydus-ecg-image-digitize@0