Evaluation
Table with columns: Metric, Value| Metric | Value |
|---|
| Test crops / pages | 1,612 / 185 |
| CER | 0.3880% |
| WER | 1.4490% |
| Exact match | 92.06% |
| CER 95% interval, page-cluster bootstrap | 0.2977–0.4881% |
| Empty / token-limited outputs | 0 / 0 |
Frozen page-disjoint split: 7,496 training crops (860 pages), 1,648 validation
crops (184 pages), 1,612 test crops (185 pages). Pixel-level audit found no
identical crops across splits. Initialization is the original LightOn model,
revision 36d8636925327c671bd8e479c517a004f7566bd9. The bbox fine-tune was not used, because its
training pages overlap this benchmark's validation/test pages.
Checkpoint checkpoint-1175 selected only on
full validation CER. Native validation CER after preserving visible quotes:
0.4510%.
The historical test was also used to evaluate Surya; it did not select this run's
checkpoint or hyperparameters. Metrics use the same frozen crops and scoring
as that Surya benchmark. Scoring preserves visible quotes, case, accents and
punctuation; only surrounding and repeated whitespace is normalized. Surya's
stored raw predictions are rescored with this identical corrected protocol.
Historical quote-stripping scores are retained separately for transparency.
Raw transcription scores are also provided in benchmark_native.json.
This is a local-domain evaluation, not a claim about other datasets.
Usage
import torchfrom PIL import Imagefrom transformers import AutoProcessor, AutoModelForImageTextToText model_id = "Remidesbois/LightOnOCR-3-Poneglyph"processor = AutoProcessor.from_pretrained(model_id)model = AutoModelForImageTextToText.from_pretrained( model_id, dtype=torch.bfloat16, device_map="cuda", attn_implementation="sdpa")image = Image.open("bubble.png").convert("RGB")conversation = [{"role": "user", "content": [{"type": "image", "image": image}]}]inputs = processor.apply_chat_template( conversation, tokenize=True, add_generation_prompt=True, enable_thinking=False, return_dict=True, return_tensors="pt").to(model.device, dtype=torch.bfloat16)with torch.inference_mode(): generated = model.generate(**inputs, max_new_tokens=256, do_sample=False)text = processor.batch_decode(generated[:, inputs["input_ids"].shape[1]:], skip_special_tokens=True)[0]print(text.strip())
Verified with Transformers 5.14.1 / PyTorch 2.8.0 CUDA 12.8 on RTX 5090.
Processor uses aspect-preserving Qwen resizing, 65,536–1,048,576 pixels.
No thinking, sampling, coordinates or geometry are included in the targets.
Training and integrity
Full language-model fine-tuning, merger and last four vision blocks:
793,333,056 / 852,985,920 parameters trained. FP32 master weights and AdamW
states, BF16 autocast, fused AdamW, SDPA, FLA Gated DeltaNet with SM120
causal-conv1d, Liger RMSNorm/SwiGLU and assistant-only weighted CE.
Every bubble contributes a normalized assistant/EOS loss, with mild extra
weight for short text and onomatopoeia. Conservative photometric augmentation;
length grouping and separate lower learning rates for vision/merger.
Export is standard BF16 safetensors. All 473
native tensors equal the BF16 cast of the CER-selected FP32 checkpoint.
Final validation/test use a fresh, unpatched Transformers reload.
Weights SHA-256: 45c7aa6054eddd1a879715fdb5a3f208dbfedefe06ec270a2f83d7032e61820f.
Only native weights, processor, model card and aggregate metrics are published.
Training crops, references and per-example predictions remain local.
Reproducible comparison
Table with columns: Identical frozen test, Surya bubble fine-tune, This LightOnOCR-3 model| Identical frozen test | Surya bubble fine-tune | This LightOnOCR-3 model |
|---|
| CER | 0.3822% | 0.3880% |
| WER | 1.3997% | 1.4490% |
| Exact match | 92.68% | 92.06% |
| Character edits / 52,064 reference characters | 199 | 202 |
IDs, pages, references, CER, WER and exact match were independently checked.
Paired page-cluster bootstrap, 5,000 resamples: LightOn minus Surya CER
95% interval -0.0716 to +0.0784 percentage points.
Surya comparison: surya-bubble-ocr-poneglyph frozen benchmark, dated 2026-10-05.
First phase: decoder LR 1.2e-5, six epochs, 60 warmup updates, cosine decay,
effective batch 32 (32 crops / update), mild photometric augmentation.
Second phase: initialized from first-phase checkpoint 1175, decoder LR 3e-6,
three epochs, ten warmup updates, no augmentation and EOS loss weight doubled.
Vision and merger LR multipliers are 0.25 and 0.5 throughout.
The first-phase checkpoint was retained; consolidation did not improve native validation CER. Selection compared native BF16 validation CER before opening test.
Native validation CER of this export: 0.4510%.
Table with columns: Candidate evaluated before test, Native BF16 validation CER| Candidate evaluated before test | Native BF16 validation CER |
|---|
| rtx5090-20261012-bubble | 0.4510% |
| rtx5090-20261012-bubble-cer-refinement | 0.5335% |
| rtx5090-20261012-bubble-average | 0.4950% |
Scoring was corrected before opening this run's test: visible quotes are kept,
and only whitespace is normalized for both models. Historical quote-stripping
test CER: Surya 0.4706%, LightOn 0.4725%.
The paired CER interval above includes zero; these data do not establish a clear
CER advantage over Surya. Validation curves show the historical scoring; native
candidate selection and test comparison use the corrected protocol.
Annotation audit
34 local crops were visually inspected: 18 targeted validation cases, six
training repetition/onomatopoeia cases and ten random training crops (seed 42).
Two validation annotations were clearly incorrect (repetition count and an
onomatopoeia); other stylized cases remain uncertain. All 16 inspected training
crops were consistent, which does not certify the full training dataset.
Of 169 non-exact validation outputs under historical scoring, 55 differed only
in case (67 of 264 character edits). Annotation capitalization conventions are
mixed, especially for onomatopoeia. No labels or splits were changed for these
results. Review images and detailed private error examples remain local.

The two training loss curves use different EOS weighting. Test was evaluated
once for the retained release, after all checkpoint and hyperparameter decisions.
These scores measure this local manga dataset; the paired confidence interval
describes uncertainty relative to the historical Surya benchmark.