File size: 4,078 Bytes
fe8b674
 
c3f244d
fe8b674
 
 
 
 
8d9605d
89630a1
 
8d9605d
89630a1
 
 
 
 
 
 
fe8b674
89630a1
 
 
 
fe8b674
89630a1
 
 
 
fe8b674
89630a1
f20827d
89630a1
 
43fd69e
89630a1
 
4ed5cde
89630a1
 
 
9b5d89a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89630a1
9b5d89a
 
 
 
fe8b674
89630a1
 
 
 
e8987d4
89630a1
fe8b674
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
import cv2
from time import time
from alpr import *
import torch
import cv2
import numpy as np
import tensorflow.compat.v1 as tf
import os
import streamlit as st
from PIL import Image
import streamlit as st

def load_image(image_file):
	img = Image.open(image_file)
	return img
	
	
st.subheader("Image")
image_file = st.file_uploader("Upload Images", type=["png","jpg","jpeg"])

#if image_file is not None:
    # To See details
    #file_details = {"filename":image_file.name, "filetype":image_file.type,"filesize":image_file.size}
    #st.write(file_details)

    # To View Uploaded Image
    #st.image(load_image(image_file),width=250)
    
submit = st.button('Generate')

if submit:
    image = load_image(image_file)
    model = torch.hub.load('ultralytics/yolov5', 'custom', path='yoloocr_best.pt')
    model.cpu()
    model.conf = 0.5
    license = DetectLicensePlate()
    counter  = dict()
    frame = np.array(image)[...,::-1]
    try:
        plate_img = alpr(frame,license)
        results = model(plate_img*255)
        control = max(results.pandas().xyxy[0].sort_values('ymin').iloc[:,1].values)
        if control > 50:
            name = results.pandas().xyxy[0].sort_values('ymin') #.iloc[:, -1] #ymin alwas bigger than 50 with bottom characters
            ind = [ix for ix,i in enumerate(name.iloc[:,1]) if i>50][0]
            upper_f_2 = name.iloc[:ind].sort_values("xmin").iloc[:,-1][:2]
            upper_sort = name.iloc[:ind].sort_values("xmin").iloc[:,-1][2:] #add name column
            bottom_sort = name.iloc[ind:].sort_values("xmin").iloc[:,-1]
            upper_name =  "".join([i for i in upper_sort])
            upper_f_name = "".join([i for i in upper_f_2])
            bottom_name = "".join([i for i in bottom_sort])
            if "1" in upper_name:
                upper_name.replace("1","I")
            if "6" in upper_name:
                upper_name.replace("6","G")
            if "0" in upper_name:
                upper_name.replace("0","O")
        
            name =  upper_f_name + upper_name + bottom_name
            if name not in counter and name != '':
                counter[name] = 1
            if name in counter and name != '':    
                counter[name] += 1
            plate_name = list((sorted(counter.items(), key=lambda item: item[1])))[-1][0]
            st.write(plate_name)
        
        else:
        
            #Post-processing pre-requisite
            decoder = results.pandas().xyxy[0].sort_values('xmin').iloc[:,0].values
            compare = list(decoder[2:])
            maks = None
            for i in range(len(compare)):
                if i == len(compare) - 1:
                    break
                if maks == None:
                    maks = abs(compare[i] - compare[i + 1])
                if abs(compare[i] - compare[i + 1]) > maks:
                    maks = abs(compare[i] - compare[i + 1])
                    w_index = (maks, i + 1)
              
            name = results.pandas().xyxy[0].sort_values('xmin').iloc[:, -1]
            name = "".join([i for i in name])
            if name not in counter and name != '':
                counter[name] = 1
            if name in counter and name !='':
                counter[name] +=1
            plate_name = list((sorted(counter.items(),key = lambda item:item[1])))[-1][0]
            #Post-processing happens after here
            mid_chars = str(plate_name[2:int(w_index[1] + 2)])  # assign this as old mid chars
    
            if "6" in mid_chars:
                mid_chars = mid_chars.replace("6", "G")  # assign this as new
            if "1" in mid_chars:
                mid_chars = mid_chars.replace("1", "I")
            if "0" in mid_chars:
                mid_chars = mid_chars.replace("0", "O")
    
            new_plate_name = plate_name.replace(plate_name[2:int(w_index[1] + 2)], mid_chars)
        
            #cv2.imshow("Plate", plate_img)
            st.write(new_plate_name)
    
    
    except Exception as e:
        
        counter.clear()
        st.write("Plaka Bulunamadı")