|
Download README.md from xplorers/GAIT_API: direct link, hf CLI and curl.
- Browser
- Download file 5.04 kB
-
https://huggingface.co/spaces/xplorers/GAIT_API/resolve/main/README.md
- Command line
-
hf download hf://spaces/xplorers/GAIT_API/README.md
-
curl -L -o README.md https://huggingface.co/spaces/xplorers/GAIT_API/resolve/main/README.md
5.04 kB
| title: GAIT_API | |
| emoji: 🚶 | |
| colorFrom: blue | |
| colorTo: indigo | |
| sdk: docker | |
| app_file: app.py | |
| pinned: false | |
| # Gait Analysis API | |
| Clinical gait analysis service built with FastAPI, OpenCV, and MediaPipe Pose. | |
| It processes a front-view walking video and returns: | |
| - extracted gait biomarkers | |
| - rule-based clinical interpretation | |
| - overall gait stability score | |
| - annotated skeleton video | |
| - clinical dashboard plot | |
| The notebook prototype is kept in [gait.ipynb](<gait.ipynb>), and the production API implementation is in [app.py](app.py). | |
| ## Table of contents | |
| - Overview | |
| - Project structure | |
| - How it works | |
| - API reference | |
| - Local development | |
| - Docker usage | |
| - Storage cleanup strategy | |
| - Hugging Face Spaces deployment | |
| - GitHub Actions auto-deploy | |
| - Troubleshooting | |
| ## Overview | |
| This API is designed for single-video gait assessment. | |
| Core stack: | |
| - FastAPI for REST endpoints | |
| - MediaPipe Pose for landmark extraction | |
| - OpenCV for video I/O and skeleton overlay | |
| - NumPy/SciPy for signal processing and feature extraction | |
| - Matplotlib for biomarker visualizations | |
| Dependencies are listed in [requirements.txt](requirements.txt). | |
| ## Project structure | |
| - [app.py](app.py): Main API + gait analysis pipeline | |
| - [requirements.txt](requirements.txt): Python dependencies | |
| - [Dockerfile](Dockerfile): Container build (HF Spaces compatible) | |
| - [scripts/start.sh](scripts/start.sh): Container startup + background cleanup loop | |
| - [scripts/cleanup_runs.py](scripts/cleanup_runs.py): Deletes old generated files | |
| - [.github/workflows/deploy-hf-space.yml](.github/workflows/deploy-hf-space.yml): Auto-sync GitHub repo to HF Space | |
| - [gait.ipynb](<gait.ipynb>): Original notebook source logic | |
| ## How it works | |
| High-level flow: | |
| 1. Upload `video` + `gender` | |
| 2. Extract pose landmarks for each frame | |
| 3. Validate video (person detected, front-view check) | |
| 4. Build temporal signals (ankles, feet, arm swing, hip center) | |
| 5. Smooth + detrend + detect peaks | |
| 6. Compute biomarkers (`stride_variability`, `cadence`, `symmetry_ratio`, arm metrics) | |
| 7. Create clinical interpretation text | |
| 8. Compute weighted gait stability score | |
| 9. Generate dashboard image + annotated video | |
| 10. Return JSON payload | |
| Main endpoints are declared in [app.py](app.py#L560-L785). | |
| ## API reference | |
| ### `GET /` | |
| Basic API metadata and endpoint hints. | |
| ### `POST /analyze` | |
| Accepts multipart form-data: | |
| - `video`: gait video (`mp4/mov/avi/...`) | |
| - `gender`: `male` or `female` | |
| Returns analysis JSON with base64-embedded files (`annotated_video`, `clinical_dashboard`). | |
| Use this when you want everything in one response. | |
| ### `POST /analyze_files` | |
| Accepts multipart form-data: | |
| - `video`: gait video | |
| - `gender`: `male` or `female` | |
| Returns analysis JSON with downloadable URLs: | |
| - `/download/{session_id}_annotated.mp4` | |
| - `/download/{session_id}_dashboard.png` | |
| This is generally the better choice for deployment because responses stay smaller than full base64 payloads. | |
| ### `GET /download/{filename}` | |
| Downloads generated output files from `runs/outputs`. | |
| ### `GET /health` | |
| Simple health check. | |
| ## Local development | |
| 1. Create environment and install dependencies | |
| ```bash | |
| python -m venv .venv | |
| source .venv/bin/activate | |
| pip install -r requirements.txt | |
| ``` | |
| 2. Run API | |
| ```bash | |
| uvicorn app:app --reload --host 0.0.0.0 --port 8000 | |
| ``` | |
| 3. Open docs | |
| - Swagger UI: http://127.0.0.1:8000/docs | |
| - ReDoc: http://127.0.0.1:8000/redoc | |
| ## Docker usage | |
| Build: | |
| ```bash | |
| docker build -t gait-api:latest . | |
| ``` | |
| Run: | |
| ```bash | |
| docker run --rm -p 7860:7860 gait-api:latest | |
| ``` | |
| Container defaults: | |
| - serves on port `7860` | |
| - startup script: [scripts/start.sh](scripts/start.sh) | |
| - output directory: `/app/runs/outputs` | |
| ## Storage cleanup strategy | |
| Generated files from `/analyze_files` are stored under `runs/outputs`. | |
| Cleanup is handled by [scripts/cleanup_runs.py](scripts/cleanup_runs.py): | |
| - default retention: 30 minutes | |
| - deletes old files under `runs/` | |
| - preserves required directory structure | |
| In Docker/HF Spaces, [scripts/start.sh](scripts/start.sh) starts a background cleanup loop automatically. | |
| Configurable environment variables: | |
| - `CLEANUP_INTERVAL_SECONDS` (default: `1800`) | |
| - `RUNS_MAX_AGE_MINUTES` (default: `30`) | |
| Optional manual run: | |
| ```bash | |
| python scripts/cleanup_runs.py --path ./runs --max-age-minutes 30 --dry-run | |
| ``` | |
| ## Hugging Face Spaces deployment (Docker) | |
| This repository is configured for Docker Spaces. | |
| Key points: | |
| - README front matter is required and already included | |
| - container uses [Dockerfile](Dockerfile) | |
| - app starts via [scripts/start.sh](scripts/start.sh) | |
| - `PORT` env is respected (default `7860`) | |
| Recommended endpoint on Spaces: | |
| - Use `/analyze_files` for better response size and reliability | |
| ## GitHub Actions auto-deploy to HF Space | |
| Workflow: [.github/workflows/deploy-hf-space.yml](.github/workflows/deploy-hf-space.yml) | |
| Behavior: | |
| - triggers on push to `main` | |
| - sanitizes `HF_TOKEN` | |
| - force-pushes repository to `xplorers/GAIT_API` | |
| Required GitHub secret: | |
| - `HF_TOKEN`: Hugging Face token with write access to the target Space | |