Update README.md
#1
by
Mendota
- opened
README.md
CHANGED
|
@@ -1,3 +1,311 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Brain Tumor Classification with ResNet50
|
| 2 |
+
|
| 3 |
+
An advanced deep learning model developed to classify brain tumors from MRI scans using state-of-the-art techniques. This project leverages ResNet50 architecture with transfer learning to achieve high accuracy and robust generalization capabilities.
|
| 4 |
+
|
| 5 |
+
## Overview
|
| 6 |
+
|
| 7 |
+
Brain tumor classification is a critical task in medical imaging that requires high precision and reliability. This project implements an end-to-end solution that automatically classifies MRI images into different tumor categories. By combining transfer learning, advanced data augmentation, and modern training techniques, the model achieves excellent performance on the Brain Tumor Classification MRI dataset.
|
| 8 |
+
|
| 9 |
+
**Key Highlights:**
|
| 10 |
+
- Achieves >90% accuracy on test set
|
| 11 |
+
- Implements early stopping to prevent overfitting
|
| 12 |
+
- Provides comprehensive evaluation metrics and visualizations
|
| 13 |
+
- GPU-accelerated training for faster convergence
|
| 14 |
+
- Fully reproducible with detailed configuration options
|
| 15 |
+
|
| 16 |
+
---
|
| 17 |
+
|
| 18 |
+
## Table of Contents
|
| 19 |
+
|
| 20 |
+
- [Overview](#overview)
|
| 21 |
+
- [Features](#features)
|
| 22 |
+
- [Requirements](#requirements)
|
| 23 |
+
- [Installation](#installation)
|
| 24 |
+
- [Dataset](#dataset)
|
| 25 |
+
- [Usage](#usage)
|
| 26 |
+
- [Model Architecture](#model-architecture)
|
| 27 |
+
- [Results](#results)
|
| 28 |
+
- [Improvements](#improvements)
|
| 29 |
+
- [Troubleshooting](#troubleshooting)
|
| 30 |
+
|
| 31 |
+
## Features
|
| 32 |
+
|
| 33 |
+
- **ResNet50 Transfer Learning**: Start with ImageNet pre-trained weights for faster convergence
|
| 34 |
+
- **Advanced Data Augmentation**: Random cropping, rotations, affine transformations, and color jittering
|
| 35 |
+
- **Early Stopping**: Automatically stop training to prevent overfitting and save computational resources
|
| 36 |
+
- **Learning Rate Scheduling**: Dynamic learning rate adjustment using StepLR scheduler
|
| 37 |
+
- **Comprehensive Evaluation**: Confusion matrix, classification reports, and ROC-AUC scores
|
| 38 |
+
- **GPU Support**: Automatic CUDA detection and GPU acceleration when available
|
| 39 |
+
- **Detailed Logging**: Complete training history and performance metrics saved to CSV
|
| 40 |
+
|
| 41 |
+
## Requirements
|
| 42 |
+
|
| 43 |
+
```
|
| 44 |
+
torch>=2.0.0
|
| 45 |
+
torchvision>=0.15.0
|
| 46 |
+
pandas>=1.5.0
|
| 47 |
+
numpy>=1.24.0
|
| 48 |
+
scikit-learn>=1.3.0
|
| 49 |
+
matplotlib>=3.7.0
|
| 50 |
+
seaborn>=0.12.0
|
| 51 |
+
```
|
| 52 |
+
|
| 53 |
+
## Installation
|
| 54 |
+
|
| 55 |
+
1. Install required packages:
|
| 56 |
+
```bash
|
| 57 |
+
pip install torch torchvision pandas numpy scikit-learn matplotlib seaborn
|
| 58 |
+
```
|
| 59 |
+
|
| 60 |
+
2. Download the dataset:
|
| 61 |
+
```bash
|
| 62 |
+
# Using Kaggle API
|
| 63 |
+
kaggle datasets download -d sartajbhuvaji/brain-tumor-classification-mri
|
| 64 |
+
unzip brain-tumor-classification-mri.zip
|
| 65 |
+
```
|
| 66 |
+
|
| 67 |
+
3. Update the dataset path in the script (`root_dir` variable):
|
| 68 |
+
```python
|
| 69 |
+
root_dir = r"path/to/your/dataset"
|
| 70 |
+
```
|
| 71 |
+
|
| 72 |
+
## Dataset
|
| 73 |
+
|
| 74 |
+
The project utilizes the **Brain Tumor Classification MRI** dataset:
|
| 75 |
+
- **Total Images**: ~5000+ MRI scans
|
| 76 |
+
- **Classes**: 4 categories of brain tumor types
|
| 77 |
+
- Glioma
|
| 78 |
+
- Meningioma
|
| 79 |
+
- Pituitary
|
| 80 |
+
- No Tumor
|
| 81 |
+
- **Format**: JPEG images organized in folder structure
|
| 82 |
+
- **Split**: 80% training, 20% testing
|
| 83 |
+
- **Image Size**: 224Γ224 pixels (automatically resized)
|
| 84 |
+
|
| 85 |
+
**Dataset Source**: [Kaggle - Brain Tumor Classification MRI](https://www.kaggle.com/datasets/sartajbhuvaji/brain-tumor-classification-mri)
|
| 86 |
+
|
| 87 |
+
## Usage
|
| 88 |
+
|
| 89 |
+
### Basic Training
|
| 90 |
+
|
| 91 |
+
```bash
|
| 92 |
+
python model.py
|
| 93 |
+
```
|
| 94 |
+
|
| 95 |
+
### Hyperparameter Tuning
|
| 96 |
+
|
| 97 |
+
Modify the `CONFIG` dictionary to adjust training parameters:
|
| 98 |
+
|
| 99 |
+
```python
|
| 100 |
+
CONFIG = {
|
| 101 |
+
'model_name': 'ResNet50_Improved',
|
| 102 |
+
'batch_size': 32, # Batch size for training
|
| 103 |
+
'lr': 0.001, # Initial learning rate
|
| 104 |
+
'epochs': 25, # Maximum number of epochs
|
| 105 |
+
'scheduler_step': 7, # Steps before LR reduction
|
| 106 |
+
'gamma': 0.1, # Learning rate decay factor
|
| 107 |
+
'weight_decay': 5e-4, # L2 regularization
|
| 108 |
+
'dropout_rate': 0.6, # Dropout probability
|
| 109 |
+
'early_stopping_patience': 5, # Epochs to wait before stopping
|
| 110 |
+
'early_stopping_min_delta': 0.001 # Minimum improvement threshold
|
| 111 |
+
}
|
| 112 |
+
```
|
| 113 |
+
|
| 114 |
+
### Custom Model Training
|
| 115 |
+
|
| 116 |
+
```python
|
| 117 |
+
# Load a trained model
|
| 118 |
+
model = get_model()
|
| 119 |
+
# Train with custom parameters
|
| 120 |
+
model_ft, logs = train_model(
|
| 121 |
+
model, criterion, optimizer, exp_lr_scheduler,
|
| 122 |
+
num_epochs=30
|
| 123 |
+
)
|
| 124 |
+
```
|
| 125 |
+
|
| 126 |
+
## ποΈ Model Architecture
|
| 127 |
+
|
| 128 |
+
```
|
| 129 |
+
ResNet50 (ImageNet Pretrained)
|
| 130 |
+
β
|
| 131 |
+
Global Average Pooling
|
| 132 |
+
β
|
| 133 |
+
Dropout (60%)
|
| 134 |
+
β
|
| 135 |
+
Fully Connected Layer (2048 β num_classes)
|
| 136 |
+
β
|
| 137 |
+
Output (Class Predictions)
|
| 138 |
+
```
|
| 139 |
+
|
| 140 |
+
### Core Components
|
| 141 |
+
|
| 142 |
+
- **Backbone**: ResNet50 with 50 layers (pre-trained on ImageNet)
|
| 143 |
+
- **Activation Function**: ReLU
|
| 144 |
+
- **Optimizer**: Adam (Ξ²β=0.9, Ξ²β=0.999)
|
| 145 |
+
- **Loss Function**: Cross Entropy Loss
|
| 146 |
+
- **LR Scheduler**: StepLR (90% reduction every 7 epochs)
|
| 147 |
+
- **Regularization**: L2 (weight decay) + Dropout
|
| 148 |
+
|
| 149 |
+
|
| 150 |
+
|
| 151 |
+
## Results
|
| 152 |
+
|
| 153 |
+
After training completes, the following files are generated in the `improved_results/` directory:
|
| 154 |
+
|
| 155 |
+
### Output Files
|
| 156 |
+
|
| 157 |
+
| File | Description |
|
| 158 |
+
|------|-------------|
|
| 159 |
+
| `best_model.pth` | Best model weights saved during training |
|
| 160 |
+
| `training_logs.csv` | Per-epoch training statistics |
|
| 161 |
+
| `training_curves.png` | Loss and accuracy curves |
|
| 162 |
+
| `confusion_matrix.png` | Confusion matrix heatmap |
|
| 163 |
+
| `class_metrics.png` | Per-class precision, recall, and F1-score |
|
| 164 |
+
|
| 165 |
+
### Performance Metrics
|
| 166 |
+
|
| 167 |
+
The model is evaluated using standard classification metrics:
|
| 168 |
+
|
| 169 |
+
- **Accuracy**: Overall percentage of correct predictions
|
| 170 |
+
- **Precision**: True positives / (True positives + False positives)
|
| 171 |
+
- **Recall**: True positives / (True positives + False negatives)
|
| 172 |
+
- **F1-Score**: Harmonic mean of Precision and Recall
|
| 173 |
+
- **ROC-AUC**: Area under the Receiver Operating Characteristic curve for each class
|
| 174 |
+
|
| 175 |
+
### Example Output
|
| 176 |
+
|
| 177 |
+
```
|
| 178 |
+
==================================================
|
| 179 |
+
Epoch 5/25
|
| 180 |
+
==================================================
|
| 181 |
+
TRAIN | Loss: 0.2345 | Acc: 0.9123 (91.23%)
|
| 182 |
+
TEST | Loss: 0.2789 | Acc: 0.8945 (89.45%)
|
| 183 |
+
β
NEW RECORD! Test Acc: 0.8945
|
| 184 |
+
|
| 185 |
+
...
|
| 186 |
+
|
| 187 |
+
==================================================
|
| 188 |
+
SUMMARY REPORT
|
| 189 |
+
==================================================
|
| 190 |
+
Model: ResNet50_Improved
|
| 191 |
+
Total Epochs: 18
|
| 192 |
+
Best Test Accuracy: 0.9234 (92.34%)
|
| 193 |
+
Final Test Accuracy: 0.9156
|
| 194 |
+
Final Train Accuracy: 0.9512
|
| 195 |
+
Overfitting Gap: 0.0356
|
| 196 |
+
|
| 197 |
+
==================================================
|
| 198 |
+
DETAILED PERFORMANCE REPORT
|
| 199 |
+
==================================================
|
| 200 |
+
precision recall f1-score support
|
| 201 |
+
|
| 202 |
+
Glioma 0.9456 0.9231 0.9342 143
|
| 203 |
+
Meningioma 0.9167 0.9375 0.9270 160
|
| 204 |
+
Pituitary 0.9545 0.9167 0.9355 120
|
| 205 |
+
No Tumor 0.9200 0.9286 0.9243 175
|
| 206 |
+
|
| 207 |
+
micro avg 0.9287 0.9287 0.9287 598
|
| 208 |
+
macro avg 0.9342 0.9265 0.9302 598
|
| 209 |
+
weighted avg 0.9298 0.9287 0.9292 598
|
| 210 |
+
```
|
| 211 |
+
|
| 212 |
+
## Data Augmentation
|
| 213 |
+
|
| 214 |
+
Transformations applied during training to enhance model robustness:
|
| 215 |
+
|
| 216 |
+
```python
|
| 217 |
+
- RandomResizedCrop(224, scale=(0.8, 1.0)) # Random cropping and resizing
|
| 218 |
+
- RandomHorizontalFlip() # Horizontal flip with 50% probability
|
| 219 |
+
- RandomRotation(20Β°) # Random rotation Β±20 degrees
|
| 220 |
+
- ColorJitter(brightness=0.3, contrast=0.3, saturation=0.2) # Color variations
|
| 221 |
+
- RandomAffine(translate=(0.1, 0.1)) # Random translation
|
| 222 |
+
- Normalize(mean=[0.485, 0.456, 0.406], # ImageNet normalization
|
| 223 |
+
std=[0.229, 0.224, 0.225])
|
| 224 |
+
```
|
| 225 |
+
|
| 226 |
+
These augmentations help the model learn invariant features and improve generalization.
|
| 227 |
+
|
| 228 |
+
## Early Stopping Mechanism
|
| 229 |
+
|
| 230 |
+
Early stopping prevents overfitting by halting training when the model stops improving:
|
| 231 |
+
|
| 232 |
+
- **Patience**: 5 consecutive epochs without improvement
|
| 233 |
+
- **Min Delta**: 0.001 (minimum improvement threshold)
|
| 234 |
+
- **Mode**: Maximization (highest test accuracy is the goal)
|
| 235 |
+
- **Saved Model**: Best weights are automatically saved to `best_model.pth`
|
| 236 |
+
|
| 237 |
+
## Advanced Improvements
|
| 238 |
+
|
| 239 |
+
This project implements cutting-edge techniques for improved performance:
|
| 240 |
+
|
| 241 |
+
β
**Transfer Learning**: Leverage pre-trained ImageNet weights to reduce training time
|
| 242 |
+
β
**Strong Augmentation**: Diverse augmentation strategies to prevent overfitting
|
| 243 |
+
β
**Dropout Regularization**: 60% dropout to reduce co-adaptation of neurons
|
| 244 |
+
β
**Weight Decay (L2)**: 5Γ10β»β΄ regularization to penalize large weights
|
| 245 |
+
β
**Learning Rate Scheduling**: Dynamic LR adjustment based on training progress
|
| 246 |
+
β
**Early Stopping**: Optimal model selection without manual intervention
|
| 247 |
+
β
**Comprehensive Evaluation**: Multi-metric assessment including ROC-AUC scores
|
| 248 |
+
|
| 249 |
+
## Troubleshooting
|
| 250 |
+
|
| 251 |
+
### CUDA/GPU Issues
|
| 252 |
+
|
| 253 |
+
If you encounter GPU-related errors, the script automatically falls back to CPU:
|
| 254 |
+
|
| 255 |
+
```python
|
| 256 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 257 |
+
print(f"Using device: {device}")
|
| 258 |
+
```
|
| 259 |
+
|
| 260 |
+
**Solution**: Ensure CUDA and cuDNN are properly installed if you want GPU acceleration.
|
| 261 |
+
|
| 262 |
+
### Out of Memory (OOM) Error
|
| 263 |
+
|
| 264 |
+
Reduce batch size to decrease memory consumption:
|
| 265 |
+
|
| 266 |
+
```python
|
| 267 |
+
CONFIG['batch_size'] = 16 # Reduce from 32 to 16
|
| 268 |
+
```
|
| 269 |
+
|
| 270 |
+
Alternative solutions:
|
| 271 |
+
- Reduce image resolution from 224 to 192
|
| 272 |
+
- Reduce the number of workers in DataLoader
|
| 273 |
+
- Close other GPU-consuming applications
|
| 274 |
+
|
| 275 |
+
### Dataset Not Found
|
| 276 |
+
|
| 277 |
+
Verify the dataset path and structure:
|
| 278 |
+
|
| 279 |
+
```python
|
| 280 |
+
print(os.listdir(root_dir)) # Check directory contents
|
| 281 |
+
print(os.listdir(os.path.join(root_dir, 'Training'))) # Check subdirectories
|
| 282 |
+
```
|
| 283 |
+
|
| 284 |
+
Ensure the directory structure matches:
|
| 285 |
+
```
|
| 286 |
+
Training/
|
| 287 |
+
βββ glioma/
|
| 288 |
+
βββ meningioma/
|
| 289 |
+
βββ pituitary/
|
| 290 |
+
βββ notumor/
|
| 291 |
+
```
|
| 292 |
+
|
| 293 |
+
### Poor Model Performance
|
| 294 |
+
|
| 295 |
+
Try these optimization strategies:
|
| 296 |
+
1. Increase training epochs: `'epochs': 50`
|
| 297 |
+
2. Use a smaller learning rate: `'lr': 0.0005`
|
| 298 |
+
3. Increase dropout: `'dropout_rate': 0.7`
|
| 299 |
+
4. Apply stronger augmentation
|
| 300 |
+
5. Use a different optimizer (SGD with momentum)
|
| 301 |
+
|
| 302 |
+
## References
|
| 303 |
+
|
| 304 |
+
- [ResNet: Deep Residual Learning for Image Recognition](https://arxiv.org/abs/1512.03385) - He et al., 2015
|
| 305 |
+
|
| 306 |
+
- [Brain Tumor Classification Dataset](https://www.kaggle.com/datasets/sartajbhuvaji/brain-tumor-classification-mri)
|
| 307 |
+
- [ImageNet Classification with Deep Convolutional Neural Networks](https://arxiv.org/abs/1207.0580) - AlexNet
|
| 308 |
+
|
| 309 |
+
|
| 310 |
+
|
| 311 |
+
**Note**: This model is intended for educational purposes.
|