Skip to content

Repository files navigation

MonOCR

MonOCR Feature Graphic

English | မြန်မာဘာသာ | ဘာသာမန်


Mon is spoken by roughly one million people across Myanmar and Thailand. UNESCO classifies it as vulnerable.

MonOCR takes an image of Mon script and returns text. It runs in the browser at ocr.mondevhub.com, offline once the model is cached. The Android and iOS apps build from source and are not in an app store yet.

Built and maintained by the Mon developer community.


Live

Samples

Three real documents, the text the CLI returned for each, and the per-line records behind it — nothing hand-corrected. See samples/, which also states what was screened out and why the headline number is not an average.

Two of the three carry non-Unicode text layers, one Zawgyi and one legacy 8-bit, and both are among the cleanest results: rasterisation happens before the model, so no encoding ever reaches it.


The model

All three apps ship one model, and since 2026-08-15 it is v3.5:

Architecture MobileNetV3-Large + SE + 2×BiLSTM-512 + attention + CTC
Parameters 11,553,437
Input Grayscale, 160px height, static 1024px width
Charset 276 characters, 277 classes
Precision FP32
Published at janakhpon/monocr, revision d3d9d5e

Android and iOS bundle it (46.2 MB and 46.3 MB respectively). The web app fetches it from that pinned revision. Per-app details are in apps/android, apps/ios and apps/web.

v3.5 is not a newer v2, it is a different contract. Input height went 128 to 160, output classes 316 to 277, charset 315 to 276, and the graph's width axis went from dynamic to a static 1024. Anything still holding a cached v2 artifact is refused rather than decoded, because a mismatch of that kind returns well-formed Mon text that is wrong. v2 remains served at revision a51be11 for anyone pinned to it.

Held-out CER 0.0100 on 150 unseen lines in a typeface the model never trained on (95% interval 0.0056 to 0.0147), measured 2026-08-16. Read it with the limits the model card states beside it:

  • n = 150, so the interval is wide.
  • One typeface. All 150 lines are Pyidaungsu, held out from training.
  • Unseen text, not an unseen renderer. Training and test images came from the same generator, so the number says nothing yet about camera photographs of real pages.
  • Disjointness is argued, not directly verified.

The figure that selected the checkpoint, val_cer 0.0210 over 4,096 lines during training, is not an evaluation and is not comparable to it.

A v4 server model was archived on 2026-08-05. It was never trained to convergence, so archiving it was a decision about maintaining a second path rather than about measured quality. It is not maintained.

No device latency number exists for any platform. Figures of that kind appeared here until 2026-08-15 and were architectural estimates, never measured on hardware.

Because high-quality Mon datasets are scarce, validated samples from the app's feedback flow feed directly into future training rounds.


Platform

Each app runs the model in this format:

Platform Format Execution provider requested
Web ONNX WebGPU where the browser offers it, otherwise WASM
Android ONNX NNAPI, with CPU fallback
iOS CoreML .mlpackage Core ML, all compute units

The provider is what each app asks for, not what was measured. Whether NNAPI or the Neural Engine actually runs the BiLSTM layers has not been checked on a device, and they are not expected to.


Resources


Contributing

Janakh Pon · Oung Seik Nyan · Rajel Da Key · MonDevHub

About

MonOCR takes an image of Mon script and returns text.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages