shantipriya/hunyuan-ocr-odia
0
HunyuanOCR Fine-tuned for Odia OCR
Fine-tuned tencent/HunyuanOCR on the OdiaGenAIOCR/odia-ocr-merged dataset using LoRA (r=64, alpha=128).
GitHub: shantipriyap/hunyuan_odia_ocr
Evaluation Results
Note on evaluation: Training uses word-level crops (OdiaGenAIOCR/odia-ocr-merged). TheIftesha/odia-ocr-benchmarkdataset contains paragraph-level images — a different domain where this model scores CER ~0.99 (expected, not trained on paragraphs).
Inference Samples (checkpoint-4000, step 80% of training)
Evaluated on 60 word-crop samples from OdiaGenAIOCR/odia-ocr-merged test split. Avg CER: 1.16 | Best CER: 0.64 (60 samples, ckpt-4000).
Note: Training is 80% complete (4000/5000 steps). Mode collapse persists — model outputs a small set of common Odia words. Expected to improve in final steps.
🟡 Best Available (CER 0.64–0.70)
🟠 Partial (CER 1.0)
🔴 Poor (CER > 3.0)
Training Loss Curve (v8, r=64)
Training Configuration
Quick Start
import torch
from PIL import Image
from transformers import HunYuanVLForConditionalGeneration, AutoProcessor
from peft import PeftModel
BASE = "tencent/HunyuanOCR"
CKPT = "shantipriya/hunyuan-ocr-odia"
base = HunYuanVLForConditionalGeneration.from_pretrained(
BASE, torch_dtype=torch.bfloat16,
attn_implementation="eager", device_map="auto")
model = PeftModel.from_pretrained(base, CKPT)
model.eval()
proc = AutoProcessor.from_pretrained(BASE, use_fast=False)
img = Image.open("odia_image.jpg").convert("RGB")
msgs = [
{"role": "system", "content": ""}, # required
{"role": "user", "content": [
{"type": "image", "image": img},
{"type": "text", "text": "Extract all Odia text from this image. Return only the Odia text."},
]},
]
text = proc.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True)
inputs = proc(text=[text], images=[img], return_tensors="pt").to("cuda")
with torch.no_grad():
gen = model.generate(**inputs, max_new_tokens=256, do_sample=False)
result = proc.batch_decode(
[gen[0][inputs["input_ids"].shape[1]:]], skip_special_tokens=True
)[0].strip()
print(result)Note: The emptysystemmessage is required — omitting it causes aposition_idsdimension error.
License
Apache 2.0
