BoneAgeTW2 β EfficientNet-B3 Multi-Head TW2 Stage Classifier
Paper: arXiv:2607.23224
Code: github.com/jmmana/BoneAgeTW2
Author: Juan Manuel Castillo Pinto β Universidad de La Salle, BogotΓ‘
What is this?
A PyTorch checkpoint of the stage classifier from BoneAgeTW2, an end-to-end deep learning system for automated Tanner-Whitehouse 2 (TW2) skeletal maturation assessment.
The model uses a shared EfficientNet-B3 backbone with 20 independent classification heads (one per TW2 bone site) to simultaneously predict the maturation stage of each bone in a hand radiograph.
Model Performance (Validation, n=1,262 β RSNA Bone Age Dataset)
| Metric | Value |
|---|---|
| Mean exact accuracy (all 20 bones) | 65.82% |
| Mean within-1 accuracy (all 20 bones) | 96.77% |
| End-to-end MAE (RUS pathway) | 14.71 months |
| Carpal bones exact accuracy | 65.1β84.4% |
| RUS long bones exact accuracy | 56.7β66.8% |
The within-1 accuracy of 96.77% falls within the human radiologist inter-rater range (King et al., 1994).
Checkpoint
| File | Size | Epochs | Loss |
|---|---|---|---|
models/stage_classifier_epoch2.pt |
72 MB | 2 | 0.9477 |
Loading the Model
import torch, timm
from huggingface_hub import hf_hub_download
# Download
ckpt_path = hf_hub_download("maktub83/BoneAgeTW2", "models/stage_classifier_epoch2.pt")
checkpoint = torch.load(ckpt_path, map_location="cpu")
# Rebuild backbone
backbone = timm.create_model("efficientnet_b3", pretrained=False, num_classes=0)
backbone.load_state_dict(checkpoint["backbone"])
backbone.eval()
# feat_dim = 1536
feat_dim = checkpoint["feat_dim"]
# Each head: Linear(feat_dim, n_stages)
# See github.com/jmmana/BoneAgeTW2/training/04_train_stage_classifier.py
# for build_model() and BONE_NAMES
TW2 Bones (20 heads)
RUS (13): radius, ulna, mc1, mc3, mc5, pp1, pp3, pp5, mp3, mp5, dp1, dp3, dp5
Carpal (7): capitate, hamate, triquetral, lunate, scaphoid, trapezoid, trapezium
Pseudo-Label Method
Training labels were generated by Gaussian inversion of the published TW2 reference
distributions: for each bone, age, and sex, the MAP stage from gaussian_params.json
is assigned as the pseudo-label. This produces 252,220 annotations from 12,611 RSNA
radiographs without any manual effort.
Citation
@article{castillo2026boneagetw2,
author = {Castillo~Pinto, Juan~Manuel},
title = {{BoneAgeTW2}: Automated Skeletal Maturation Assessment via the {Tanner-Whitehouse 2} Method, Deep Learning, and Clinical Report Generation with Distribution Curves},
journal = {arXiv preprint arXiv:2607.23224},
year = {2026}
}