Spaces:
Running
Running
# π 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") | |