|
|
import gradio as gr |
|
|
import torch |
|
|
import numpy as np |
|
|
import cv2 |
|
|
import sqlite3 |
|
|
import pandas as pd |
|
|
from PIL import Image, ImageDraw |
|
|
from transformers import YolosImageProcessor, YolosForObjectDetection |
|
|
import easyocr |
|
|
from datetime import datetime |
|
|
|
|
|
|
|
|
conn = sqlite3.connect("vehicles.db", check_same_thread=False) |
|
|
cursor = conn.cursor() |
|
|
cursor.execute(""" |
|
|
CREATE TABLE IF NOT EXISTS vehicles( |
|
|
plate TEXT, |
|
|
type TEXT, |
|
|
time TEXT |
|
|
) |
|
|
""") |
|
|
conn.commit() |
|
|
|
|
|
|
|
|
processor = YolosImageProcessor.from_pretrained("nickmuchi/yolos-small-finetuned-license-plate-detection") |
|
|
model = YolosForObjectDetection.from_pretrained("nickmuchi/yolos-small-finetuned-license-plate-detection") |
|
|
model.eval() |
|
|
reader = easyocr.Reader(['en']) |
|
|
|
|
|
|
|
|
def classify_plate_color(plate): |
|
|
img = np.array(plate) |
|
|
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV) |
|
|
|
|
|
green = np.sum(cv2.inRange(hsv, (35,40,40),(85,255,255))) |
|
|
yellow = np.sum(cv2.inRange(hsv,(15,50,50),(35,255,255))) |
|
|
white = np.sum(cv2.inRange(hsv,(0,0,200),(180,30,255))) |
|
|
|
|
|
if green > yellow and green > white: |
|
|
return "EV" |
|
|
elif yellow > green and yellow > white: |
|
|
return "Commercial" |
|
|
else: |
|
|
return "Personal" |
|
|
|
|
|
|
|
|
def read_plate(img): |
|
|
results = reader.readtext(np.array(img)) |
|
|
if results: |
|
|
return results[0][1] |
|
|
return "UNKNOWN" |
|
|
|
|
|
|
|
|
def get_stats(): |
|
|
df = pd.read_sql("SELECT * FROM vehicles", conn) |
|
|
if len(df)==0: |
|
|
return "No vehicles yet" |
|
|
return df['type'].value_counts().to_string() |
|
|
|
|
|
|
|
|
def process_image(img): |
|
|
image = Image.fromarray(img) |
|
|
inputs = processor(images=image, return_tensors="pt") |
|
|
with torch.no_grad(): |
|
|
outputs = model(**inputs) |
|
|
|
|
|
results = processor.post_process_object_detection( |
|
|
outputs, threshold=0.3, |
|
|
target_sizes=torch.tensor([[image.size[1], image.size[0]]]) |
|
|
)[0] |
|
|
|
|
|
draw = ImageDraw.Draw(image) |
|
|
|
|
|
if len(results["boxes"])==0: |
|
|
return image,"No Plate","",get_stats() |
|
|
|
|
|
box = results["boxes"][0].tolist() |
|
|
x1,y1,x2,y2 = map(int,box) |
|
|
|
|
|
plate = image.crop((x1,y1,x2,y2)) |
|
|
plate_text = read_plate(plate) |
|
|
vtype = classify_plate_color(plate) |
|
|
|
|
|
cursor.execute("INSERT INTO vehicles VALUES (?,?,?)", |
|
|
(plate_text,vtype,datetime.now().strftime("%H:%M:%S"))) |
|
|
conn.commit() |
|
|
|
|
|
draw.rectangle([x1,y1,x2,y2],outline="red",width=3) |
|
|
draw.text((x1,y1-10),f"{plate_text} | {vtype}",fill="red") |
|
|
|
|
|
return image, plate_text, vtype, get_stats() |
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
gr.Markdown("# ๐ Smart Traffic & EV Detection System") |
|
|
|
|
|
img = gr.Image(type="numpy", sources=["upload","webcam"]) |
|
|
out_img = gr.Image() |
|
|
plate = gr.Textbox(label="Number Plate") |
|
|
vtype = gr.Textbox(label="Vehicle Type") |
|
|
stats = gr.Textbox(label="Dashboard") |
|
|
|
|
|
btn = gr.Button("Scan Vehicle") |
|
|
btn.click(process_image, img, [out_img,plate,vtype,stats]) |
|
|
|
|
|
demo.launch() |
|
|
|