| # 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("Vehicle_number_plate_Detection.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) | |
| # # Ensure output image is same size as input | |
| # result_img = Image.fromarray(frame) | |
| # return result_img, 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: | |
| # col1, col2 = st.columns([1, 2]) | |
| # uploaded_file = st.file_uploader("Upload Image", type=["jpg", "jpeg", "png"]) | |
| # if uploaded_file: | |
| # image_input = Image.open(uploaded_file) | |
| # with col1: | |
| # 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) | |
| # with col2: | |
| # st.image(result_img, caption="Detection Result", 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: | |
| # col1, col2 = st.columns([1, 2]) | |
| # with col1: | |
| # camera_image = st.camera_input("π· Take a picture using your webcam") | |
| # if camera_image: | |
| # try: | |
| # image_input = Image.open(camera_image) | |
| # with st.spinner("Analyzing..."): | |
| # result_img, confidence, label = detect_and_predict(image_input) | |
| # with col2: | |
| # st.image(result_img, caption="Detection Result", 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)}") | |
| 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("Vehicle_number_plate_Detection.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" | |
| 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) | |
| # Convert back to PIL and resize to 450x450 for display | |
| result_img = Image.fromarray(frame) | |
| result_img = result_img.resize((450, 450)) | |
| return result_img, confidence, plate_text | |
| # Streamlit 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: | |
| col1, col2 = st.columns([1, 2]) | |
| with col1: | |
| uploaded_file = st.file_uploader("Upload Image", type=["jpg", "jpeg", "png"], key="uploader") | |
| 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) | |
| with col2: | |
| st.image(result_img, caption="Detection Result (450x450)", use_container_width=False) | |
| 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: | |
| col1, col2 = st.columns([1, 2]) | |
| with col1: | |
| camera_image = st.camera_input("π· Take a picture using your webcam") | |
| if camera_image: | |
| try: | |
| image_input = Image.open(camera_image) | |
| with st.spinner("Analyzing..."): | |
| result_img, confidence, label = detect_and_predict(image_input) | |
| with col2: | |
| st.image(result_img, caption="Detection Result (450x450)", use_container_width=False) | |
| 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)}") | |