| 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 |
|
|
| |
| 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): |
| |
| results = segmentation_model(image) |
|
|
| |
| boxes = results[0].boxes.xyxy.numpy() |
| if len(boxes) == 0: |
| return None |
|
|
| |
| x1, y1, x2, y2 = boxes[0] |
| segmented_plate = image[int(y1):int(y2), int(x1):int(x2)] |
|
|
| |
| ocr_results = self.ocr.ocr(segmented_plate, cls=True) |
|
|
| |
| 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') |
|
|
| |
| 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()] |
|
|
| |
| 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) |
|
|
| |
| image_np = np.array(image) |
|
|
| |
| 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.') |
|
|
| |
| 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() |