Jean-Benoit Delbrouck / Research blog

Research blog · CT report generation

nnFoundation, read for report generation

DKFZ’s new 3D radiology foundation model is evaluated on 108 tasks. Two of them are CT report generation, and they are easy to miss. These notes collect everything the paper and its appendix say about that setting: where the 2.16 million pretraining volumes came from, how the encoder was trained without a single report, how it was wired into Qwen2.5-VL-3B, and what the numbers show.

Paper Constantin Ulrich Harsy, Tassilo Wald, … Fabian Isensee, Klaus H. Maier-Hein. nnFoundation: 3D Foundation Models for Radiology. arXiv:2609.26924, v1, 22 Sep 2026 By Jean-Benoit Delbrouck Published 25 Sep 2026 Reading time ~15 min
2.16M
3D volumes in pretraining (CT, MRI, PET)
0
radiology reports used in pretraining
674M
parameters in the frozen 3D ViT
1,728
visual tokens per CT fed to the LLM*
0.437
abnormality F1 on CT-RATE, highest of 9 encoders

* Our arithmetic from the stated patch size and merge factor, for a 192³ input.

TL;DR
  • The experiment is an encoder bake-off. Nine frozen image encoders are plugged, one at a time, into the same Qwen2.5-VL-3B + 3D adapter + LoRA recipe. The encoder is never updated, so score differences measure how much report-relevant information each representation already holds.
  • nnFoundationViT comes first, but only just. On CT-RATE it scores BLEU 0.317, F1 0.437 and CRG 0.444; on MERLIN, BLEU 0.172. The 2D CURIA encoder is statistically tied on BLEU and F1. Only the CRG gap (+0.018) passes the paper’s own significance test.
  • The encoder never read a report. It is a 40-layer 3D ViT trained by masked autoencoding, with 80% of its 8³-voxel patches hidden, on 2.16M volumes. Reports come in only later, to train the adapter and the LoRA weights on the training part of CT-RATE’s 25,692 scans.
  • The data advantage comes from hospital access. 61% of the corpus comes from three German clinical partners: DKFZ, Bonn and Thoraxklinik Heidelberg. CT is 26.6% of it, about 574k volumes.
  • BLEU hardly separates the encoders. F1 ranges from 0.000 to 0.437 across encoders, but BLEU only from 0.241 to 0.317. An encoder that gets no abnormality right (F1 = 0) still reaches 76% of the best BLEU.

01Why this experiment matters

Most 3D report-generation papers change several things at once: the encoder, the connector, the language model and the training data. That makes it hard to tell what helped. The report-generation experiment in nnFoundation does the opposite. Everything after the image encoder is fixed: Qwen2.5-VL-3B without its own 2D vision tower, one 3D adapter design, one two-stage training schedule and the same two datasets. Only the frozen encoder changes, along with a per-encoder sweep of learning rate and field of view.

Because the encoder weights never move, differences in BLEU, F1 and CRG show what each pretrained representation already contains. If you are choosing a vision backbone for CT report generation, that is more useful than yet another end-to-end system. The experiment covers just two of the paper’s 108 tasks, and most of its numbers sit in Supplementary Tables 9, 10 and 15.

The line-up covers every major pretraining approach:

  • Masked autoencoding: nnFoundationViT and nnFoundationCNN
  • DINOv2 self-distillation on 2D slices: CURIA
  • Contrastive learning: CT-FM and VoCo
  • Vision–language pretraining with reports: Merlin
  • Supervised segmentation: VISTA3D
  • Older self-supervised objectives: SwinUNETR (inpainting + contrastive + rotation) and MIS-FM (volume fusion)
Figure 1 — The report-generation stack. The same stack is reused for every encoder; only the frozen box changes, along with each encoder’s own preprocessing. Sources: Methods 4.6, 4.6.1 and Table 1.

02The data: 2.16 million volumes, zero reports

The pretraining corpus is the hardest part to copy. The team gathered 3,271,454 imaging series from 125 sources and kept 2,158,570 volumes after curation. The corpus has three streams:

By data streamClinical partnerships 60.9%Research cohorts 34.2%Clinical partnerships 1,315,227Research cohorts 737,714Small public datasets 105,629By modalityCT 26.6%MRI 71.7%CT 26.6% (≈574k volumes)MRI 71.7%PET 1.7%
Figure 2 — What the corpus is made of. Clinical partnerships supply most of the volumes. By modality the corpus is mostly MRI; CT, the modality these notes focus on, is about a quarter. Sources: Results (“Large-scale multimodal 3D radiological data…”) and Supplementary Section 8.

