Image Segmentation
Transformers
Safetensors
cxr_basic
feature-extraction
chest_x_ray
x_ray
medical_imaging
radiology
segmentation
classification
lungs
heart
custom_code
Instructions to use ianpan/chest-x-ray-basic with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ianpan/chest-x-ray-basic with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-segmentation", model="ianpan/chest-x-ray-basic", trust_remote_code=True)# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("ianpan/chest-x-ray-basic", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
| library_name: transformers | |
| tags: | |
| - chest_x_ray | |
| - x_ray | |
| - medical_imaging | |
| - radiology | |
| - segmentation | |
| - classification | |
| - lungs | |
| - heart | |
| base_model: | |
| - timm/tf_efficientnetv2_s.in21k_ft_in1k | |
| pipeline_tag: image-segmentation | |
| This model performs both segmentation and classification on chest radiographs (X-rays). | |
| The model uses a `tf_efficientnetv2_s` backbone with a U-Net decoder for segmentation and linear layer for classification. | |
| For frontal radiographs, the model segments the: 1) right lung, 2) left lung, and 3) heart. | |
| The model also predicts the chest X-ray view (AP, PA, lateral), patient age, and patient sex. | |
| The [CheXpert](https://stanfordmlgroup.github.io/competitions/chexpert/) (small version) and [NIH Chest X-ray](https://nihcc.app.box.com/v/ChestXray-NIHCC) datasets were used to train the model. | |
| Segmentation masks were obtained from the CheXmask [dataset](https://physionet.org/content/chexmask-cxr-segmentation-data/0.4/) ([paper](https://www.nature.com/articles/s41597-024-03358-1)). | |
| The final dataset comprised 335,516 images from 96,385 patients and was split into 80% training/20% validation. A holdout test set was not used since minimal tuning was performed. | |
| The view classifier was trained only on CheXpert images (NIH images excluded from loss function), given that lateral radiographs are only present in CheXpert. | |
| This is to avoid unwanted bias in the model, which can occur if one class originates only from a single dataset. | |
| Validation performance as follows: | |
| ``` | |
| Segmentation (Dice similarity coefficient): | |
| Right Lung: 0.957 | |
| Left Lung: 0.948 | |
| Heart: 0.943 | |
| Age Prediction: | |
| Mean Absolute Error: 5.25 years | |
| Classification: | |
| View (AP, PA, lateral): 99.42% accuracy | |
| Female: 0.999 AUC | |
| ``` | |
| To use the model: | |
| ``` | |
| import cv2 | |
| import torch | |
| from transformers import AutoModel | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| model = AutoModel.from_pretrained("ianpan/chest-x-ray-basic", trust_remote_code=True) | |
| model = model.eval().to(device) | |
| img = cv2.imread(..., 0) | |
| x = model.preprocess(img) # only takes single image as input | |
| x = torch.from_numpy(x).unsqueeze(0).unsqueeze(0) # add channel, batch dims | |
| x = x.float() | |
| with torch.inference_mode(): | |
| out = model(x.to(device)) | |
| ``` | |
| The output is a dictionary which contains 4 keys: | |
| * `mask` has 3 channels containing the segmentation masks. Take the argmax over the channel dimension to create a single image mask (i.e., `out["mask"].argmax(1)`): 1 = right lung, 2 = left lung, 3 = heart. | |
| * `age`, in years. | |
| * `view`, with 3 classes for each possible view. Take the argmax to select the predicted view (i.e., `out["view"].argmax(1)`): 0 = AP, 1 = PA, 2 = lateral. | |
| * `female`, binarize with `out["female"] >= 0.5`. | |
| You can use the segmentation mask to crop the region containing the lungs from the rest of the X-ray. | |
| You can also calculate the [cardiothoracic ratio (CTR)](https://radiopaedia.org/articles/cardiothoracic-ratio?lang=us) using this function: | |
| ``` | |
| import numpy as np | |
| def calculate_ctr(mask): # single mask with dims (height, width) | |
| lungs = np.zeros_like(mask) | |
| lungs[mask == 1] = 1 | |
| lungs[mask == 2] = 1 | |
| heart = (mask == 3).astype("int") | |
| y, x = np.stack(np.where(lungs == 1)) | |
| lung_min = x.min() | |
| lung_max = x.max() | |
| y, x = np.stack(np.where(heart == 1)) | |
| heart_min = x.min() | |
| heart_max = x.max() | |
| lung_range = lung_max - lung_min | |
| heart_range = heart_max - heart_min | |
| return heart_range / lung_range | |
| ``` | |
| If you have `pydicom` installed, you can also load a DICOM image directly: | |
| ``` | |
| img = model.load_image_from_dicom(path_to_dicom) | |
| ``` | |
| This model is for demonstration and research purposes only and has NOT been approved by any regulatory agency for clinical use. | |
| The user assumes any and all responsibility regarding their own use of this model and its outputs. |