Donyking1818 commited on
Commit
8d74894
·
verified ·
1 Parent(s): 3d4e61f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +60 -42
app.py CHANGED
@@ -1,12 +1,12 @@
1
  import gradio as gr
2
- from transformers import AutoProcessor, AutoModel
3
  import torch
4
  from PIL import Image
5
 
6
- # --- KONFIGURASI ALAM SEMESTA ---
7
  MODEL_PATH = "zai-org/GLM-OCR"
8
 
9
- # 1. HUKUM KEKALAN HARDWARE (Otomatis Deteksi CPU/GPU)
10
  if torch.cuda.is_available():
11
  device = "cuda"
12
  dtype = torch.float16
@@ -16,90 +16,108 @@ else:
16
 
17
  print(f"🚀 ENGINE STARTED: Device={device} | Dtype={dtype}")
18
 
19
- # 2. INISIASI MODEL (TRUST REMOTE CODE MUTLAK)
20
  try:
21
- print("⏳ Menyiapkan Otak Buatan...")
 
 
22
  processor = AutoProcessor.from_pretrained(
23
  MODEL_PATH,
24
  trust_remote_code=True
25
  )
26
 
27
- # Kita pakai AutoModel karena GLM-OCR arsitekturnya unik
28
- model = AutoModel.from_pretrained(
29
  MODEL_PATH,
30
  torch_dtype=dtype,
31
  trust_remote_code=True,
32
  low_cpu_mem_usage=True,
33
  device_map="auto"
34
  )
35
- # Kunci model ke mode evaluasi biar irit memori
36
- model.eval()
 
37
 
38
  except Exception as e:
39
- print(f"⚠️ Warning Loading Model (Abaikan jika UI Muncul): {e}")
40
- # Kita biarkan script lanjut karena warning weights mismatch itu wajar di custom model
41
  pass
42
 
43
- # 3. PROSES INFERENSI (INTELIJEN VISUAL)
44
  def proses_intelijen(image):
45
  if image is None:
46
- return "⚠️ Gambarnya mana Bro? Fisika butuh materi buat bereaksi."
47
 
48
- # Format Prompt Khusus GLM
49
- pesan = [{"role": "user", "content": [{"type": "image", "image": image}, {"type": "text", "text": "Text Recognition:"}]}]
 
 
 
 
 
 
 
 
50
 
51
  try:
 
 
52
  inputs = processor.apply_chat_template(
53
- pesan,
54
  add_generation_prompt=True,
 
55
  return_dict=True,
56
- return_tensors="pt"
57
- ).to(model.device)
 
 
 
 
 
 
58
 
 
59
  with torch.no_grad():
60
- output_ids = model.generate(
61
  **inputs,
62
- max_new_tokens=1500, # Batasi biar ga timeout
63
  do_sample=False
64
  )
65
 
66
- hasil = output_ids[0][len(inputs["input_ids"][0]):]
67
- teks_final = processor.decode(hasil, skip_special_tokens=True)
 
 
 
68
  return teks_final
69
 
70
  except Exception as e:
71
- return f"🚨 ERROR REAKSI: {str(e)}"
72
-
73
- # 4. ANTARMUKA VISUAL 2026 (Modern Style)
74
- # HAPUS 'theme' dan 'show_copy_button' di sini biar 100% Anti-Error
75
 
 
76
  css_style = """
77
  .container { max-width: 1200px; margin: auto; padding-top: 20px; }
78
- h1 { text-align: center; color: #3b82f6; font-family: sans-serif; }
79
- .gr-button-primary { background: linear-gradient(90deg, #3b82f6 0%, #8b5cf6 100%); border: none; color: white; }
80
- .info { text-align: center; color: gray; font-size: 0.9em; margin-bottom: 20px;}
81
  """
82
 
83
- with gr.Blocks(css=css_style, title="GLM-OCR PRO") as app:
84
  with gr.Column(elem_classes="container"):
85
- gr.Markdown("# 👁️ GLM-OCR INFINITE VISION")
86
- gr.Markdown("<p class='info'>Analisis Dokumen Menggunakan Arsitektur Syaraf GLM Multimodal</p>")
87
 
88
  with gr.Row():
89
- # Kolom Kiri: Input
90
  with gr.Column(scale=1):
91
- input_img = gr.Image(type="pil", label="Masukkan Materi (Gambar)", sources=["upload", "clipboard"], height=500)
92
- # Tombol Ganteng
93
- scan_btn = gr.Button("🚀 EKSTRAKSI DATA", variant="primary", size="lg")
94
 
95
- # Kolom Kanan: Output
96
  with gr.Column(scale=1):
97
- # INI DIA FIXNYA: Ganti TextArea jadi Textbox dan HAPUS argumen ilegal
98
- # Pake 'show_copy_button=True' HANYA jika komponen Textbox, tapi demi keamanan kita pake standar aja.
99
- # interactive=False biar jadi read-only mode
100
- output_txt = gr.Textbox(label="Hasil Analisis Molekuler", lines=25, interactive=False, show_label=True)
101
 
102
- # Trigger Reaksi
103
  scan_btn.click(fn=proses_intelijen, inputs=input_img, outputs=output_txt)
104
 
105
  if __name__ == "__main__":
 
1
  import gradio as gr
2
+ from transformers import AutoProcessor, AutoModelForImageTextToText
3
  import torch
4
  from PIL import Image
5
 