Clinical partnerships dominate. The DKFZ radiology research PACS alone contributes 821,692 volumes, followed by Bonn with 264,803 and Thoraxklinik Heidelberg with 228,732. Together that is 1,315,227 volumes, or 60.9% of the corpus. Large research cohorts add 34.2%, for example the Osteoarthritis Initiative’s 240,867 MRIs, NLST’s 129,592 chest CTs, OpenNeuro and I-SPY 2. The 91 small public datasets that most papers are built on, mostly from TCIA, make up only 4.9%. The scale comes from institutional access within the Human Radiome Project, not from a clever scrape of public data.

Clinical partner (private)Public research cohortEverything else0200k400k600k800kDKFZ radiology research PACSCT · MR · PET821,692BonnCT · MR264,803Osteoarthritis InitiativeMR240,867Thoraxklinik HeidelbergCT · MR228,732NLSTCT129,592OpenNeuroCT · MR · PET115,639I-SPY 2MR77,433ABCD StudyMR41,581ACRIN 6698MR41,532A4 StudyMR · PET28,153UPenn-GBMMR26,001113 smaller public sourcesmixed142,541
Figure 3 — The 11 largest sources account for 93% of the volumes. The three clinical partners’ archives take three of the top four places. Among public cohorts, NLST is the only large CT-only source. Source: Table 8 in Supplementary Section 8, which lists 124 sources (the text says 125). Its rows sum to 2,158,566, four fewer than the total given in the text.
Show as table
SourceModalitiesKindVolumesShare
DKFZ radiology research PACSCT · MR · PETprivate821,69238.1%
BonnCT · MRprivate264,80312.3%
Osteoarthritis InitiativeMRpublic240,86711.2%
Thoraxklinik HeidelbergCT · MRprivate228,73210.6%
NLSTCTpublic129,5926.0%
OpenNeuroCT · MR · PETpublic115,6395.4%
I-SPY 2MRpublic77,4333.6%
ABCD StudyMRpublic41,5811.9%
ACRIN 6698MRpublic41,5321.9%
A4 StudyMR · PETpublic28,1531.3%
UPenn-GBMMRpublic26,0011.2%
113 smaller public sourcesmixedother142,5416.6%
What this means for CT derived

CT is 26.6% of the corpus, or ≈574k volumes. Only about 144k of them come from sources that are CT-only, and NLST alone accounts for 130k. The other ~430k CT volumes therefore sit in mixed-modality sources. The public ones among those are mostly MRI collections, so most of the CT signal must come from the three clinical partners’ archives. The paper does not break CT down by body region. Thoraxklinik is a specialist lung hospital, so chest CT is probably well covered.

Curation was aggressive and mostly automatic. A third of the aggregated series were dropped. The largest cuts were volumes derived from 4D series (458,754), volumes with fewer than 10 slices along an axis (229,693), and series that were not CT, MR or PET, or not images at all (180,051). Two steps matter directly for report generation:

  • An out-of-distribution detector whose flags were reviewed by hand. This removed 25,456 volumes, 9,110 of them non-human scans.
  • Hash-based de-duplication against every downstream dataset, which removed 88,477 volumes. It keeps CT-RATE and MERLIN scans out of pretraining.
01M2M3MAggregated series3,271,454Not CT/MR/PET, or not an image−180,051Non-finite voxel values−67Segmentation masks (few unique values)−4,192Derived from 4D series (diffusion, dynamic)−458,754Outliers on review (incl. 9,110 non-human)−25,456Overlap with evaluation sets (hash dedup)−88,477Implausible anatomy, failed reconstructions−99,716Fewer than 10 slices along an axis−229,693Voxel spacing > 8 mm along an axis−26,478Final pretraining corpus2,158,570
Figure 4 — The curation funnel, step by step. Grey bars show how much each filter removed; subtracting every step from the 3,271,454 start gives exactly the final 2,158,570. Hover a bar for exact counts. Source: Methods 4.1.

Pretraining uses no labels and no text. Volumes are not resampled to a common spacing, so the model sees native resolutions, and every image is z-score normalised.

03Stage 0: pretraining an encoder that never reads

The report-generation encoder is nnFoundationViT, a plain 3D Vision Transformer built on the Primus design, DKFZ’s ViT for 3D medical segmentation. A CT crop is cut into 8×8×8-voxel patches. Each patch becomes a 1,056-dimensional token, and 40 transformer layers process the sequence.

It is trained by masked autoencoding. For every 192³ crop, 80% of the patch tokens are hidden at random. The encoder sees the remaining 20%, and an 8-layer decoder reconstructs the missing voxels. The decoder is discarded after pretraining. No text, label or contrastive pair is used at any point in this stage.

