Model reference · open weights

indra-ocr

LLMs datalab-to Image→text 1 build Open weights 1k dl/mo

indra-ocr is an open-weight language model from datalab-to. indra-ocr (FP32) weighs 2 MB; the smallest configuration that runs it is RTX 3060 12 GB.

For self-hosting, compare this build's requirements below with the GPU you plan to rent.

  • Indra OCR is a 1M-parameter image-to-text model by datalab-to that converts PDFs and images into markdown, plain text, or JSON.
  • It supports OCR for Latin, Cyrillic, Greek, Devanagari, Bengali, and Chinese scripts, while reading digital PDF text layers in any script.
  • The model uses a modified OpenRAIL-M license and runs on ONNX Runtime without PyTorch.

Summary of the datalab-to/indra-ocr model card, 2026-10-18

What it is

Released bydatalab-to
Released2026-10-10
Parameters1M
VRAM2 MB for the weights

What it runs on

Memory and cards for indra-ocr (FP32)

2 MBweights, file size
762 MBruntime overhead, at least

How much memory each request adds isn't estimated yet for this architecture. The weights need at least the cards below, plus room for the context.

CardWeights alone
RTX 3060 12 GBfits
RTX 4060 Ti 16 GBfits
RTX 3090 24 GBfits
RTX 4090 24 GBfits
RTX 5090 32 GBfits
L40S 48 GBfits
A100 80 GBfits
H100 80 GBfits
RTX PRO 6000 Blackwell 96 GBfits
DGX Spark (GB10) 128 GB unifiedfits
H200 141 GBfits
B200 180 GBfits

From the model card

What datalab-to says about indra-ocr

Read the model card

Indra OCR is a 1M-parameter OCR model that reads up to 49 pages per second on CPU. It turns PDFs and images into markdown, plain text, or JSON with boxes, and it has these features:

  • Throughput - 49 pages/s, 11-17x faster than Tesseract and PaddleOCR on the same machine and pages (table)
  • Latency - ~230 ms per page on 4 x86 vCPUs, 12-24x faster than Tesseract and PaddleOCR
  • Accuracy - scores 41.3 on OmniParseBench text, ahead of PaddleOCR's PP-OCR text models (35.8) and Tesseract (19.3). Its headline score (62.1) beats PaddleOCR's full PP-StructureV3 pipeline (58.4).
  • Layout and boxes - a bounding box for every line and every layout block, with block labels (headings, lists, tables, captions, footnotes, page headers) and reading order
  • Digital PDFs - reads the PDF's own text layer in any script, and OCRs only what is missing
  • Small - about 18 MB of models on ONNX Runtime, no PyTorch

The main recognizer, rec.onnx, has about 1M parameters. See benchmarks for the full results and limitations for what it does not do yet.

Indra OCR is named for Indra.

Try Datalab's Managed Platform

Indra OCR is built for speed on CPUs. When you need the highest accuracy, on handwriting, math, complex tables and degraded scans, our managed platform runs Chandra, our state of the art OCR model, with zero data retention by default, SOC 2 Type 2, and custom BAAs.

If you have high volume workloads, we offer a batch processing service that can handle 1B+ pages a day.

Get started with $5 in free credits - sign up - or try Chandra in our public playground.

Quickstart

pip install indra-ocr

indra-ocr paper.pdf                    # markdown to stdout
indra-ocr *.pdf --out results/         # one .md per input, all cores
indra-ocr scan.png --format json       # lines, boxes, layout blocks, confidences

indra-ocr-viewer                       # local web viewer on http://localhost:8765

The first run downloads the models (about 18 MB) from Hugging Face.

Examples

Real Indra OCR outputs on OmniParseBench pages. Colored boxes are layout blocks with their label, faint blue boxes are lines, drawn from the JSON output with no edits.

See more examples, with the markdown output for each →

License

The code is Apache 2.0. The model weights use a modified OpenRAIL-M license (LICENSE).

Commercial usage

This code is Apache 2.0, and our model weights use a modified OpenRAIL-M license (free for research, personal use, and startups under $20M funding/revenue, cannot be used competitively with our API). To remove the OpenRAIL license requirements, or for broader commercial licensing, visit our pricing page here.

Installation

pip install indra-ocr

Python 3.10 or newer. It installs ONNX Runtime, OpenCV and pypdfium2, and no PyTorch. The models download from Hugging Face on the first run and are cached. To use a local copy, set INDRA_OCR_MODEL_DIR or pass --model-dir.

Usage

CLI

indra-ocr paper.pdf                       # markdown to stdout
indra-ocr *.pdf --out results/            # one .md per input
indra-ocr scan.png --format json          # lines, boxes, layout blocks, confidences, timings
indra-ocr paper.pdf --format text         # plain text, one line per detected line
indra-ocr paper.pdf --mode ocr --timings  # ignore the text layer, OCR every page; timings on stderr
indra-ocr paper.pdf --keep-furniture      # keep page headers and footers in the markdown
indra-ocr *.pdf --out results/ --cores 8  # limit the cores (default: all usable cores)
indra-ocr paper.pdf --math                # write math as LaTeX (off by default; slower on math pages)

CLI Options:

  • --out DIR: write one file per input (.md, .txt or .jsonl)
  • --format [md|text|json]: output format (default: md)
  • --mode [auto|ocr|text]: auto reads the text layer where it passes the checks and OCRs elsewhere (default). ocr never reads the text layer. text uses the text layer even when the checks fail
  • --model-order: order text-layer lines with the order model, not the PDF content order
  • --no-image-ocr: on text-layer pages, do not OCR text inside images
  • --cores N: cores to use, one worker process each (default: all usable cores)
  • --dpi: render resolution for PDFs (default: 200)
  • --max-pages N: read at most N pages per file
  • --password: password for encrypted PDFs
  • --keep-furniture: keep page headers and footers in the markdown
  • --math: write math as LaTeX ($...$); off by default, see Math
  • --timings: print per-page source and time to stderr
  • --model-dir: folder with the models (default: download)

The CLI continues past files it cannot read, and exits with 1 if any failed.

From python

import indra_ocr

conv = indra_ocr.load(threads=4)          # mode="auto" | "ocr" | "text"
for i, page in conv.convert("paper.pdf"):
    print(page.source, page.timings["total_ms"])
    print(page.markdown)                  # headings, lists, tables as HTML
    page.blocks                           # [{"label", "bbox", "text"}] in reading order
    page.lines                            # [Line(box, text, conf)] in reading order

For many pages or files, convert_many runs one single-threaded worker process per core, one page per task, and returns results in input order:

import indra_ocr

if __name__ == "__main__":                # worker processes re-impo

Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.

© 2026 AxForge · EU-hosted AI infrastructure Pricing Docs Trust Privacy Terms