Machine learning project · 3rd place, XdHacks Vancouver
SickNote takes a cough recording, turns it into a mel spectrogram, and predicts whether the cough is a sick one. A 3-model, 3-layer CNN ensemble, trained from scratch on 2,267 expert-labeled clips.
The number I care about is not the one that looks best. An earlier version of this model reported 0.73 AUC. Nested 5-fold cross-validation showed that figure was split noise, an artifact of which clips happened to land in which fold, not a property of the model. The honest number, measured on held-out test data, is 0.724 AUC-ROC.
I tried ResNet18 transfer learning first. It overfit badly on a dataset this small, so I reverted to the from-scratch CNN. Then I replaced a 1.4-million-parameter dense head with time-axis pooling: the same 0.724 AUC-ROC, at 72 thousand parameters. Roughly twenty times smaller for no loss in performance.
Predictions are served from FastAPI, trained with BCEWithLogitsLoss and a positive-class weight to handle the class imbalance. The model runs on Railway, the frontend on Vercel.

One of my first machine learning projects. The first one I placed with at a hackathon. It's also where computer vision stopped being something I read about and became something I wanted to build. I've been leaning further into it ever since.