Spaces:
Running
Running
| import os | |
| import re | |
| import difflib | |
| from vision_ocr.pix2text_engine import Pix2TextOCREngine | |
| def normalize_eval(s: str) -> str: | |
| s = s.replace("$", "").replace("\\", "").replace("{", "").replace("}", "").replace(" ", "").lower() | |
| for rm in [",", ".", ";", ":", "-", "_", "(", ")", "^", "*", "+", "=", "'", "prime"]: | |
| s = s.replace(rm, "") | |
| return s | |
| def calc_sim(a: str, b: str) -> float: | |
| na = normalize_eval(a) | |
| nb = normalize_eval(b) | |
| return difflib.SequenceMatcher(None, na, nb).ratio() | |
| GROUND_TRUTHS = { | |
| "2D_easy.png": ( | |
| "Cho tam giác ABC vuông tại A, biết AB=6, AC=8.\n" | |
| "Gọi H là chân đường cao từ A xuống BC.\n" | |
| "Tính BC, AH và diện tích tam giác ABC." | |
| ), | |
| "3D_easy.png": ( | |
| "Cho hình hộp chữ nhật ABCD.A'B'C'D' có AB=4, AD=3, AA'=5.\n" | |
| "Tính độ dài đường chéo AC'." | |
| ), | |
| "2D_hard.png": ( | |
| "Cho đường tròn (O) có đường kính AB.\n" | |
| "Lấy điểm C trong (O), C khác A, B. Tiếp tuyến tại A và C cắt nhau tại M.\n" | |
| "Gọi H là hình chiếu vuông góc của C lên AB, N là giao điểm của CM và AB.\n" | |
| "Chứng minh rằng MA^2 = MH * MN và góc AMC = 2 * góc ABC." | |
| ), | |
| "3D_hard.png": ( | |
| "Cho hình chóp S.ABCD có đáy ABCD là hình vuông cạnh a, SA vuông góc (ABCD), SA=a.\n" | |
| "Gọi M, N lần lượt là trung điểm của AB, CD.\n" | |
| "Gọi H là hình chiếu vuông góc của A lên SM.\n" | |
| "1. Xác định giao tuyến của hai mặt phẳng (SMN) và (SAD).\n" | |
| "2. Tính khoảng cách từ A đến đường thẳng SM.\n" | |
| "3. Tính góc giữa SM và mặt phẳng (ABCD)." | |
| ), | |
| } | |
| def main(): | |
| engine = Pix2TextOCREngine.get_instance() | |
| test_dir = os.path.join(os.path.dirname(__file__), "..", "tests", "data") | |
| print("=" * 70) | |
| print(" MATH OCR BENCHMARK EVALUATION (4 Test Cases)") | |
| print("=" * 70) | |
| sims = [] | |
| for name, gt in GROUND_TRUTHS.items(): | |
| img_path = os.path.join(test_dir, name) | |
| res = engine.recognize(img_path) | |
| sim = calc_sim(res.text, gt) | |
| sims.append((name, sim, res, gt)) | |
| print(f"\n📁 TEST CASE: {name}") | |
| print(f"📊 Similarity Score: {sim * 100:.2f}% | Elements: {len(res.elements)} | Conf: {res.confidence:.4f}") | |
| print(f"📐 Extracted LaTeX ({len(res.latex)}): {res.latex}") | |
| print("\n--- [Ground Truth] ---") | |
| print(gt) | |
| print("\n--- [OCR Canonical Output Text] ---") | |
| print(res.text) | |
| print("-" * 70) | |
| avg_sim = sum(s[1] for s in sims) / len(sims) | |
| print(f"\n🎯 OVERALL BENCHMARK ACCURACY: {avg_sim * 100:.2f}%\n") | |
| if __name__ == "__main__": | |
| main() | |