Vahe commited on
Commit
f5fea1b
1 Parent(s): 338dedb

the digit extractor model changed

Browse files
Files changed (3) hide show
  1. app.py +3 -0
  2. digit_yolov8_best_float16.tflite +2 -2
  3. models.py +42 -9
app.py CHANGED
@@ -49,12 +49,15 @@ def main():
49
  else:
50
  cropped_image = gray[y1:y2, x1:x2]
51
  # cropped_image = resized_image[y1:y2, x1:x2]
 
52
  cv2.imwrite('odometer_number_image.jpg', cropped_image)
 
53
  extracted_digit = get_digit(
54
  model_path="digit_yolov8_best_float16.tflite",
55
  image_path='odometer_number_image.jpg',
56
  threshold=0.4
57
  )
 
58
  display_text = f'Here is the zoomed odometer value: {extracted_digit}.'
59
  st.image('odometer_number_image.jpg', caption=f"{display_text}", use_column_width=True)
60
 
 
49
  else:
50
  cropped_image = gray[y1:y2, x1:x2]
51
  # cropped_image = resized_image[y1:y2, x1:x2]
52
+ cropped_image = cv2.resize(cropped_image, (640, 640))
53
  cv2.imwrite('odometer_number_image.jpg', cropped_image)
54
+
55
  extracted_digit = get_digit(
56
  model_path="digit_yolov8_best_float16.tflite",
57
  image_path='odometer_number_image.jpg',
58
  threshold=0.4
59
  )
60
+
61
  display_text = f'Here is the zoomed odometer value: {extracted_digit}.'
62
  st.image('odometer_number_image.jpg', caption=f"{display_text}", use_column_width=True)
63
 
digit_yolov8_best_float16.tflite CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:64673733adce09ce682b4527410ece79f62108e33cea42e8b14166e695e67d55
3
- size 6195116
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8dea8a7f16ed9569b0fbc527b04026fb3c06683ab81f51d1365ed1ae578a41e4
3
+ size 6195448
models.py CHANGED
@@ -85,9 +85,9 @@ def get_digit(model_path, image_path, threshold=0.5):
85
  # image = Image.open(image_path2)
86
  # image_resized = image.resize((image_width, image_height)) # Resize the image to the corresponding size of the input tensor and store it in a new variable
87
  image = cv2.imread(image_path)
88
- image_resized = np.resize(image, (image_width, image_height, 3))
89
 
90
- image_np = np.array(image_resized) #
91
  image_np = np.true_divide(image_np, 255, dtype=np.float32)
92
  image_np = image_np[np.newaxis, :]
93
 
@@ -101,25 +101,58 @@ def get_digit(model_path, image_path, threshold=0.5):
101
  output = output.T
102
 
103
  boxes_xywh = output[:, :4] #Get coordinates of bounding box, first 4 columns of output tensor
104
- scores = output[:, 4]#np.max(output[..., 5:], axis=1) #Get score value, 5th column of output tensor
105
- classes = np.argmax(output[:, 5:], axis=1) # Get the class value, get the 6th and subsequent columns of the output tensor, and store the largest value in the output tensor.
106
 
107
  pred_list = []
108
 
 
 
109
  for box, score, cls in zip(boxes_xywh, scores, classes):
 
 
 
 
110
  x_center, y_center, width, height = box
111
  x1 = int((x_center - width / 2) * image_width)
112
  y1 = int((y_center - height / 2) * image_height)
113
  x2 = int((x_center + width / 2) * image_width)
114
  y2 = int((y_center + height / 2) * image_height)
115
- pred_list.append(((x1, x2, cls, score)))
116
 
117
- pred_list = [i for i in pred_list if i[-1] > threshold]
118
- pred_list = [i for i in pred_list if i[0]>0 and i[1]>0]
119
- sorted_number_list = sorted(pred_list, key=lambda x: x[0])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  # sorted_number_list = sorted(sorted_number_list, reverse=True, key= lambda x: x[-1])
121
  # output_digit = float(''.join([str(int(i[2])) if i[2]!=10 else '.' for i in sorted_number_list]))
122
- output_digit = ''.join([str(int(i[2])) if i[2]!=10 else '.' for i in sorted_number_list])
123
  # output_digit = ''.join([str(int(i[2])) if i[2]!=10 else '.' for i in sorted_number_list[:10]])
124
 
125
  return output_digit
 
85
  # image = Image.open(image_path2)
86
  # image_resized = image.resize((image_width, image_height)) # Resize the image to the corresponding size of the input tensor and store it in a new variable
87
  image = cv2.imread(image_path)
88
+ # image_resized = np.resize(image, (image_width, image_height, 3))
89
 
90
+ image_np = np.array(image) #
91
  image_np = np.true_divide(image_np, 255, dtype=np.float32)
92
  image_np = image_np[np.newaxis, :]
93
 
 
101
  output = output.T
102
 
103
  boxes_xywh = output[:, :4] #Get coordinates of bounding box, first 4 columns of output tensor
104
+ scores = np.max(output[:, 4:], axis=1) #Get score value, 5th column of output tensor
105
+ classes = np.argmax(output[:, 4:], axis=1) # Get the class value, get the 6th and subsequent columns of the output tensor, and store the largest value in the output tensor.
106
 
107
  pred_list = []
108
 
109
+ prob_threshold = threshold
110
+
111
  for box, score, cls in zip(boxes_xywh, scores, classes):
112
+
113
+ if score < prob_threshold:
114
+ continue
115
+
116
  x_center, y_center, width, height = box
117
  x1 = int((x_center - width / 2) * image_width)
118
  y1 = int((y_center - height / 2) * image_height)
119
  x2 = int((x_center + width / 2) * image_width)
120
  y2 = int((y_center + height / 2) * image_height)
 
121
 
122
+ pred_list.append((x1, x2, cls, score))
123
+
124
+ pred_list = sorted(pred_list, key=lambda x: x[0])
125
+
126
+ num_list = []
127
+
128
+ temp_pred_list =[]
129
+
130
+ x_prev = 0
131
+
132
+ x_diff = min([elem[1] - elem[0] for elem in pred_list]) - 10
133
+
134
+ for idx, pred in enumerate(pred_list):
135
+
136
+ if idx == 0:
137
+ temp_pred_list.append(pred)
138
+ x_prev = pred[0]
139
+ elif idx == len(pred_list) - 1:
140
+ temp_final_num = sorted(temp_pred_list, key=lambda x: x[-1], reverse=True)[0]
141
+ num_list.append(temp_final_num)
142
+ elif pred[0] - x_prev < x_diff:
143
+ temp_pred_list.append(pred)
144
+ x_prev = pred[0]
145
+ else:
146
+ temp_final_num = sorted(temp_pred_list, key=lambda x: x[-1], reverse=True)[0]
147
+ num_list.append(temp_final_num)
148
+ temp_pred_list = []
149
+ x_prev = pred[0]
150
+ temp_pred_list.append(pred)
151
+
152
+ sorted_number_list = sorted(num_list, key=lambda x: x[0])
153
  # sorted_number_list = sorted(sorted_number_list, reverse=True, key= lambda x: x[-1])
154
  # output_digit = float(''.join([str(int(i[2])) if i[2]!=10 else '.' for i in sorted_number_list]))
155
+ output_digit = float(''.join([str(int(i[2])) if i[2]!=10 else '.' for i in sorted_number_list]))
156
  # output_digit = ''.join([str(int(i[2])) if i[2]!=10 else '.' for i in sorted_number_list[:10]])
157
 
158
  return output_digit