Plate / app.py
esssyjr's picture
Update app.py
bee9925 verified
Raw
History Blame Contribute Delete
3.69 kB
import streamlit as st
from PIL import Image
import numpy as np
from ultralytics import YOLO
from paddleocr import PaddleOCR
from streamlit_webrtc import webrtc_streamer, VideoProcessorBase
import av
# Load the license plate segmentation model (YOLOv8)
segmentation_model = YOLO('plate_segment_best.pt')
class LicensePlateProcessor(VideoProcessorBase):
def __init__(self):
self.ocr = PaddleOCR(use_angle_cls=True, lang='en')
def process_image(self, image):
# Perform license plate segmentation using the YOLOv8 model
results = segmentation_model(image)
# Extract the bounding box with the highest confidence score
boxes = results[0].boxes.xyxy.numpy()
if len(boxes) == 0:
return None
# Assuming the first box is the license plate (you can adjust based on your model's output)
x1, y1, x2, y2 = boxes[0]
segmented_plate = image[int(y1):int(y2), int(x1):int(x2)]
# Use PaddleOCR to extract text from the segmented plate area
ocr_results = self.ocr.ocr(segmented_plate, cls=True)
# Extract the plate number from OCR results
plate_number = self.extract_plate_number(ocr_results)
return plate_number
def extract_plate_number(self, ocr_results):
plate_number = ""
for line in ocr_results:
for word in line:
plate_number += word[1][0] + " "
return plate_number.strip()
def recv(self, frame):
img = frame.to_ndarray(format="bgr24")
plate_number = self.process_image(img)
return av.VideoFrame.from_ndarray(img, format="bgr24"), plate_number
def main():
st.title('License Plate Reader')
# Input suspected criminal plate numbers
suspected_numbers = st.text_area('Enter suspected criminal plate numbers (one per line):')
suspected_plates = [num.strip() for num in suspected_numbers.split('\n') if num.strip()]
# File uploader for image input
uploaded_file = st.file_uploader('Choose an image...', type=['jpg', 'png'])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption='Uploaded Image', use_column_width=True)
# Convert PIL image to numpy array
image_np = np.array(image)
# Process image to extract license plate number
plate_number = LicensePlateProcessor().process_image(image_np)
if plate_number:
st.write('Detected License Plate Number:', plate_number)
if suspected_plates and plate_number in suspected_plates:
st.write('**Criminal Car Detected!**')
else:
st.write('Car is not in the suspected criminal list.')
else:
st.write('License Plate Number could not be extracted.')
# Webcam input for live video stream
ctx = webrtc_streamer(
key="license-plate-reader",
video_processor_factory=LicensePlateProcessor,
rtc_configuration={"iceServers": [{"urls": ["stun:stun.l.google.com:19302"]}]},
media_stream_constraints={"video": True, "audio": False},
async_processing=True,
)
if ctx.video_processor:
plate_number = ctx.video_processor.recv(ctx.video_processor)
if plate_number:
st.write('Detected License Plate Number:', plate_number)
if suspected_plates and plate_number in suspected_plates:
st.write('**Criminal Car Detected!**')
else:
st.write('Car is not in the suspected criminal list.')
else:
st.write('License Plate Number could not be extracted.')
if __name__ == '__main__':
main()