File size: 4,578 Bytes
6757d9d
 
 
 
 
6a414d7
6757d9d
 
6a414d7
 
6757d9d
 
6a414d7
 
 
 
 
6757d9d
 
 
6a414d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6757d9d
 
6a414d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6757d9d
6a414d7
 
 
 
 
 
 
6757d9d
6a414d7
 
6757d9d
6a414d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6757d9d
6a414d7
 
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import PIL 
from PIL import ImageDraw
from PIL import Image
import streamlit as st
import os
import easyocr

def load_image(image_file):
    img = PIL.Image.open(image_file)
    return img

def init_session_states():
    if 'disp' not in st.session_state:
        st.session_state['disp'] = st.empty()
        st.session_state['disp'].text("กำลังตั้งค่า Environment...")
    if 'init' not in st.session_state:
        st.session_state['init'] = 1

init_session_states()

def draw_bounding_boxes(image, results):
    """วาด bounding boxes บนภาพ"""
    draw = ImageDraw.Draw(image)
    
    for (bbox, text, confidence) in results:
        # แปลง coordinates
        top_left = tuple(bbox[0])
        bottom_right = tuple(bbox[2])
        
        # วาดสี่เหลี่ยม
        draw.rectangle([top_left, bottom_right], outline="red", width=3)
        
        # วาดข้อความ
        draw.text(top_left, f"{text} ({confidence:.2f})", fill="blue")
    
    return image

def main():
    st.session_state['disp'].text("Environment พร้อมใช้งานแล้ว!")
    
    st.title("📝 Image Text Detection")
    st.write("ใช้ EasyOCR สำหรับตรวจจับและจดจำข้อความจากภาพ")
    
    # เลือกภาษา
    st.sidebar.subheader("🌐 เลือกภาษา")
    languages = {
        "English": "en",
        "Thai": "th", 
        "Chinese Simplified": "ch_sim",
        "Japanese": "ja",
        "Korean": "ko",
        "French": "fr",
        "German": "de"
    }
    
    selected_langs = st.sidebar.multiselect(
        "เลือกภาษาที่ต้องการตรวจจับ:",
        options=list(languages.keys()),
        default=["English", "Thai"]
    )
    
    # แปลงเป็นรหัสภาษา
    lang_codes = [languages[lang] for lang in selected_langs]
    
    uploaded_file = st.file_uploader("เลือกไฟล์ภาพ", type=['jpeg','jpg','png'])
    
    if uploaded_file is not None:
        # แสดงรายละเอียดไฟล์
        file_details = {
            "ชื่อไฟล์": uploaded_file.name,
            "ประเภท": uploaded_file.type,
            "ขนาด": f"{uploaded_file.size / 1024:.2f} KB",
            "ภาษาที่ตรวจจับ": ", ".join(selected_langs)
        }
        st.write(file_details)
        
        # โหลดและแสดงภาพ
        image = load_image(uploaded_file)
        st.image(image, width=500, caption="ภาพต้นฉบับ")
        
        # ตรวจจับข้อความ
        with st.spinner(f"กำลังตรวจจับข้อความใน {len(selected_langs)} ภาษา..."):
            reader = easyocr.Reader(lang_codes, gpu=False)
            results = reader.readtext(image)
        
        st.success("ตรวจจับข้อความสำเร็จ!")
        
        # แสดงผลลัพธ์
        st.subheader("🔍 ผลลัพธ์การตรวจจับ")
        
        # วาด bounding boxes
        if results:
            annotated_image = draw_bounding_boxes(image.copy(), results)
            st.image(annotated_image, width=500, caption="ภาพที่มีการวาด Bounding Boxes")
            
            # แสดงข้อความที่ตรวจจับได้
            st.subheader("📄 ข้อความที่ตรวจจับได้")
            
            for i, (bbox, text, confidence) in enumerate(results):
                st.write(f"**ข้อความ {i+1}:**")
                st.write(f"- ข้อความ: `{text}`")
                st.write(f"- ความมั่นใจ: `{confidence:.2%}`")
                st.write(f"- ตำแหน่ง: {bbox}")
                st.write("---")
                
            # รวมข้อความทั้งหมด
            all_text = " ".join([text for (_, text, _) in results])
            st.subheader("📝 ข้อความรวม")
            st.text_area("ข้อความที่ตรวจจับได้ทั้งหมด:", all_text, height=100)
            
        else:
            st.warning("❌ ไม่พบข้อความในภาพนี้")

if __name__ == "__main__":
    main()