digits / app.py
sayedM's picture
Update app.py
e444c96
import cv2
import numpy as np
import time
#import os
#import datetime
#from datetime import datetime
#from PIL import Image
#from io import BytesIO
#import requests
#from scipy import ndimage
INPUT_WIDTH = 320
INPUT_HEIGHT = 320
SCORE_THRESHOLD = 0.45
NMS_THRESHOLD = 0.45
CONFIDENCE_THRESHOLD = 0.5
# Text parameters.
FONT_FACE = cv2.FONT_HERSHEY_SIMPLEX
FONT_SCALE = 0.7
THICKNESS = 1
# Colors.
BLACK = (0,0,0)
BLUE = (255,178,50)
YELLOW = (0,255,255)
classesFile = "coco.names"
classes = None
ch_detection_modelWeights = "best_upwork.onnx"
ch_detection_model = cv2.dnn.readNet(ch_detection_modelWeights)
x_=["-","0","1","2","3","4","5","6","7","8","9"]
def draw_label(im, label, x, y):
"""Draw text onto image at location."""
# Get text size.
text_size = cv2.getTextSize(label, FONT_FACE, FONT_SCALE, THICKNESS)
dim, baseline = text_size[0], text_size[1]
# Use text size to create a BLACK rectangle.
cv2.rectangle(im, (x,y), (x + dim[0], y + dim[1] + baseline), (0,0,0), cv2.FILLED);
# Display text inside the rectangle.
cv2.putText(im, label, (x, y + dim[1]), FONT_FACE, FONT_SCALE, YELLOW, THICKNESS, cv2.LINE_AA)
def pre_process(input_image, net,w,h):
# Create a 4D blob from a frame.
#print(input_image.shape)
blob = cv2.dnn.blobFromImage(input_image, 1/255, (w, h), [0,0,0], 1, crop=False)
# Sets the input to the network.
net.setInput(blob)
# Run the forward pass to get output of the output layers.
outputs = net.forward(net.getUnconnectedOutLayersNames())
return outputs
def get_xyxy(input_image,image_height,image_width, outputs,w,h):
# Lists to hold respective values while unwrapping.
class_ids = []
confidences = []
boxes = []
output_boxes=[]
results_cls_id=[]
# Rows.
rows = outputs[0].shape[1]
x_factor = image_width / w
y_factor = image_height / h
# Iterate through detections.
for r in range(rows):
row = outputs[0][0][r]
confidence = row[4]
# Discard bad detections and continue.
if confidence >= CONFIDENCE_THRESHOLD:
classes_scores = row[5:]
# Get the index of max class score.
class_id = np.argmax(classes_scores)
# Continue if the class score is above threshold.
if (classes_scores[class_id] > SCORE_THRESHOLD):
confidences.append(confidence)
class_ids.append(class_id)
cx, cy, w, h = row[0], row[1], row[2], row[3]
left = int((cx - w/2) * x_factor)
top = int((cy - h/2) * y_factor)
width = int(w * x_factor)
height = int(h * y_factor)
box = np.array([left, top, width, height,])
boxes.append(box)
# Perform non maximum suppression to eliminate redundant, overlapping boxes with lower confidences.
indices = cv2.dnn.NMSBoxes(boxes, confidences, CONFIDENCE_THRESHOLD, NMS_THRESHOLD)
for i in indices:
box = boxes[i]
left = box[0]
top = box[1]
width = box[2]
height = box[3]
results_cls_id.append(class_ids[i])
cv2.rectangle(input_image, (left, top), (left + width, top + height), BLUE, 1)
boxes[i][2]=left + width
boxes[i][3]=top + height
#check if the height is suitable
output_boxes.append(boxes[i])
cv2.imwrite('x1.jpg',input_image)
return output_boxes,results_cls_id #boxes (left,top,width,height)
def char_det(input_image,ch_detection_model,w,h):
#in_image_copy=input_image.copy()
detections = pre_process(input_image.copy(), ch_detection_model,w,h) #detection results
image_height=input_image.shape[0]
image_width=input_image.shape[1]
bounding_boxes=get_xyxy(input_image,image_height,image_width, detections,w,h)
#date = datetime.now().strftime("%Y_%m_%d_%I_%M_%S_%p")
#im_name=f"ch_{date}.jpg"
#print(im_name)
#cv2.imwrite(im_name,image_with_bounding_boxes)
# cv2.imwrite('x1.jpg',image_with_bounding_boxes)
return bounding_boxes
def rearange_(array_pred,results_cls_id):
scores=''
#print(y2,y2[:,0])
ind=np.argsort(array_pred[:,0])
#print(license_image.shape[0],ind)
for indx in (ind):
scores=scores+x_[results_cls_id[indx]]
return scores
def main_func(img,):
scores=0
t1=time.time()
img = np.array(img)
im2=img.copy()
#send_im_2_tg(img)
#cv2.imwrite(f"inp.jpg",img)
width_height_diff=img.shape[1]-img.shape[0] #padding
#print(width_height_diff,img.shape)
if width_height_diff>0:
img = cv2.copyMakeBorder(img, 0, width_height_diff, 0, 0, cv2.BORDER_CONSTANT, (0,0,0))
if width_height_diff<0:
img = cv2.copyMakeBorder(img, 0, 0, 0, int(-1*width_height_diff), cv2.BORDER_CONSTANT, (0,0,0))
cropped_chars_array,results_cls_id=char_det(img.copy(),ch_detection_model,320,320)
if len(cropped_chars_array)!=0:
cropped_chars_array=np.asarray(cropped_chars_array)
scores=rearange_(cropped_chars_array,results_cls_id)
for box in cropped_chars_array:
left,top,width,height=box
cv2.rectangle(im2, (left, top), (width,height), BLUE, 1)
time_of_process=(time.time()-t1)
#return scores,time_of_process
return scores,im2,time_of_process
import gradio as gr
def final_func():
gr.Interface(fn=main_func,
inputs=gr.Image(),
outputs=[gr.Textbox(lines=1, label="Scores"),gr.Image(label="Image"),gr.Number(label="Time")],examples=["test.png"]).launch()
if __name__ == "__main__":
final_func()