File size: 4,030 Bytes
0e8147e
 
 
 
 
 
 
 
 
 
5d8a7ae
0e8147e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a11fb5d
 
 
 
 
 
0e8147e
 
a11fb5d
0e8147e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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("<h3 style='text-align: center; color: navy;'>πŸ” AI-Powered Vehicle Plate Detection & OCR</h3>", unsafe_allow_html=True)

# Tabs
tab1, tab2 = st.tabs([
    "πŸ–ΌοΈ **:blue[Upload Vehicle Image]**",
    "πŸ“· **:green[Use Live Webcam]**"
])

# Tab 1 - Upload
with tab1:
    st.markdown("#### :blue[Upload an image to detect number plate]", unsafe_allow_html=True)
    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", width=250)

        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", width=250)
            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
with tab2:
    st.markdown("#### :green[Capture from your webcam to scan a vehicle plate]", unsafe_allow_html=True)
    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", width=250)

            with st.spinner("Analyzing..."):
                result_img, confidence, label = detect_and_predict(image_input)

            st.image(result_img, caption="Detection Result", channels="RGB", width=250)
            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)}")