ChronoStellar's picture
Create app.py
a932029 verified
raw
history blame
1.67 kB
import gradio as gr
import cv2
import joblib
from skimage.feature import hog
import numpy as np
MODEL_PATH = 'models/hog_lreg_model_4.pkl'
clf = joblib.load(MODEL_PATH)
def ocr(pil_image):
# Convert PIL image to OpenCV format
im = np.array(pil_image)
im = cv2.cvtColor(im, cv2.COLOR_RGB2BGR)
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, im_th = cv2.threshold(im_gray, 120, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
ctrs, hier = cv2.findContours(im_th, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
bboxes = [cv2.boundingRect(c) for c in ctrs]
sorted_bboxes = sorted(bboxes, key=lambda b: b[0]) # Sort by x-coordinate
plate_char = []
image_height, image_width = im.shape[:2]
height_threshold = image_height * 0.3
width_threshold = image_width * 0.3
for num, i_bboxes in enumerate(sorted_bboxes):
[x, y, w, h] = i_bboxes
if h > height_threshold and w < width_threshold:
roi = im_gray[y:y + h, x:x + w]
roi = cv2.resize(roi, (64, 128), interpolation=cv2.INTER_AREA)
roi_hog_fd = hog(roi, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(1, 1))
nbr = clf.predict(np.array([roi_hog_fd]))
plate_char.append(str(nbr[0]))
return ''.join(plate_char)
# Create Gradio interface
interface = gr.Interface(
fn=ocr,
inputs=gr.Image(type="pil", label="Upload License Plate Image"),
outputs=gr.Textbox(label="Predicted License Plate"),
title="Automatic License Plate Recognition",
description="Upload an image of a license plate, and the system will predict the text on it.",
)
# Launch the Gradio app
interface.launch()