End-to-end image classification project that predicts whether an uploaded image is a cat, with notebook experiments, FastAPI serving, and a React frontend.
Live frontend: https://njoppi2.github.io/cat-vs-non-cat/
Create a compact end-to-end ML app that covers model experimentation, API inference, and a simple user-facing interface for prediction.
- Python, FastAPI, TensorFlow/Keras
- React + TypeScript (Vite)
- Docker / Docker Compose
- GitHub Actions + GitHub Pages
deployment/: FastAPI backend and model-serving filesfront-end/: React frontendnotebooks-and-models/: model training and experimentation artifacts.github/workflows/: CI and deploy workflows
From repository root:
docker compose up --buildOpen:
- Frontend:
http://localhost:3000 - API docs:
http://localhost:8000/docs
Stop:
docker compose downBackend:
cd deployment
pip install -r requirements.txt
uvicorn app.main:app --reloadFrontend:
cd front-end
npm install
npm run devLocal checks:
python -m compileall deployment/app
PYTHONPATH=deployment python -m unittest discover -s deployment/tests -p "test_*.py"
cd front-end && npm ci && npm run buildCI validates backend syntax, backend API smoke tests, and frontend build. GitHub Pages workflow publishes frontend from front-end/dist.
- Notebook-to-inference path is fully connected.
- Frontend is publicly accessible via GitHub Pages.
- Local Docker setup brings up both API and UI together.
- Model artifacts are still stored directly in the repository.
- Training is notebook-centric, not fully script-driven.
- Backend test coverage is still minimal.
- Move large model binaries to Releases/LFS.
- Add reproducible training CLI pipeline.
- Add backend unit/smoke tests to CI.
See CONTRIBUTING.md.
