Download evaluate.py from borreooo/ocr: direct link, hf CLI and curl.
- Browser
- Download file 3.73 kB
-
https://huggingface.co/spaces/borreooo/ocr/resolve/main/evaluate.py
- Command line
-
hf download hf://spaces/borreooo/ocr/evaluate.py
-
curl -L -o evaluate.py https://huggingface.co/spaces/borreooo/ocr/resolve/main/evaluate.py
3.73 kB
| import os | |
| import json | |
| from barcode_scanner import scan_all_barcodes | |
| from ocr import read_chassis, postprocess_with_hint | |
| BARCODE_DIR = "images/barcode" | |
| CHASSIS_DIR = "images/chassis" | |
| RESULTS_DIR = "results" | |
| def get_pairs(): | |
| barcode_files = {os.path.splitext(f)[0]: f | |
| for f in os.listdir(BARCODE_DIR) | |
| if f.lower().endswith(('.jpg', '.jpeg', '.png'))} | |
| chassis_files = {os.path.splitext(f)[0]: f | |
| for f in os.listdir(CHASSIS_DIR) | |
| if f.lower().endswith(('.jpg', '.jpeg', '.png'))} | |
| common = sorted(set(barcode_files.keys()) & set(chassis_files.keys())) | |
| pairs = [] | |
| for key in common: | |
| pairs.append({ | |
| "key": key, | |
| "barcode_path": os.path.join(BARCODE_DIR, barcode_files[key]), | |
| "chassis_path": os.path.join(CHASSIS_DIR, chassis_files[key]), | |
| }) | |
| return pairs | |
| def evaluate(): | |
| os.makedirs(RESULTS_DIR, exist_ok=True) | |
| print("=" * 60) | |
| print("CHASSIS OCR EVALUATION") | |
| print("=" * 60) | |
| print("\n[1/3] Scanning barcodes for ground truth...") | |
| barcode_results = scan_all_barcodes(BARCODE_DIR) | |
| pairs = get_pairs() | |
| print(f"\n[2/3] Found {len(pairs)} matching image pairs") | |
| print(f"\n[3/3] Running OCR pipeline on chassis images...\n") | |
| results = [] | |
| exact_match = 0 | |
| corrected_match = 0 | |
| failed = 0 | |
| for pair in pairs: | |
| key = pair["key"] | |
| expected = barcode_results.get(key) | |
| chassis_path = pair["chassis_path"] | |
| if not expected: | |
| print(f" [WARN] {key} - barcode not decoded, skipping") | |
| continue | |
| ocr_text, conf = read_chassis(chassis_path, save_comparison=True) | |
| corrected, is_match = postprocess_with_hint(ocr_text, expected) | |
| if ocr_text == expected: | |
| status = "[EXACT]" | |
| exact_match += 1 | |
| elif is_match: | |
| status = "[CORRECTED]" | |
| corrected_match += 1 | |
| else: | |
| status = "[FAILED]" | |
| failed += 1 | |
| print(f" {status} | {key}") | |
| print(f" Expected : {expected}") | |
| print(f" Got : {ocr_text} (conf: {conf:.0%})") | |
| if is_match and ocr_text != expected: | |
| print(f" Fixed to : {corrected}") | |
| print() | |
| results.append({ | |
| "key": key, | |
| "expected": expected, | |
| "ocr_raw": ocr_text, | |
| "corrected": corrected, | |
| "confidence": round(conf, 3), | |
| "match": is_match, | |
| "exact": ocr_text == expected, | |
| }) | |
| total = len(results) | |
| total_correct = exact_match + corrected_match | |
| print("=" * 60) | |
| print("RESULTS SUMMARY") | |
| print("=" * 60) | |
| print(f"Total pairs evaluated : {total}") | |
| print(f"Exact matches : {exact_match}/{total} ({exact_match/total*100:.1f}%)") | |
| print(f"Corrected matches : {corrected_match}/{total} ({corrected_match/total*100:.1f}%)") | |
| print(f"Total correct : {total_correct}/{total} ({total_correct/total*100:.1f}%)") | |
| print(f"Failed : {failed}/{total} ({failed/total*100:.1f}%)") | |
| print("=" * 60) | |
| if failed > 0: | |
| print("\nFailed images (focus preprocessing tuning here):") | |
| for r in results: | |
| if not r["match"]: | |
| print(f" - {r['key']}: expected '{r['expected']}', got '{r['ocr_raw']}'") | |
| report_path = os.path.join(RESULTS_DIR, "report.json") | |
| with open(report_path, "w") as f: | |
| json.dump(results, f, indent=2) | |
| print(f"\nFull report saved -> {report_path}") | |
| print(f"Comparison images -> {RESULTS_DIR}/") | |
| if __name__ == "__main__": | |
| evaluate() | |