29
29
logger = logging .getLogger (__name__ )
30
30
31
31
class CNNClassifier (object ):
32
- def __init__ (self , model_file , label_file , input_layer = "input" , output_layer = "final_result" , input_height = 128 , input_width = 128 , input_mean = 127.5 , input_std = 127.5 ):
32
+ def __init__ (self , model_file , label_file ):
33
33
logger .info (model_file )
34
34
self ._interpreter = Interpreter (model_path = model_file )
35
35
self ._interpreter .set_num_threads (4 )
@@ -40,73 +40,20 @@ def __init__(self, model_file, label_file, input_layer="input", output_layer="fi
40
40
self ._input_height = self ._input_details [0 ]['shape' ][1 ]
41
41
self ._input_width = self ._input_details [0 ]['shape' ][2 ]
42
42
self ._floating_model = (self ._input_details [0 ]['dtype' ] == np .float32 )
43
- #input_name = "import/" + input_layer
44
- #output_name = "import/" + output_layer
45
- #self._input_operation = self._graph.get_operation_by_name(input_name)
46
- #self._output_operation = self._graph.get_operation_by_name(output_name)
47
- #self._session = tf.compat.v1.Session(graph=self._graph)
48
- #self._graph_norm = tf.Graph()
49
- #with self._graph_norm.as_default():
50
- # image_mat = tf.compat.v1.placeholder(tf.float32, None, name="image_rgb_in")
51
- # float_caster = tf.cast(image_mat, tf.float32)
52
- # dims_expander = tf.expand_dims(float_caster, 0)
53
- # resized = tf.compat.v1.image.resize_bilinear(dims_expander, [input_height, input_width])
54
- # normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std], name="image_norm_out")
55
- # self._input_operation_norm = self._graph_norm.get_operation_by_name("image_rgb_in")
56
- # self._output_operation_norm = self._graph_norm.get_operation_by_name("image_norm_out")
57
- #self._sess_norm = tf.Session(graph=self._graph_norm)
58
43
59
44
def close (self ):
60
45
pass
61
- #self._session.close()
62
- #self._sess_norm.close()
63
-
64
- #def load_graph(self, model_file):
65
- # graph = tf.Graph()
66
- # graph_def = tf.compat.v1.GraphDef()
67
- #
68
- # with open(model_file, "rb") as f:
69
- # graph_def.ParseFromString(f.read())
70
- # with graph.as_default():
71
- # tf.import_graph_def(graph_def)
72
- #
73
- # return graph
74
- #
75
- #def read_tensor_from_image_file(self, file_name, input_height=299, input_width=299, input_mean=0, input_std=255):
76
- # input_name = "file_reader"
77
- # output_name = "normalized"
78
- #
79
- # file_reader = tf.read_file(file_name, input_name)
80
- #
81
- # if file_name.endswith(".png"):
82
- # image_reader = tf.image.decode_png(file_reader, channels=3, name='png_reader')
83
- # elif file_name.endswith(".gif"):
84
- # image_reader = tf.squeeze(tf.image.decode_gif(file_reader, name='gif_reader'))
85
- # elif file_name.endswith(".bmp"):
86
- # image_reader = tf.image.decode_bmp(file_reader, name='bmp_reader')
87
- # else:
88
- # image_reader = tf.image.decode_jpeg(file_reader, channels=3, name='jpeg_reader')
89
- #
90
- # float_caster = tf.cast(image_reader, tf.float32)
91
- # dims_expander = tf.expand_dims(float_caster, 0);
92
- # resized = tf.image.resize_bilinear(dims_expander, [self.input_height, self.input_width])
93
- # normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
94
- # sess = tf.Session()
95
- #
96
- # result = sess.run(normalized)
97
- # sess.close()
98
- #
99
- # return result
100
- #
101
- #def read_tensor_from_image_mat(self, image_mat, input_height=299, input_width=299, input_mean=0, input_std=255):
102
- # result = self._sess_norm.run(self._output_operation_norm.outputs[0], {self._input_operation_norm.outputs[0]: image_mat})
103
- # return result
104
- def read_tensor_from_image_mat (self , image_mat , input_height = 299 , input_width = 299 , input_mean = 0 , input_std = 255 ):
46
+
47
+ def read_tensor_from_image_file (self , file_name ):
48
+ image = cv2 .imread (file_name )
49
+ return self .read_tensor_from_image_mat (image )
50
+
51
+ def read_tensor_from_image_mat (self , image_mat ):
105
52
frame_rgb = cv2 .cvtColor (image_mat , cv2 .COLOR_BGR2RGB )
106
53
frame_resized = cv2 .resize (frame_rgb , (self ._input_width , self ._input_height ))
107
54
input_data = np .expand_dims (frame_resized , axis = 0 )
108
55
109
- # Normalize pixel values if using a floating model (i.e. if model is non-quantized)
56
+ # Normalize pixel values if using a floating model (i.e. if model is non-quantized)
110
57
if self ._floating_model :
111
58
input_mean = 127.5
112
59
input_std = 127.5
@@ -124,33 +71,39 @@ def classify_image(self,
124
71
image_file_or_mat ,
125
72
top_results = 3 ):
126
73
input_image = None
127
- # if isinstance(image_file_or_mat, str):
128
- # t = self.read_tensor_from_image_file(file_name=image_file_or_mat)
129
- # else:
130
- input_image = self .read_tensor_from_image_mat (image_file_or_mat )
74
+ if isinstance (image_file_or_mat , str ):
75
+ input_image = self .read_tensor_from_image_file (file_name = image_file_or_mat )
76
+ else :
77
+ input_image = self .read_tensor_from_image_mat (image_file_or_mat )
131
78
132
79
self ._interpreter .set_tensor (self ._input_details [0 ]['index' ], input_image )
133
80
self ._interpreter .invoke ()
134
- scores = self ._interpreter .get_tensor (self ._output_details [0 ]['index' ])[0 ] # Bounding box coordinates of detected objects
135
-
81
+ scores = self ._interpreter .get_tensor (self ._output_details [0 ]['index' ])[0 ]
82
+
83
+ #print("scores: " + str(scores))
84
+ confidence = 0.4
85
+ base = 1
86
+ # normalize to int8 for quantized models
87
+ if len (scores )> 0 and (scores [0 ] == int (scores [0 ])):
88
+ confidence = 128
89
+ base = 256
136
90
pairs = []
137
91
for i in range (0 , len (scores )):
138
- if scores [i ] > 128 :
92
+ if scores [i ] > confidence :
139
93
object_name = self ._labels [i ]
140
- pairs .append ((object_name , int (100 * scores [i ]/ 256 )))
94
+ pairs .append ((object_name , int (100 * scores [i ]/ base )))
141
95
142
96
pairs = sorted (pairs , key = lambda x : x [1 ], reverse = True )[:top_results ]
143
- logger .info (str (pairs ))
144
97
return pairs
145
98
146
99
def detect_objects (self ,
147
100
image_file_or_mat ,
148
101
top_results = 3 ):
149
102
input_image = None
150
- # if isinstance(image_file_or_mat, str):
151
- # t = self.read_tensor_from_image_file(file_name=image_file_or_mat)
152
- # else:
153
- input_image = self .read_tensor_from_image_mat (image_file_or_mat )
103
+ if isinstance (image_file_or_mat , str ):
104
+ input_image = self .read_tensor_from_image_file (file_name = image_file_or_mat )
105
+ else :
106
+ input_image = self .read_tensor_from_image_mat (image_file_or_mat )
154
107
155
108
self ._interpreter .set_tensor (self ._input_details [0 ]['index' ], input_image )
156
109
self ._interpreter .invoke ()
0 commit comments