File size: 6,021 Bytes
5a1edc8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e444c96
5a1edc8
 
 
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
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()