Wayu-Paxa-OCR-Zero

Thai document OCR: 0.9B parameters, trained without a single OCR label from a real Thai document. A full fine-tune of PaddleOCR-VL-1.6 on 45,723 synthetic pages, reconstructed from public English document collections. Release artifact for the paper How Far Can Synthetic Data Take Thai OCR?

Against its base checkpoint it cuts median character error rate from 6.64% to 1.24% on printed Thai pages and from 74.87% to 20.55% on handwriting, and it reads Thai better than the 7B Typhoon OCR model on all three of our evaluation sets.

This is a region recognizer, not a page reader. It is trained on crops and has never seen a whole page. Reading a page takes two models — PP-DocLayoutV3 finds the regions and orders them, this model transcribes each one — which is what the PaddleOCRVL pipeline below does for you. Handing it a full page directly will disappoint you.

โมเดลนี้ไม่ได้อ่านข้อความจากทั้งหน้าในครั้งเดียว แต่ประมวลผลทีละ region เนื่องจากตอนเทรน โมเดลเห็นเฉพาะภาพที่ crop จากแต่ละส่วนของเอกสาร ไม่ได้เห็นภาพหน้าเต็ม

ดังนั้น การอ่านข้อความจากเอกสารหนึ่งหน้าต้องใช้สองขั้นตอน: ให้ PP-DocLayoutV3 ตรวจหา region และจัดลำดับการอ่านก่อน จากนั้นจึงใช้โมเดลนี้อ่านข้อความในแต่ละ region

pipeline PaddleOCRVL ด้านล่างรวมสองขั้นตอนนี้ไว้ให้แล้ว จึงควรป้อนภาพทั้งหน้าผ่าน pipeline โดยตรง แทนที่จะส่งภาพเต็มหน้าเข้าโมเดลนี้เพียงตัวเดียว ซึ่งมักให้ผลลัพธ์ไม่ดี

Research artifact. Released for reproducibility and further research alongside the paper above. Not a product: no maintenance or availability commitment, and no warranty. There is no staffed support channel — but community help is very welcome, so please open an issue or a pull request on wayu-research/wayu-ocr-inference.

Code and tutorial: wayu-research/wayu-ocr-inference. Data generator: wayu-research/docaug.

Usage — full page, on a GPU

Serve the weights on vLLM, then drive the stock PaddleOCR-VL pipeline against them. The pipeline dials the recognizer by name, so --served-model-name is not optional.

pip install "paddleocr[doc-parser]>=3.6.0" paddlepaddle-gpu vllm

vllm serve wayu-ai/wayu-paxa-ocr-zero \
    --served-model-name PaddleOCR-VL-1.6-0.9B --port 8011 \
    --max-num-batched-tokens 16384 --no-enable-prefix-caching --mm-processor-cache-gb 0
from paddleocr import PaddleOCRVL

pipeline = PaddleOCRVL(
    pipeline_version="v1.6",                          # PP-DocLayoutV3 + the 0.9B recognizer
    vl_rec_backend="vllm-server",
    vl_rec_server_url="http://127.0.0.1:8011/v1",
    vl_rec_max_concurrency=32,
)
result = pipeline.predict(["page.png"], use_queues=False,
                          temperature=0.1, top_p=0.7, repetition_penalty=1.05)[0]
print(result.markdown["markdown_texts"])              # the page, in reading order
for block in result["parsing_res_list"]:              # or region by region
    print(block.label, block.bbox, block.content)

use_queues=False is load-bearing for throughput: with queues on, the pipeline flushes crops to the recognizer as each detection chunk finishes and leaves the server at a handful of concurrent requests. Off, a whole chunk's crops arrive as one batch and the server fills. Sample rather than decode greedily: greedy decoding tends to loop on hard crops. The paper's numbers are greedy (temperature=0), which the pipeline sends when no temperature is given. Measured on 15 dense Thai invoice pages: ~52 pages/min with an RTX 3090 for the recognizer and a second card for layout detection, ~15 pages/min with layout detection on the CPU instead. Note that vLLM reserves --gpu-memory-utilization of the card up front, so paddle may fail to allocate if you leave both on one GPU — lower it, or move layout off.

Usage — full page, on CPU

Same pipeline, quantized recognizer, no GPU anywhere. GGUF builds are in wayu-ai/wayu-paxa-ocr-zero-gguf; llama.cpp has had the paddleocr architecture natively since #18825, so no patched build is needed.

llama-server -m Wayu-Paxa-OCR-Zero-Q4_K_M.gguf \
    --mmproj mmproj-Wayu-Paxa-OCR-Zero-F16.gguf \
    --alias PaddleOCR-VL-1.6-0.9B --jinja -c 8192 -t 10 -np 4 --port 8080
