File size: 3,289 Bytes
1a517f1
a187193
592ad8f
a187193
ef3ca12
592ad8f
 
a187193
b31bef1
a187193
 
1a517f1
 
ef3ca12
b31bef1
a187193
 
 
 
 
ef3ca12
 
 
 
a187193
ddc67bf
a187193
 
ef3ca12
 
 
 
 
 
 
 
 
 
17ba373
 
ddc67bf
ef3ca12
592ad8f
 
ef3ca12
592ad8f
 
a187193
17ba373
ef3ca12
a187193
592ad8f
 
a187193
592ad8f
17ba373
592ad8f
 
1c8a6bd
17ba373
1c8a6bd
 
948e2eb
ef3ca12
 
 
 
 
 
 
 
 
 
 
 
 
592ad8f
ddc67bf
592ad8f
 
17ba373
a187193
ef3ca12
17ba373
592ad8f
a187193
592ad8f
 
1a517f1
17ba373
 
592ad8f
1a517f1
592ad8f
 
 
948e2eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import os
import warnings
import torch
import gc
from transformers import pipeline, AutoTokenizer
from PIL import Image
import gradio as gr
from huggingface_hub import login

warnings.filterwarnings('ignore')
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

# Global variables
pipe = None

if torch.cuda.is_available():
    torch.cuda.empty_cache()
    gc.collect()
    print("เคลียร์ CUDA cache เรียบร้อยแล้ว")

def load_pipeline():
    """โหลด pipeline"""
    global pipe
    print("กำลังโหลด pipeline...")
    
    try:
        hub_model_path = "Aekanun/thai-handwriting-llm"
        
        # สร้าง pipeline
        pipe = pipeline(
            "image-to-text",
            model=hub_model_path,
            device="cuda" if torch.cuda.is_available() else "cpu",
            model_kwargs={
                "torch_dtype": torch.bfloat16,
                "load_in_4bit": True,
                "trust_remote_code": True,
            },
            token=os.environ.get('HUGGING_FACE_HUB_TOKEN')
        )
        
        print("โหลด pipeline สำเร็จ!")
        return True
    except Exception as e:
        print(f"เกิดข้อผิดพลาดในการโหลด pipeline: {str(e)}")
        return False

def process_handwriting(image):
    """ฟังก์ชันสำหรับ Gradio interface"""
    global pipe
    
    if image is None:
        return "กรุณาอัพโหลดรูปภาพ"
    
    try:
        # Ensure image is in PIL format
        if not isinstance(image, Image.Image):
            image = Image.fromarray(image)
            
        # Convert to RGB if needed
        if image.mode != "RGB":
            image = image.convert("RGB")

        # ใช้ pipeline ประมวลผล
        result = pipe(
            image,
            prompt="""Transcribe the Thai handwritten text from the provided image.
Only return the transcription in Thai language.""",
            max_new_tokens=256,
            do_sample=False
        )
        
        # รับผลลัพธ์
        if isinstance(result, list):
            return result[0]['generated_text'].strip()
        return result['generated_text'].strip()
        
    except Exception as e:
        return f"เกิดข้อผิดพลาด: {str(e)}"

# Initialize application
print("กำลังเริ่มต้นแอปพลิเคชัน...")
if load_pipeline():
    # Create Gradio interface
    demo = gr.Interface(
        fn=process_handwriting,
        inputs=gr.Image(type="pil", label="อัพโหลดรูปลายมือเขียนภาษาไทย"),
        outputs=gr.Textbox(label="ข้อความที่แปลงได้"),
        title="Thai Handwriting Recognition",
        description="อัพโหลดรูปภาพลายมือเขียนภาษาไทยเพื่อแปลงเป็นข้อความ",
        examples=[["example1.jpg"], ["example2.jpg"]]
    )

    if __name__ == "__main__":
        demo.launch()
else:
    print("ไม่สามารถเริ่มต้นแอปพลิเคชันได้")