File size: 4,258 Bytes
4554d22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8cbb829
4554d22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a92610
4554d22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8cbb829
4554d22
 
 
 
8cbb829
 
e68a4c0
bc71e30
 
8cbb829
 
 
 
 
 
4554d22
 
8cbb829
 
 
 
 
 
 
 
 
4554d22
8cbb829
 
 
 
 
 
 
 
4554d22
 
 
8cbb829
4554d22
 
 
 
 
 
 
8cbb829
4554d22
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import streamlit as st
from ultralytics import YOLO
import numpy as np
import cv2
from PIL import Image

# Model labels
model1Labels = {0: 'single_number_plate', 1: 'double_number_plate'}

model2Labels = {
    0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: 'A', 11: 'B', 12: 'C',
    13: 'D', 14: 'E', 15: 'F', 16: 'G', 17: 'H', 18: 'I', 19: 'J', 20: 'K', 21: 'L', 22: 'M', 23: 'N', 24: 'O',
    25: 'P', 26: 'Q', 27: 'R', 28: 'S', 29: 'T', 30: 'U', 31: 'V', 32: 'W', 33: 'X', 34: 'Y', 35: 'Z'
}

# Load models
model = YOLO("models/LP-detection.pt")
model2 = YOLO("models/Charcter-LP.pt")

def prediction(image):
    result = model.predict(source=image, conf=0.5)
    boxes = result[0].boxes
    height = boxes.xywh
    crd = boxes.data

    n = len(crd)
    lp_number = []
    img_lp_final = None  

    for i in range(n):
        ht = int(height[i][3])
        c = int(crd[i][5])

        xmin = int(crd[i][0])
        ymin = int(crd[i][1])
        xmax = int(crd[i][2])
        ymax = int(crd[i][3])

        img_lp = image[ymin:ymax, xmin:xmax]
        img_lp_final = img_lp.copy()  # Store the cropped image for display
        cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)

        h = np.median(ht)

        # Second Model Prediction
        result2 = model2.predict(source=img_lp, conf=0.25)
        boxes_ocr = result2[0].boxes
        data2 = boxes_ocr.data

        n2 = len(data2)
        xaxis0, xaxis11, xaxis12 = [], [], []
        label0, label11, label12 = [], [], []
        numberPlate = ""

        if c == 0:  # Single line license plate
            for i in range(n2):
                x = int(data2[i][2])
                xaxis0.append(x)
                l = int(data2[i][5])
                label0.append(l)

            # Sort characters by x-axis for single line
            sorted_labels = [label0[i] for i in np.argsort(xaxis0)]
            numberPlate = ''.join([model2Labels.get(l) for l in sorted_labels])
            lp_number.append(numberPlate)

        elif c == 1:  # Double line license plate
            for i in range(n2):
                x = int(data2[i][0])
                y = int(data2[i][3])
                l = int(data2[i][5])
                if y < (h / 2):
                    xaxis11.append(x)
                    label11.append(l)
                else:
                    xaxis12.append(x)
                    label12.append(l)

            # Sort characters by x-axis for double line (upper and lower separately)
            sorted_labels11 = [label11[i] for i in np.argsort(xaxis11)]
            sorted_labels12 = [label12[i] for i in np.argsort(xaxis12)]
            numberPlate = ''.join([model2Labels.get(l) for l in sorted_labels11 + sorted_labels12])
            lp_number.append(numberPlate)

    return lp_number, img_lp_final  

st.title('License Plate Recognition 🚗')
st.header('Upload an image of a license plate to get the License number.')

# Define example images (update with actual paths)
example_images = {
    "Car ": "test/audiR8V10.jpg",
    "Car 2": "test/c7.jpg",
    "Car 3": "test/c4.jpg",
    "CCTV B/W": "test/cctv img plate.jpg",
    "Bike": "test/BikeNumberPlate.jpg",
    "Bus": "test/bus.jpg",
}

# File uploader
uploaded_file = st.file_uploader("Choose an image...", type="jpg")



c1, c2 = st.columns(2)
for name, path in example_images.items():
    with c1:
        example_img = Image.open(path)

image = None
if uploaded_file is not None:
    image = np.array(Image.open(uploaded_file))
else:
    st.header("Or choose an example image from below dropdown:")
    selected_example = st.selectbox("", list(example_images.keys()))
    if selected_example:
        image = np.array(Image.open(example_images[selected_example]))

if image is not None:
    c1, c2, c3 = st.columns(3)

    with c1:
        st.image(image, caption='Uploaded Image', use_column_width=True)

    license_plate_text, img_lp = prediction(image)

    with c2:
        if img_lp is not None:
            st.image(img_lp, caption='Cropped License Plate', use_column_width=True)
        else:
            st.write('No License Plate Detected')

    with c3:
        st.success(', '.join(license_plate_text))
        st.write('License Plate Text')