A CNN built from scratch (no pretrained models) to classify 8 types of blood cells from microscopic images, achieving 93.8% accuracy on a confidential hidden test set.
This project was completed as part of Deep Learning Fundamentals (COMP SCI 7318) at the University of Adelaide. The task was to design, implement, and evaluate a deep learning model for classifying microscopic blood cell images into 8 categories (Basophil, Eosinophil, Erythroblast, Immature Granulocyte, Lymphocyte, Monocyte, Neutrophil, Platelet), using 3,200 training images.
| Model | Parameters | Epochs | Val Accuracy |
|---|---|---|---|
| SVM (baseline) | N/A | - | 69.38% |
| Simple CNN (baseline) | 10,344 | 30 | 81.25% |
| Main model (BatchNorm + Dropout) | 163,848 | 30 | 87.97% |
| Main model (extended training) | 163,848 | 50 | 90.16% |
| Final model (BatchNorm only) | 163,848 | 30 | 96.25% |
Hidden test set (GradeScope autograder): 93.8%
- Designed a 3-block CNN (3→32→64→128 channels) with 2 fully-connected layers, built entirely from scratch in PyTorch.
- Applied data augmentation (horizontal flip, rotation, colour jitter) tailored to microscope image characteristics.
- Compared against SVM and a simple CNN baseline to contextualise performance.
- Ran a systematic ablation study on BatchNorm and Dropout, finding that Dropout caused over-regularisation on this dataset.
- Verified the finding wasn't due to undertraining by running the BatchNorm+Dropout model for an extra 20 epochs (50 total) — it still underperformed the BatchNorm-only model by 6.09%p, despite the additional training time.
More regularisation isn't always better. On this relatively small, well-balanced dataset, BatchNorm alone (combined with data augmentation) provided sufficient regularisation, while adding Dropout actively hurt performance by over-constraining the model's representational capacity — a pattern confirmed by both extended training and the final hidden test set result.
Python, PyTorch, scikit-learn, NumPy
Full methodology, related work, and discussion available in report.pdf, main.ipynb.