pipeline = PaddleOCRVL(
    pipeline_version="v1.6",
    vl_rec_backend="llama-cpp-server",   # sends PNG crops and `max_tokens`; not interchangeable
    vl_rec_server_url="http://127.0.0.1:8080/v1",
    vl_rec_max_concurrency=4,            # match `-np`; llama.cpp queues the rest
    device="cpu",                        # PP-DocLayoutV3 on CPU too
)

Q4_K_M is the fast build, not the accurate one. It holds up on clean born-digital pages and gives way on the long tail — dot-matrix carbon copies, tables, and the other hard pages the model was already unsure of. When the transcript has to be right, read those pages at full precision: the safetensors in this repository on a GPU, or the F16 GGUF.

build file LM size what it is for
Q4_K_M Wayu-Paxa-OCR-Zero-Q4_K_M.gguf 286 MiB the default; smallest and fastest
Q8_0 Wayu-Paxa-OCR-Zero-Q8_0.gguf 475 MiB when you want a second opinion on a quantization artifact
F16 Wayu-Paxa-OCR-Zero-F16.gguf 892 MiB full precision on this path — what accuracy work reads a page with
vision mmproj-Wayu-Paxa-OCR-Zero-F16.gguf 840 MiB required by all three; stays F16

What it reads

Each region carries the prompt PaddleX assigns to its category, and the model answers in that category's format — inherited from the base checkpoint and kept verbatim in training:

prompt region output
OCR: text, titles, headers, list items, captions Markdown
Table Recognition: tables OTSL
Formula Recognition: formulas LaTeX
Chart Recognition: charts Markdown table

The pipeline assembles these into one Markdown page for you; the table above matters only if you are calling the recognizer directly on your own crops.

Results

CER in percent, lower better. Med. is the page median, Mean the character-weighted mean; on skewed page distributions the median is the number to read. The ThaiOCRBench pair is the average across its five audited reading tasks (Med. = mean of the per-task medians), not a page median. Every value is the projected CER of the paper's Appendix C — each prediction is projected onto the evaluated regions before scoring, so a crop pipeline and a whole-page model are charged for recognition rather than for their output contract.

System Heldout Handwriting Easy HW ThaiOCRBench SEA-DocBench
Med. Mean Med. Mean Med. Mean Med. Mean Med. Mean
PaddleOCR-VL-1.6 (0.9B, base) 6.64 27.60 74.87 67.90 73.74 69.41 38.0 43.3 8.87 18.54
Wayu-Paxa-OCR-Zero (0.9B) 1.24 14.75 20.55 22.28 14.18 17.08 15.3 25.6 4.86 9.99
Typhoon OCR (7B) 2.54 18.27 43.60 49.36 34.99 45.06 30.6 44.7 9.22 17.57
Typhoon OCR 1.5 (2B) 0.21 5.47 19.36 21.86 9.02 15.74 6.2 16.8 5.81 12.80
Gemini 3.7 Flash 0.00 3.56 11.29 15.04 3.89 7.64 0.9 3.8 5.51 10.62

Limitations

  • Needs a layout detector. A region recognizer alone is not an OCR system. Reported numbers include PP-DocLayoutV3's detection and reading-order errors, because that is what a user actually gets.
  • Handwriting is usable, not solved. 20.55% median CER means a readable transcript with real errors in it, not a faithful one.
  • Printed Thai is where it is strongest, and forms, receipts and dense financial tables are where it is weakest — merged-cell tables in particular tend to end early.
  • Thai and English only. Other scripts are whatever the base checkpoint had; nothing here trained or measured them.
  • Synthetic supervision has a ceiling. Every rendering decision the generator makes — typefaces, degradation, glyph inventory — is a distribution the model inherits and cannot see past.

Disclaimer

Provided "as is", without warranty of any kind, express or implied, to the fullest extent permitted by law (Apache-2.0, sections 7 and 8). The authors, the maintainers and their affiliated institutions accept no responsibility and no liability for any damage, loss, cost or claim arising from use or misuse of this model or its output, and are not responsible for how third parties use it.

OCR output is a prediction, not a transcript of record. Do not use it unreviewed where a misread digit or dropped tone mark carries legal, financial or medical consequence, and do not feed documents you are not permitted to process into any service you did not deploy yourself.

License

Apache-2.0, the license of the base model.

Acceptable use. By downloading or using this model you agree to the Wayu Research Acceptable Use terms.

Citation

@misc{pipatanakul2026farsyntheticdatathai,
      title={How Far Can Synthetic Data Take Thai OCR?}, 
      author={Kunat Pipatanakul},
      year={2026},
      eprint={2609.03595},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2609.03595}, 
}

Contact

Kunat Pipatanakul — research@wayuresearch.org

Downloads last month
32
Safetensors
Model size
0.9B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for wayu-ai/wayu-paxa-ocr-zero

Finetuned
(10)
this model
Quantizations
1 model

Collection including wayu-ai/wayu-paxa-ocr-zero

Paper for wayu-ai/wayu-paxa-ocr-zero