CalcTrainer / image_processing_cpu.py
hoololi's picture
Upload 5 files
5617612 verified
raw
history blame
3.59 kB
# ==========================================
# 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