Indra OCR là model OCR của Datalab, đọc PDF và ảnh thành markdown, plain text hoặc JSON có toạ độ. Repo vừa mở công khai trên GitHub, ngôn ngữ chính Python, license Apache-2.0 cho code. Điểm gây chú ý nằm ở con số throughput: tối đa 49 trang/giây trên CPU, không cần GPU, không cần PyTorch.
Cái đáng nói là kích thước. Model nhận dạng chính rec.onnx chỉ khoảng 1 triệu tham số. Toàn bộ model chạy trên ONNX Runtime, tổng cộng khoảng 18 MB, tải từ Hugging Face ở lần chạy đầu tiên. Với một bài toán mà mọi người vẫn mặc định phải có GPU mới làm được, đây là hướng tiếp cận khá khác.
Nó làm được gì, cụ thể
Đầu vào là PDF hoặc ảnh. Đầu ra có ba dạng: markdown, text thuần, hoặc JSON kèm bounding box. Repo mô tả rõ các tính năng:
- Nhận dạng theo dòng (line detection, CTC recognition) và sắp xếp thứ tự đọc (reading order)
- Mỗi dòng và mỗi layout block đều có bounding box, block có label như heading, list, table, caption, footnote, page header
- Với PDF số (digital PDF, có text layer sẵn), nó đọc luôn text layer ở bất kỳ hệ chữ nào, chỉ OCR phần bị thiếu
- Xuất được math sang LaTeX nếu bật cờ
--math
Về hiệu năng, README đưa số cụ thể: 49 trang/giây, nhanh hơn Tesseract và PaddleOCR từ 11 đến 17 lần trên cùng máy và cùng tập trang. Độ trễ khoảng 230 ms mỗi trang trên 4 vCPU x86, tức nhanh hơn 12 đến 24 lần so với hai đối thủ kia. Về độ chính xác, Indra đạt 41.3 điểm trên OmniParseBench phần text, so với PP-OCR của PaddleOCR là 35.8 và Tesseract là 19.3. Điểm tổng (62.1) vượt pipeline đầy đủ PP-StructureV3 của PaddleOCR (58.4).
Vì sao repo này đang được chú ý
Tính đến thời điểm này repo có 530 sao, và được tạo ngày 13/10/2026, cập nhật ngày 15/10/2026. Nghĩa là nó rất mới, mới vài ngày. Việc một repo OCR mới toanh đã lên 530 sao cho thấy nhu cầu parse tài liệu vẫn rất lớn.
Bối cảnh thì ai làm RAG hay xử lý hợp đồng, hoá đơn, paper cũng biết: OCR truyền thống chậm, còn các pipeline document parsing hiện đại thì nặng và thường đòi GPU. Pipeline nhẹ nhất cũng phải kéo theo PyTorch vài GB. Indra đi ngược lại: model siêu nhỏ, chạy CPU, CLI gọn. Với người cần xử lý hàng nghìn trang PDF trên server không có GPU, khoảng cách giữa 49 trang/giây và vài trang/giây là tiền điện và thời gian chờ thật.
Một điểm khác biệt nữa: nó xử lý PDF số thông minh. Thay vì render ảnh rồi OCR lại toàn bộ, nó kiểm tra text layer, chỗ nào đọc được thì lấy luôn, chỗ nào thiếu mới OCR. Cách này vừa nhanh vừa giữ được text chính xác ở những trang PDF “sạch”.
Cài và chạy thử
Yêu cầu Python 3.10 trở lên, đã test trên Linux (x86_64 và aarch64, Python 3.10 đến 3.13) và macOS Apple silicon. Cài bằng pip:
pip install indra-ocr
Muốn lấy code mới nhất từ GitHub thì cài trực tiếp từ repo:
pip install git+https://github.com/datalab-to/indra.git
Chạy CLI cơ bản:
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
Có sẵn web viewer chạy local ở cổng 8765 để xem kết quả trực quan. Nếu muốn so sánh với Tesseract thì cài thêm pip install "indra-ocr[tesseract]" kèm binary Tesseract.
Dùng từ 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
Khi xử lý nhiều file, dùng convert_many để tận dụng đa nhân, mỗi core một worker process:
import indra_ocr
if __name__ == "__main__": # worker processes re-import this file
for path, result in indra_ocr.convert_many(["a.pdf", "b.pdf"], cores=None):
if isinstance(result, indra_ocr.InputError):
continue # unreadable or locked file
Vài cờ CLI đáng để ý: --mode ocr để bỏ qua text layer và OCR toàn bộ, --mode text để ép dùng text layer kể cả khi kiểm tra thất bại, --keep-furniture để giữ header/footer trong markdown, --dpi để chỉnh độ phân giải render (mặc định 200), --cores N để giới hạn số nhân. Lần chạy đầu sẽ tải model từ Hugging Face; muốn dùng bản local thì set biến môi trường INDRA_OCR_MODEL_DIR hoặc truyền --model-dir.
Ai nên dùng
Hợp nhất với ai cần xử lý khối lượng PDF lớn trên hạ tầng CPU thuần: đội làm RAG, ingest tài liệu vào vector database, xử lý hoá đơn, hợp đồng, báo cáo. Cũng hợp với người làm chạy trên máy cá nhân hoặc VPS rẻ, không có GPU, mà vẫn muốn có bounding box và reading order để kiểm tra chéo kết quả. Còn nếu bạn cần đọc chữ viết tay, công thức phức tạp, bảng rối hoặc bản scan mờ thì chính README khuyên chuyển sang dịch vụ managed của Datalab, nơi chạy model Chandra.
So sánh nhanh
Với Tesseract thì Indra nhanh hơn 11 đến 17 lần và điểm text cao hơn nhiều (41.3 so với 19.3). Đổi lại Tesseract có lịch sử lâu năm, tài liệu dày, cộng đồng đông, hỗ trợ hàng trăm ngôn ngữ. Indra còn non, mới ra mắt, chưa rõ độ phủ ngôn ngữ tới đâu.
Với PaddleOCR, Indra nhỉnh hơn ở cả tốc độ lẫn điểm trên thang OmniParseBench, nhưng PaddleOCR có hệ sinh thái pipeline đầy đủ (PP-StructureV3) trưởng thành hơn nhiều. Nếu bạn đang có sẵn hạ tầng Paddle và cần bảng biểu phức tạp, cái cũ vẫn đáng giữ.
Ưu điểm và những chỗ cần cân nhắc
Ưu điểm rõ: model 18 MB, chạy ONNX Runtime, không kéo PyTorch theo, tốc độ tốt trên CPU, xuất JSON có box để debug, CLI đơn giản. Cài đặt nhẹ đến mức có thể nhét vào Lambda hay container nhỏ.
Hạn chế thì phải nói thẳng. Thứ nhất là license model: code Apache-2.0, nhưng weights dùng modified OpenRAIL-M, miễn phí cho nghiên cứu, dùng cá nhân và startup dưới 20 triệu USD funding/revenue, và không được dùng cạnh tranh với API của Datalab. Muốn bỏ ràng buộc đó thì phải mua license thương mại. Đây là điểm nhiều đội sẽ phải đọc kỹ trước khi nhúng vào sản phẩm.
Thứ hai là độ trưởng thành. Repo mới vài ngày tuổi, README có mục limitations nhưng chưa rõ chi tiết phủ ngôn ngữ và chất lượng trên từng loại tài liệu ngoài thực tế. Benchmark đều chạy trên OmniParseBench, một tập chuẩn do chính Datalab (hoặc bên liên quan) dùng, nên đọc số cho vui chứ đừng lấy làm chân lý. Hãy tự test trên dữ liệu của bạn trước khi tin.
Thứ ba, mấy con số “1M parameter” và “49 trang/giây” khá ấn tượng nhưng cần nhìn kèm điều kiện phần cứng. 49 trang/giây chắc chắn là kịch trần đa nhân; con số thực tế của bạn sẽ phụ thuộc số core, loại PDF và việc có bật --math hay không (bật math sẽ chậm hơn trên trang nhiều công thức).
Chốt
Nếu bài toán của bạn là OCR hàng loạt PDF sạch trên CPU và bạn không muốn nuôi GPU, Indra đáng để thử ngay trong 10 phút: pip install indra-ocr, chạy thử vài file của bạn, xem JSON box có đúng không. Còn nếu công việc phụ thuộc vào chữ viết tay hay bảng phức tạp, hoặc bạn cần license thương mại thoáng, cứ để dành nó cho lần sau. Repo ở đây: datalab-to/indra.