6
+ # --- KONFIGURASI INTI ---
7
  MODEL_PATH = "zai-org/GLM-OCR"
8
 
9
+ # 1. HUKUM KEKALAN HARDWARE (Auto Deteksi CPU/GPU)
10
  if torch.cuda.is_available():
11
  device = "cuda"
12
  dtype = torch.float16
 
16
 
17
  print(f"🚀 ENGINE STARTED: Device={device} | Dtype={dtype}")
18
 
19
+ # 2. INISIASI MODEL (DENGAN SAFE LOAD)
20
  try:
21
+ print("⏳ Menyiapkan Otak GLM...")
22
+
23
+ # Processor (Penyortir Data)
24
  processor = AutoProcessor.from_pretrained(
25
  MODEL_PATH,
26
  trust_remote_code=True
27
  )
28
 
29
+ # Model (Otak Utama) - Balik ke AutoModelForImageTextToText karena Library GIT udah support
30
+ model = AutoModelForImageTextToText.from_pretrained(
31
  MODEL_PATH,
32
  torch_dtype=dtype,
33
  trust_remote_code=True,
34
  low_cpu_mem_usage=True,
35
  device_map="auto"
36
  )
37
+
38
+ # Mode Hemat Energi (Evaluasi)
39
+ model.eval()
40
 
41
  except Exception as e:
42
+ print(f"⚠️ Warning Model Loading: {e}")
43
+ # Biasanya warning doang, gas terus.
44
  pass
45
 
46
+ # 3. PROSES REAKSI FISIKA (Input -> Tensor -> Output)
47
  def proses_intelijen(image):
48
  if image is None:
49
+ return "⚠️ Upload dulu gambarnya Bos! Jangan scan angin."
50
 
51
+ # Format Pesan Sesuai Standar GLM
52
+ messages = [
53
+ {
54
+ "role": "user",
55
+ "content": [
56
+ {"type": "image", "image": image},
57
+ {"type": "text", "text": "Text Recognition:"}
58
+ ],
59
+ }
60
+ ]
61
 
62
  try:
63
+ # --- PERBAIKAN FATAL ADA DISINI ---
64
+ # tokenize=True adalah KUNCINYA. Biar dia jadi Tensor (Angka), bukan Teks doang.
65
  inputs = processor.apply_chat_template(
66
+ messages,
67
  add_generation_prompt=True,
68
+ tokenize=True, # <--- INI YG DULU KURANG!
69
  return_dict=True,
70
+ return_tensors="pt" # Pastikan keluar format PyTorch
71
+ )
72
+
73
+ # Buang data sampah yang gak perlu
74
+ inputs.pop("token_type_ids", None)
75
+
76
+ # Pindahkan ke Mesin (Device) secara Manual biar aman
77
+ inputs = {k: v.to(device) for k, v in inputs.items()}
78
 
79
+ # GEBER MESINNYA (GENERATE)
80
  with torch.no_grad():
81
+ generated_ids = model.generate(
82
  **inputs,
83
+ max_new_tokens=2048, # Naikkin dikit biar dokumen panjang kebaca
84
  do_sample=False
85
  )
86
 
87
+ # DECODE (Angka -> Teks Manusia)
88
+ # Kita potong input promptnya, ambil hasilnya doang
89
+ hasil_potong = generated_ids[0][inputs["input_ids"].shape[1]:]
90
+ teks_final = processor.decode(hasil_potong, skip_special_tokens=False) # Coba False dulu biar detail
91
+
92
  return teks_final
93
 
94
  except Exception as e:
95
+ return f"🚨 SYSTEM CRITICAL FAILURE: {str(e)}\n(Kemungkinan memori tidak cukup atau input rusak)"
 
 
 
96
 
97
+ # 4. ANTARMUKA 2026 (UI yang Elegan tapi BODOH-PROOF)
98
  css_style = """
99
  .container { max-width: 1200px; margin: auto; padding-top: 20px; }
100
+ h1 { text-align: center; color: #1e3a8a; font-family: sans-serif; font-weight: 900; }
101
+ .btn-primary { background: linear-gradient(90deg, #1e3a8a 0%, #3b82f6 100%); color: white; border: none; font-size: 1.1rem; }
102
+ .btn-primary:hover { opacity: 0.9; }
103
  """
104
 
105
+ with gr.Blocks(css=css_style, title="GLM-OCR V1") as app:
106
  with gr.Column(elem_classes="container"):
107
+ gr.Markdown("# 👁️ GLM-OCR ULTRA SCANNER")
108
+ gr.Markdown("Ekstrak teks dari dokumen apapun. Upload, Klik, Jadi.")
109
 
110
  with gr.Row():
111
+ # Kolom Input
112
  with gr.Column(scale=1):
113
+ input_img = gr.Image(type="pil", label="Input Visual (Gambar)", sources=["upload", "clipboard"], height=450)
114
+ scan_btn = gr.Button("⚡ AKTIFKAN PEMINDAI", variant="primary", elem_classes="btn-primary")
 
115
 
116
+ # Kolom Output (Pake Textbox biasa biar anti error 'show_copy_button')
117
  with gr.Column(scale=1):
118
+ output_txt = gr.Textbox(label="Data Terekstraksi", lines=22, show_copy_button=True, interactive=False)
 
 
 
119
 
120
+ # Pemicu
121
  scan_btn.click(fn=proses_intelijen, inputs=input_img, outputs=output_txt)
122
 
123
  if __name__ == "__main__":