diff options
| author | Vineet Kumar <git@vineetk.net> | 2026-04-21 23:58:24 -0400 |
|---|---|---|
| committer | Vineet Kumar <git@vineetk.net> | 2026-04-21 23:58:24 -0400 |
| commit | a54bcf2255337052808ea2312cbd418c6a5f89a4 (patch) | |
| tree | e5bae0500b0b41121d6c38acff6e2ae501d394ae | |
| parent | 443033a57e93ae73785c063116f54ec26b903beb (diff) | |
add final report
| -rw-r--r-- | .gitignore | 6 | ||||
| -rw-r--r-- | references.bib | 48 | ||||
| -rw-r--r-- | report.org | 462 |
3 files changed, 514 insertions, 2 deletions
| @@ -1,7 +1,9 @@ | |||
| 1 | *~ | 1 | *~ |
| 2 | .claude/ | ||
| 3 | __pycache__/ | 2 | __pycache__/ |
| 4 | guix-root | 3 | guix-root |
| 5 | guix-root-1-link | 4 | guix-root-1-link |
| 6 | results/ | 5 | results/ |
| 7 | venv/ \ No newline at end of file | 6 | venv/ |
| 7 | report.tex | ||
| 8 | report.pdf | ||
| 9 | report.bbl | ||
diff --git a/references.bib b/references.bib new file mode 100644 index 0000000..1a50b8e --- /dev/null +++ b/references.bib | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | @inproceedings{he2016deep, | ||
| 2 | author = {He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian}, | ||
| 3 | title = {Deep Residual Learning for Image Recognition}, | ||
| 4 | booktitle = {Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, | ||
| 5 | year = {2016}, | ||
| 6 | pages = {770--778}, | ||
| 7 | } | ||
| 8 | |||
| 9 | @inproceedings{tan2019efficientnet, | ||
| 10 | author = {Tan, Mingxing and Le, Quoc V.}, | ||
| 11 | title = {{EfficientNet}: Rethinking Model Scaling for Convolutional Neural Networks}, | ||
| 12 | booktitle = {Proceedings of the 36th International Conference on Machine Learning (ICML)}, | ||
| 13 | year = {2019}, | ||
| 14 | pages = {6105--6114}, | ||
| 15 | } | ||
| 16 | |||
| 17 | @inproceedings{dosovitskiy2021image, | ||
| 18 | author = {Dosovitskiy, Alexey and Beyer, Lucas and Kolesnikov, Alexander and Weissenborn, Dirk and Zhai, Xiaohua and Unterthiner, Thomas and Dehghani, Mostafa and Minderer, Matthias and Heigold, Georg and Gelly, Sylvain and Uszkoreit, Jakob and Houlsby, Neil}, | ||
| 19 | title = {An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale}, | ||
| 20 | booktitle = {International Conference on Learning Representations (ICLR)}, | ||
| 21 | year = {2021}, | ||
| 22 | } | ||
| 23 | |||
| 24 | @inproceedings{lin2017focal, | ||
| 25 | author = {Lin, Tsung-Yi and Goyal, Priya and Girshick, Ross and He, Kaiming and Doll{\'a}r, Piotr}, | ||
| 26 | title = {Focal Loss for Dense Object Detection}, | ||
| 27 | booktitle = {Proceedings of the IEEE International Conference on Computer Vision (ICCV)}, | ||
| 28 | year = {2017}, | ||
| 29 | pages = {2980--2988}, | ||
| 30 | } | ||
| 31 | |||
| 32 | @incollection{zuiderveld1994clahe, | ||
| 33 | author = {Zuiderveld, Karel}, | ||
| 34 | title = {Contrast Limited Adaptive Histogram Equalization}, | ||
| 35 | booktitle = {Graphics Gems {IV}}, | ||
| 36 | editor = {Heckbert, Paul S.}, | ||
| 37 | publisher = {Academic Press}, | ||
| 38 | year = {1994}, | ||
| 39 | pages = {474--485}, | ||
| 40 | } | ||
| 41 | |||
| 42 | @misc{amanneo2022dr, | ||
| 43 | author = {Amanneo}, | ||
| 44 | title = {Diabetic Retinopathy Resized Arranged}, | ||
| 45 | year = {2022}, | ||
| 46 | publisher = {Kaggle}, | ||
| 47 | url = {https://www.kaggle.com/datasets/amanneo/diabetic-retinopathy-resized-arranged}, | ||
| 48 | } | ||
diff --git a/report.org b/report.org new file mode 100644 index 0000000..044e888 --- /dev/null +++ b/report.org | |||
| @@ -0,0 +1,462 @@ | |||
| 1 | #+title: Diabetic Retinopathy Classification -- Final Report | ||
| 2 | #+subtitle: EEL4759: Digital Image Processing | ||
| 3 | #+author: Vineet Kumar | ||
| 4 | #+options: toc:nil | ||
| 5 | #+cite_export: biblatex | ||
| 6 | #+bibliography: references.bib | ||
| 7 | #+latex_class_options: [12pt,letterpage] | ||
| 8 | #+latex_header: \usepackage[margin=1in]{geometry} | ||
| 9 | #+latex_header: \usepackage{booktabs} | ||
| 10 | #+latex_header: \usepackage{float} | ||
| 11 | #+latex_header: \usepackage{graphicx} | ||
| 12 | |||
| 13 | * Abstract | ||
| 14 | |||
| 15 | This report covers automated severity grading of diabetic retinopathy | ||
| 16 | (DR) from retinal images using deep convolutional neural | ||
| 17 | networks. Three pretrained architectures (ResNet-50, EfficientNet-B0, | ||
| 18 | and ViT-B/16) were fine-tuned on the Kaggle "Diabetic Retinopathy | ||
| 19 | Resized Arranged" dataset and evaluated on a five-class severity | ||
| 20 | classification task (Healthy through Proliferative DR). Each model was | ||
| 21 | trained with and without CLAHE (Contrast Limited Adaptive Histogram | ||
| 22 | Equalization) preprocessing to assess its effect on classification | ||
| 23 | performance. Class imbalance was addressed via sqrt-inverse-frequency | ||
| 24 | weighted sampling and Focal Loss. At 384\times{}384 pixel resolution, | ||
| 25 | ResNet-50 and EfficientNet-B0 achieved 0.80 overall accuracy and | ||
| 26 | weighted F1-scores of 0.77 and 0.78 respectively. ViT-B/16 was | ||
| 27 | constrained to 224\times{}224 and achieved 0.69 accuracy. CLAHE | ||
| 28 | improved detection of minority classes (particularly Mild NPDR) at a | ||
| 29 | small cost to overall accuracy. Mild NPDR remained the hardest class | ||
| 30 | to classify across all experiments, with F1-scores no higher than 0.17 | ||
| 31 | due to its visual similarity to healthy retinal images. | ||
| 32 | |||
| 33 | * Introduction | ||
| 34 | |||
| 35 | ** Diabetic Retinopathy | ||
| 36 | |||
| 37 | Diabetic retinopathy is a progressive eye disease caused by diabetes | ||
| 38 | that is one of the leading causes of preventable vision loss | ||
| 39 | worldwide. It develops when high blood sugar damages the retinal blood | ||
| 40 | vessels, causing leakage, abnormal blood vessel growth, and eventually | ||
| 41 | retinal detachment if untreated. The disease is classified into five | ||
| 42 | severity grades: no retinopathy (Healthy), Mild Non-Proliferative DR | ||
| 43 | (NPDR), Moderate NPDR, Severe NPDR, and Proliferative DR. Early | ||
| 44 | detection through systematic retinal screening can prevent up to 90% | ||
| 45 | of severe vision loss cases. Manual grading by trained specialists is | ||
| 46 | accurate but expensive and slow, making automated image classification | ||
| 47 | useful for large-scale screening programs. | ||
| 48 | |||
| 49 | ** Convolutional Neural Networks for Retinal Image Classification | ||
| 50 | |||
| 51 | Convolutional neural networks (CNNs) have become the dominant approach | ||
| 52 | for medical image classification tasks. Rather than hand-crafting | ||
| 53 | features, CNNs learn hierarchical representations (low-level edges and | ||
| 54 | textures in early layers, progressively more abstract features in | ||
| 55 | deeper layers) directly from training data. For retinal imaging, | ||
| 56 | pretrained ImageNet models (transfer learning) are effective: the | ||
| 57 | low-level filters learned on natural images transfer well to retinal | ||
| 58 | images, and fine-tuning on DR data allows the network to specialize to | ||
| 59 | lesion-specific features such as microaneurysms, hard exudates, and | ||
| 60 | hemorrhages that distinguish severity grades. This project compares | ||
| 61 | three architectures spanning different design philosophies: ResNet-50 | ||
| 62 | (residual connections), EfficientNet-B0 (compound scaling), and | ||
| 63 | ViT-B/16 (pure self-attention on image patches). | ||
| 64 | |||
| 65 | ** Existing Model Performance | ||
| 66 | |||
| 67 | The Kaggle Diabetic Retinopathy detection competitions have | ||
| 68 | established rough baselines for this type of task. On five-class | ||
| 69 | grading datasets similar to the one used here, top-performing single | ||
| 70 | models typically achieve quadratic weighted kappa scores in the | ||
| 71 | 0.82--0.86 range using heavily tuned ensembles, test-time | ||
| 72 | augmentation, and competition-grade preprocessing. More comparable | ||
| 73 | single-model baselines reported on Kaggle notebooks for the "Diabetic | ||
| 74 | Retinopathy Resized Arranged" dataset (224\times{}224) report | ||
| 75 | accuracies of roughly 0.60--0.73 and kappa values around 0.50--0.58 | ||
| 76 | for standard fine-tuned CNNs, which is consistent with the results | ||
| 77 | obtained in this project's 224px training run. | ||
| 78 | |||
| 79 | * Methodology | ||
| 80 | |||
| 81 | ** Dataset and Class Distribution | ||
| 82 | |||
| 83 | The dataset used is "Diabetic Retinopathy Resized Arranged" | ||
| 84 | [cite:@amanneo2022dr], containing 35,126 retinal images organized into | ||
| 85 | five class-labeled folders. The images are JPEG files at approximately | ||
| 86 | 1024\times{}768 pixel resolution. The dataset was split into 70% | ||
| 87 | training, 15% validation, and 15% test sets using stratified sampling | ||
| 88 | to preserve the class distribution across all splits (scikit-learn's | ||
| 89 | =train_test_split= with =stratify=, seed 42). | ||
| 90 | |||
| 91 | #+begin_export latex | ||
| 92 | \begin{table}[H] | ||
| 93 | \centering | ||
| 94 | \caption{Dataset class distribution (test split, 5,269 images).} | ||
| 95 | \begin{tabular}{clrr} | ||
| 96 | \toprule | ||
| 97 | Class & Grade & Test Count & Test \% \\ | ||
| 98 | \midrule | ||
| 99 | 0 & Healthy & 3,872 & 73.5\% \\ | ||
| 100 | 1 & Mild NPDR & 366 & 6.9\% \\ | ||
| 101 | 2 & Moderate NPDR & 794 & 15.1\% \\ | ||
| 102 | 3 & Severe NPDR & 131 & 2.5\% \\ | ||
| 103 | 4 & Proliferative DR & 106 & 2.0\% \\ | ||
| 104 | \bottomrule | ||
| 105 | \end{tabular} | ||
| 106 | \end{table} | ||
| 107 | #+end_export | ||
| 108 | |||
| 109 | The dataset is severely imbalanced: the Healthy class accounts for | ||
| 110 | nearly 74% of all samples, while Severe NPDR and Proliferative DR | ||
| 111 | together comprise only 4.5%. | ||
| 112 | |||
| 113 | ** Models | ||
| 114 | |||
| 115 | Three ImageNet-pretrained architectures were fine-tuned for 5-class DR | ||
| 116 | severity classification. In all cases the original classification head | ||
| 117 | was replaced with a linear layer mapping to 5 outputs, and all | ||
| 118 | backbone weights were unfrozen for full fine-tuning. | ||
| 119 | |||
| 120 | - ResNet-50 [cite:@he2016deep]: Deep residual network with skip | ||
| 121 | connections. The final fully connected layer (2048 \to 5) was | ||
| 122 | replaced. Input: 384\times{}384. | ||
| 123 | |||
| 124 | - EfficientNet-B0 [cite:@tan2019efficientnet]: Compound-scaled network | ||
| 125 | optimizing width, depth, and resolution simultaneously. The | ||
| 126 | classifier head (=Dropout(0.2)= + Linear 1280 \to 5) was replaced. | ||
| 127 | Input: 384\times{}384. | ||
| 128 | |||
| 129 | - ViT-B/16 [cite:@dosovitskiy2021image]: Vision Transformer that | ||
| 130 | splits the image into 16\times{}16 pixel patches and processes them | ||
| 131 | with multi-head self-attention. The projection head (768 \to 5) was | ||
| 132 | replaced. Input: 224\times{}224 (PyTorch's ViT-B/16 implementation | ||
| 133 | only supports 224\times{}224 input; higher resolutions are not | ||
| 134 | supported without custom modifications to the model). | ||
| 135 | |||
| 136 | ** Preprocessing and Augmentation | ||
| 137 | |||
| 138 | Images were resized from their native ~1024\times{}768 resolution to | ||
| 139 | the model's target input resolution (384\times{}384 for ResNet-50 and | ||
| 140 | EfficientNet-B0; 224\times{}224 for ViT-B/16) as the first | ||
| 141 | preprocessing step. | ||
| 142 | |||
| 143 | CLAHE (Contrast Limited Adaptive Histogram Equalization) | ||
| 144 | [cite:@zuiderveld1994clahe] was applied as an optional subsequent | ||
| 145 | preprocessing step. The transform converts the image from RGB to LAB | ||
| 146 | color space, applies =cv2.createCLAHE= (clip limit 2.0, tile grid | ||
| 147 | 8\times{}8) to the L (lightness) channel only, and converts back to | ||
| 148 | RGB. Operating on the lightness channel alone | ||
| 149 | enhances local contrast in retinal structures such as vessels and | ||
| 150 | lesions without altering hue or saturation. | ||
| 151 | |||
| 152 | The training augmentation pipeline (applied after CLAHE if enabled): | ||
| 153 | |||
| 154 | 1. =RandomResizedCrop= to target resolution, scale 0.8--1.0 | ||
| 155 | 2. =RandomHorizontalFlip= (p=0.5), =RandomVerticalFlip= (p=0.5) | ||
| 156 | 3. =RandomRotation=(\pm{}30\textdegree) | ||
| 157 | 4. =ColorJitter= (brightness 0.3, contrast 0.3, saturation 0.2, hue | ||
| 158 | 0.02) | ||
| 159 | 5. =GaussianBlur= (kernel 3, \sigma{} 0.1--1.0) | ||
| 160 | 6. Normalize to ImageNet mean/std | ||
| 161 | |||
| 162 | Validation and test images were resized to the target resolution | ||
| 163 | deterministically (no random crop) and normalized identically. | ||
| 164 | |||
| 165 | ** Class Imbalance Handling | ||
| 166 | |||
| 167 | Two complementary mechanisms addressed the severe class imbalance: | ||
| 168 | |||
| 169 | - WeightedRandomSampler: Each training sample was assigned a weight | ||
| 170 | proportional to $1/\sqrt{n_c}$ where $n_c$ is the count of its | ||
| 171 | class. The square-root weighting provides a moderate upsampling of | ||
| 172 | minority classes without completely drowning the majority-class | ||
| 173 | signal (which full inverse-frequency weighting was found to do). | ||
| 174 | |||
| 175 | - Focal Loss [cite:@lin2017focal]: The loss function | ||
| 176 | $\mathrm{FL}(p_t) = -(1-p_t)^\gamma \log(p_t)$ with $\gamma=2$ | ||
| 177 | down-weights easy, well-classified examples and focuses gradient | ||
| 178 | updates on hard misclassifications, which helps with minority classes | ||
| 179 | where the model initially predicts low confidence. | ||
| 180 | |||
| 181 | ** Training Configuration | ||
| 182 | |||
| 183 | #+begin_export latex | ||
| 184 | \begin{table}[H] | ||
| 185 | \centering | ||
| 186 | \caption{Hyperparameters used for all experiments.} | ||
| 187 | \begin{tabular}{ll} | ||
| 188 | \toprule | ||
| 189 | Hyperparameter & Value \\ | ||
| 190 | \midrule | ||
| 191 | Optimizer & AdamW \\ | ||
| 192 | Head learning rate & 1e-4 \\ | ||
| 193 | Backbone learning rate & 1e-5 ($10\times$ lower) \\ | ||
| 194 | Weight decay & 1e-4 \\ | ||
| 195 | Batch size & 256 \\ | ||
| 196 | Max epochs & 50 \\ | ||
| 197 | Early stopping & patience 10, monitor val macro F1 \\ | ||
| 198 | LR warmup & 3 epochs linear ($0.1\times \to 1\times$) \\ | ||
| 199 | LR schedule & Cosine annealing after warmup \\ | ||
| 200 | Gradient clipping & max norm 1.0 \\ | ||
| 201 | Mixed precision & \texttt{torch.amp.autocast} + GradScaler \\ | ||
| 202 | Hardware & $2\times$ AMD Radeon RX 7900 XTX (ROCm) \\ | ||
| 203 | Random seed & 42 \\ | ||
| 204 | \bottomrule | ||
| 205 | \end{tabular} | ||
| 206 | \end{table} | ||
| 207 | #+end_export | ||
| 208 | |||
| 209 | A discriminative learning rate was used: the pretrained backbone was | ||
| 210 | trained at 1e-5 while the newly initialized classification head was | ||
| 211 | trained at the full 1e-4. This prevents the pretrained features from | ||
| 212 | being overwritten too quickly in early epochs. | ||
| 213 | |||
| 214 | ** Evaluation Metrics | ||
| 215 | |||
| 216 | Each trained model was evaluated on the held-out test set using: | ||
| 217 | |||
| 218 | - Accuracy: fraction of correctly classified samples | ||
| 219 | - Weighted F1: F1 averaged over classes weighted by support; reflects | ||
| 220 | overall performance on the imbalanced distribution | ||
| 221 | - Macro F1: F1 averaged equally over all 5 classes; better reflects | ||
| 222 | performance on minority classes | ||
| 223 | - Quadratic-weighted Cohen's Kappa: measures inter-rater agreement | ||
| 224 | beyond chance; the quadratic weighting penalizes predictions further | ||
| 225 | from the true label more heavily, which is appropriate for the | ||
| 226 | ordinal DR severity scale | ||
| 227 | |||
| 228 | * Results | ||
| 229 | |||
| 230 | ** Summary of Test-Set Performance | ||
| 231 | |||
| 232 | #+begin_export latex | ||
| 233 | \begin{table}[H] | ||
| 234 | \centering | ||
| 235 | \caption{Test-set metrics for all six experiments at $384\times384$ (ResNet-50, EfficientNet-B0) and $224\times224$ (ViT-B/16).} | ||
| 236 | \begin{tabular}{llccc} | ||
| 237 | \toprule | ||
| 238 | Model & CLAHE & Accuracy & Weighted F1 & Macro F1 \\ | ||
| 239 | \midrule | ||
| 240 | ResNet-50 & No & 0.80 & 0.77 & 0.51 \\ | ||
| 241 | ResNet-50 & Yes & 0.78 & 0.77 & 0.53 \\ | ||
| 242 | EfficientNet-B0 & No & 0.80 & 0.78 & 0.52 \\ | ||
| 243 | EfficientNet-B0 & Yes & 0.78 & 0.76 & 0.51 \\ | ||
| 244 | ViT-B/16 & No & 0.68 & 0.69 & 0.47 \\ | ||
| 245 | ViT-B/16 & Yes & 0.69 & 0.71 & 0.49 \\ | ||
| 246 | \bottomrule | ||
| 247 | \end{tabular} | ||
| 248 | \end{table} | ||
| 249 | #+end_export | ||
| 250 | |||
| 251 | ** Per-Class F1 Scores | ||
| 252 | |||
| 253 | #+begin_export latex | ||
| 254 | \begin{table}[H] | ||
| 255 | \centering | ||
| 256 | \caption{Per-class F1-score for all six experiments.} | ||
| 257 | \begin{tabular}{lccccc} | ||
| 258 | \toprule | ||
| 259 | Model / CLAHE & Healthy & Mild NPDR & Moderate NPDR & Severe NPDR & Proliferative DR \\ | ||
| 260 | \midrule | ||
| 261 | ResNet-50 / No & 0.90 & 0.09 & 0.57 & 0.50 & 0.52 \\ | ||
| 262 | ResNet-50 / Yes & 0.89 & 0.17 & 0.53 & 0.45 & 0.61 \\ | ||
| 263 | EfficientNet-B0 / No & 0.90 & 0.10 & 0.57 & 0.45 & 0.58 \\ | ||
| 264 | EfficientNet-B0 / Yes & 0.88 & 0.11 & 0.54 & 0.45 & 0.60 \\ | ||
| 265 | ViT-B/16 / No & 0.81 & 0.14 & 0.43 & 0.43 & 0.51 \\ | ||
| 266 | ViT-B/16 / Yes & 0.83 & 0.17 & 0.45 & 0.45 & 0.56 \\ | ||
| 267 | \bottomrule | ||
| 268 | \end{tabular} | ||
| 269 | \end{table} | ||
| 270 | #+end_export | ||
| 271 | |||
| 272 | ** Effect of Input Resolution (224px vs 384px) | ||
| 273 | |||
| 274 | The experiments were run twice: an initial run at 224\times{}224 and a | ||
| 275 | subsequent run at 384\times{}384 for ResNet-50 and | ||
| 276 | EfficientNet-B0. ViT-B/16 was kept at 224\times{}224 in both runs. The | ||
| 277 | resolution increase produced a substantial improvement for the CNN | ||
| 278 | models. | ||
| 279 | |||
| 280 | #+begin_export latex | ||
| 281 | \begin{table}[H] | ||
| 282 | \centering | ||
| 283 | \caption{Comparison of 224px (initial run) vs 384px (final run) test-set results for CNN models. ViT results shown for reference; both runs used 224px.} | ||
| 284 | \resizebox{\linewidth}{!}{% | ||
| 285 | \footnotesize | ||
| 286 | \begin{tabular}{llccccccc} | ||
| 287 | \toprule | ||
| 288 | Model & CLAHE & Acc (224px) & W-F1 (224px) & M-F1 (224px) & Kappa (224px) & Acc (384px) & W-F1 (384px) & M-F1 (384px) \\ | ||
| 289 | \midrule | ||
| 290 | ResNet-50 & No & 0.61 & 0.66 & 0.46 & 0.53 & 0.80 & 0.77 & 0.51 \\ | ||
| 291 | ResNet-50 & Yes & 0.61 & 0.65 & 0.44 & 0.52 & 0.78 & 0.77 & 0.53 \\ | ||
| 292 | EfficientNet-B0 & No & 0.61 & 0.65 & 0.46 & 0.55 & 0.80 & 0.78 & 0.52 \\ | ||
| 293 | EfficientNet-B0 & Yes & 0.62 & 0.66 & 0.45 & 0.54 & 0.78 & 0.76 & 0.51 \\ | ||
| 294 | ViT-B/16 & No & 0.68 & 0.69 & 0.47 & 0.53 & 0.68 & 0.69 & 0.47 \\ | ||
| 295 | ViT-B/16 & Yes & 0.67 & 0.69 & 0.48 & 0.56 & 0.69 & 0.71 & 0.49 \\ | ||
| 296 | \bottomrule | ||
| 297 | \end{tabular}% | ||
| 298 | } | ||
| 299 | \end{table} | ||
| 300 | #+end_export | ||
| 301 | |||
| 302 | Accuracy for ResNet-50 and EfficientNet-B0 improved by approximately | ||
| 303 | 19 percentage points (0.61 \to 0.80) with the resolution increase. The | ||
| 304 | improvement is consistent across both CLAHE settings and is attributed | ||
| 305 | to the finer retinal microstructure (microaneurysms, hemorrhage dots, | ||
| 306 | exudates) that is present at 384px but lost at 224px. | ||
| 307 | |||
| 308 | ** Confusion Matrices | ||
| 309 | |||
| 310 | *** ResNet-50 without CLAHE | ||
| 311 | |||
| 312 | #+ATTR_LATEX: :width 0.75\textwidth :placement [H] | ||
| 313 | [[file:results/resnet50_clahe=False/confusion_matrix.png]] | ||
| 314 | |||
| 315 | *** ResNet-50 with CLAHE | ||
| 316 | |||
| 317 | #+ATTR_LATEX: :width 0.75\textwidth :placement [H] | ||
| 318 | [[file:results/resnet50_clahe=True/confusion_matrix.png]] | ||
| 319 | |||
| 320 | *** EfficientNet-B0 without CLAHE | ||
| 321 | |||
| 322 | #+ATTR_LATEX: :width 0.75\textwidth :placement [H] | ||
| 323 | [[file:results/efficientnet_b0_clahe=False/confusion_matrix.png]] | ||
| 324 | |||
| 325 | *** EfficientNet-B0 with CLAHE | ||
| 326 | |||
| 327 | #+ATTR_LATEX: :width 0.75\textwidth :placement [H] | ||
| 328 | [[file:results/efficientnet_b0_clahe=True/confusion_matrix.png]] | ||
| 329 | |||
| 330 | *** ViT-B/16 without CLAHE | ||
| 331 | |||
| 332 | #+ATTR_LATEX: :width 0.75\textwidth :placement [H] | ||
| 333 | [[file:results/vit_b_16_clahe=False/confusion_matrix.png]] | ||
| 334 | |||
| 335 | *** ViT-B/16 with CLAHE | ||
| 336 | |||
| 337 | #+ATTR_LATEX: :width 0.75\textwidth :placement [H] | ||
| 338 | [[file:results/vit_b_16_clahe=True/confusion_matrix.png]] | ||
| 339 | |||
| 340 | ** Training Curves | ||
| 341 | |||
| 342 | *** ResNet-50 | ||
| 343 | |||
| 344 | #+ATTR_LATEX: :width \textwidth :placement [H] | ||
| 345 | [[file:results/resnet50_clahe=False/training_curves.png]] | ||
| 346 | |||
| 347 | #+ATTR_LATEX: :width \textwidth :placement [H] | ||
| 348 | [[file:results/resnet50_clahe=True/training_curves.png]] | ||
| 349 | |||
| 350 | *** EfficientNet-B0 | ||
| 351 | |||
| 352 | #+ATTR_LATEX: :width \textwidth :placement [H] | ||
| 353 | [[file:results/efficientnet_b0_clahe=False/training_curves.png]] | ||
| 354 | |||
| 355 | #+ATTR_LATEX: :width \textwidth :placement [H] | ||
| 356 | [[file:results/efficientnet_b0_clahe=True/training_curves.png]] | ||
| 357 | |||
| 358 | *** ViT-B/16 | ||
| 359 | |||
| 360 | #+ATTR_LATEX: :width \textwidth :placement [H] | ||
| 361 | [[file:results/vit_b_16_clahe=False/training_curves.png]] | ||
| 362 | |||
| 363 | #+ATTR_LATEX: :width \textwidth :placement [H] | ||
| 364 | [[file:results/vit_b_16_clahe=True/training_curves.png]] | ||
| 365 | |||
| 366 | * Discussion | ||
| 367 | |||
| 368 | ** Resolution Is the Dominant Factor for CNN Models | ||
| 369 | |||
| 370 | The largest improvement was the ~19 percentage point accuracy jump for | ||
| 371 | ResNet-50 and EfficientNet-B0 when input resolution was increased from | ||
| 372 | 224\times{}224 to 384\times{}384. Retinal images contain small | ||
| 373 | features used for diagnosis (microaneurysms, dot-like red lesions as | ||
| 374 | small as 10--20\mu{}m, dot hemorrhages, and hard exudates) that take | ||
| 375 | up only a few pixels at 224px. At 384px these features are resolved | ||
| 376 | clearly enough for the network to learn discriminative filters for | ||
| 377 | them. The resolution improvement had no effect on ViT-B/16 because | ||
| 378 | PyTorch's ViT-B/16 implementation only supports 224\times{}224 input | ||
| 379 | and cannot be run at higher resolutions without custom modifications | ||
| 380 | to the model. | ||
| 381 | |||
| 382 | ** CLAHE Trades Accuracy for Minority-Class Recall | ||
| 383 | |||
| 384 | Applying CLAHE consistently reduced overall accuracy by approximately | ||
| 385 | 2 percentage points for the CNN models (e.g., ResNet-50: 0.80 \to | ||
| 386 | 0.78) while improving detection of minority classes. For ResNet-50, | ||
| 387 | CLAHE nearly doubled the Mild NPDR F1-score from 0.09 to 0.17, and | ||
| 388 | improved Proliferative DR F1 from 0.52 to 0.61. This happens because | ||
| 389 | CLAHE enhances the local contrast of subtle lesions, making | ||
| 390 | minority-class features more distinguishable, but the enhanced | ||
| 391 | contrast can also introduce artifacts that disrupt features the model | ||
| 392 | relied on for the majority Healthy class. | ||
| 393 | |||
| 394 | For ViT-B/16, CLAHE produced a small but consistent improvement across | ||
| 395 | most classes, and the Mild NPDR recall improved from 0.17 to | ||
| 396 | 0.22. This suggests that CLAHE is more beneficial for ViT, possibly | ||
| 397 | because the transformer's attention mechanism can exploit the enhanced | ||
| 398 | contrast across longer-range spatial dependencies. | ||
| 399 | |||
| 400 | Whether CLAHE is desirable depends on the application: maximizing | ||
| 401 | overall accuracy favors CLAHE-off, while maximizing detection of the | ||
| 402 | higher-risk advanced DR grades favors CLAHE-on. For a clinical | ||
| 403 | screening tool the latter is generally preferable. | ||
| 404 | |||
| 405 | ** Mild NPDR Remains Universally Difficult | ||
| 406 | |||
| 407 | Mild NPDR (class 1) had the lowest F1-score in every experiment, | ||
| 408 | ranging from 0.09 to 0.17. This class is defined by only | ||
| 409 | microaneurysms with no other lesions, a very subtle change from the | ||
| 410 | healthy retina. The confusion matrices confirm that the vast majority | ||
| 411 | of Mild NPDR predictions are misclassified as Healthy. The visual | ||
| 412 | difference is small, the class is heavily underrepresented (6.9% of | ||
| 413 | the dataset), and the class boundaries are subjective even for trained | ||
| 414 | graders. Despite weighted sampling and Focal Loss, the network does | ||
| 415 | not reliably learn to distinguish these cases. A possible solution to | ||
| 416 | this is to train with a classification model that supports higher | ||
| 417 | resolutions such as the modified Hi-ResNet, where I hypothesize that | ||
| 418 | the small lesions in class 1 get obscured or even essentially erased | ||
| 419 | when downscaling the images during the dataset preparation for use as | ||
| 420 | input to the models. | ||
| 421 | |||
| 422 | ** ViT-B/16 Underperforms at 224px | ||
| 423 | |||
| 424 | ViT-B/16 achieved lower accuracy (0.68--0.69) compared to ResNet-50 | ||
| 425 | and EfficientNet-B0 (0.78--0.80). This is mainly due to the resolution | ||
| 426 | constraint: ViT-B/16 uses 16\times{}16 pixel patches, so at 224px each | ||
| 427 | patch covers a 16\times{}16 area, which is large enough to subsume | ||
| 428 | entire microaneurysms. The training curves reveal severe overfitting: | ||
| 429 | the training loss approaches zero while validation loss increases | ||
| 430 | after ~10--15 epochs. ViT-B/16 likely requires either a higher input | ||
| 431 | resolution (which demands interpolated positional embeddings and | ||
| 432 | careful fine-tuning), a larger dataset, or stronger regularization to | ||
| 433 | generalize well on medical images. | ||
| 434 | |||
| 435 | * Conclusion | ||
| 436 | |||
| 437 | Pretrained CNN architectures achieved strong diabetic retinopathy | ||
| 438 | grading performance (accuracy ~0.80, weighted F1 ~0.77--0.78) when | ||
| 439 | fine-tuned at sufficient resolution (384\times{}384). Input resolution | ||
| 440 | was the most impactful factor, with a ~19 percentage point accuracy | ||
| 441 | improvement for ResNet-50 and EfficientNet-B0 when resolution was | ||
| 442 | increased from 224 to 384 pixels. CLAHE preprocessing improved | ||
| 443 | minority class detection at a small overall accuracy cost and is | ||
| 444 | recommended for clinical settings where detecting advanced DR grades | ||
| 445 | is the priority. EfficientNet-B0 achieved the best weighted F1 (0.78) | ||
| 446 | without CLAHE, while ResNet-50 with CLAHE achieved the best macro F1 | ||
| 447 | (0.53), indicating slightly more balanced performance across | ||
| 448 | classes. ViT-B/16 was constrained by its fixed-resolution patch | ||
| 449 | embedding and underperformed the CNN models. | ||
| 450 | |||
| 451 | Mild NPDR remains the hardest class: its visual distinction from a | ||
| 452 | healthy retina is subtle and the class is severely | ||
| 453 | underrepresented. Future work could address this with: dedicated data | ||
| 454 | augmentation for lesion synthesis, higher-resolution ViT variants | ||
| 455 | (ViT-L with interpolated positional embeddings), pre-training on | ||
| 456 | larger retinal image datasets, or model ensembles. | ||
| 457 | |||
| 458 | * Appendix | ||
| 459 | The repository will be available at | ||
| 460 | [[https://git.vineetk.net/eel4759_finalproject_classification/]]. | ||
| 461 | |||
| 462 | #+print_bibliography: | ||
