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 OCR tools model = load_model("number%20plate%20Detection.keras") plate_detector = cv2.CascadeClassifier("haarcascade_russian_plate_number.xml") reader = easyocr.Reader(['en']) # Plate Detection 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" # Draw detection 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 # Streamlit App UI st.set_page_config(page_title="License Plate Detection", layout="wide") st.title("🚘 License Plate Detection App") tab1, tab2 = st.tabs(["📁 Upload Image", "📷 Webcam Capture"]) # Tab 1 - Upload Image with tab1: uploaded_file = st.file_uploader("Upload Image", type=["jpg", "jpeg", "png"]) if uploaded_file: image_input = Image.open(uploaded_file) st.image(image_input, caption="Uploaded Image", use_container_width=True) if st.button("🔍 Detect from Upload"): with st.spinner("Processing..."): result_img, confidence, label = detect_and_predict(image_input) st.image(result_img, caption="Detection Result", channels="RGB", use_container_width=True) if confidence: st.metric("Confidence", f"{confidence * 100:.2f}%") st.success(f"Detected Text: {label}") else: st.warning("No plate text detected.") # Tab 2 - Webcam Input (camera snapshot) with tab2: camera_image = st.camera_input("📷 Take a picture using your webcam") if camera_image: try: image_input = Image.open(camera_image) st.image(image_input, caption="Webcam Snapshot", use_container_width=True) with st.spinner("Analyzing..."): result_img, confidence, label = detect_and_predict(image_input) st.image(result_img, caption="Detection Result", channels="RGB", use_container_width=True) if confidence is not None: st.metric("Confidence", f"{confidence*100:.2f}%") st.success(f"Detected Text: {label}") else: st.warning("Plate detected but no readable text found.") except Exception as e: st.error(f"❌ Error: {str(e)}")