ECG Over-Read: Pre-trained Models for ECG Diagnosis

Pre-trained model weights for the paper "Beyond Machine Interpretation: Learning from Expert Over-Reads Improves ECG Diagnosis" (Under Review of MIDL 2026).

Models

This repository contains 4 pre-trained models:

Model File Description
Supervised supervised/best.pt Baseline ResNet-50 multi-label classifier
CLIP clip/best_cliponly.ckpt ECG-Text contrastive learning model
NegCLIP negclip/best_detail.ckpt CLIP with hard negative mining
Self-Training selftraining/best.pt Semi-supervised learning with FixMatch

Model Architecture

ECG Encoder (All Models)

  • Architecture: 1D ResNet-50 with bottleneck blocks (3-4-6-3)
  • Input: 12-lead ECG signal (batch, 12, 2500) at 250 Hz
  • Output: 512-dimensional embedding
  • Preprocessing: High-pass filter (0.5 Hz), Notch filter (60 Hz), Per-lead z-score

Text Encoder (CLIP/NegCLIP)

  • Architecture: CLIP text encoder
  • Output: 512-dimensional embedding (projected)

Usage

Download Weights

from huggingface_hub import hf_hub_download

# Download supervised model
model_path = hf_hub_download(
    repo_id="tyoung089/ECG_overread",
    filename="supervised/best.pt"
)

# Load model
import torch
checkpoint = torch.load(model_path, map_location="cpu")

Using with Our Code

# Clone the code repository
git clone https://github.com/YOUR_USERNAME/ecg-overread.git
cd ecg-overread

# Download all weights
pip install huggingface_hub
python download_weights.py --outdir ./weights

# Run evaluation
python Supervised/ecg_eval_cls.py \
    --csv /path/to/test.csv \
    --ckpt ./weights/supervised/best.pt \
    --label-prefix "label_diag__"

Input Data Format

ECG Signal

  • Sampling rate: 250 Hz
  • Duration: 10 seconds
  • Leads: 12-lead standard ECG
  • Shape: (2500, 12) or (12, 2500)
  • Format: NumPy .npy files

Checkpoint Format

Supervised / Self-Training (best.pt):

{
    "model": state_dict,           # Model weights
    "opt": optimizer_state,        # Optimizer state
    "sched": scheduler_state,      # Scheduler state
    "epoch": int,                  # Training epoch
    "best": float,                 # Best validation metric
    "classes": list,               # Class names
}

CLIP / NegCLIP (.ckpt):

{
    "model": state_dict,           # Full model (ECG + Text encoder)
    "epoch": int,
    "args": training_args,
}

Training Details

Model Training Data Method
Supervised Labeled ECGs Multi-label BCE loss
CLIP ECG + Text pairs Symmetric contrastive loss
NegCLIP ECG + Text pairs Contrastive loss with hard negatives
Self-Training Labeled + Unlabeled FixMatch with pseudo-labels

License

MIT License

Citation

@inproceedings{overread2026midl,
  title={Beyond Machine Interpretation: Learning from Expert Over-Reads Improves ECG Diagnosis},
  author={Kwak et al.},
  booktitle={Under Review for Medical Imaging with Deep Learning (MIDL)},
  year={2026}
}

Links

  • Code Repository: GitHub
  • Paper: Coming soon
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support