Views
No views yet
| Parameter | Value |
|---|---|
| Epochs | 250 |
| Batch Size | 16 |
| Learning Rate | 1e-5 |
| Optimizer | AdamW |
| Training Regime | fp16 mixed precision |
| Metric | Value |
|---|---|
| CER (Character Error Rate) | 0.488% |
1import editdistance
2
3def calculate_cer(pred, label):
4 """Character Error Rate (lower is better)"""
5 if len(label) == 0:
6 return 1.0 if len(pred) > 0 else 0.0
7 distance = editdistance.eval(pred, label)
8 return distance / len(label)pip install transformers torch sentencepiece pillow1import torch
2from PIL import Image
3import sentencepiece as spm
4from transformers import VisionEncoderDecoderModel, ViTImageProcessor
5
6# Load model
7model = VisionEncoderDecoderModel.from_pretrained('microsoft/trocr-base-handwritten')
8image_processor = ViTImageProcessor.from_pretrained('microsoft/trocr-base-handwritten')
9
10# Load Thai tokenizer
11sp = spm.SentencePieceProcessor()
12sp.Load('thai_sp_30000.model')
13
14# Load trained weights
15checkpoint = torch.load('best_model.pt', map_location='cpu')
16model.decoder.resize_token_embeddings(sp.GetPieceSize())
17model.load_state_dict(checkpoint['model_state_dict'], strict=False)
18model.eval()
19
20# Inference
21image = Image.open('handwriting.jpg').convert('RGB')
22pixel_values = image_processor(image, return_tensors='pt').pixel_values
23
24with torch.no_grad():
25 generated_ids = model.generate(
26 pixel_values,
27 max_length=128,
28 num_beams=4,
29 )
30
31# Decode
32ids = generated_ids[0].tolist()
33text = sp.DecodeIds(ids)
34print(text)Input Image
|
v
Vision Transformer (ViT) Encoder
|
v
Cross-Attention
|
v
Transformer Decoder
|
v
SentencePiece Tokenizer (Unigram)
|
v
Thai Text Output1@misc{thai-handwritten-trocr,
2 author = {Warit Sirikosityanggoon},
3 title = {Thai Handwritten OCR using TrOCR},
4 year = {2025},
5 publisher = {Hugging Face},
6 howpublished = {\url{https://github.com/waritkan/Thai-Hand-Written-TrOCR-Webapp}}
7}