A deep learning project for automated lung segmentation in chest X-ray images using PyTorch and U-Net architecture.
This project implements a complete pipeline for lung segmentation in chest X-ray images, including data visualization, preprocessing, model training, and evaluation. The model is trained on a combined dataset of 3,211 chest X-ray images with corresponding lung segmentation masks.
The dataset combines images from three sources:
- Darwin Dataset: 2,507 images (including normal, bacterial, and viral pneumonia cases)
- Montgomery Dataset: 138 images
- Shenzhen Dataset: 566 images
Total: 3,211 image-mask pairs in PNG format
Dataset/ChestXray/
├── CXR_Combined/
│ ├── images/ # 3,211 chest X-ray images
│ └── masks/ # 3,211 corresponding lung masks
├── CXR_RadioOpaque/ # Images with pneumonia (radio-opaque)
├── CXR_RadioOpaque_Mask/
├── CXR_RadioLucent/ # Normal images (radio-lucent)
├── CXR_RadioLucent_Mask/
└── CXR_Selected-Image-Dataset_Log.csv
DARCXR_*.png- Darwin dataset imagesCHNCXR_*_*.png- Shenzhen dataset imagesMCUCXR_*_*.png- Montgomery dataset images
ChestXraySegmentation/
├── visualization.ipynb # Data analysis and visualization
├── training.ipynb # Model training and evaluation
├── README.md # This file
├── train_split.csv # Training set filenames (70%)
├── val_split.csv # Validation set filenames (15%)
├── test_split.csv # Test set filenames (15%)
├── models/ # Saved model checkpoints
│ ├── best_model.pth
│ ├── final_model.pth
│ └── checkpoint_epoch_*.pth
├── results/ # Training results and metrics
│ ├── training_history.json
│ ├── test_metrics.json
│ └── test_detailed_metrics.csv
└── plots/ # Generated visualizations
├── training_curves.png
├── test_predictions.png
└── metrics_distribution.png
Purpose: Analyze and prepare the dataset for training
Features:
- Dataset statistics and distribution analysis
- Image dimension analysis
- Mask coverage percentage calculations
- Train/validation/test split creation (70/15/15)
- Multiple visualization types:
- Dataset source distribution
- Image dimension distributions
- Sample images with mask overlays
- Mask coverage analysis
- Export train/val/test splits to CSV files
Output:
train_split.csv- 2,247 imagesval_split.csv- 482 imagestest_split.csv- 482 images
Purpose: Train U-Net model for lung segmentation
Features:
- Custom PyTorch Dataset with data augmentation
- U-Net architecture implementation (~31M parameters)
- Combined loss function (BCE + Dice Loss)
- GPU acceleration with CUDA support
- Training with early stopping
- Comprehensive metrics (IoU, Dice, Precision, Recall)
- Model checkpointing (best, final, periodic)
- Training visualization and monitoring
- Test set evaluation with per-image metrics
Model Architecture:
- Input: 256×256 grayscale images
- Encoder: 4 downsampling blocks with skip connections
- Bottleneck: 512 channels
- Decoder: 4 upsampling blocks
- Output: Binary segmentation mask
torch>=2.0.0
torchvision>=0.15.0
numpy>=1.24.0
pandas>=2.0.0
matplotlib>=3.7.0
seaborn>=0.12.0
opencv-python>=4.8.0
Pillow>=10.0.0
scikit-learn>=1.3.0
tqdm>=4.65.0
- GPU with CUDA support (recommended for training)
- At least 8GB RAM
- ~5GB free disk space for models and results
# Open and run visualization.ipynb
# This will:
# - Analyze the dataset
# - Create train/val/test splits
# - Generate visualizations
# - Export split CSV files# Open and run training.ipynb
# This will:
# - Load the dataset splits
# - Train the U-Net model on GPU
# - Save model checkpoints
# - Generate training curves
# - Evaluate on test set- Batch Size: 16
- Epochs: 50 (with early stopping)
- Learning Rate: 1e-4
- Optimizer: Adam (weight decay: 1e-5)
- Loss Function: Combined BCE + Dice Loss (alpha=0.5)
- Image Size: 256×256 pixels
- Data Augmentation: Horizontal flips (50% probability)
The model generates the following outputs:
best_model.pth- Model with best validation lossfinal_model.pth- Model after final epochcheckpoint_epoch_*.pth- Periodic checkpoints
- IoU (Intersection over Union): Overlap accuracy
- Dice Coefficient: Segmentation similarity
- Precision: Correct positive predictions
- Recall: Coverage of actual positives
- Training/validation loss curves
- Metric curves (IoU, Dice)
- Sample predictions with ground truth
- Metric distribution histograms
The U-Net model is trained to segment lungs in chest X-ray images with high accuracy. Performance metrics are saved in:
results/training_history.json- Training and validation metrics per epochresults/test_metrics.json- Final test set performanceresults/test_detailed_metrics.csv- Per-image metrics for all test images
Dataset source: Mendeley Data
Original datasets:
- Darwin Dataset: 6,106 images (2,507 selected)
- Montgomery Dataset: 139 images (138 used)
- Shenzhen Dataset: 566 images (100% used)
Dataset preparation: See Dataset/ChestXray/prepare_image_dataset.ipynb
Mrunal Shah
- Email: mrunalnshah@protonmail.com
- GitHub: mrunalnshah
- LinkedIn: mrunalnshah
This project is for educational and research purposes. Please refer to the original dataset licenses for usage restrictions.
- Dataset providers: Darwin, Montgomery, and Shenzhen hospitals
- U-Net architecture: Ronneberger et al. (2015)
- PyTorch framework and community
- The dataset is balanced with radio-opaque (pneumonia) and radio-lucent (normal) images
- Images are automatically resized to 256×256 during training
- GPU is automatically detected and used when available
- Training progress is displayed with progress bars
- All visualizations are automatically saved to the
plots/directory
Out of Memory Error: Reduce batch size in training.ipynb CUDA Not Available: Training will automatically fall back to CPU Missing Splits: Run visualization.ipynb first to generate CSV files Path Errors: Ensure the Dataset/ChestXray/ directory is accessible
For questions or issues, please open an issue on the GitHub repository.