--- title: Chess Vision Backend emoji: ♟️ colorFrom: indigo colorTo: gray sdk: docker app_port: 7860 pinned: false --- # ♟️ Chess Vision — Backend (API) FastAPI service for my MSc project: **chess board digitization** + **human-like move prediction**. Upload a board image to get its FEN, then ask for the moves a human would likely play (CNN trained on Lichess games) combined with **Stockfish**. Models are served as quantized **ONNX** (the original ~444 MB of PyTorch weights → ~47 MB ONNX), so the image is small and CPU inference is fast. ## Endpoints | Method | Path | Description | |--------|------|-------------| | `GET` | `/health` | Liveness probe | | `POST` | `/digitize` | multipart image → FEN board placement | | `POST` | `/predict-move` | `{ "fen": "...", "top_n": 3 }` → CNN / Stockfish / hybrid moves | | `GET` | `/docs` | Swagger UI | ```bash curl -X POST .../predict-move -H 'Content-Type: application/json' \ -d '{"fen":"rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1","top_n":3}' # -> {"cnn":["e7e5","g8f6","d7d5"], "stockfish":["e7e5","c7c5","e7e6"], "hybrid":[...]} ``` ## How it works - **Digitization** (`app/digitize.py`): fixed crop → Canny → Hough grid (exact MSc pipeline) → 64 square crops → ONNX MobileNetV2 piece classifier → FEN. - **Move prediction** (`app/predict.py`): board → 12×8×8 tensor → a piece-type CNN + six destination-square CNNs → legal human-like moves; black is mirrored; Stockfish adds engine moves and a non-blundering hybrid. ## Run locally ```bash python3.12 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt # Stockfish: apt install stockfish (Linux) and set STOCKFISH_PATH, or omit for CNN-only uvicorn app.main:app --reload --port 7860 ``` ## Models `models_onnx/` holds the quantized ONNX weights (digitizer + piece + 6 square classifiers). Regenerate from the original `.pth` with `convert_to_onnx.py`. > The demo backend runs on a free Hugging Face Space that sleeps after inactivity; > the first request after that triggers a short cold start.