Back

SickNote

Codebase

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.

The SickNote web app
sicknoteinc.xyz

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.