Asis / app.py
RivianG's picture
Update app.py
e8538e1
raw
history blame
4.16 kB
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='yoloocrv2_1.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= upper_name.replace("1","I")
if "6" in upper_name:
upper_name= upper_name.replace("6","G")
if "0" in upper_name:
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])
w_index = (maks, 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ı")