Handwriting is a coin toss
25.2% on the OmniParseBench handwriting tests, and about a third of the words on held-out handwritten pages. Cursive and faint pencil read worst. The 1890 letter in the readout is the honest version of this.
Datalab Indra OCR v1.1.0 OpenRAIL-M weights
Indra OCR reads PDFs and scans into clean markdown — headings, lists, tables — with a box, a label and a reading order for every line. Eighty languages, 7.3 million parameters, no GPU.
--math
01 the readout
Every run below was made by the real model on a 4-vCPU machine, and is replayed here: the same boxes, the same reading order, the same timings. Nothing is estimated for the web.
Runs recorded with indra-ocr 1.1.0 on this machine's CPU. The page ships no model and no server — it replays the recording.
02 the machine
Nothing here needs a GPU, a transformer or an API key. The reader is four small recognizers, a line detector, a layout and reading-order model, and a language model for unsure lines — all ONNX Runtime.
A 372 kB orientation model picks the quarter turn, a row-angle search straightens the rest — up to 45° of tilt — before anything is read.
rot 90° · skew −6.5° see the sideways scan
One network marks the ink lines at half resolution; connected ink is split into line boxes, then laid out into blocks.
390 kB · det 66 ms
A 192 kB classifier sends each line to one of four recognizers — Latin, CJK, right-to-left, or Indic and Southeast Asian.
4 recognizers 95 languages measured
Each crop is squeezed to 32 px high and read by a 5 MB recognizer. When the classifier hesitates, a second reading is taken and the more confident one wins.
rec 446 ms on 25 handwritten lines
Blocks get their labels and a reading order, headers and footers drop out, and the page is written as markdown — tables as HTML, math as LaTeX when asked.
order 15 ms
03 the numbers
OmniParseBench scores 2,937 pages with 16,288 pass/fail tests. Accuracy is the mean of the text, table and layout families; latency is the median page on four vCPUs, one page at a time.
Every engine on the same pages, same scorer, its own default settings. Hollow points read lines only, so their tables score zero. Log time axis — further up and further left is better.
| Engine | 4 cores | 8 | 16 | 32 |
|---|---|---|---|---|
| Indra OCR | 6.2 | 11.9 | 23.7 | 43.9 |
| PP-OCRv6 small (text only) | 0.65 | 1.24 | 2.42 | 4.28 |
| Tesseract 5 | 0.78 | 1.37 | 2.27 | 2.92 |
| PP-StructureV3 | ≤0.022 | ≤0.044 | ≤0.089 | ≤0.18 |
| Engine | Headline | Text | Tables | Layout |
|---|---|---|---|---|
Indra OCR --math | 71.4 | 62.7 | 59.6 | 92.0 |
| Indra OCR | 66.7 | 46.7 | 61.1 | 92.2 |
| PP-StructureV3 | 58.4 | 55.6 | 47.8 | 71.7 |
| Tesseract 5 (text only) | — | 19.3 | 0.0 | — |
Scores as published in Datalab's model card, from their own runs of OmniParseBench (revision 961c0f89) and olmOCR-bench. Line-only engines score zero on tables because they emit lines, not tables. Median latency varies about 15% between runs — compare engines within a run, not across papers.
04 the scripts
On 95 held-out printed languages, 83 read at character F1 0.90 or better and 67 at 0.95 or better. A line classifier routes each line to the recognizer that can read it; a page of mixed scripts needs no setting.
Scores below are OmniParseBench per-script, with the number of tests in brackets. Most scripts have few tests — one page moves a score by two to eight points.
rec.onnxLatin, Cyrillic, Greek, Latin handwriting~50 languagesrec_cjk.onnxChinese, Japanese, Koreanvertical toorec_rtl.onnxArabic, Persian, Urdu, Pashto, Kurdish, Hebrewlogical orderrec_world.onnxDevanagari, Bengali, Tamil, Telugu, Kannada, Malayalam, Gujarati, Gurmukhi, Odia, Thai, Lao, Khmer, Myanmar, Sinhala, Georgian, Armenian, Ethiopic17 scripts05 the limits
The model card is unusually direct about where this reader loses. Read it before you point it at a hundred thousand pages.
25.2% on the OmniParseBench handwriting tests, and about a third of the words on held-out handwritten pages. Cursive and faint pencil read worst. The 1890 letter in the readout is the honest version of this.
Merged or spanning cells, wrapped cell text, nested headers, or tables with no ruling lines can land in the wrong row. Simple grids read well.
29.5% on degraded-scan tests. Low-resolution, foxed or washed-out pages lose lines before they are ever read.
Kurmanji, Czech, Lithuanian, Icelandic, Turkish and Slovak sometimes get a neighbouring diacritic — ň for ñ, ů for ú, ė for é. English, French, German and Spanish are fine.
Syriac, Tibetan, Mongolian, Santali and Meitei only work through a digital PDF's text layer. Written Cantonese characters are missing from the Chinese recognizer.
Vertical pages read columns right to left, which can reorder newspaper articles. Banner-shaped pages read poorly, and labels inside engineering drawings come out as small tables.
For handwriting, complex tables, math at scale or degraded archives, Datalab points at Chandra on their managed platform instead.
06 the command
Python 3.10+, ONNX Runtime, OpenCV, pypdfium2. The first run pulls 76 MB of models from Hugging Face and caches them. There is a local viewer, too, with the same overlays you just used.