Models
Model benchmarks for classifiers are here
Model Interface
- class xrv.models.Model
The library is composed of core and baseline classifiers. Core classifiers are trained specifically for this library and baseline classifiers come from other papers that have been adapted to provide the same interface and work with the same input pixel scaling as our core models. All models will automatically resize input images (higher or lower using bilinear interpolation) to match the specified size they were trained on. This allows them to be easily swapped out for experiments. Pre-trained models are hosted on GitHub and automatically downloaded to the user’s local ~/.torchxrayvision directory.
Core pre-trained classifiers are provided as PyTorch Modules which are fully differentiable in order to work seamlessly with other PyTorch code.
- forward(x: Tensor) Tensor
The model will output a tensor with the shape [batch, pathologies] which is aligned to the order of the list model.pathologies.
preds = model(img) print(dict(zip(model.targets, preds.tolist()[0]))) # {'Atelectasis': 0.5583771, # 'Consolidation': 0.5279943, # 'Infiltration': 0.60061914, # ...
- targets: List[str]
Each classifier provides a field model.targets which aligns to the list of predictions that the model makes. Depending on the weights loaded this list will change. The predictions can be aligned to pathology names as follows:
- features(x: Tensor) Tensor
The pre-trained models can also be used as features extractors for semi-supervised training or transfer learning tasks. A feature vector can be obtained for each image using the model.features function. The resulting size will vary depending on the architecture and the input image size. For some models there is a model.features2 method that will extract features at a different point of the computation graph.
feats = model.features(img)
XRV Pathology Classifiers
- class xrv.models.DenseNet(weights=SPECIFY, op_threshs=None, apply_sigmoid=False)
Pre-trained DenseNet-121 pathology classifier
Based on “Densely Connected Convolutional Networks”
Models are trained on a single dataset or a combination of datasets and predict up to 18 chest pathologies. Input images are automatically resized to the resolution the model was trained on (224 × 224 for all current weights).
Available pre-trained weights:
model = xrv.models.DenseNet(weights="densenet121-res224-all") # trained on all datasets model = xrv.models.DenseNet(weights="densenet121-res224-rsna") # RSNA Pneumonia Challenge model = xrv.models.DenseNet(weights="densenet121-res224-nih") # NIH ChestX-ray14 model = xrv.models.DenseNet(weights="densenet121-res224-pc") # PadChest model = xrv.models.DenseNet(weights="densenet121-res224-chex") # CheXpert (Stanford) model = xrv.models.DenseNet(weights="densenet121-res224-mimic_nb") # MIMIC-CXR (MIT) model = xrv.models.DenseNet(weights="densenet121-res224-mimic_ch") # MIMIC-CXR (MIT)
- Parameters:
weights – Name of pre-trained weights to load. See above for options.
cache_dir – Directory used to store downloaded weights (default:
~/.torchxrayvision/).op_threshs – Per-pathology operating-point thresholds. When set, outputs are re-scaled so that the threshold maps to 0.5.
apply_sigmoid – If
True, apply a sigmoid to the raw logits before returning. Ignored whenop_threshsis also set.
- targets: List[str] = ['Atelectasis', 'Consolidation', 'Infiltration', 'Pneumothorax', 'Edema', 'Emphysema', 'Fibrosis', 'Effusion', 'Pneumonia', 'Pleural_Thickening', 'Cardiomegaly', 'Nodule', 'Mass', 'Hernia', 'Lung Lesion', 'Fracture', 'Lung Opacity', 'Enlarged Cardiomediastinum']
- class xrv.models.ResNet(weights=SPECIFY, op_threshs=None, apply_sigmoid=False)
Pre-trained ResNet-50/101 pathology classifier
Based on “Deep Residual Learning for Image Recognition”
Input images are automatically resized to the resolution the model was trained on (512 × 512 for all current weights).
Available pre-trained weights:
model = xrv.models.ResNet(weights="resnet50-res512-all") # trained on all datasets
- Parameters:
weights – Name of pre-trained weights to load. See above for options.
cache_dir – Directory used to store downloaded weights (default:
~/.torchxrayvision/).op_threshs – Per-pathology operating-point thresholds. When set, outputs are re-scaled so that the threshold maps to 0.5.
apply_sigmoid – If
True, apply a sigmoid to the raw logits before returning. Ignored whenop_threshsis also set.
- targets: List[str] = ['Atelectasis', 'Consolidation', 'Infiltration', 'Pneumothorax', 'Edema', 'Emphysema', 'Fibrosis', 'Effusion', 'Pneumonia', 'Pleural_Thickening', 'Cardiomegaly', 'Nodule', 'Mass', 'Hernia', 'Lung Lesion', 'Fracture', 'Lung Opacity', 'Enlarged Cardiomediastinum']
XRV ResNet Autoencoder
- class xrv.autoencoders.ResNetAE(weights=SPECIFY)
ResNet-based image autoencoder
Encodes a chest X-ray to a compact latent representation and decodes it back to image space. Useful for representation learning, anomaly detection, and data augmentation.
Available pre-trained weights:
"101-elastic"— trained on PadChest, NIH, CheXpert, and MIMIC. From Cohen et al., 2021.
ae = xrv.autoencoders.ResNetAE(weights="101-elastic") z = ae.encode(image) # encode to latent space image2 = ae.decode(z) # reconstruct
- Parameters:
weights – Name of pre-trained weights to load. See above for options.
cache_dir – Directory used to store downloaded weights (default:
~/.torchxrayvision/).
CheXpert Pathology Classifier
- class xrv.baseline_models.chexpert.DenseNet(weights_zip='', num_models=30)
CheXpert ensemble DenseNet classifier
An ensemble of up to 30 DenseNet models trained on the Stanford CheXpert dataset, predicting 5 pathologies. Setting
num_modelsto a value less than 30 loads a subset of the ensemble, which reduces memory use and inference time at the cost of accuracy.Targets (5): Atelectasis, Cardiomegaly, Consolidation, Edema, Effusion.
Modified for TorchXRayVision to maintain the PyTorch gradient tape and to expose a
features()method compatible with the rest of the library.Note
This class requires a local copy of the pre-trained weights ZIP file, which must be passed as
weights_zip. The weights are not downloaded automatically.- Citation:
Irvin J, Rajpurkar P, Ko M, et al. CheXpert: A Large Chest Radiograph Dataset with Uncertainty Labels and Expert Comparison. AAAI Conference on Artificial Intelligence, 2019. https://arxiv.org/abs/1901.07031
- Download weights:
https://academictorrents.com/details/5c7ee21e6770308f2d2b4bd829e896dbd9d3ee87
- targets: List[str] = ['Atelectasis', 'Cardiomegaly', 'Consolidation', 'Edema', 'Effusion']
JF Healthcare Pathology Classifier
- class xrv.baseline_models.jfhealthcare.DenseNet(apply_sigmoid=True)
JF Healthcare DenseNet-121 classifier trained on CheXpert
A DenseNet-121 model trained on the Stanford CheXpert dataset using weakly supervised lesion localisation with Probabilistic-CAM Pooling. Predicts 5 pathologies.
Targets (5): Atelectasis, Cardiomegaly, Consolidation, Edema, Effusion.
- Source:
- License:
Apache-2.0
- Citation:
Ye W, Yao J, Xue H, Li Y. Weakly Supervised Lesion Localization With Probabilistic-CAM Pooling. arXiv:2005.14480, 2020. https://arxiv.org/abs/2005.14480
- targets: List[str] = ['Cardiomegaly', 'Edema', 'Consolidation', 'Atelectasis', 'Effusion']
ChestX-Det Segmentation
- class xrv.baseline_models.chestx_det.PSPNet(cache_dir: str = None)
ChestX-Det anatomical segmentation model (PSPNet)
A PSPNet model pre-trained for pixel-level segmentation of 14 anatomical structures in chest X-rays. Output shape is
[batch, 14, 512, 512].Targets (14): Left Clavicle, Right Clavicle, Left Scapula, Right Scapula, Left Lung, Right Lung, Left Hilus Pulmonis, Right Hilus Pulmonis, Heart, Aorta, Facies Diaphragmatica, Mediastinum, Weasand, Spine.
seg_model = xrv.baseline_models.chestx_det.PSPNet() output = seg_model(image) output.shape # [1, 14, 512, 512]
- Parameters:
cache_dir – Directory used to store downloaded weights (default:
~/.torchxrayvision/).
- Dataset:
- Citation:
Lian J, Liu J, Zhang S, et al. A Structure-Aware Relation Network for Thoracic Diseases Detection and Segmentation. IEEE Transactions on Medical Imaging, 2021. doi: 10.48550/arxiv.2104.10326
- targets: List[str] = ['Left Clavicle', 'Right Clavicle', 'Left Scapula', 'Right Scapula', 'Left Lung', 'Right Lung', 'Left Hilus Pulmonis', 'Right Hilus Pulmonis', 'Heart', 'Aorta', 'Facies Diaphragmatica', 'Mediastinum', 'Weasand', 'Spine']
Emory HITI Race
- class xrv.baseline_models.emory_hiti.RaceModel
This model is from the work below and is trained to predict the patient race from a chest X-ray. Public data from the MIMIC dataset is used to train this model. The native resolution of the model is 320x320. Images are scaled automatically.
model = xrv.baseline_models.emory_hiti.RaceModel() image = xrv.utils.load_image('00027426_000.png') image = torch.from_numpy(image)[None,...] pred = model(image) model.targets[torch.argmax(pred)] # 'White'
@article{Gichoya2022, title = {AI recognition of patient race in medical imaging: a modelling study}, author = {Gichoya, Judy Wawira and Banerjee, Imon and Bhimireddy, Ananth Reddy and Burns, John L and Celi, Leo Anthony and Chen, Li-Ching and Correa, Ramon and Dullerud, Natalie and Ghassemi, Marzyeh and Huang, Shih-Cheng and Kuo, Po-Chih and Lungren, Matthew P and Palmer, Lyle J and Price, Brandon J and Purkayastha, Saptarshi and Pyrros, Ayis T and Oakden-Rayner, Lauren and Okechukwu, Chima and Seyyed-Kalantari, Laleh and Trivedi, Hari and Wang, Ryan and Zaiman, Zachary and Zhang, Haoran}, doi = {10.1016/S2589-7500(22)00063-2}, journal = {The Lancet Digital Health}, pmid = {35568690}, url = {https://www.thelancet.com/journals/landig/article/PIIS2589-7500(22)00063-2/fulltext}, year = {2022} }
- targets: List[str] = ['Asian', 'Black', 'White']
Riken Age Model
- class xrv.baseline_models.riken.AgeModel
This model predicts age. It is trained on the NIH dataset. The publication reports a mean absolute error (MAE) between the estimated age and chronological age of 3.67 years.
The native resolution of the model is 320x320. Images are scaled automatically.
model = xrv.baseline_models.riken.AgeModel() image = xrv.utils.load_image('00027426_000.png') image = torch.from_numpy(image)[None,...] pred = model(image) # tensor([[50.4033]], grad_fn=<AddmmBackward0>)
Source: https://github.com/pirocv/xray_age
@article{Ieki2022, title = {{Deep learning-based age estimation from chest X-rays indicates cardiovascular prognosis}}, author = {Ieki, Hirotaka et al.}, doi = {10.1038/s43856-022-00220-6}, journal = {Communications Medicine}, publisher = {Nature Publishing Group}, url = {https://www.nature.com/articles/s43856-022-00220-6}, year = {2022} }
- targets: List[str] = ['Age']
Xinario View Model
- class xrv.baseline_models.xinario.ViewModel
Chest X-ray view classifier (Frontal vs. Lateral)
A ResNet-50 model trained to classify chest X-rays as frontal or lateral view. The native resolution is 320 × 320; images are scaled automatically.
Targets (2): Frontal, Lateral.
model = xrv.baseline_models.xinario.ViewModel() image = xrv.utils.load_image('00027426_000.png') image = torch.from_numpy(image)[None,...] pred = model(image) model.targets[pred.argmax()] # 'Lateral'
- targets: List[str] = ['Frontal', 'Lateral']
Mira Sex Model
- class xrv.baseline_models.mira.SexModel(weights=True)
This model is from the MIRA (Medical Image Representation and Analysis) project and is trained to predict patient sex from a chest X-ray. The model uses a ResNet34 architecture and is trained on CheXpert dataset. The native resolution of the model is 224x224. Images are scaled automatically.
Publication: Algorithmic encoding of protected characteristics in chest X-ray disease detection models B. Glocker, C. Jones, M. Bernhardt, S. Winzeck eBioMedicine. Volume 89, 104467, 2023.
model = xrv.baseline_models.mira.SexModel() image = xrv.utils.load_image('00027426_000.png') image = torch.from_numpy(image)[None,...] pred = model(image) model.targets[torch.argmax(pred)] # 'Male' or 'Female'
@article{MIRA2023, title = {Chexploration: Medical Image Representation and Analysis}, author = {MIRA Team}, journal = {biomedia-mira/chexploration}, url = {https://github.com/biomedia-mira/chexploration}, year = {2023} }
- targets: List[str] = ['Male', 'Female']