import streamlit as st import cv2 import numpy as np import easyocr from PIL import Image from tensorflow.keras.models import load_model from tensorflow.keras.preprocessing import image as keras_image # Load model and tools model = load_model("Vehicle Number Plates.keras") plate_detector = cv2.CascadeClassifier("haarcascade_russian_plate_number.xml") reader = easyocr.Reader(['en']) # Detect and predict function def detect_and_predict(img_input): img = np.array(img_input.convert("RGB")) frame = img.copy() gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) plates = plate_detector.detectMultiScale(gray, 1.1, 4) plate_text = "Not Detected" confidence = None for x, y, w, h in plates: roi = frame[y:y+h, x:x+w] try: test_img = cv2.resize(roi, (200, 200)) test_img = keras_image.img_to_array(test_img) / 255.0 test_img = np.expand_dims(test_img, axis=0) pred = model.predict(test_img)[0][0] except Exception as e: print(f"Prediction error: {e}") continue if pred < 0.5: result = reader.readtext(roi) if result: plate_text = result[0][1] confidence = result[0][2] label = f"Plate: {plate_text}" else: label = "Plate Detected (No text)" else: label = "Plate Not Detected" cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.putText(frame, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) return frame, confidence, plate_text # App Config st.set_page_config(page_title="Vehicle Plate Identifier", layout="centered") # # Sidebar style # with st.sidebar: # st.markdown("## 🚗 License Plate Scanner") # st.markdown("Upload an image or take a photo to detect and read vehicle number plates using AI and OCR.") # st.markdown("---") # st.info("📌 Tip: Use clear images with visible plates for best results.") # Title st.markdown("