Skip to main content
AGPL-3.0-or-laterSelf-hostedDomain-agnostic

OpenProcessor

Self-hosted, Triton-backed visual AI: detection, faces, embeddings, OCR, and an active-learning curation backend

OpenProcessor walkthrough: API calls in a terminal, the Swagger API docs, Triton model status, live Grafana dashboards, Prometheus targets, MLflow training runs and a run comparison, OpenSearch Dashboards, then Cropwright, the labeling UI for this API

Object detection

YOLO11 (EfficientNMS end2end, GPU NMS) and YOLO26 (natively NMS-free) served side by side from one Triton instance. POST /detect, /detect/batch; pick a model per request.

Faces

SCRFD-10G detection with 5-point landmarks plus ArcFace 512-dim embeddings: detect, recognize, 1:1 verify, 1:N identify and similarity search under /faces.

Embeddings and visual search

MobileCLIP image and text embeddings (512-dim) indexed in OpenSearch k-NN: image-to-image, text-to-image, face, OCR-text and object-level search.

OCR

PP-OCRv5 text detection and recognition behind a Triton Python-backend (BLS) pipeline: POST /ocr/predict and /ocr/batch, plus text search over ingested images.

Combined analysis and ingest

POST /analyze runs detection, faces, CLIP and OCR on one image; /ingest indexes everything into OpenSearch, one image, a batch of up to 64, or a server directory.

Curation backend

A domain-agnostic active-learning subsystem under /curation: item ingest, clustering, review queues, VLM-assisted labeling, region cascades, export, training and model comparison.

TensorRT on Triton

Every core model is exported to TensorRT FP16 with dynamic batching; Triton runs in explicit model-control mode so models load, unload and promote at runtime.

Monitoring and MLOps

An opt-in monitoring profile: Prometheus scraping Triton, the API, host and DCGM GPU metrics, with alert rules; provisioned Grafana dashboards; Loki for container logs. MLflow tracks every training run's parameters, per-epoch metrics, lineage and artifacts.

How it works

1

Export models make download-models export-models

Fetch base weights and compile them to TensorRT engines once; Triton loads the cached engines on every later start.

2

Run inference /detect /faces /embed /ocr /analyze

Stateless core routes: send an image, get normalized boxes, landmarks, 512-dim embeddings or text back.

3

Ingest and index /ingest, /curation/ingest/*

Index images into OpenSearch for search, or into the curation item pool, where an item detector proposes crops.

4

Cluster and review /curation/clusters, /curation/review/{tab}

Group crops by PE-Core embedding similarity and work active-learning review queues, most-uncertain first.

5

Label /curation/crops/*, /curation/vlm/*

Label by hand or with an OpenAI-compatible VLM's suggestions; every write is undoable and keeps its provenance.

6

Export /curation/export/yolo

Freeze a test holdout and write a deterministic YOLO-format dataset with a checksummed manifest.

7

Train and compare /curation/train/*, /curation/bakeoff/*

Preflight and launch a training run on the trainer container, then score it against baselines per class.

8

Promote /curation/train/promote/{job_id}

Serve the winning model from Triton; its predictions feed the next review cycle's disagreement queue.

Walk through the whole loop in the curation workflow guide.

See it in action

Clusters: cards served by GET /curation/clusters (captured from Cropwright, a frontend for this backend)
Review queue: GET /curation/review/{tab} with VLM, detector and score fields (captured from Cropwright, a frontend for this backend)
Region review: box, detector chain and text reading from the region cascade (captured from Cropwright, a frontend for this backend)
Training: /curation/train/* preflight and run setup (captured from Cropwright, a frontend for this backend)
Bake-off: /curation/bakeoff/* eval datasets and trained runs (captured from Cropwright, a frontend for this backend)

Sample imagery: COCO val2017 and Open Images (Creative Commons licensed photographs). Credits

See the backend in action

Model status: GET /models/ lists every Triton model, its backend and batch size
Swagger UI at /docs: every endpoint group, try-it-out included
Grafana: per-model Triton throughput, latency and leaderboard, live
Grafana: per-GPU utilization, memory, power and temperature (DCGM)
Prometheus: Triton, API, node, GPU (DCGM) and Loki targets, all up
MLflow: training runs logged by the curation trainer
MLflow: per-epoch metric charts for one run
MLflow: two runs compared, differences only (epochs, mAP)
OpenSearch Dashboards: the op_* curation indexes

Captured from a stack holding only public sample data (COCO val2017). The tools shown are Swagger UI, Grafana, Prometheus, MLflow and OpenSearch Dashboards, each under its own license. Credits

Quick start

Clone, run the setup script, and the core API is up on port 4603.

git clone https://github.com/davidamacey/OpenProcessor.git && cd OpenProcessor
./scripts/setup.sh --yes
curl http://localhost:4603/health
# opt-in curation workers
docker compose --profile curation up -d

Full quick-start guide