Spaces:
Sleeping
Sleeping
from typing import get_args | |
from PIL import Image | |
import gradio as gr | |
from ultralytics import YOLO | |
import cv2 | |
import numpy as np | |
import tempfile | |
import os | |
import subprocess | |
from fast_alpr import ALPR | |
from fast_alpr.default_detector import PlateDetectorModel | |
from fast_alpr.default_ocr import OcrModel | |
# Loading YOLO model | |
model = YOLO('best.pt') | |
img_dim = (640, 640) | |
# Default models for plate recognition | |
DETECTOR_MODELS = list(get_args(PlateDetectorModel)) | |
OCR_MODELS = list(get_args(OcrModel)) | |
# Put global OCR first | |
OCR_MODELS.remove("global-plates-mobile-vit-v2-model") | |
OCR_MODELS.insert(0, "global-plates-mobile-vit-v2-model") | |
def predict(image, conf_threshold, iou_threshold): | |
# Resizing | |
image = image.resize(img_dim) | |
# Convert from PIL to OpenCV format | |
image = np.array(image) | |
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) | |
# Run inference | |
results = model.predict( | |
image, | |
conf=conf_threshold, | |
iou=iou_threshold, | |
imgsz=640 | |
) | |
# Get annotated image | |
annotated_image = results[0].plot() | |
# Perform OCR on detected objects | |
ocr_text= "" | |
for box in results[0].boxes.xyxy.cpu().numpy(): | |
x1, y1, x2, y2 = map(int, box) | |
cropped = image[y1:y2, x1:x2] | |
# Skip if the cropped region is too small | |
if cropped.size == 0: | |
continue | |
# Apply detector for plate region | |
alpr = ALPR(detector_model=DETECTOR_MODELS[0], ocr_model=OCR_MODELS[0]) | |
alpr_results = alpr.predict(cropped) | |
if alpr_results: | |
res = alpr_results[0] | |
# Access the detection and OCR attributes from ALPRResult | |
plate_text = res.ocr.text if res.ocr else "N/A" | |
plate_confidence = res.ocr.confidence if res.ocr else 0.0 | |
ocr_text += f"- Detected Plate: {plate_text} with confidence {plate_confidence:.2f}\n" | |
# Add text to annotated image | |
cv2.putText(annotated_image, plate_text, (x1, y1-10), | |
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) | |
# Convert back to RGB for Gradio display | |
annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB) | |
return annotated_image, ocr_text | |
# Create Gradio interface | |
with gr.Blocks() as demo: | |
gr.Markdown("# MIA-Yolov8 for peruvian plate recognition") | |
with gr.Row(): | |
with gr.Column(): | |
input_image = gr.Image(label="Input Image", type="pil") | |
conf_slider = gr.Slider(0, 1, value=0.25, label="Confidence Threshold") | |
iou_slider = gr.Slider(0, 1, value=0.45, label="IOU Threshold") | |
submit_btn = gr.Button("Run model") | |
with gr.Column(): | |
output_image = gr.Image(label="Detected Objects") | |
ocr_output = gr.Textbox(label="OCR Results") | |
submit_btn.click( | |
fn=predict, | |
inputs=[input_image, conf_slider, iou_slider], | |
outputs=[output_image, ocr_output] | |
) | |
demo.launch() |