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