Out-of-fold predictions on 129 AML patients, patient-grouped nested cross-validation, folds sealed and hashed before any training ran. Encoder: DinoBloom-B, a haematology foundation model, with attention multiple-instance learning and one head per gene. Every figure is the mean over 10 training seeds, and the interval combines two independent sources of uncertainty: resampling patients, and retraining.
| Lesion | AUROC mean of 10 seeds | 95% CI patients + retraining | seed SD | positives |
|---|---|---|---|---|
| PML::RARA | 0.977 | 0.948 – 1.000 | 0.003 | 24 / 129 |
| CBFB::MYH11 | 0.922 | 0.859 – 0.985 | 0.015 | 37 / 129 |
| RUNX1::RUNX1T1 | 0.882 | 0.809 – 0.954 | 0.020 | 32 / 129 |
| NPM1 | 0.819 | 0.726 – 0.912 | 0.020 | 36 / 129 |
Why 129 and not 189. The source cohort is 129 AML patients plus 60 healthy stem-cell donors. Separating a healthy donor from a leukaemic patient is trivial and has nothing to do with detecting a lesion, so including the donors inflates every figure while looking like lesion detection. Every number above excludes them, and each is therefore a lesion-versus-other-AML discrimination, which is the question a trial screens on. With the donors included these read 0.985, 0.955, 0.933 and 0.907 respectively; we publish the lower, harder numbers because they are the ones that answer the real question.
Why these are means, and why they moved. A single training run is one draw. Our first run reported 0.851 for NPM1; across ten seeds the mean is 0.819, and that first value turned out to be the highest of the ten. The seed was the pipeline default, fixed long before any result was seen, so nothing was selected after the fact, but the published number was still a favourable draw. Reporting the mean and the full spread removes the question. Seeds are fixed in the script before it runs and none are dropped.
Where the uncertainty comes from. Resampling patients dominates retraining in every gene (for NPM1, SD 0.043 against 0.020): with 24 to 37 positives, who is in the cohort matters more than how the model is initialised. The intervals above add both.
Status: demonstrated in preliminary testing. Out-of-fold but not externally validated, and on one dataset. No claim of clinical performance.
DinoBloom was pretrained on this exact cohort. Not "may have been": the DinoBloom paper (Koch et al., MICCAI 2024) states "we train the DinoBloom models on all datasets except the Acevedo dataset, which is kept as external test set", and lists the AML Hehr set at 81,214 single-cell images from 189 patients, which is byte-for-byte the cohort used above. The encoder has seen every image we embedded. It never saw the labels, and the classifier heads above are still out-of-fold on patient-grouped folds sealed before training, so this is not label leakage. But it does mean a DinoBloom number here is not an estimate of how the model would behave on a cohort it has never seen.
So every run is repeated with a generic ImageNet-pretrained DINOv2 on the same sealed folds and the same patients, and both are published together. The control has not seen these images.
| Lesion | DinoBloom-B | ImageNet control | Gap |
|---|---|---|---|
| PML::RARA | 0.977 | 0.803 (0.674–0.931) | +0.174 |
| CBFB::MYH11 | 0.922 | 0.731 (0.604–0.857) | +0.191 |
| RUNX1::RUNX1T1 | 0.882 | 0.681 (0.578–0.785) | +0.201 |
| NPM1 | 0.819 | 0.581 (0.459–0.703) | +0.238 |
The control cannot see NPM1. Its interval, 0.459 to 0.703, spans 0.5: on AML patients a generic encoder is not distinguishable from a coin flip for this gene. The control also loses far more than DinoBloom when the healthy donors are removed, on every gene, which is evidence it was leaning on the healthy-versus-leukaemic signal rather than reading the cell. Both columns are means over the same 10 seeds; an earlier single run put this gap at +0.304 for NPM1, which was the two runs diverging in opposite directions from their means.
Read the gap as a ceiling, not a measurement. Because the encoder was pretrained on these images, the DinoBloom column is the optimistic end of the range and the gap over the control is an upper bound on what haematology pretraining buys on unseen data. The honest reading of this table: on a cohort the encoder has seen, it separates these lesions well; on a cohort it has not, this table cannot say. That is what an external cohort is for, and as of 29 August 2026 there is one, for a single lesion. It is the next card.
Every figure above this card comes from a cohort DinoBloom was pretrained on, so none of them describes behaviour on unseen data. This one does. The model was frozen, then run without modification on BoneMarrowWSI-PediatricLeukemia (public, CC BY 4.0, published 2025 and not among DinoBloom’s pretraining corpora): 93 AML patients, 10 PML::RARA against 83 other AML, labelled from the molecular diagnosis recorded in the images themselves. Nothing about this cohort touched training, calibration or threshold selection.
The specificity check, which is the load-bearing part. One forward pass produces a head per gene. If the model were merely registering that a slide looks unfamiliar, every head would rise together on these cases. Scored against the same PML::RARA label, only the PML::RARA head separates.
| Head | AUROC against the PML::RARA label |
|---|---|
| PML::RARA | 0.724 |
| RUNX1::RUNX1T1 | 0.411 |
| CBFB::MYH11 | 0.366 |
| NPM1 | 0.349 |
| healthy | 0.476 |
Every other head sits at or below chance. What the model responds to on these slides is specific to the lesion, not a generic reaction to a new scanner, a new stain batch or paediatric marrow.
The drop is large and we are not going to smooth it. Internal out-of-fold for this lesion is 0.977; external is 0.724. Four things changed at once: bone marrow rather than peripheral blood, paediatric rather than adult, cells found by our own classical detector at F1 0.465 rather than curated by an expert, and a different site’s scanner and stain. Any one would move the number. This run cannot isolate how much of the drop is encoder contamination, because contamination is only one of those four differences.
What it does and does not establish. The confidence interval excludes 0.5 under both a stratified bootstrap and Hanley-McNeil, and a 20,000-shuffle permutation test rejects the null at p = 0.009, so the signal is real on data the encoder has never seen. With 10 positives the interval is wide, and this is a pilot rather than a performance estimate. Ranking 4 of the 10 positives into the top 10 of 93 is a screening aid, not a call. NPM1, CBFB::MYH11 and RUNX1::RUNX1T1 remain externally untested: this cohort carries a molecular label for PML::RARA only.
A learned detector, trained on 70 patients and scored on a sealed test set of 21 patients and 3,249 expert consensus-labelled cell bounding boxes it never saw, on pediatric bone marrow aspirate smears scanned at 40x. Public data, DICOM whole-slide images, read at 0.11 microns per pixel. Average precision, threshold-free, is 0.991. The operating threshold was chosen on a separate validation split and never on the test set.
Against the classical baseline it replaces. On the same held-out tiles under the same IoU rule, the stain-threshold detector reaches precision 0.329 and recall 0.507. At the lowest threshold we swept, the learned detector returns 0.491 more recall while still holding precision 0.818, two and a half times the baseline’s. It is not an equal-precision comparison: no swept threshold brings the learned detector down to 0.329. Measured across all 114 patients that baseline is F1 0.465 under the centre-in-box rule and 0.303 under IoU, superseding the 10-slide figure of 0.672 shown here previously.
How it is scored. Both detectors are scored on the monolayer regions a cell count is read from, so the number measures detection rather than coverage. Labelled cells that do not belong in a blast count, 32% of all boxes, are ignore regions for both detectors rather than errors, and the classical detector runs at the 0.44 microns per pixel it was tuned at.
On the 0.958 figure. Learned detectors published elsewhere report average precision around 0.958 on this collection. That is indicative, not a matched comparison: it comes from a different paper, on a different split, possibly a different subset, under an evaluation protocol we have not reproduced. We cite it to say the headroom is real, not to claim our number sits on the same axis.
Production ledger, signed and hash-chained, anchored to a public append-only transparency log. Anyone can verify an entry without our cooperation.
Verify at public log index 2051205018 →Status: working in production. Public anchoring powered by Project AIR.
None of these have numbers, and until they do, no claim on this site depends on them.