Spaces:
Running
Running
File size: 2,797 Bytes
7d41adb | 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 | 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()
|