Spaces:
Running
Running
Add image check and confidence calculation in
Browse files
app.py
CHANGED
@@ -16,6 +16,9 @@ def get_sample_images():
|
|
16 |
def inference(image):
|
17 |
# load model
|
18 |
demo = TFliteDemo(os.path.join(os.path.dirname(__file__), 'model.tflite'))
|
|
|
|
|
|
|
19 |
# load image
|
20 |
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
21 |
image = center_fit(image, 128, 64, top_left=True)
|
@@ -25,7 +28,9 @@ def inference(image):
|
|
25 |
# decode
|
26 |
dict = load_dict(os.path.join(os.path.dirname(__file__), 'label.names'))
|
27 |
res = decode_label(pred, dict)
|
28 |
-
|
|
|
|
|
29 |
|
30 |
|
31 |
class TFliteDemo:
|
@@ -79,6 +84,21 @@ def load_dict(dict_path='label.names'):
|
|
79 |
return dict
|
80 |
|
81 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
def decode_label(mat, chars) -> str:
|
83 |
# mat is the output of model
|
84 |
# get char indices along best path
|
@@ -90,20 +110,25 @@ def decode_label(mat, chars) -> str:
|
|
90 |
res = res.replace(' ', '').replace('_', '')
|
91 |
return res
|
92 |
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
<
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
)
|
109 |
-
|
|
|
|
|
|
|
|
|
|
|
|
16 |
def inference(image):
|
17 |
# load model
|
18 |
demo = TFliteDemo(os.path.join(os.path.dirname(__file__), 'model.tflite'))
|
19 |
+
# check image is not None
|
20 |
+
if image is None:
|
21 |
+
return 'None', 'None'
|
22 |
# load image
|
23 |
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
24 |
image = center_fit(image, 128, 64, top_left=True)
|
|
|
28 |
# decode
|
29 |
dict = load_dict(os.path.join(os.path.dirname(__file__), 'label.names'))
|
30 |
res = decode_label(pred, dict)
|
31 |
+
# get confidence
|
32 |
+
confidence = get_confidence(pred)
|
33 |
+
return res, confidence
|
34 |
|
35 |
|
36 |
class TFliteDemo:
|
|
|
84 |
return dict
|
85 |
|
86 |
|
87 |
+
def get_confidence(mat) -> float:
|
88 |
+
# mat is the output of model
|
89 |
+
# get char indices along best path
|
90 |
+
best_path_indices = np.argmax(mat[0], axis=-1)
|
91 |
+
confidence = np.max(mat[0], axis=-1)
|
92 |
+
blank_idx = mat.shape[-1] - 1
|
93 |
+
avg_confidence = []
|
94 |
+
for idx, conf in zip(best_path_indices, confidence):
|
95 |
+
if idx != blank_idx:
|
96 |
+
avg_confidence.append(conf)
|
97 |
+
conf = np.mean(avg_confidence) / 255.0
|
98 |
+
# keep 4 decimal places
|
99 |
+
return "{:.4f}".format(conf)
|
100 |
+
|
101 |
+
|
102 |
def decode_label(mat, chars) -> str:
|
103 |
# mat is the output of model
|
104 |
# get char indices along best path
|
|
|
110 |
res = res.replace(' ', '').replace('_', '')
|
111 |
return res
|
112 |
|
113 |
+
|
114 |
+
if __name__ == '__main__':
|
115 |
+
_TITLE = '''South Korean License Plate Recognition'''
|
116 |
+
_DESCRIPTION = '''
|
117 |
+
<div>
|
118 |
+
<p style="text-align: center; font-size: 1.3em">This is a demo of South Korean License Plate Recognition.
|
119 |
+
<a style="display:inline-block; margin-left: .5em" href='https://github.com/noahzhy/KR_LPR_TF/'><img src='https://img.shields.io/github/stars/noahzhy/KR_LPR_TF?style=social' /></a>
|
120 |
+
</p>
|
121 |
+
</div>
|
122 |
+
'''
|
123 |
+
interface = gr.Interface(
|
124 |
+
fn=inference,
|
125 |
+
inputs="image",
|
126 |
+
outputs=[
|
127 |
+
gr.Textbox(label="Plate Number", type="text"),
|
128 |
+
gr.Textbox(label="Confidence", type="text"),
|
129 |
+
],
|
130 |
+
title=_TITLE,
|
131 |
+
description=_DESCRIPTION,
|
132 |
+
examples=get_sample_images(),
|
133 |
+
)
|
134 |
+
interface.launch()
|