An iterative program on Chikitsa — a CPU‑first, multi‑reader CXR interpretation pipeline. This is the honest record: every hypothesis we tested, what the data accepted or rejected, and where we deliberately stopped.
We set out to raise cross‑hospital accuracy of a deployed CXR reader ensemble. The work repeatedly overturned the obvious levers and converged on an unglamorous truth: label quality and encoder generalisation — not model size or more data — are what govern real‑world performance.
Chikitsa runs a panel of independent “readers” whose outputs are combined by tiered consensus with per‑finding provenance. It fails open (a crashed reader never silently reads as “normal”), normalises scanner variation on input, and flags when a new scanner needs calibration. A single frozen foundation embedding is computed once per scan and reused by the specialist readers below.
Each step is a hypothesis, the test, the result, and an explicit verdict. Rejections are the point — they’re where the money and time were saved.
→ Not a population gap. The fault line is CheXpert’s report‑mined labels, which reframed the entire program toward label quality.
Tested MLP & gradient‑boosting heads, RAD‑DINO×EVA‑X feature fusion, and U‑Ones/U‑Zeros uncertain‑label policies. Net gain: +0.035 AUC — not worth shipping. The bottleneck was elsewhere. This is where we pivoted to the label investigation.
Mean external AUC 0.70. The structural findings transfer (effusion, pneumothorax, cardiomegaly ≈ 0.75–0.77); the label‑ambiguous ones don’t (consolidation, pneumonia ≈ 0.59–0.64) — exactly the split the label thesis predicts.
On home‑turf CheXpert/NIH, Ark+ led by +0.037. But CheXpert & NIH are in Ark+’s pretraining set. On truly‑external PadChest it lost by −0.014. Supervised pretraining overfit its training distributions. Rejected — and a reminder that in‑domain wins can be a mirage.
Yes. A finding’s best within‑site AUC across datasets is its “learnable‑when‑clean” ceiling; a dataset far below it is contributing label noise, not difficulty. Pneumonia is perfectly learnable (0.998 on curated Guangzhou/darthPanda) — so CheXpert’s 0.645 and NIH’s 0.636 are proven noise. Corroborated with cleanlab.
One radiologist cohort (VinDr) suggested consolidation is easy‑when‑clean (0.934); a second (PadChest) disagreed (0.748). A third (ChestX‑Det, NIH re‑annotated by 3 radiologists) broke the tie at 0.849 — the honest clean ceiling. Lesson recorded: one clean anchor can mislead; use ≥ 2.
Built consolidation, atelectasis, effusion and a normal/abnormal triage gate as clean‑anchored probes, trained on three radiologist cohorts + report‑mined coverage, validated leave‑one‑cohort‑out. Effusion is robust (~0.88 across cohorts). Atelectasis settled as intrinsically ~0.77–0.82 — three radiologist cohorts agree it caps there, so the reader isn’t underperforming; the finding is just hard. Knowing where to stop is a result.
Audit found most public CXR data and the deployed RAD‑DINO encoder are research‑only. Two MIT‑licensed medical encoders exist: EVA‑X (lightweight) and MedImageInsight (Microsoft). The knowledge (reliability matrix, ceilings, architecture) is unlicensed and carries over regardless.
Across 5 datasets / 3 countries / 2 labelling regimes: MedImageInsight 0.797 > EVA‑X 0.756 > RAD‑DINO 0.700. The research‑licensed RAD‑DINO is the worst cross‑dataset generaliser — so going commercial is an accuracy upgrade, not a trade‑off. (Full chart below.)
Retrained all embedding readers (H/I/J/K/N) on MedImageInsight, refit the OOD reference in its embedding space, benchmarked the CPU cost (1.8× RAD‑DINO, ~5.9 s/scan — acceptable for non‑real‑time reads), built a one‑env‑var encoder switch (instant rollback), smoke‑tested end‑to‑end, and deployed. Healthy, no degraded readers.
→ The commercial‑data provenance issue — the one red flag left in “where it stands” — went from must‑fix to largely solved, for the cost of CPU time on already‑cached features.
Train on four datasets, test on the held‑out fifth. This is the deployment‑relevant number. Higher = generalises better to an unseen hospital.
| Finding (held-out mean) | RAD-DINO · research | EVA-X · MIT | MedImageInsight · MIT |
|---|---|---|---|
| Pleural Effusion | |||
| Consolidation | |||
| Atelectasis | |||
| Cardiomegaly | |||
| Pneumothorax | |||
| MEAN — generalisation | 0.700 | 0.756 | 0.797 |
Fast estimate (4k random samples/dataset, single split). Absolute values are conservative; the ranking is stable across all five findings and both metrics. Datasets: CheXpert & NIH (US, report‑mined), VinDr (Vietnam), PadChest (Spain), ChestX‑Det (US, radiologist).
Within‑site AUC (RAD‑DINO probe). A radiologist ceiling far above the report‑mined value = the labels are noise.
| Finding | Radiologist* | CheXpert | NIH |
|---|---|---|---|
| Pneumonia | 0.998 | 0.645 | 0.636 |
| Consolidation | 0.934 | 0.707 | 0.737 |
| Atelectasis | 0.899 | 0.692 | 0.801 |
| Pleural Effusion | 0.921 | 0.862 | 0.848 |
| Cardiomegaly | 0.961 | 0.828 | 0.892 |
| Pneumothorax | 0.878 | 0.858 | 0.843 |
*Best of VinDr / PadChest / ChestX‑Det. Pneumonia clean ceiling from curated Guangzhou/darthPanda.
Leave‑one‑anchor‑out AUC of the deployed specialist probes. MedImageInsight wins every reader.
| Reader | RAD-DINO | EVA-X | MedImgIns |
|---|---|---|---|
| I · Consolidation | 0.852 | 0.795 | 0.821 |
| J · Atelectasis | 0.768 | 0.673 | 0.817 |
| K · Pleural Effusion | 0.880 | 0.871 | 0.904 |
| N · Triage (abnormal) | 0.756 | 0.782 | 0.853 |
| H · TB screen | 0.996 | 0.997 | 0.999 |
TB is same‑source (darthPanda) — optimistic; cross‑site TB is a known future validation.
| Encoder | ms / scan | dim |
|---|---|---|
| RAD-DINO (86M ViT) | 3,353 | 768 |
| MedImageInsight (360M DaViT) | 5,889 | 1024 |
1.8× — tolerable for non‑real‑time interpretation.
The gap to a good commercial CXR product is not model accuracy — on the findings we cover, our cross‑site generalisation already sits in the published vendor band. The gap is productisation and evidence: named operating points, breadth of findings, localisation, integration, and regulatory clearance. Most of that is engineering and data work our architecture absorbs directly; the rest is exactly what a partner is meant to fund. This section is the live status of closing it.
Every reader now ships two named operating points — a high‑sensitivity and a high‑specificity threshold — with the sensitivity/specificity you actually get at each. Thresholds are chosen leave‑site‑out (picked on other cohorts, reported on an unseen one), the format a partner lines up against a Qure or Lunit datasheet. This is the deliverable a raw AUC cannot replace.
| Reader · finding | AUC | High‑sens sens / spec |
High‑spec sens / spec |
NPV* | Validation |
|---|---|---|---|---|---|
| K · Pleural effusion | 0.910 | 0.90 / 0.73 | 0.76 / 0.90 | 0.95 | cross‑site (3 cohorts) |
| M · Pneumothorax new | 0.897 | 0.90 / 0.62 | 0.76 / 0.90 | 0.99 | cross‑site (3 cohorts) |
| L · Cardiomegaly | 0.85 | 0.90 / 0.66 | 0.68 / 0.90 | 0.95 | clean · livecommercial‑clean (NIH+ChestX‑Det) |
| N · Triage (abnormal) | 0.895 | 0.90 / 0.70 | 0.66 / 0.90 | 0.74 | 8 training cohorts; held-out VinDr+PadChest |
| J · Atelectasis | 0.835 | 0.90 / 0.53 | 0.55 / 0.90 | 0.97 | cross‑site (3 cohorts) |
| I · Consolidation | 0.752 | 0.90 / 0.28 | 0.43 / 0.90 | 0.90 | cross‑site — label‑capped |
| H · Tuberculosis | 0.72 | 0.90 / 0.75 | 0.81 / 0.90 | 0.99 | clean · livecross‑site (Montgomery+Shenzhen) — replaced single‑source 0.995 |
| P · Aortic enlargement new | 0.969 | 0.90 / 0.91 | 0.91 / 0.90 | 0.98 | single‑source (VinDr) — optimistic ⚠ |
| R · Pulmonary fibrosis new | 0.763 | 0.90 / 0.41 | 0.39 / 0.90 | 0.92 | cross‑site (VinDr+ChestX‑Det) |
| S · Calcification new | 0.751 | 0.90 / 0.31 | 0.43 / 0.90 | 0.98 | cross‑site (VinDr+ChestX‑Det) |
| Q · Pleural thickening new | 0.738 | 0.90 / 0.41 | 0.31 / 0.90 | 0.90 | cross‑site (VinDr+ChestX‑Det) |
| O · Nodule / mass detector | 0.872 | — | — | — | RetinaNet (BSD) — real bounding boxes; in‑domain (VinDr val), cross‑cohort TBD |
| V · Diaphragmatic hernia new | 0.921 | 0.90 / 0.75 | 0.85 / 0.90 | 1.00 | cross‑site (NIH+PadChest) |
| U · Mass new | 0.722 | — | 0.57 / 0.90 | 0.99 | cross‑site (NIH+PadChest) — modest, advisory weight |
| T · Emphysema new | 0.712 | — | 0.52 / 0.90 | 0.99 | cross‑site (NIH+PadChest) — modest, advisory weight |
*NPV at the high‑specificity point, at the cohort’s observed prevalence. Leave‑site‑out rotation with 95% bootstrap CIs; full per‑site tables in vendor/reader_*/opdx.json. Effusion is the lead finding; TB’s 0.995 is single‑source (darthPanda) and is honestly flagged — a second TB cohort is required for a real number.
What separates us from an incumbent datasheet, and who closes each gap.
| Gap | Can we fill it? |
|---|---|
| Named operating points (sens/spec) | Done |
| Breadth of findings | In progress |
| High‑specificity normal rule‑out | Reframe |
| Image‑quality / view gate | Our stack |
| Localisation / heatmaps | Deployed |
| External / prospective validation | With a partner |
| DICOM / PACS / RIS integration | Engineering |
| FDA / CE clearance | Capital + partner |
The un‑fillable‑alone rows (clearance, prospective trial, PACS) are the partner ask — the science is de‑risked; those are funded, not researched.
One GPU dependency total; the rest runs CPU‑only on the frozen embedding.
For a partner, the rejections are the credibility. Each one is an experiment that changed our direction rather than a claim we asserted.
| Hypothesis | Verdict | Evidence |
|---|---|---|
| A bigger / better backbone lifts accuracy | Rejected | Medical backbones tie (0.785 ≈ 0.784); bottleneck is labels, not features |
| Better head / feature fusion / uncertain‑label policy helps | Rejected | +0.035 AUC — insignificant |
| Balanced pooling always adds ~+4 AUC | Refined | −0.012 on pneumonia; needs label‑consistent sources |
| Ark+ is a stronger encoder | Rejected | +0.037 in‑domain but −0.014 external (pretraining overlap) |
| Consolidation is intrinsically hard | Rejected | 0.93 with clean labels — it was label noise |
| Atelectasis can be pushed past ~0.82 cross‑site | Rejected | 3 radiologist cohorts agree on an intrinsic ceiling |
| “Exclude noisy labels” is the fix | Refined | “Add a clean source” — noisy data is weak, not harmful, signal |
| Full fine‑tuning on our data | Not pursued | Literature: distorts features, −7% OOD; frozen/LoRA preferred |
Genuine, evidence‑backed openings — recorded so a partner can pick them up. Most are gated on data access or compute we chose not to spend yet.
We stress-tested the deployed readers on a large, unseen US multi‑site cohort (ReXGradient‑160K — ~6,000 adult studies drawn as a random slice, 79 sites) that shares no data with training. The point was not just a number, but a protocol that separates a real generalisation failure from a measurement artifact — because they demand opposite responses. Two further never‑trained cohorts — Indiana/OpenI (a US community hospital) and JSRT (Japan) — corroborate the result: the featured panel holds at Indiana (effusion 0.95, cardiomegaly 0.93, pneumothorax 0.95, consolidation 0.96, atelectasis 0.84).
Labels here are report‑mined (noisy), so every number is a conservative floor. Most of the panel holds at or above its cross‑site figure.
| Finding | unseen cohort | cross‑site | read |
|---|---|---|---|
| Cardiomegaly | 0.889 | 0.883 | held perfectly |
| Atelectasis | 0.803 | 0.835 | held |
| Pulmonary fibrosis | 0.803 | 0.763 | held (↑) |
| Consolidation | 0.782 | 0.752 | held (↑) |
| Abnormal triage | 0.778 | 0.895 | solid |
| Pleural effusion | 0.728 | 0.910 | flagged → investigated |
| Pneumothorax | 0.547 | 0.897 | flagged → investigated |
A pre‑registered protocol: (A) stratify by view to isolate domain shift, (B) purify the labels to impression‑level, negation‑ and treatment‑aware, to isolate label noise, (C) Confident‑Learning to quantify the label‑error rate.
| Finding | report‑mined | A: view split | B: purified labels | C: label error | verdict |
|---|---|---|---|---|---|
| Pleural effusion | 0.721 | no portable penalty | 0.924 | 13.4% | label noise — resolved |
| Pneumothorax | 0.547 | no portable penalty | 0.874 (76 pos) | — | label noise — resolved |
Effusion recovers to 0.924 on clean impression‑level labels — matching its cross‑site 0.91; the “drop” was the 13.4% error in report‑mined labels. Pneumothorax’s near‑chance value was pure label noise: a later re‑audit pinned the exact mechanism — the label extractor’s negation check spanned only 40 characters, so listed negations (“no effusion, or pneumothorax”) registered as positives (351 of 427 “positives” were negated mentions). A full‑sentence negation pass across all findings, on the identical deployed probe, lifted pneumothorax to 0.874 and effusion to 0.922 — both matching their internal figures. Neither was ever a model failure.