A deep learning project for classifying COVID-19 chest X-ray images into four categories using Convolutional Neural Networks (CNNs) and Transfer Learning techniques.
This project implements and compares two deep learning approaches for COVID-19 chest X-ray classification:
- Custom CNN Model: A baseline convolutional neural network built from scratch with residual connections and SE (Squeeze-and-Excitation) attention mechanisms
- Transfer Learning Model: A ResNet50-based model using pre-trained weights from ImageNet with fine-tuning
The models classify chest X-ray images into four categories:
- Negative for Pneumonia (Class 0)
- Typical Appearance (Class 1)
- Indeterminate Appearance (Class 2)
- Atypical Appearance (Class 3)
- Data Preparation Pipeline: Automated data loading, preprocessing, and train/validation splitting
- Custom CNN Architecture: Baseline model with residual connections and attention mechanisms
- Transfer Learning: ResNet50-based model with two-phase training (feature extraction + fine-tuning)
- Model Comparison Tools: Comprehensive comparison scripts with visualizations and metrics
- Model Serialization: Save and load trained models with metadata
- GPU Support: Optimized for CUDA-enabled GPUs with TensorFlow
- Class Imbalance Handling: Built-in support for class weights and balanced loss functions
SIIM COVID-19 Dataset - 256px JPG Images
- Source: Kaggle Dataset
- Image Size: 256x256 pixels
- Format: JPG
data/
├── 256px/
│ ├── train/
│ │ └── train/ # Training images
│ └── test/
│ └── test/ # Test images
├── train.csv # Training labels
├── meta_train.csv # Training metadata
├── meta_test.csv # Test metadata
├── train_split.csv # Generated train split
└── val_split.csv # Generated validation split
- Python 3.10
- Conda (recommended) or pip
- NVIDIA GPU with CUDA support (optional, but recommended for faster training)
- CUDA 11.8 or 12.x (for GPU support)
- cuDNN 8.x (matching CUDA version)
# Clone the repository
git clone <repository-url>
cd Covid19-Project
# Create and activate conda environment
conda env create -f environment.yml
conda activate Covid19-env
# Register as Jupyter kernel
python -m ipykernel install --user --name Covid19-env --display-name "Python (Covid19-env)"Linux/Mac/WSL:
chmod +x setup_conda_env.sh
./setup_conda_env.shPython Script:
python setup_conda_env.pypip install -r requirements.txtAfter installation, verify TensorFlow can detect your GPU:
conda activate Covid19-env
python -c "import tensorflow as tf; print('GPU Available:', len(tf.config.list_physical_devices('GPU')) > 0)"Run the data preparation notebook to prepare and split the dataset:
jupyter notebook Covid19_DataPrep.ipynbThis notebook will:
- Load the dataset from the
data/directory - Create train/validation splits
- Generate
train_split.csvandval_split.csv
Train the baseline custom CNN model:
jupyter notebook Covid19_Image_Modeling_1.ipynbKey Features:
- Custom CNN architecture with residual connections
- SE (Squeeze-and-Excitation) attention mechanisms
- Image augmentation (rotation, shifts, zoom, flip)
- Model checkpointing and early stopping
- Comprehensive evaluation metrics
Train the ResNet50-based transfer learning model:
jupyter notebook Covid19_Transfer_Learning.ipynbTraining Strategy:
- Phase 1: Freeze ResNet50 base, train only classification head (30 epochs)
- Phase 2: Unfreeze top layers, fine-tune with lower learning rate (20 epochs)
- Class weight balancing for imbalanced datasets
Compare the performance of both models:
# Using the comparison script
python compare_models.py
# Or in Python
python -c "
from compare_models import ModelComparator, create_default_custom_cnn_metrics, create_default_transfer_learning_metrics
custom_cnn_metrics = create_default_custom_cnn_metrics()
transfer_learning_metrics = create_default_transfer_learning_metrics()
class_labels = {
0: 'Negative for Pneumonia',
1: 'Typical Appearance',
2: 'Indeterminate Appearance',
3: 'Atypical Appearance'
}
comparator = ModelComparator(
custom_cnn_metrics=custom_cnn_metrics,
transfer_learning_metrics=transfer_learning_metrics,
class_labels=class_labels,
output_dir='comparison_results'
)
comparator.run_full_comparison()
"The comparison generates:
- Overall metrics comparison (accuracy, precision, recall, F1-score)
- Per-class metrics comparison
- Visualizations (bar charts)
- Summary report
Covid19-Project/
├── data/ # Dataset directory
│ ├── 256px/ # Image files
│ ├── train.csv # Training labels
│ ├── meta_train.csv # Training metadata
│ ├── meta_test.csv # Test metadata
│ ├── train_split.csv # Generated train split
│ └── val_split.csv # Generated validation split
│
├── models/ # Model directory
│ ├── saved_models/ # Saved model packages
│ └── features/ # Extracted features
│
├── comparison_results/ # Model comparison outputs
│ ├── overall_metrics_comparison.csv
│ ├── per_class_metrics_comparison.csv
│ ├── overall_metrics_comparison.png
│ ├── per_class_metrics_comparison.png
│ └── comparison_summary.txt
│
├── notebooks/
│ ├── Covid19_DataPrep.ipynb # Data preparation
│ ├── Covid19_Image_Modeling_1.ipynb # Custom CNN training
│ ├── Covid19_Transfer_Learning.ipynb # Transfer learning training
│ └── Model_Comparison.ipynb # Model comparison
│
├── compare_models.py # Model comparison script
├── model_serialization.py # Model save/load utilities
├── setup_conda_env.py # Python setup script
├── setup_conda_env.sh # Shell setup script
├── read_logs.py # Log reading utilities
│
├── environment.yml # Conda environment file
├── requirements.txt # pip requirements
├── SETUP_INSTRUCTIONS.md # Detailed setup guide
├── COMPARISON_README.md # Comparison tool documentation
└── README.md # This file
Custom CNN:
- Image Size: 256x256
- Batch Size: 64
- Learning Rate: 0.001
- Epochs: 50
- Number of Classes: 4
Transfer Learning:
- Image Size: 256x256
- Batch Size: 32
- Learning Rate (Phase 1): 0.001
- Learning Rate (Phase 2): 1e-5
- Epochs (Phase 1): 30
- Epochs (Phase 2): 20
- Base Model: ResNet50
Both models use the following augmentation:
- Rotation: ±15 degrees
- Width/Height Shift: 0.1
- Shear: 0.1
- Zoom: 0.1
- Horizontal Flip: Enabled
The project includes tools to compare model performance across multiple metrics:
- Overall Metrics: Accuracy, Precision (weighted/macro), Recall (weighted/macro), F1-Score (weighted/macro)
- Per-Class Metrics: Precision, Recall, F1-Score for each class
- Visualizations: Bar charts comparing both models
- TensorFlow (>=2.15.0) - Deep learning framework with GPU support
- NumPy (>=1.26.4) - Numerical computing
- Pandas (>=2.2.2) - Data manipulation
- Scikit-learn (>=1.2.2) - Machine learning utilities
- Matplotlib (>=3.10.0) - Plotting
- Seaborn (>=0.13.2) - Statistical visualization
- OpenCV (>=4.11.0.86) - Image processing
- Jupyter - Notebook environment
- Joblib (>=1.3.0) - Model serialization
See requirements.txt or environment.yml for complete dependency list.
- Loads and explores the dataset
- Creates train/validation splits
- Generates data statistics and visualizations
- Implements custom CNN architecture
- Trains baseline model from scratch
- Evaluates model performance
- Saves model and metadata
- Implements ResNet50 transfer learning
- Two-phase training strategy
- Handles class imbalance
- Evaluates and saves model
- Compares both models
- Generates comparison visualizations
- Creates summary reports
- Restart the kernel after installing TensorFlow
- Check NVIDIA drivers: Run
nvidia-smiin terminal - For WSL2: Ensure GPU passthrough is enabled
- Alternative: Install TensorFlow CPU-only version if GPU is unavailable
If you encounter package conflicts:
# Remove existing environment
conda env remove -n Covid19-env
# Recreate environment
conda env create -f environment.yml
conda activate Covid19-envEnsure the dataset is properly downloaded and extracted:
- Download from Kaggle
- Extract to
data/directory - Verify CSV files are present
- Dataset: SIIM COVID-19 Dataset on Kaggle
- Base Model: ResNet50 from Keras Applications
- Framework: TensorFlow/Keras