medbench.kr

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 runcurl -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-50K 1.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