This project focuses on classifying chest X-ray images into four classes: COVID-19, Viral Pneumonia, Lung Opacity, and Normal. It explores deep learning techniques like CNN and Transfer Learning under the challenges of medical image classification and class imbalance.
- Source: Kaggle chest X-ray dataset
- ~19,000 X-ray images (unbalanced across classes)
- Includes segmentation masks for lungs (used for region-focused training)
- Applied lung segmentation masks to focus on regions of interest
- Data augmentations: mild random rotations and flips
- Custom convolutional network trained from scratch
- Used as a performance baseline
- Pretrained on ImageNet
- Fully fine-tuned
- Compared with and without class imbalance strategies
- None (Baseline)
- Weighted Loss: Class weights inversely proportional to frequency
- Oversampling:
WeightedRandomSamplerto balance batches
- Per-class: Precision, Recall, F1-Score
- Macro averages across all classes
- Accuracy (for reference)
- Confusion matrix
- ROC and Precision-Recall curves (per class)
| Model | Weighted Loss | Oversampling | Macro F1 |
|---|---|---|---|
| CNN Baseline | No | No | 0.80 |
| ResNet18 | No | No | 0.89 |
| ResNet18 | Yes | No | 0.86 |
| ResNet18 | No | Yes | 0.90 |
Note: All metrics and plots you can find in notebooks/results.ipynb
- Custom CNN provides a reasonable starting point.
- Transfer learning with ResNet18 outperforms it.
- Oversampling gave the best results in this setup.
- Class Imbalance Strategies was not that effective (minor class had already good scoring)
python >= 3.8
torch >= 1.10
torchvision
scikit-learn
matplotlib
numpy
pandas├── models/ # CNN baseline architecture + save/load model functions
├── notebooks/ # Training and results with visualizations
├── outputs/ # Saved curves and confusion matrix as .png files
├── preprocessing/ # Creating DataLoaders, Data Augmentation, Class Imbalance Strategies functions
├── results/ # Evaluation + Visualizations functions
├── training/ # Training loops
├── utils/ # Other helper functions
├── weights/ # Saved model's weights
├── main.py # Pipeline to train and evaluate model