| import gradio as gr |
| import torch |
| import numpy as np |
| import cv2 |
| from PIL import Image, ImageDraw |
| from transformers import YolosImageProcessor, YolosForObjectDetection |
|
|
| |
| processor = YolosImageProcessor.from_pretrained( |
| "nickmuchi/yolos-small-finetuned-license-plate-detection" |
| ) |
| model = YolosForObjectDetection.from_pretrained( |
| "nickmuchi/yolos-small-finetuned-license-plate-detection" |
| ) |
| model.eval() |
|
|
| |
| def classify_plate_color(plate_img): |
| img = np.array(plate_img) |
| hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV) |
|
|
| green = cv2.inRange(hsv, (35, 40, 40), (85, 255, 255)) |
| yellow = cv2.inRange(hsv, (15, 50, 50), (35, 255, 255)) |
| white = cv2.inRange(hsv, (0, 0, 200), (180, 30, 255)) |
|
|
| g = np.sum(green) |
| y = np.sum(yellow) |
| w = np.sum(white) |
|
|
| if g > y and g > w: |
| return " ELECTRIC Vehicle (Green Plate) " |
| elif y > g and y > w: |
| return " COMMERCIAL Vehicle (Yellow Plate) " |
| else: |
| return " PERSONAL Vehicle (White Plate) " |
|
|
| |
| def process_image(img): |
| image = Image.fromarray(img) |
|
|
| inputs = processor(images=image, return_tensors="pt") |
| with torch.no_grad(): |
| outputs = model(**inputs) |
|
|
| target_sizes = torch.tensor([[image.size[1], image.size[0]]]) |
| results = processor.post_process_object_detection( |
| outputs, threshold=0.3, target_sizes=target_sizes |
| )[0] |
|
|
| draw = ImageDraw.Draw(image) |
|
|
| if len(results["boxes"]) == 0: |
| return image, "No license plate detected" |
|
|
| box = results["boxes"][0].tolist() |
| x1, y1, x2, y2 = map(int, box) |
|
|
| plate = image.crop((x1, y1, x2, y2)) |
| vehicle_type = classify_plate_color(plate) |
|
|
| draw.rectangle([x1, y1, x2, y2], outline="yellow", width=3) |
| draw.text((x1, y1 - 10), vehicle_type, fill="black") |
|
|
| return image, vehicle_type |
|
|
| |
| with gr.Blocks() as demo: |
| gr.Markdown("# ๐ Vehicle Classification using License Plate") |
| gr.Markdown("Upload or take a photo of a car. The AI detects the license plate and classifies the vehicle.") |
|
|
| with gr.Row(): |
| input_img = gr.Image(type="numpy", sources=["upload", "webcam"]) |
| output_img = gr.Image() |
| |
| result = gr.Textbox(label="Vehicle Type") |
|
|
| btn = gr.Button("Detect Vehicle") |
| btn.click(process_image, input_img, [output_img, result]) |
|
|
| demo.launch() |
|
|