File size: 3,587 Bytes
5617612
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# ==========================================
# image_processing_cpu.py - Version CPU avec EasyOCR
# ==========================================

"""
Module de traitement d'images CPU-optimisé pour calculs mathématiques
Utilise EasyOCR pour des performances rapides sur CPU
"""

import time
from utils import (
    optimize_image_for_ocr,
    prepare_image_for_dataset, 
    create_thumbnail_fast,
    create_white_canvas,
    log_memory_usage,
    cleanup_memory,
    decode_image_from_dataset,
    validate_ocr_result
)

# Variables globales pour OCR EasyOCR
easyocr_reader = None
OCR_MODEL_NAME = "EasyOCR"

def init_ocr_model() -> bool:
    """Initialise EasyOCR (optimisé CPU)"""
    global easyocr_reader
    
    try:
        print("🔄 Chargement EasyOCR (CPU optimisé)...")
        import easyocr
        easyocr_reader = easyocr.Reader(['en'], gpu=False, verbose=False)
        print("✅ EasyOCR prêt (CPU) !")
        return True
        
    except Exception as e:
        print(f"❌ Erreur lors du chargement EasyOCR: {e}")
        return False

def get_ocr_model_info() -> dict:
    """Retourne les informations du modèle OCR utilisé"""
    return {
        "model_name": OCR_MODEL_NAME,
        "device": "CPU",
        "framework": "EasyOCR",
        "optimized_for": "speed",
        "version": "1.7.x"
    }

def recognize_number_fast_with_image(image_dict, debug: bool = False) -> tuple[str, any, dict | None]:
    """
    OCR avec EasyOCR (CPU optimisé)
    
    Args:
        image_dict: Image d'entrée (format Gradio)
        debug: Afficher les logs de debug
        
    Returns:
        (résultat_ocr, image_optimisée, données_dataset)
    """
    if image_dict is None or easyocr_reader is None:
        if debug:
            print("  ❌ Image manquante ou EasyOCR non initialisé")
        return "0", None, None

    try:
        start_time = time.time()
        if debug:
            print("  🔄 Début OCR EasyOCR...")
        
        # Optimiser image (fonction commune)
        optimized_image = optimize_image_for_ocr(image_dict, max_size=300)
        if optimized_image is None:
            if debug:
                print("  ❌ Échec optimisation image")
            return "0", None, None

        # EasyOCR - traitement spécialisé CPU
        if debug:
            print("  ⚡ Lancement EasyOCR...")
        
        import numpy as np
        img_array = np.array(optimized_image)
        results = easyocr_reader.readtext(img_array, detail=0, paragraph=False)
        
        # Traitement des résultats EasyOCR
        if results:
            all_text = ' '.join(str(r) for r in results)
            final_result = validate_ocr_result(all_text, max_length=4)
        else:
            final_result = "0"
        
        # Préparer pour dataset (fonction commune)
        dataset_image_data = prepare_image_for_dataset(optimized_image)
        
        if debug:
            total_time = time.time() - start_time
            print(f"  ✅ EasyOCR terminé en {total_time:.1f}s → '{final_result}'")
        
        return final_result, optimized_image, dataset_image_data

    except Exception as e:
        print(f"❌ Erreur OCR EasyOCR: {e}")
        return "0", None, None

def recognize_number_fast(image_dict) -> tuple[str, any]:
    """Version rapide standard"""
    result, optimized_image, _ = recognize_number_fast_with_image(image_dict)
    return result, optimized_image

def recognize_number(image_dict) -> str:
    """Interface standard"""
    result, _ = recognize_number_fast(image_dict)
    return result