Architecture
Primus-style 3D ViT · depth 40 · width 1,056 · 674M parameters
Tokens
8×8×8-voxel patches → 24³ = 13,824 tokens per 192³ crop derived
Objective
MAE, random patch masking, ratio 0.8 (≈2,765 visible tokens per crop, derived)
Decoder
8 transformer layers, used only during pretraining
Input
Random 192³ crops at native spacing, z-score intensities
Optimiser
AdamW, weight decay 0.05, peak LR 2×10⁻³, 50k linear warm-up steps, polynomial decay, gradient clipping 1, mixed precision
Schedule
Global batch 96 × 625,000 steps = 60M crops, ≈28 passes over the corpus (derived)
Compute
≈12,500 A100 GPU-hours (130 h on 96 GPUs)

Why MAE, and why a large ViT

The choice came from a controlled comparison run before scaling up. On a subset of ~630k public volumes, separate teams tuned MAE, DINOv2 and SimCLR-style contrastive learning, each for both a CNN (nnU-Net ResEnc-L) and a Primus ViT. Each team had a development budget of about 25k A100-hours, and each pretraining run was capped at 400 GPU-hours. MAE came out on top for both architectures.

Scaling then went differently for the two. Going from 205M to 674M parameters clearly helped the ViT but did not consistently help the CNN, so the final pair is a 102M CNN and a 674M ViT.

One detail from the development runs is relevant to report generation. With a shallower (16-layer) encoder, the depth of the MAE decoder shifted what the encoder learned: shallow decoders favoured segmentation, deeper ones favoured classification. The authors read this as decoder capacity trading fine local detail against more abstract features. The final model pairs its 40-layer encoder with the deepest decoder they tried (8 layers). Our reading is that this fits the ViT’s later strength on global, semantic tasks such as writing reports.

04Stages 1–2: from frozen features to a report

Report generation reuses Qwen2.5-VL-3B but discards its 2D vision tower. The frozen 3D encoder takes its place, and a small adapter connects the two. At 674M parameters, the 3D encoder is about the same size as the 2D tower it replaces (roughly 0.65B, by our count from the Qwen2.5-VL config).

The adapter: Qwen’s patch merger, in 3D

Qwen2.5-VL shortens its sequence of vision tokens by concatenating each 2×2 group of neighbouring tokens and projecting the result into the language model’s embedding space. The nnFoundation adapter does the same over 2×2×2 groups. Eight neighbouring encoder tokens (8 × 1,056 = 8,448 features) are concatenated and projected to one LLM token. This keeps local 3D context together and makes the sequence 8× shorter.

nnFoundationViTfrozen · 8³ patches3D mergertrained · 2×2×2 → 1192 × 192 × 192 voxels1 mm isotropic crop≈7.1M intensities24 × 24 × 24 = 13,824 tokens1,056 features eachencoder output12 × 12 × 12 = 1,728 tokens2,048 features eachLLM input (visual prefix)
Figure 5 — Token budget for one CT. For a 192³ input at 1 mm, the encoder emits 13,824 tokens and the adapter passes 1,728 visual tokens to the LLM, a manageable prefix for a 3B model. The paper states the patch size, width and merge factor; the counts are our arithmetic.

The paper describes the adapter in one paragraph. Here is a minimal sketch of it, reconstructed from that description (not the authors’ code):

