Sarvamangalak's picture
Rename app.py to app_basic.py
6576164 verified
import gradio as gr
import torch
import numpy as np
import cv2
from PIL import Image, ImageDraw
from transformers import YolosImageProcessor, YolosForObjectDetection
# Load model
processor = YolosImageProcessor.from_pretrained(
"nickmuchi/yolos-small-finetuned-license-plate-detection"
)
model = YolosForObjectDetection.from_pretrained(
"nickmuchi/yolos-small-finetuned-license-plate-detection"
)
model.eval()
# -------- Plate Color Classifier -------- #
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) "
# -------- Main Pipeline -------- #
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
# -------- Gradio UI -------- #
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()