onsslimene's picture
Update app.py
71de506 verified
Raw
History Blame Contribute Delete
3.05 kB
import os
os.environ["YOLO_CONFIG_DIR"] = "/tmp"
import gradio as gr
from ultralytics import YOLO
import cv2
import numpy as np
import easyocr
# -------------------------------------------------------
# 🔥 Charger le modèle YOLO (détection plaques)
# -------------------------------------------------------
model = YOLO("best1.pt") # Mets ton modèle ici
# -------------------------------------------------------
# 🔥 Charger OCR arabe + anglais
# -------------------------------------------------------
reader = easyocr.Reader(['ar', 'en'], gpu=False)
# -------------------------------------------------------
# 🔥 Fonction de détection + OCR
# -------------------------------------------------------
def recognize_license_plate(image):
# Convertir PIL → OpenCV (BGR)
image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Détection YOLO
results = model(image_rgb, conf=0.5, verbose=False)
output = image_rgb.copy()
detections = []
for r in results:
if not hasattr(r, "boxes") or r.boxes is None:
continue
for box in r.boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0])
cls_id = int(box.cls[0])
class_name = model.names.get(cls_id, "unknown")
conf = float(box.conf[0])
# Dessiner la boîte
cv2.rectangle(output, (x1, y1), (x2, y2), (0, 255, 0), 2)
# Crop de la plaque
crop = image_rgb[y1:y2, x1:x2]
# Vérifier si crop valide
if crop.size == 0:
continue
# Préprocessing OCR
gray = cv2.cvtColor(crop, cv2.COLOR_BGR2GRAY)
gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
gray = cv2.GaussianBlur(gray, (3, 3), 0)
# OCR
ocr_result = reader.readtext(gray)
if len(ocr_result) > 0:
text = ocr_result[0][1]
text_conf = float(ocr_result[0][2])
else:
text = ""
text_conf = 0.0
# Ajouter le texte sur l'image
cv2.putText(output, text, (x1, y1 - 8),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
# Ajouter à la liste JSON
detections.append({
"country": class_name,
"bbox": [x1, y1, x2, y2],
"plate_text": text,
"plate_confidence": round(text_conf, 2),
"detection_confidence": round(conf, 2)
})
return output, detections
# -------------------------------------------------------
# 🔥 Interface Gradio
# -------------------------------------------------------
app = gr.Interface(
fn=recognize_license_plate,
inputs=gr.Image(type="pil"),
outputs=[
gr.Image(label="Image + OCR"),
gr.JSON(label="Detections JSON")
],
title="YOLO – Detection + EasyOCR (Arabic + English)"
)
app.launch()