FaceTron is a high-performance, modular face(recognition) embedding server with ONNX Runtime support, featuring dynamic multi-model loading, take your models offline, built to run anywhere, from local machines to scalable cloud environments. It also provides an OpenAPI Specification (OAS) endpoint with MCP-compatible metadata, and with OpenTelemetry integration.
Added lightweight ONNX models under the models/ directory for testing purposes. Replace or mount this directory with actual high-resolution face models such as 1k3d68, 2d106det, arcface, buffalo, genderage, glintr100, and scrfd_10g_bnkps for full functionality.
-
π APIs:
- GET /models: Get all loaded models from registry.
- POST /infer: Get embeddings from an image.
- POST /infer_visualize: Get boxed image with face detection markings.
- GET /download: Download boxed image with face detection markings.
- GET /openapi.json: Get OpenAPI v3.1.0 JSON spec for MCP metadata.
-
π§ Face Embedding Inference
Accepts face images, detects faces, and returns clean, standardized vector embeddings. -
π¦ Dynamic Multi-Model Support
Load multiple ONNX models (e.g., ArcFace, SCRFD, Glint360K) via/models
with plug-and-play architecture. -
π Face Detection & Visualization
Returns original images with bounding boxes and aligned face crops for inference validation. -
π OpenAPI 3.1 & Swagger UI
Easy integration via built-in interactive API documentation. -
π·οΈ Out-of-the-Box OpenTelemetry Tracing Integrated support for OpenTelemetry with OTLP exporter (Jaeger compatible). Use setup_telemetry() in main.py to enable tracing automatically, or disable via the DISABLE_OTEL=true environment variable
-
π§© Future-Ready Modular Design
Clean architecture withservices/
,routes/
, andutils/
layersβready for:- TensorFlow, PyTorch runtime extension
- Deployment into model orchestration pipelines
-
π§ MCP Metadata Support
Exposes model info in OpenAPI spec for compliance with Model Connector Protocol (MCP) agents.
- FastAPI (async web server)
- ONNX Runtime (model execution)
- Python 3.9+
- Dockerized & DevOps-ready
facetron/
βββ main.py # FastAPI app entrypoint
βββ routes.py # API route definitions
βββ services/ # Core face detection & embedding logic
β βββ face_detection_service.py
β βββ face_embedding_service.py
β βββ model_registry_service.py
βββ utils/ # Utility helpers
β βββ image_utils.py
βββ models/ # Pretrained ONNX models (test models included)
β βββ 1k3d68.onnx
β βββ 2d106det.onnx
β βββ arcface.onnx
β βββ buffalo.onnx
β βββ genderage.onnx
β βββ glintr100.onnx
β βββ scrfd_10g_bnkps.onnx
βββ tester/ # Client script for local testing
β βββ local_tester_client.py
βββ temp/ # Temp storage for incoming image files
βββ resources/ # Visual assets for API & architecture
β βββ *.png, *.jpg
βββ requirements.txt
βββ docker-compose.yml
βββ Dockerfile
βββ .env
βββ readme.md
βββ telemetry_utils.py # setup telemetry configs
βββ license
git clone https://github.com/13shivam/facetron.git
cd facetron
Make sure your models implement a .get_embedding(np.ndarray) -> np.ndarray
interface via a wrapper.
The server includes built-in OpenTelemetry, Telemetry is enabled on startup if setup_telemetry() is called in main.py.
Disable Telemetry: Set the environment variable DISABLE_OTEL=true before starting the server and skip invoking setup_telemetry().
MODEL_DIR=models
LOG_LEVEL=info
OTEL_EXPORTER_OTLP_ENDPOINT=http://host.docker.internal:4317
DISABLE_OTEL=false
docker-compose up -d
pip install -r requirements.txt
python main.py
...
INFO: Will watch for changes in these directories: ['/facetron']
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO: Started reloader process [11385] using StatReload
INFO: Started server process [11388]
INFO: Waiting for application startup.
INFO: Application startup complete.
(logs contd...)
#run tester script
python local_tester_client.py
...
200
{'message': 'Image saved successfully', 'saved_image_path': '/facetron/temp/temp_276ce9b8.jpg'}
200
{'message': 'Image saved successfully', 'saved_image_path': '/facetron/temp/temp_47179b1b.jpg'}
200
{'message': 'Image saved successfully', 'saved_image_path': '/facetron/temp/temp_feb98d6b.jpg'}
200
{'message': 'Image saved successfully', 'saved_image_path': '/facetron/temp/temp_5e4a77e5.jpg'}
...
curl --location 'http://localhost:8000/infer' --header 'Content-Type: application/json' --form 'model_name="buffalo"' --form 'image_format="jpg"' --form 'file=@"/path/to/your/image.jpg"'
Example response:
{
"faces": [
{
"face_id": "15f9b282-ea6f-43f5-a60f-0e1a3b422fcd",
"bbox": [403, 46, 465, 108],
"embedding": [0, 0, 3434, -343...]
}
]
}
This project is licensed under the MIT License - see the license file for details.
Important Notice Regarding Open Source Dependencies:
This project relies on various open-source models and libraries, each with its own licensing terms. It is the user's responsibility to understand and adhere to the specific licenses of all the open-source components they choose to use. Consult the individual licenses provided by the respective model and library providers.