Netra OCR V2 β Khmer Text Recognition (Phase A, in progress)
Khmer text recognizer over character-cluster (KCC) tokens, based on Towards Universal Khmer Text Recognition (Kong et al.) and extended to address both limitations raised in the paper's Β§6: a supervised MAFS modality router and a learned decoder router.
Code: https://github.com/NDarayut/Netra-OCR-V2
β οΈ Status β this is not a finished model
phase_a_epoch26.pt is a mid-training snapshot: Phase A (document/printed
pretraining) at epoch 26, and Phase B (scene & handwritten adaptation) has not
been run. It is published for checkpointing and reproducibility, not for use.
No accuracy numbers are claimed. The model has not been evaluated on the held-out test sets, and it has seen essentially no scene-text or handwritten data yet β expect it to perform poorly outside clean printed documents. Do not deploy this for anything that matters.
Architecture
image β CBAM-refined VGG backbone β Transformer encoder β MAFS β β¬β AR decoder (accurate)
ββ CTC head (fast)
- 22.6M parameters, float32.
- Input height 48px, chunked at width 100 with 16px overlap.
- Trained jointly with
l_Total = l_CTC + l_TR; the AR decoder uses a 30% input-token masking regularizer. - MAFS router: 5 slots, first 3 supervised against per-source document / scene / handwritten labels.
Files
| File | Contents |
|---|---|
phase_a_epoch26.pt |
{"model": state_dict, "epoch": 26, "phase": "a"} β inference weights only |
Optimizer and scheduler state are not included, so this checkpoint cannot be used to resume training.
Usage
import torch
from netra_ocr_v2.config import OCRConfig
from netra_ocr_v2.model import KhmerOCR
ck = torch.load("phase_a_epoch26.pt", map_location="cpu")
model = KhmerOCR(OCRConfig())
model.load_state_dict(ck["model"])
model.eval()
See the repo for preprocessing and the predictor.
Training data
Ten Khmer OCR sources from the Hub β the work of their respective authors,
including datasets from SoyVitou, seanghay, KrorngAI, LazyGreed,
KiteAether, plus Google Research's HierText. The full split with modality
labels is in dataset_split.md in the repo. Please credit those authors if you
build on this.
Citation
Base architecture: Kong et al., Towards Universal Khmer Text Recognition. Also builds on CBAM (Woo et al. 2018), Mask-Predict (Ghazvininejad et al. 2019), and blockwise parallel decoding (Stern et al. 2018).