Skip to main content

OpenThai 2.0 OCR Markdown: an open model that reads Thai documents into Markdown, tables included

· 5 min read
Kobkrit Viriyayudhakorn
CEO @ iApp Technology

Today we are releasing OpenThai 2.0 OCR Markdown, an open-weight model that reads Thai and English document pages into Markdown, with every table written out as HTML. It has 0.63 billion parameters, reads a page in 1.6 seconds on one NVIDIA H100, and is a free download from Hugging Face under the OpenMDW-1.1 licence. The same model also runs as an API, at 0.15 IC a page.

Model page: iapp.co.th/openmodels/openthai2p0-ocr-markdown · Weights: huggingface.co/iapp/OpenThai2.0-OCR-Markdown

Why tables​

Thai government and university documents are full of tables: budget breakdowns, schedules, and forms whose header cells span several rows and columns. An OCR engine that returns lines of text loses which figure belongs to which row and column. OpenThai 2.0 OCR Markdown writes each table as HTML with rowspan and colspan, so that structure reaches your search index or your language model intact. Around the tables it writes headings, lists and paragraphs as Markdown, and it marks every block with a bounding box and a class, in reading order.

A Thai budget table with merged header cells and the Markdown OpenThai 2.0 OCR Markdown writes for it, an HTML table with rowspan and colspan; 95.2 on Thai document tables against 91.6 for Typhoon OCR V2 2B, and 1.6 s a page against 15.8 s

Results​

OpenThai 2.0 OCR Markdown against Typhoon OCR V2 2B and 0.8B: Thai document tables 95.2, new Royal Gazette pages 98.7%, ThaiOCRBench tables 68.9, printed Thai text 90.3, 1.6 s a page, 0.63 billion parameters

Every model read the same pages and was scored by the same script; Typhoon OCR V2 2B and Typhoon OCR V2 0.8B ran with the settings on their model card. Intervals are 95% paired bootstrap intervals over pages.

ModelSizeThai document tablesThaiOCRBench tablesPrinted Thai textSeconds a pageNew Royal Gazette pages
OpenThai 2.0 OCR Markdown0.63B95.268.990.31.698.7
Nemotron 3.5 Parse (base model)0.63B91.368.389.01.891.5
Typhoon OCR V2 2B2B91.667.689.615.894.6
Typhoon OCR V2 0.8B0.8B89.064.785.818.7–
  • Thai document tables: 65 real Thai government and university pages, text and tables scored together. Ahead of Typhoon OCR V2 2B by 3.6 points, 95% interval [+1.2, +6.2], and 3.9 points above its base model.
  • ThaiOCRBench tables: table structure and content (TEDS) on its 193 table images. +1.3 against Typhoon OCR V2 2B, [−1.7, +4.6]: a tie.
  • Printed Thai text: character accuracy, 100 × (1 − character error rate), averaged over 12 sets of 1,200 pages and 50 whole Administrative Court judgments. +0.76 against Typhoon OCR V2 2B, [−0.04, +1.51]: a tie. A page cut off by a repetition loop counts as empty; none of the 2,270 pages was.
  • Seconds a page: the median of 12 pages sent one at a time to vLLM on one NVIDIA H100. Typhoon OCR V2 2B needs --enforce-eager on the vLLM version we used, so its time is pessimistic.
  • New Royal Gazette pages: 339 pages from 293 documents published from 4 to 9 November 2026, after our training data was collected. The set was locked before any model read it, and each model read each page once; character accuracy. These are new documents of a kind OpenThai 2.0 OCR Markdown was trained on (Royal Gazette pages from earlier months), so they show how it reads unseen documents, not a new kind of document. The reference text comes from the same tool that made our Royal Gazette training labels, so it follows conventions this model learned. +4.1 against Typhoon OCR V2 2B, [+3.7, +4.4]; with every space removed, so that line-joining conventions do not count, +3.5, [+3.2, +3.9]. Typhoon OCR V2 0.8B was not run on this set.

On Thai document tables it is significantly better than Typhoon OCR V2 2B. On ThaiOCRBench tables and on printed text the two are level. It is about 10 times faster, at a third of the size. On 339 new Royal Gazette pages, published after our training data was collected, it read 98.7% of characters correctly, against 94.6% for Typhoon OCR V2 2B, also a significant lead; these are new documents of a kind it was trained on. Results for each of the 12 printed text sets are on the model page.

How we built it​

We started from NVIDIA Nemotron 3.5 Parse, a 0.63B model that already reads page layout, block classes and reading order, and fine-tuned it for Thai. Its serving and post-processing stack is unchanged, so OpenThai 2.0 OCR Markdown runs anywhere the base model runs.

The text labels are exact, never another model's reading. The training mix has 54,596 rows:

  • Synthetic Thai documents rendered in a browser from Thai Wikipedia text in 24 open-licence fonts: forms, memos, minutes, schedules and merged-cell tables, with scan and phone-photo damage. Two- and three-column pages teach it to read column by column.
  • Born-digital Thai government pages, the Thai parliament's budget documents and the Royal Gazette, whose PDF text layer gives the exact text and whose ruled grids give the exact tables.
  • Tables of other kinds: public financial and scientific tables (FinTabNet and PubTabNet), and synthetic Thai receipts, statements, lab and insurance reports and multi-level row headers, some with every digit in Thai.
  • Short crops of handwriting lines, English text and generated dot-matrix print, so that it keeps reading short pieces of text.
  • Pages that looped: 420 pages, from old-book scans, synthetic receipt photos and government pages, on which earlier fine-tunes ran into a repetition loop. Each carries the earlier model's own output up to the start of the loop, and the training lowers the probability of writing that loop again.

We trained on one H100 for one epoch of 1,707 steps. The release is the last checkpoint, used as trained, with none of the base model's weights blended in.

It was picked by a rule fixed before any candidate was scored, which uses development sets only; none of the results above was used to choose it. The model card sets out the rule. No benchmark page was trained on.

Limits​

  • No page in our tests ran into a repetition loop: 2,270 printed-text pages, 193 ThaiOCRBench table images and 6,137 development pages. If a page does, the parser raises an error, so the page can go to another reader.
  • Photographed single words and very short crops read worse than full pages: 96.4 against 99.8 for Typhoon OCR V2 2B.
  • Dot-matrix print, as in bank passbooks and impact-printed forms, reads less well than ordinary print: about 89% character accuracy on our development crops; the crops are generated and there is no real dot-matrix test set yet, so expect less on real passbooks.
  • Full handwritten pages, scene text and photographs of screens are not targets.

Get it​

The weights, the model card and NVIDIA's nemotron_parse package are on Hugging Face, a free download; the model page has the commands to serve it with vLLM and parse a page. If you would rather not run a GPU, the OpenThai 2.0 OCR Markdown API runs the same model in Thailand, at 0.15 IC a page.

OpenThai 2.0 OCR Markdown is a derivative of NVIDIA Nemotron 3.5 Parse and is distributed under the OpenMDW License Agreement, version 1.1. Built on NVIDIA Nemotron. It was trained and evaluated on an NVIDIA H100 GPU provided by Siam AI Corporation.