Skip to content

Redrob Verify

Available on GitHubHugging Face

Open OCR models
and the harness that grades them.

Open weights for document OCR, forgery, and face matching, all on your own GPU. The harness that scores them ships with them.

Document OCR

Reads the fields off an identity document and scores them one field at a time, not as one blob of text. PaddleOCR classic by default, VL a config switch away.

  • Field-level character error rate is the metric
  • MIDV-2020 arrives through the fetch scripts, never through git
  • A stub backend says why it fell back instead of returning a quiet zero
Document OCR

Forgery detection

Scores a document as authentic or tampered, and sweeps the threshold instead of publishing one flattering operating point. ForgeryNet weights, on Hugging Face.

  • TPR and F1 across a threshold sweep, with the published threshold stated
  • Document-disjoint split, so eval IDs never appear in training forgeries
  • The optional TruFor backend is research-only, so its weights stay unpublished
Forgery detection

Face compare

Matches the portrait on a document against a selfie, with detection and embedding split into steps you can inspect. YuNet finds the face, SFace compares it.

  • Sensitivity and accuracy across a threshold sweep
  • ONNX weights from redrob-labs/redrob-verify-face
  • Pairs are built during ingest, so the next run sees the same pairs
Face compare

Identity aggregate

Pulls a developer identity together from public profiles and measures what the caller actually waits for, slowest upstream included.

  • End-to-end latency, not per-call microbenchmarks
  • JMeter drives the load for the latency test
  • Four services, one shared /v1/meta preflight contract
Identity aggregate
Document OCR

And much more

Every module, and the rules we hold ourselves to, in one list.

Shared preflight

Every service answers /v1/meta before a run counts

Isolated images

Paddle, Torch, and OpenCV stay in separate containers

Provenance manifests

Origin and freeze checks gate what a result may claim

Seeds in config

Targets and seeds live in config.yaml, not in a shell history

One-shot bootstrap

run.sh bootstrap-gpu goes deps, models, data, compose, smoke

HTML report

eval-all writes JSON plus a report you can hand over

Documents stay local

Weights and raw images are downloaded, never committed

License inventory

Third-party terms are listed per model in LICENSES.md

What we measured

The published forgery weights hold TPR at or above 0.88 and F1 at or above 0.798 across seeds 7, 13, and 42, on a document-disjoint 400/100 split where eval IDs never appear among training forgeries. Published threshold is 0.87 at seed 7. What the split does not cover is in the model card.

Read the model card

Get started

Clone the public repo. Run it locally. Inspect the method.

01

Clone and bootstrap

One pass on a GPU box: dependencies, models, data, compose up, and an OCR smoke test.

02

Check the preflight

Every service reports the backend it is really running, so a stub cannot pass for the real thing.

03

Run the metrics

eval-all writes results and report.html. Or run one: eval-cer, eval-forgery, eval-face.

git clone https://github.com/redrob-labs/redrob-verify.git && cd redrob-verify && ./run.sh bootstrap-gpu

Common questions

License, limits, and how the path actually runs. Claims travel with method and caveat.