43 chest X-ray classifiers, all trained on CheXpert under one fixed pipeline so their scores are directly comparable. Released alongside a technical report that compares the design choices behind them.
Most models predict five findings: Atelectasis, Cardiomegaly, Consolidation, Edema, Pleural Effusion.
The ensemble members
Blended together these three score 0.9174 mean AUROC on test500, the best result in the study.
1import cv2, torch
2from modeling import load_model, preprocess
34model, cfg = load_model("rad_dino_vitB_768")# any folder name below56img = cv2.imread("frontal.jpg", cv2.IMREAD_GRAYSCALE)7x = preprocess(img, cfg)89with torch.no_grad():10 probs = model(x).sigmoid()[0]1112for task, p inzip(cfg["tasks"], probs.tolist()):13print(f"{task:18}{p:.3f}")
load_model picks the right builder for each backbone, so the same two lines work for every model here. preprocess reproduces the training pipeline: resize to fit the target box keeping the aspect ratio, zero pad the short side, normalize. Never mirror a chest X-ray at inference, it moves the heart to the wrong side.
What is in each folder
File
Description
model.safetensors
Weights only, fp32. No optimizer state.
config.json
Backbone, input size, normalization, label policy, head layout, scores.
thresholds.json
Per finding decision thresholds, tuned for F1 on the large validation split then frozen. Only needed for hard yes/no predictions.
A note on outputs
Most models emit one logit per finding, so sigmoid gives five probabilities. A few trained with the three way uncertainty head emit 9 logits, and the single pathology models emit 1. config.json always states which, under head:
json
1"head":{2"n_logits":5,3"layout":"one sigmoid logit per task",4"task_slices":{"Atelectasis":[0,1],"Cardiomegaly":[1,2],"...":[]}5}
How the ensemble was combined
The report's headline, 0.9174 mean AUROC on the official test set, is a plain 1/3 probability average of the three models above. Fitting per finding weights on the validation split did not improve on it.
That is +0.0061 over the best single model, medmae_vitb_nih_B_768_s2_seed1337 at 0.9113, with a 95% bootstrap interval of [+0.0005, +0.0118] over 10,000 resamples. The lesson from the report: diversity beats count. Seven runs of the same backbone averaged to 0.9095, below the best single model, while three genuinely different backbones reached 0.9174.
All models
valid200 and test500 are the official radiologist labelled splits, 202 and 518 frontal images. Neither was trained on.
These are research artifacts, released to support a technical report.
Not a medical device. Do not use them to make clinical decisions.
No external validation. Every number here comes from CheXpert's own splits. Performance on images from other hospitals, scanners or populations is unknown.
The test sets are small. 202 and 518 images, so per model rankings are unstable and confidence intervals are wide.
Labels come from an automatic labeler applied to radiology reports, so the models learn that labeler's conventions along with the findings.
License and data
CC BY-NC 4.0: free to use, share and build on with attribution, non-commercial only. This matches CheXpert's Stanford University Dataset Research Use Agreement, which permits research use and forbids commercial use.
The CheXpert data is not redistributed here, in this repo or on GitHub. Request it from Stanford AIMI directly.
Citation
bibtex
1@techreport{yosef2026chexpert,
2 title = {A Systematic Study of Design Choices for Multi-Label Chest X-ray Classification on CheXpert},
3 author = {Yosef, Ma'moun},
4 year = {2026},
5 institution = {University of Jordan},
6 doi = {10.13140/RG.2.2.19222.92487}
7}