Indra a reading readout

Datalab Indra OCR v1.1.0 OpenRAIL-M weights

A page in.
Markdown out.
On a CPU.

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.

OmniParseBench
66.771.4 with --math
Throughput, 32 cores
44pages per second
Median page, 4 vCPU
212milliseconds
Parameters
7.3million, all ONNX
Page one of the paper Deep kernel hedging
arXiv:2609.34474 · page 1 text layer · 44 lines

01 the readout

Pick a document.
Watch it come apart.

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.

loading the run…
— —

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

Five passes, then text.

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.

  1. 1

    Turn it upright

    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

  2. 2

    Find every line

    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

  3. 3

    Name the script

    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

  4. 4

    Read the line

    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

  5. 5

    Put it in order

    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

Fast enough to stop thinking about it.

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.

Accuracy against time per page

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.

Throughput on the same 300 pages, one single-threaded worker per core
Engine4 cores81632
Indra OCR6.211.923.743.9
PP-OCRv6 small (text only)0.651.242.424.28
Tesseract 50.781.372.272.92
PP-StructureV3≤0.022≤0.044≤0.089≤0.18
OmniParseBench, headline score
EngineHeadlineTextTablesLayout
Indra OCR --math71.462.759.692.0
Indra OCR66.746.761.192.2
PP-StructureV358.455.647.871.7
Tesseract 5 (text only)—19.30.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

Four readers, one queue.

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 languages
rec_cjk.onnxChinese, Japanese, Koreanvertical too
rec_rtl.onnxArabic, Persian, Urdu, Pashto, Kurdish, Hebrewlogical order
rec_world.onnxDevanagari, Bengali, Tamil, Telugu, Kannada, Malayalam, Gujarati, Gurmukhi, Odia, Thai, Lao, Khmer, Myanmar, Sinhala, Georgian, Armenian, Ethiopic17 scripts

05 the limits

It is built for speed on clean print.

The model card is unusually direct about where this reader loses. Read it before you point it at a hundred thousand pages.

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.

Complex tables break

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.

Old and faded scans

29.5% on degraded-scan tests. Low-resolution, foxed or washed-out pages lose lines before they are ever read.

Diacritics drift

Kurmanji, Czech, Lithuanian, Icelandic, Turkish and Slovak sometimes get a neighbouring diacritic — ň for ñ, ů for ú, ė for é. English, French, German and Spanish are fine.

Scripts outside the list

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, wide, engineered

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

A fifth of a second, per page.

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.

  • Code Apache 2.0
  • Weights modified OpenRAIL-M — free for research, personal use, and startups under $20M
  • Platforms Linux x86_64 / aarch64, macOS on Apple silicon