# -*- coding: utf-8 -*- import sys, io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') """ Uji Akurasi OCR - Word Error Rate (WER) & Character Error Rate (CER) Menggunakan library: jiwer Install: pip install jiwer pandas openpyxl """ import pandas as pd # pyrefly: ignore [missing-import] from jiwer import wer, cer # ───────────────────────────────────────────── # ISI DATA: ground_truth vs hasil_ocr # ground_truth = teks ASLI dari menu (ketik manual) # hasil_ocr = teks yang terbaca oleh Google Vision OCR # ───────────────────────────────────────────── data_ocr = [ # (foto_id, ground_truth, hasil_ocr) # ✅ = terbaca sempurna | ⚠️ = ada karakter salah ("F01", "Kopi Susu Gula Aren 18000", "Kopi Susu Gula Aren 18000"), # ✅ ("F02", "Matcha Latte 20000", "Matcha Latte 20000"), # ✅ ("F03", "Es Teh Manis 8000", "Es Teh Manis 8000"), # ✅ ("F04", "Roti Bakar Coklat 15000", "Roti Bakar Coklat 15000"), # ✅ ("F05", "Americano 16000", "Americano 16000"), # ✅ ("F06", "Caramel Macchiato 22000", "Caramel Macchiato 22000"), # ✅ ("F07", "Es Kopi Susu 18000", "Es Kopi Susu 18000"), # ✅ ("F08", "Lemon Tea 12000", "Lemon Tea 12000"), # ✅ ("F09", "Croissant Butter 18000", "Croisssant Butter 18000"), # ⚠️ "Croisssant" ("F10", "French Fries 15000", "French Fries 15000"), # ✅ ("F11", "Cappuccino 19000", "Cappuccino 19000"), # ✅ ("F12", "Waffle Coklat 22000", "Waffle Coklat 22000"), # ✅ ("F13", "Es Kopi Aren 20000", "Es Kopi Aren 20000"), # ✅ ("F14", "Pisang Goreng Keju 12000", "Pisang Goreng Keju 12000"), # ✅ ("F15", "Hot Chocolate 18000", "Hot Chocolate 18000"), # ✅ ("F16", "Nasi Goreng Spesial 25000", "Nasi Goreng Spesial 25000"), # ✅ ("F17", "Smoothie Strawberry 20000", "Smoothie Strawberry 20000"), # ✅ ("F18", "Roti Bakar Keju 15000", "Roti Bakar Keju 15000"), # ✅ ("F19", "Cold Brew Coffee 22000", "Cold Brew Coffee 22000"), # ✅ ("F20", "Teh Tarik 12000", "Teh Tarik 12000"), # ✅ ("F21", "Es Matcha Red Bean 22000", "Es Matcha Red Bean 22000"), # ✅ ("F22", "Sandwich Ayam 20000", "Sandwlch Ayam 20000"), # ⚠️ "Sandwlch" ("F23", "Vanilla Latte 20000", "Vanilla Latte 20000"), # ✅ ("F24", "Es Jeruk 10000", "Es Jeruk 10000"), # ✅ ("F25", "Pancake Madu 18000", "Pancake Madu 18000"), # ✅ ("F26", "Espresso Shot 14000", "Espresso Shot 14000"), # ✅ ("F27", "Mie Goreng Spesial 23000", "Mle Goreng Spesial 23000"), # ⚠️ "Mle" ("F28", "Coklat Panas 16000", "Coklat Panas 16000"), # ✅ ("F29", "Mixed Juice 18000", "Mixed Juice 18000"), # ✅ ("F30", "Brownies Kukus 14000", "Brownies Kukus 14000"), # ✅ ] # ───────────────────────────────────────────── # HITUNG WER & CER PER ITEM # ───────────────────────────────────────────── rows = [] for foto_id, truth, ocr_result in data_ocr: item_wer = wer(truth, ocr_result) item_cer = cer(truth, ocr_result) rows.append({ "Foto": foto_id, "Ground Truth": truth, "Hasil OCR": ocr_result, "WER": round(item_wer, 4), "CER": round(item_cer, 4), "WER (%)": f"{item_wer*100:.1f}%", "CER (%)": f"{item_cer*100:.1f}%", "Akurasi Kata (%)": f"{(1-item_wer)*100:.1f}%", }) df_ocr = pd.DataFrame(rows) # ───────────────────────────────────────────── # RATA-RATA KESELURUHAN # ───────────────────────────────────────────── all_truth = [r[1] for r in data_ocr] all_ocr = [r[2] for r in data_ocr] avg_wer = wer(all_truth, all_ocr) avg_cer = cer(all_truth, all_ocr) avg_acc = (1 - avg_wer) * 100 print("="*55) print(" HASIL UJI AKURASI OCR") print("="*55) print(df_ocr[["Foto","WER (%)","CER (%)","Akurasi Kata (%)"]].to_string(index=False)) print(f"\n Rata-rata WER : {avg_wer*100:.2f}%") print(f" Rata-rata CER : {avg_cer*100:.2f}%") print(f" Akurasi OCR : {avg_acc:.2f}%") print("="*55) # Simpan ke Excel df_ocr.to_excel("hasil_uji_ocr.xlsx", index=False) print("[OK] Disimpan: hasil_uji_ocr.xlsx")