A wildlife classifier that shows its work
A ResNet18 trained on camera-trap imagery, served through FastAPI and Docker, and wrapped in a field-notebook-inspired React interface with GradCAM explanations.
01 / The problem
Camera-trap datasets contain empty frames, noisy labels, repeated environments, and visual artifacts that can let a model appear strong while learning the wrong thing. A deployed demo also needs to communicate when its prediction should not be trusted.
02 / The approach
The project starts with metadata exploration before downloading images, selects classes from the actual distribution, crops timestamp bars, filters only irrecoverably blurred frames, and splits by camera site to prevent background leakage. The final model, API, and frontend live as separate deployable pieces of one system.
03 / What shipped
- Group-based train, validation, and test splits with an explicit no-site-overlap assertion
- Data preprocessing decisions derived from exploration rather than assumed upfront
- FastAPI inference service with Docker deployment and visual explanations
- A frontend that sets expectations before asking a user to upload an image
04 / Outcome
The deployed app returns top-three predictions and a GradCAM overlay from one backward-enabled pass. The interface explains that the model is trained for camera-trap imagery and documents where it performs worse, making the limitation part of the product rather than a footnote.