class PatchMerger3D(nn.Module):
    """Merge each 2x2x2 block of frozen-encoder tokens into one LLM token."""
    def __init__(self, d_vis=1056, d_llm=2048, m=2):
        super().__init__()
        self.m, d_cat = m, d_vis * m ** 3          # 8 x 1056 = 8448
        self.norm = nn.LayerNorm(d_vis)            # Qwen2.5-VL uses RMSNorm
        self.mlp = nn.Sequential(
            nn.Linear(d_cat, d_cat), nn.GELU(), nn.Linear(d_cat, d_llm))

    def forward(self, x):                          # x: (B, 24, 24, 24, 1056)
        B, D, H, W, C = x.shape
        m = self.m
        x = self.norm(x).view(B, D // m, m, H // m, m, W // m, m, C)
        x = x.permute(0, 1, 3, 5, 2, 4, 6, 7)      # group each 2x2x2 block
        x = x.reshape(B, -1, m ** 3 * C)           # (B, 1728, 8448)
        return self.mlp(x)                         # (B, 1728, 2048)

If the adapter copies Qwen’s two-layer MLP exactly, it has about 89M trainable parameters (8,448² + 8,448 × 2,048). A single linear projection would have about 17M. The paper does not say which it uses.

Training: two stages, one loss

Training is plain supervised next-token prediction on the reference reports, in two stages. Stage 1 trains only the adapter, for 1.2 epochs. This places the visual tokens somewhere the LLM can use them before the LLM itself is allowed to change; the authors describe it as a guard against feature collapse. Stage 2 adds LoRA to the language model for another 10.8 epochs while the adapter keeps training. The encoder stays frozen throughout.

Stage 1 · align · 1.2 epStage 2 · LoRA fine-tune · 10.8 ep01.224681012dataset epochsnnFoundationViT encoderfrozen3D merger adaptertrained (full)Qwen2.5-VL-3B LLMLoRA adapters trained
Figure 6 — Which weights move, and when. Stage 1 aligns the adapter against a frozen LLM; stage 2 adds LoRA. The epoch counts and the peak learning rates (Table 1b) are the only schedule details given. The paper does not report LoRA rank, batch size or report-generation optimiser. Source: Methods 4.6.1.

Every encoder got its own sweep over learning rate and field of view on internal validation splits, and each reported number is that encoder’s best configuration. The two ViTs, nnFoundationViT and CURIA, both preferred a learning rate of 1e-3. All the other encoders settled at 4e-4 (Table 1 below).

05CT preprocessing and field of view

Preprocessing is standardised per encoder. Each scan is resampled to the encoder’s native spacing, which for nnFoundation (no fixed spacing) means 1 mm isotropic. It is then normalised with the encoder’s own intensity scheme: z-score for most, [0, 1] scaling for VISTA3D and Merlin.

Each scan is then cropped to the anatomy. On CT-RATE, the region of interest is the union of TotalSegmentator’s lung labels. On MERLIN, it is the union of all TotalSegmentator foreground labels. Connected components under 400 voxels are discarded as outliers, and the bounding box is enlarged by 4%. Three field-of-view modes were then compared:

  • resize: trilinearly resize the ROI crop to the encoder’s native input size, which keeps all the anatomy at lower resolution;
  • native crop: centre-crop the ROI to the native input size, which keeps full resolution but may cut off anatomy;
  • 192-crop: centre-crop to 192³.

On MERLIN the abdominal ROI is larger than every encoder’s input, so only the resize mode was run. Two encoders needed special handling:

  • CURIA is a 2D model, so its per-slice tokens are mean-pooled into 8, 12 or 16 axial bins (part of the sweep) to form a volume grid.
  • Merlin, on its own dataset, keeps its original 224×224×160 pad-and-crop pipeline with no ROI crop, so it is not disadvantaged by a shift away from its pretraining setup.
EncoderParamsNative patchIntensityReport-gen LRChosen FOV
nnFoundationViT674M192³z-score1e-3native crop
CURIA86M1×512² (2D)z-score1e-3resized
CT-FM87M24×128²z-score4e-4192-crop
Merlin271M160×224²[0, 1]4e-4native crop
nnFoundationCNN102M192³z-score4e-4resized
VISTA3D218M128³[0, 1]4e-4192-crop
VoCo-B54M96³z-score4e-4192-crop
SwinUNETR102M96³z-score4e-4192-crop
MIS-FM142M64×128²z-score4e-4192-crop

Table 1 — Report-generation settings chosen by each encoder’s sweep. “Native patch” is the pretraining input size listed in the paper. Source: Table 1a/b and Methods 4.6.

Worth checking our observation

nnFoundationViT’s native input is 192³ voxels at 1 mm. Its winning “native crop” is therefore a 19.2 cm cube from the centre of the lung bounding box, identical to “192-crop”. Adult lungs often extend beyond 19.2 cm from side to side and from apex to base. In many scans, the best configuration probably does not see the lung apices, bases or outer edges. That makes the result more impressive, and it suggests an easy follow-up: tile the ROI, or add a low-resolution view of the whole region.

06Results on CT-RATE (chest CT)

CT-RATE pairs 25,692 non-contrast chest CT scans from 21,304 patients with their radiology reports. The reports were written in Turkish, machine-translated into English and reviewed by bilingual medical students. It is the only benchmark for which the paper uses structured abnormality labels, so it is the only one scored with clinical metrics.

BLEUcommon 0–0.5 scale00.10.20.30.40.50.317Abnormality F1common 0–0.5 scale00.10.20.30.40.50.437CRG scorecommon 0–0.5 scale00.10.20.30.40.5chance0.444nnFoundationViTCURIACT-FMMerlinnnFoundationCNNVISTA3DVoCo-BSwinUNETRMIS-FM
Figure 7 — CT-RATE report generation with nine frozen encoders. All three metrics share a 0–0.5 scale, so the spread of each metric can be compared directly. Lines are bootstrap 95% CIs, mostly narrower than the dots. The dashed line marks CRG = 1/3, chance level, which is also what an encoder scores if its reports never flag an abnormality (see section 09). Source: Supplementary Table 15.
Frozen encoderArch.PretrainingPretrain vol.BLEUF1CRG
nnFoundationViT3D ViTMAE2.1M0.317 0.311–0.3230.437 0.427–0.4480.444 0.440–0.448
CURIA2D ViTDINOv21M0.316 0.310–0.3230.428 0.415–0.4390.426 0.422–0.429
CT-FM3D CNNContrastive148k0.285 0.279–0.2930.276 0.265–0.2870.384 0.381–0.387
Merlin3D CNNVision–language15k0.276 0.269–0.2830.227 0.216–0.2370.372 0.369–0.374
nnFoundationCNN3D CNNMAE2.1M0.267 0.260–0.2750.146 0.138–0.1540.354 0.352–0.356
VISTA3D3D CNNSupervised seg.11k0.271 0.263–0.2780.135 0.126–0.1440.355 0.353–0.357
VoCo-B3D SwinVol. contrastive160k0.263 0.256–0.2710.132 0.122–0.1410.354 0.352–0.355
SwinUNETR3D SwinInpaint + contr. + rot.5k0.247 0.239–0.2550.022 0.018–0.0260.336 0.335–0.336
MIS-FM3D hybridVolume fusion110k0.241 0.234–0.2490.000 0.000–0.0000.333 0.333–0.333

Table 2 — CT-RATE results with 95% CIs. Sorted by F1. “Pretrain vol.” is as listed in the paper’s Table 1; CURIA’s 1M counts 2D slices as volume equivalents. Source: Supplementary Table 15 and Table 1a.

Five things stand out:

  1. Two leaders, then a large drop. nnFoundationViT (F1 0.437) and CURIA (0.428) are far ahead; the third encoder, CT-FM, reaches 0.276. The two leaders are the only plain ViTs in the line-up and, together with nnFoundationCNN, have the three largest pretraining sets. Their objectives are very different: MAE on 3D crops versus DINOv2 on 2D slices.
  2. Same data, different architecture, three times the F1. nnFoundationCNN has the same corpus and the same MAE objective as the ViT, yet reaches only F1 0.146. Architecture is not the only difference, though: the CNN has 102M parameters to the ViT’s 674M, and about 500 A100-hours of pretraining to its 12,500. The CNN is the paper’s pick for segmentation. For report generation from frozen features, it is roughly level with VISTA3D and VoCo.
  3. Report supervision on a small dataset does not carry over to chest CT. Merlin’s encoder was pretrained with reports on ~15k abdominal CTs. On chest CT-RATE it reaches F1 0.227, well behind both self-supervised ViTs. On its own abdominal data it ties nnFoundationViT (section 08), so part of this gap is domain, not supervision.
  4. Some encoders give the LLM nothing to work with. MIS-FM scores F1 0.000 and a CRG of exactly 1/3, with CIs of zero width. That is chance level: its reports essentially never flag an abnormality. SwinUNETR is barely higher (0.022 and 0.336). With these features the LLM appears to write much the same normal-looking report for every scan, and that still earns BLEU 0.241–0.247.
  5. Absolute scores are modest. The best CRG, 0.444, corresponds to a pooled true-positive rate minus false-positive rate of about 0.37 (section 09). That leaves a lot of room to improve.
Plain ViT (2D or 3D)3D CNNSwin / hybrid0.00.10.20.30.40.510k100k1Mpretraining volumes (log scale, as listed in the paper's Table 1)CT-RATE abnormality F1same 2.1M volumes,same MAE objective:ΔF1 = 0.291nnFoundationViTCURIA (2D)CT-FMMerlinnnFoundationCNNVISTA3DVoCo-BSwinUNETRMIS-FM
Figure 8 — Scale matters, but architecture matters more. Pretraining set size alone does not predict F1. The two nnFoundation models were trained on identical data with the same objective (though with very different model size and compute), and they sit 0.29 F1 apart. Hover a point for its architecture, objective and size. Sources: Table 1a and Supplementary Table 15.

Where does 0.437 sit?

Other CT-RATE report generators, scored with CT-RATE’s RadBERT labeler (probably the one used here), give some context. Test sets and averaging differ between papers, so treat this as a rough guide, not a leaderboard.

SystemF1CRGReported in
CT2Rep0.1600.359CRG paper (2025), CT-RATE validation set
CT-CHAT0.1840.368CRG paper (2025), CT-RATE validation set
Merlin (own generator, re-impl.)0.1600.352CRG paper (2025), CT-RATE validation set
nnFoundationViT + Qwen2.5-VL-3B0.4370.444this paper; test split and averaging not stated
DKFZ companion paper, best configs0.495–Resolution Meets Reduction (2026), macro F1, 1,564 validation reports

Table 3 — CT-RATE context. A frozen, report-free encoder behind a 3B LLM clears the 2024-era systems by a wide margin. A closely related DKFZ paper, which tunes how visual tokens are reduced, reaches 0.495. Sources: arXiv:2505.17167 and arXiv:2608.08713.

07Is the lead real?

The paper uses a strict rule: nnFoundation “outperforms” a comparator only if the 95% paired-bootstrap interval for the difference lies entirely above zero. By that rule, the win over CURIA holds for CRG only (+0.018, 95% CI +0.014 to +0.023). The F1 lead (+0.009, CI −0.005 to +0.022) and the BLEU lead (+0.001) are within noise. Against every other encoder, nnFoundationViT is clearly ahead on all three metrics.

Δ abnormality F1CT-RATE0+0.1+0.2+0.3+0.4n.s.Δ CRGCT-RATE0+0.04+0.08+0.12Δ BLEUmean of CT-RATE and MERLIN0+0.04+0.08+0.12n.s.vs CURIAvs CT-FMvs Merlinvs nnFoundationCNNvs VISTA3Dvs VoCo-Bvs SwinUNETRvs MIS-FM
Figure 9 — Paired differences, nnFoundationViT minus each comparator. Hollow dots marked “n.s.” have a 95% CI that crosses zero. Each panel has its own scale. ΔBLEU is averaged over CT-RATE and MERLIN, as in the paper. Source: Supplementary Table 10.
Show as table
nnFoundationViT minusΔ F1Δ CRGΔ BLEU (2-dataset mean)
CURIA+0.009 -0.005 to +0.022 n.s.+0.018 +0.014 to +0.023+0.001 -0.001 to +0.004 n.s.
CT-FM+0.161 +0.147 to +0.173+0.060 +0.056 to +0.064+0.017 +0.014 to +0.019
Merlin+0.210 +0.197 to +0.223+0.072 +0.068 to +0.076+0.021 +0.018 to +0.024
nnFoundationCNN+0.291 +0.279 to +0.303+0.090 +0.086 to +0.094+0.064 +0.062 to +0.067
VISTA3D+0.302 +0.289 to +0.315+0.089 +0.085 to +0.093+0.070 +0.067 to +0.072
VoCo-B+0.306 +0.293 to +0.317+0.090 +0.086 to +0.094+0.072 +0.069 to +0.075
SwinUNETR+0.415 +0.404 to +0.427+0.108 +0.104 to +0.112+0.071 +0.069 to +0.074
MIS-FM+0.437 +0.427 to +0.448+0.111 +0.107 to +0.115+0.114 +0.112 to +0.117

The paper’s ranking summary tells the same story. On report generation, nnFoundation’s mean rank is 1.00 (95% CI 1.00–2.50) and CURIA’s is 2.00 (1.50–3.00). A fair headline is therefore “best or joint best”. The more interesting result is the tie itself: a 2D slice encoder, with slice features mean-pooled into a coarse volume grid, nearly matches a native 3D ViT at writing chest CT reports.

08Results on MERLIN (abdominal CT)

MERLIN is Stanford’s abdominal CT dataset: 25,528 scans in the paper’s count, with findings organised by organ system. The Merlin encoder was pretrained on its roughly 15k-scan training split. Only BLEU is reported for this benchmark, so it says nothing about clinical correctness.

00.050.10.150.2nnFoundationViT0.172CURIA0.170CT-FM0.170Merlin0.170SwinUNETR0.100nnFoundationCNN0.093VoCo-B0.081VISTA3D0.079MIS-FM0.019overlapping95% CIs
Figure 10 — MERLIN report generation (BLEU only). Four encoders are tied at the top, with overlapping 95% CIs. Scores are lower than on CT-RATE, but BLEU is not comparable across datasets because report length and style differ. Source: Supplementary Table 15.
Show as table
Frozen encoderMERLIN BLEU (95% CI)
nnFoundationViT0.172 0.169–0.175
CURIA0.170 0.167–0.173
CT-FM0.170 0.167–0.173
Merlin0.170 0.167–0.173
SwinUNETR0.100 0.097–0.103
nnFoundationCNN0.093 0.090–0.096
VoCo-B0.081 0.078–0.084
VISTA3D0.079 0.076–0.082
MIS-FM0.019 0.018–0.020

Four encoders are tied at the top: nnFoundationViT at 0.172, and CURIA, CT-FM and Merlin at 0.170, with overlapping intervals. Merlin is the in-domain reference here. It was pretrained on this very dataset and evaluated with its original preprocessing, so matching it with an encoder that never saw these scans is a good sign for transfer. Below the top four, scores roughly halve (0.079–0.100), and MIS-FM drops to 0.019.

09Reading the metrics

BLEU

The paper uses corpus-level BLEU: n-gram overlap between generated and reference reports, pooled over the test set. It doesn’t state the n-gram order; the common CT-RATE evaluation code (pycocoevalcap, as in the VLM3D challenge) reports BLEU-1 to BLEU-4 and their mean. BLEU rewards fluent, templated wording, which is why an encoder with F1 = 0 still scores 0.241 on CT-RATE. Its range across the nine encoders on CT-RATE is 0.076, against 0.437 for F1.

Abnormality-label F1

F1 is computed only where structured labels exist, which here means CT-RATE. Each CT-RATE scan carries 18 multi-label abnormality annotations:

  • Medical material
  • Arterial wall calcification
  • Cardiomegaly
  • Pericardial effusion
  • Coronary artery wall calcification
  • Hiatal hernia
  • Lymphadenopathy
  • Emphysema
  • Atelectasis
  • Lung nodule
  • Lung opacity
  • Pulmonary fibrotic sequela
  • Pleural effusion
  • Mosaic attenuation pattern
  • Peribronchial thickening
  • Consolidation
  • Bronchiectasis
  • Interlobular septal thickening

To score a generated report, its abnormalities first have to be read out of the text. The paper doesn’t name its extractor. The standard tool is the RadBERT classifier released with CT-RATE, fine-tuned on 1,000 manually labelled reports and thresholded at 0.5. The same classifier produced CT-RATE’s ground-truth labels.

Micro or macro F1?

The paper doesn’t say; it only calls the metric “abnormality-label F1”, while it explicitly macro-averages segmentation and classification. Two clues point to macro:

  • The evaluation code of the MICCAI 2025 VLM3D challenge, the reference implementation for CT-RATE report generation, computes positive-class F1 for each abnormality and takes the unweighted mean.
  • A DKFZ companion paper with an overlapping author team and a similar frozen-encoder + LoRA recipe states that it computes macro F1 across all 18 classes with the RadBERT classifier.

That makes macro the likely reading, but it is not confirmed. The distinction matters because the 18 labels are highly imbalanced: micro-F1 is dominated by common findings, while macro-F1 gives rare findings equal weight.

CRG score

CRG (Hamamci et al., 2025) counts true positives, false negatives and false positives over every label slot in the test set. It weights them so that an empty report and an exhaustive one score the same:

s = w·TP − w·FN − FP,   w = (T − A) / 2A,   Smax = w·A
CRG = Smax / (2·Smax − s)  # T = label slots (reports × 18), A = positive labels

A little algebra shows that CRG is a rescaling of Youden’s J (sensitivity + specificity − 1) over the pooled label slots:

CRG = 1 / (3 − 2J),   J = TPR − FPR  # our derivation

So 1/3 is chance level (J = 0). That is also exactly what a model scores if it never reports an abnormality, or always reports all of them. The scale runs from 0.2 (J = −1) to 1. MIS-FM’s exact 0.333, alongside F1 = 0, means its reports essentially never flag an abnormality. Converted back to J, the results are easier to read:

00.10.20.30.4nnFoundationViT0.37CURIA0.33CT-FM0.20Merlin0.16VISTA3D0.09nnFoundationCNN0.09VoCo-B0.09SwinUNETR0.01MIS-FM≈ 0
Figure 11 — CRG converted back to detection skill. J = (3 − 1/CRG) / 2: the pooled true-positive rate minus the false-positive rate across all 18 labels. nnFoundationViT’s reports reach J ≈ 0.37; SwinUNETR and MIS-FM are at or near chance. derived This assumes nnFoundation uses the standard pooled CRG computation, which the paper does not state. Source: Supplementary Table 15.
Caveat on the labels

CT-RATE’s abnormality labels were extracted from the reports by a text classifier, not read from the images by radiologists. Both the reference labels and every score computed from them inherit that classifier’s errors.

10What the paper leaves out

The protocol is described in two short paragraphs. Several details you would need to reproduce the numbers, or to compare them with other CT-RATE work, are missing:

  • Language-model training: LoRA rank, alpha and target modules; the report-generation optimiser and schedule; batch size; context length; the prompt. The DKFZ companion paper with a similar recipe uses LoRA r = 32, α = 64 and dropout 0.1, which may carry over.
  • Targets: which report sections are generated (findings, impression or both) and any text cleaning.
  • Scoring: the label extractor behind F1 and CRG, and whether F1 is micro- or macro-averaged. Most likely it is the RadBERT classifier with macro F1 (section 09).
  • Evaluation set: test-split size, and how scans with several reconstructions were handled.
  • Decoding: greedy or sampled, and the maximum length.
  • Cost: compute for the report-generation runs. The whole evaluation suite used more than 50k A100-hours.
  • Deeper analysis: per-abnormality results, radiologist review, or comparison with published CT-RATE report generators.
  • Ablations: on the adapter design or the two-stage schedule, and a baseline with the encoder unfrozen.
  • Code: the paper says fine-tuning pipelines for vision–language tasks are provided. The only nnFoundation code repository it links is nnssl, which covers pretraining, and the model card lists report generation as “TBA”. The encoder weights themselves are public under CC-BY-SA-4.0.

11Takeaways for building a CT report generator

  1. Treat the encoder as the main lever, and benchmark it frozen. With the LLM, adapter and recipe held fixed, swapping encoders moved F1 from 0.00 to 0.44. A frozen-encoder comparison like this one is cheap and gives clear answers.
  2. For report generation, choose a ViT pretrained at scale. Both leaders are plain ViTs. Every CNN and Swin encoder lags far behind, including one trained on the same 2.1M volumes. For segmentation the order flips, and the paper’s CNN wins.
  3. You may not need reports to pretrain the encoder. Image-only self-supervision at scale tied a report-supervised encoder (Merlin) on Merlin’s own abdominal data and beat it on chest CT, where Merlin is off-domain. Reports are needed to train the adapter and LoRA weights, and a CT-RATE-sized dataset was enough (its official training split has ~20k patients; the paper doesn’t say which split it used). The encoder weights are public, so you can reuse the 12,500 GPU-hours of pretraining.
  4. Test a strong 2D encoder before committing to 3D. CURIA, with slices mean-pooled into axial bins, is statistically tied on F1 and BLEU.
  5. Don’t rely on BLEU alone. Track a clinical metric such as label F1 or CRG, and watch for template collapse: F1 near 0, or CRG stuck at chance (1/3).
  6. Keep the two-stage schedule and sweep per encoder. Warming up the adapter alone before adding LoRA is cheap insurance. Sweep ROI cropping and field of view for each encoder: the settings that won differ from one encoder to the next (Table 1).
  7. There is plenty of headroom. Each constraint here has an obvious upgrade: the encoder is frozen, the LLM has only 3B parameters, and the LLM is tuned only through LoRA. Candidates are partial unfreezing, a larger LLM, tiling the full lung volume, and reinforcement learning against a clinical reward such as CRG.

ARecipe sheet & sources

Everything the paper specifies for report generation

Datasets
CT-RATE (chest, 25,692 volumes) · MERLIN (abdomen, 25,528 volumes)
Language model
Qwen2.5-VL-3B, 2D vision tower replaced by the frozen 3D encoder
Adapter
Spatial-to-channel merge of 2³ neighbouring tokens, projected to the LLM hidden size
Loss
Supervised next-token prediction on reports
Stage 1
1.2 epochs · adapter only
Stage 2
10.8 epochs · adapter + LoRA on the LLM
Encoder
Frozen throughout, for every method
Sweeps
Learning rate × field of view per encoder, internal validation split, best configuration reported
nnFoundationViT
LR 1e-3 · native crop (192³ at 1 mm) · lung ROI on CT-RATE, resize on MERLIN
Metrics
Corpus BLEU; abnormality F1 and CRG on CT-RATE; bootstrap 95% CIs (1,000 replicates); paired-bootstrap significance
Not reported
LoRA rank/alpha/targets, batch size, optimiser, prompt, decoding, report sections, label extractor, F1 averaging, test-split size, compute
Likely, not confirmed
RadBERT labeler, macro F1, pooled CRG. LoRA r = 32, α = 64, dropout 0.1, as in the DKFZ companion paper

References

  1. Ulrich Harsy, C., Wald, T., et al. nnFoundation: 3D Foundation Models for Radiology. arXiv:2609.26924 (2026).
  2. MIC-DKFZ. nnssl: self-supervised learning framework for 3D medical images (linked from the paper).
  3. Hamamci, I. E., et al. CT-RATE / CT-CLIP. arXiv:2403.17834 · dataset.
  4. Hamamci, I. E., et al. CRG Score: a distribution-aware clinical metric for radiology report generation (2025).
  5. Suprijadi, J., Stock, R., et al. Resolution Meets Reduction: efficient visual context for 3D radiology report generation (2026). DKFZ companion paper.
  6. VLM3D challenge report-generation evaluation code: forithmus/VLM3D-Dockers.
  7. MIC-DKFZ. nnFoundationViT model card (CC-BY-SA-4.0).
  8. Blankemeier, L., et al. Merlin: a computed tomography vision–language foundation model and dataset. Nature 652, 1318–1328 (2026).
  9. Qwen Team. Qwen2.5-VL technical report (2025).
  10. Wasserthal, J., et al. TotalSegmentator.