# 🚀 Streamlit ANPR App using YOLOv8 + EasyOCR # Upload a car image -> detect number plate -> read plate text -> show result import cv2 import easyocr from ultralytics import YOLO import os from datetime import datetime import streamlit as st import numpy as np from ultralytics import YOLOvv8 MODEL_PATH = YOLOvv8.from_pretrained("Ultralytics/YOLOv8") #source = 'http://images.cocodataset.org/val2017/000000039769.jpg' #model.predict(source=source, save=True) # Initialize models #plate_model = YOLO('yolov8n.pt') # Auto-download yolov8n.pt if not already present import os from ultralytics.utils.downloads import attempt_download_asset if not os.path.exists('yolov8n.pt'): attempt_download_asset('yolov8n.pt') #MODEL_PATH = 'yolov8n.pt' #if not os.path.exists(MODEL_PATH): # from urllib.request import urlretrieve # urlretrieve("https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt", MODEL_PATH) plate_model = YOLO(MODEL_PATH) reader = easyocr.Reader(['en']) # Function to detect plate and read text def detect_plate_number(image_array, output_dir='outputs'): if not os.path.exists(output_dir): os.makedirs(output_dir) # Save uploaded image temporarily temp_path = os.path.join(output_dir, 'uploaded_car.jpg') cv2.imwrite(temp_path, image_array) # Step 1: Detect plate results = plate_model(temp_path) boxes = results[0].boxes.xyxy.cpu().numpy() if len(boxes) == 0: return None, "No plate detected." # Step 2: Crop plate region x1, y1, x2, y2 = map(int, boxes[0]) plate_img = image_array[y1:y2, x1:x2] plate_path = os.path.join(output_dir, f"plate_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jpg") cv2.imwrite(plate_path, plate_img) # Step 3: OCR the plate result = reader.readtext(plate_path) plate_text = result[0][1] if result else "Text not readable" return plate_img, plate_text # 🖼️ Streamlit UI st.set_page_config(page_title="ANPR App", layout="centered") st.title("🚘 Automatic Number Plate Recognition") uploaded_file = st.file_uploader("Upload a car image", type=["jpg", "png", "jpeg"]) if uploaded_file: # Convert uploaded image to OpenCV format file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8) image = cv2.imdecode(file_bytes, 1) st.image(image, caption="Uploaded Car Image", use_column_width=True) with st.spinner("Detecting plate and reading text..."): plate_img, plate_text = detect_plate_number(image) if plate_img is not None: st.success(f"✅ Plate Detected: {plate_text}") st.image(plate_img, caption="Detected Plate Region", use_column_width=False, width=300) else: st.error(plate_text) st.markdown("---") st.markdown("Made with ❤️ using YOLOv8 + EasyOCR")