Skip to content

Commit 52da64c

Browse files
committed
blaze_hailo: Update to support face detection/landmarks models.
1 parent 8ec34d7 commit 52da64c

File tree

4 files changed

+228
-73
lines changed

4 files changed

+228
-73
lines changed

blaze_detect_live.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,13 @@ def get_video_dev_by_name(src):
191191
{ "blaze": "face", "pipeline": "tfl_face_v0_10_sparse", "model1": "blaze_tflite/models/face_detection_full_range_sparse.tflite", "model2": "blaze_tflite/models/face_landmark.tflite" },
192192
{ "blaze": "face", "pipeline": "pyt_face_v0_07_front" , "model1": "blaze_pytorch/models/blazeface.pth", "model2": "blaze_pytorch/models/blazeface_landmark.pth" },
193193
{ "blaze": "face", "pipeline": "pyt_face_v0_07_back" , "model1": "blaze_pytorch/models/blazefaceback.pth", "model2": "blaze_pytorch/models/blazeface_landmark.pth" },
194+
{ "blaze": "face", "pipeline": "hai_face_v0_10_short" , "model1": "blaze_hailo/models/face_detection_short_range.hef", "model2": "blaze_hailo/models/face_landmark.hef" },
195+
{ "blaze": "face", "pipeline": "hai_face_v0_10_full" , "model1": "blaze_hailo/models/face_detection_full_range.hef", "model2": "blaze_hailo/models/face_landmark.hef" },
194196
{ "blaze": "pose", "pipeline": "tfl_pose_v0_10_lite" , "model1": "blaze_tflite/models/pose_detection.tflite", "model2": "blaze_tflite/models/pose_landmark_lite.tflite" },
195197
{ "blaze": "pose", "pipeline": "tfl_pose_v0_10_full" , "model1": "blaze_tflite/models/pose_detection.tflite", "model2": "blaze_tflite/models/pose_landmark_full.tflite" },
196198
{ "blaze": "pose", "pipeline": "tfl_pose_v0_10_heavy" , "model1": "blaze_tflite/models/pose_detection.tflite", "model2": "blaze_tflite/models/pose_landmark_heavy.tflite" },
197-
{ "blaze": "pose", "pipeline": "pyt_pose_v0_06" , "model1": "blaze_pytorch/models/blazepose.pth", "model2": "blaze_pytorch/models/blazepose_landmark.pth" }
199+
{ "blaze": "pose", "pipeline": "pyt_pose_v0_06" , "model1": "blaze_pytorch/models/blazepose.pth", "model2": "blaze_pytorch/models/blazepose_landmark.pth" },
200+
{ "blaze": "pose", "pipeline": "hai_pose_v0_10_lite" , "model1": "blaze_tflite/models/pose_detection.tflite", "model2": "blaze_hailo/models/pose_landmark_lite.hef" }
198201
]
199202
nb_blaze_pipelines = len(blaze_pipelines)
200203

blaze_hailo/blazedetector.py

Lines changed: 69 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,8 @@ def load_model(self, model_path):
8181
# Conv__543 [1x36x16x16] =transpose=> [1x16x16x36] =reshape=> [1x512x18] => [1x2944x18]
8282
# Conv__550 [1x36x32x32] =transpose=> [1x32x32x36] =reshape=> [1x2048x1] //
8383
if self.blaze_app == "blazepalm" and self.num_outputs == 6:
84-
8584
self.outputShape1 = tuple((1,2944,1))
8685
self.outputShape2 = tuple((1,2944,18))
87-
88-
if self.DEBUG:
89-
print("[BlazeDetector.load_model] Input Shape : ",self.inputShape)
90-
print("[BlazeDetector.load_model] Output1 Shape : ",self.outputShape1)
91-
print("[BlazeDetector.load_model] Output2 Shape : ",self.outputShape2)
9286

9387
### palm_detection_lite/full
9488
# Conv__410 [1x2x24x24] =transpose=> [1x24x24x2] =reshape=> [1x1152x1] \\
@@ -99,14 +93,24 @@ def load_model(self, model_path):
9993
# => [1x2016x18]
10094
# Conv__411 [1x108x12x12] =transpose=> [1x12x12x108] =reshape=> [1x864x18] //
10195
if self.blaze_app == "blazepalm" and self.num_outputs == 4:
102-
10396
self.outputShape1 = tuple((1,2016,1))
10497
self.outputShape2 = tuple((1,2016,18))
98+
99+
# face_detection_short_range
100+
if self.blaze_app == "blazeface" and self.num_outputs == 4:
101+
self.outputShape1 = tuple((1,896,1))
102+
self.outputShape2 = tuple((1,896,16))
105103

106-
if self.DEBUG:
107-
print("[BlazeDetector.load_model] Input Shape : ",self.inputShape)
108-
print("[BlazeDetector.load_model] Output1 Shape : ",self.outputShape1)
109-
print("[BlazeDetector.load_model] Output2 Shape : ",self.outputShape2)
104+
# face_detection_full_range
105+
if self.blaze_app == "blazeface" and self.num_outputs == 2:
106+
self.outputShape1 = tuple((1,2304,1))
107+
self.outputShape2 = tuple((1,2304,16))
108+
109+
if self.DEBUG:
110+
print("[BlazeDetector.load_model] Input Shape : ",self.inputShape)
111+
print("[BlazeDetector.load_model] Output1 Shape : ",self.outputShape1)
112+
print("[BlazeDetector.load_model] Output2 Shape : ",self.outputShape2)
113+
110114

111115
self.x_scale = self.inputShape[1]
112116
self.y_scale = self.inputShape[2]
@@ -279,6 +283,60 @@ def predict_on_batch(self, x):
279283
concat_1_2016_18 = np.concatenate((reshape_1_1152_18,reshape_1_864_18),axis=1)
280284

281285
out2 = concat_1_2016_18.astype(np.float32)
286+
287+
### face_detection_short_range
288+
#[BlazeDetector.load_model] Model File : blaze_hailo/models/face_detection_short_range.hef
289+
#[BlazeDetector.load_model] HEF Id : 0
290+
#[BlazeDetector.load_model] Input VStream Infos : [VStreamInfo("face_detection_short_range/input_layer1")]
291+
#[BlazeDetector.load_model] Output VStream Infos : [VStreamInfo("face_detection_short_range/conv21"), VStreamInfo("face_detection_short_range/conv14"), VStreamInfo("face_detection_short_range/conv20"), VStreamInfo("face_detection_short_range/conv13")]
292+
#[BlazeDetector.load_model] Number of Inputs : 1
293+
#[BlazeDetector.load_model] Input[ 0 ] Shape : (128, 128, 3) Name : face_detection_short_range/input_layer1
294+
#[BlazeDetector.load_model] Number of Outputs : 4
295+
#[BlazeDetector.load_model] Output[ 0 ] Shape : (8, 8, 96) Name : face_detection_short_range/conv21
296+
#[BlazeDetector.load_model] Output[ 1 ] Shape : (16, 16, 32) Name : face_detection_short_range/conv14
297+
#[BlazeDetector.load_model] Output[ 2 ] Shape : (8, 8, 6) Name : face_detection_short_range/conv20
298+
#[BlazeDetector.load_model] Output[ 3 ] Shape : (16, 16, 2) Name : face_detection_short_range/conv13
299+
if self.blaze_app == "blazeface" and self.num_outputs == 4:
300+
transpose_1_16_16_2 = infer_results[self.output_vstream_infos[3].name]
301+
transport_1_8_8_6 = infer_results[self.output_vstream_infos[2].name]
302+
303+
reshape_1_512_1 = transpose_1_16_16_2.reshape(1,512,1)
304+
reshape_1_384_1 = transport_1_8_8_6.reshape(1,384,1)
305+
306+
concat_1_896_1 = np.concatenate((reshape_1_512_1,reshape_1_384_1),axis=1)
307+
308+
out1 = concat_1_896_1.astype(np.float32)
309+
310+
transpose_1_16_16_32 = infer_results[self.output_vstream_infos[1].name]
311+
transport_8_8_96 = infer_results[self.output_vstream_infos[0].name]
312+
313+
reshape_1_512_16 = transpose_1_16_16_32.reshape(1,512,16)
314+
reshape_1_384_16 = transport_8_8_96.reshape(1,384,16)
315+
316+
concat_1_896_16 = np.concatenate((reshape_1_512_16,reshape_1_384_16),axis=1)
317+
318+
out2 = concat_1_896_16.astype(np.float32)
319+
320+
### face_detection_full_range
321+
#[BlazeDetector.load_model] Model File : blaze_hailo/models/face_detection_full_range.hef
322+
#[BlazeDetector.load_model] HEF Id : 0
323+
#[BlazeDetector.load_model] Input VStream Infos : [VStreamInfo("face_detection_full_range/input_layer1")]
324+
#[BlazeDetector.load_model] Output VStream Infos : [VStreamInfo("face_detection_full_range/conv49"), VStreamInfo("face_detection_full_range/conv48")]
325+
#[BlazeDetector.load_model] Number of Inputs : 1
326+
#[BlazeDetector.load_model] Input[ 0 ] Shape : (192, 192, 3) Name : face_detection_full_range/input_layer1
327+
#[BlazeDetector.load_model] Number of Outputs : 2
328+
#[BlazeDetector.load_model] Output[ 0 ] Shape : (48, 48, 16) Name : face_detection_full_range/conv49
329+
#[BlazeDetector.load_model] Output[ 1 ] Shape : (48, 48, 1) Name : face_detection_full_range/conv48
330+
if self.blaze_app == "blazeface" and self.num_outputs == 2:
331+
transpose_1_48_48_1 = infer_results[self.output_vstream_infos[1].name]
332+
transpose_1_48_48_16 = infer_results[self.output_vstream_infos[0].name]
333+
334+
reshape_1_2304_1 = transpose_1_48_48_1.reshape(1,2304,1)
335+
reshape_1_2304_16 = transpose_1_48_48_16.reshape(1,2304,16)
336+
337+
out1 = reshape_1_2304_1.astype(np.float32)
338+
out2 = reshape_1_2304_16.astype(np.float32)
339+
282340

283341
#if self.DEBUG:
284342
# print("[BlazeDetector.load_model] Input : ",x.shape, x.dtype, x)

blaze_hailo/blazelandmark.py

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ def load_model(self, model_path):
4545
if self.DEBUG:
4646
print("[BlazeLandmark.load_model] Input VStream Infos : ",self.input_vstream_infos)
4747
print("[BlazeLandmark.load_model] Output VStream Infos : ",self.output_vstream_infos)
48-
#[BlazeLandmark.load_model] Input VStream Infos : [VStreamInfo("hand_landmark_lite/input_layer1")]
49-
#[BlazeLandmark.load_model] Output VStream Infos : [VStreamInfo("hand_landmark_lite/fc1"), VStreamInfo("hand_landmark_lite/fc3"), VStreamInfo("hand_landmark_lite/fc2"), VStreamInfo("hand_landmark_lite/fc4")]
5048

5149
# Get input/output tensors dimensions
5250
self.num_inputs = len(self.input_vstream_infos)
@@ -58,25 +56,26 @@ def load_model(self, model_path):
5856
print("[BlazeLandmark.load_model] Number of Outputs : ",self.num_outputs)
5957
for i in range(self.num_outputs):
6058
print("[BlazeLandmark.load_model] Output[",i,"] Shape : ",tuple(self.output_vstream_infos[i].shape))
61-
#[BlazeLandmark.load_model] Number of Inputs : 1
62-
#[BlazeLandmark.load_model] Input[ 0 ] Shape : (224, 224, 3)
63-
#[BlazeLandmark.load_model] Number of Outputs : 4
64-
#[BlazeLandmark.load_model] Output[ 0 ] Shape : (63,)
65-
#[BlazeLandmark.load_model] Output[ 1 ] Shape : (63,)
66-
#[BlazeLandmark.load_model] Output[ 2 ] Shape : (1,)
67-
#[BlazeLandmark.load_model] Output[ 3 ] Shape : (1,)
6859

69-
self.inputShape = self.input_vstream_infos[0].shape
70-
self.outputShape1 = tuple(self.output_vstream_infos[2].shape)
71-
self.outputShape2 = tuple(self.output_vstream_infos[0].shape)
60+
if self.blaze_app == "blazehandlandmark":
61+
self.inputShape = self.input_vstream_infos[0].shape
62+
self.outputShape1 = tuple(self.output_vstream_infos[2].shape)
63+
self.outputShape2 = tuple(self.output_vstream_infos[0].shape)
64+
65+
if self.blaze_app == "blazefacelandmark":
66+
self.inputShape = self.input_vstream_infos[0].shape
67+
self.outputShape1 = tuple(self.output_vstream_infos[0].shape)
68+
self.outputShape2 = tuple(self.output_vstream_infos[1].shape)
69+
70+
if self.blaze_app == "blazeposelandmark":
71+
self.inputShape = self.input_vstream_infos[0].shape
72+
self.outputShape1 = tuple(self.output_vstream_infos[0].shape)
73+
self.outputShape2 = tuple(self.output_vstream_infos[1].shape)
7274

7375
if self.DEBUG:
7476
print("[BlazeLandmark.load_model] Input Shape : ",self.inputShape)
7577
print("[BlazeLandmark.load_model] Output1 Shape : ",self.outputShape1)
7678
print("[BlazeLandmark.load_model] Output2 Shape : ",self.outputShape2)
77-
#[BlazeLandmark.load_model] Input Shape : (224, 224, 3)
78-
#[BlazeLandmark.load_model] Output1 Shape : (63,)
79-
#[BlazeLandmark.load_model] Output2 Shape : (63,)
8079

8180
self.resolution = self.inputShape[1]
8281
if self.DEBUG:
@@ -117,19 +116,49 @@ def predict(self, x):
117116
start = timer()
118117

119118
if self.blaze_app == "blazehandlandmark":
119+
#[BlazeLandmark.load_model] Model File : blaze_hailo/models/hand_landmark_lite.hef
120+
#[BlazeLandmark.load_model] Input VStream Infos : [VStreamInfo("hand_landmark_lite/input_layer1")]
121+
#[BlazeLandmark.load_model] Output VStream Infos : [VStreamInfo("hand_landmark_lite/fc1"), VStreamInfo("hand_landmark_lite/fc4"), VStreamInfo("hand_landmark_lite/fc3"), VStreamInfo("hand_landmark_lite/fc2")]
122+
#[BlazeLandmark.load_model] Number of Inputs : 1
123+
#[BlazeLandmark.load_model] Input[ 0 ] Shape : (224, 224, 3)
124+
#[BlazeLandmark.load_model] Number of Outputs : 4
125+
#[BlazeLandmark.load_model] Output[ 0 ] Shape : (63,)
126+
#[BlazeLandmark.load_model] Output[ 1 ] Shape : (1,)
127+
#[BlazeLandmark.load_model] Output[ 2 ] Shape : (1,)
128+
#[BlazeLandmark.load_model] Output[ 3 ] Shape : (63,)
120129
out1 = infer_results[self.output_vstream_infos[2].name]
121130
handedness = infer_results[self.output_vstream_infos[3].name]
122131
out2 = infer_results[self.output_vstream_infos[0].name]
123132
out2 = out2.reshape(1,21,-1) # 42 => [1,21,2] | 63 => [1,21,3]
124133
out2 = out2/self.resolution
125134
elif self.blaze_app == "blazefacelandmark":
135+
#[BlazeLandmark.load_model] Model File : blaze_hailo/models/face_landmark.hef
136+
#[BlazeLandmark.load_model] Input VStream Infos : [VStreamInfo("face_landmark/input_layer1")]
137+
#[BlazeLandmark.load_model] Output VStream Infos : [VStreamInfo("face_landmark/conv23"), VStreamInfo("face_landmark/conv25")]
138+
#[BlazeLandmark.load_model] Number of Inputs : 1
139+
#[BlazeLandmark.load_model] Input[ 0 ] Shape : (192, 192, 3)
140+
#[BlazeLandmark.load_model] Number of Outputs : 2
141+
#[BlazeLandmark.load_model] Output[ 0 ] Shape : (1, 1, 1)
142+
#[BlazeLandmark.load_model] Output[ 1 ] Shape : (1, 1, 1404)
143+
#[BlazeLandmark.load_model] Input Shape : (192, 192, 3)
126144
out1 = infer_results[self.output_vstream_infos[0].name]
127145
out2 = infer_results[self.output_vstream_infos[1].name]
128146
out2 = out2.reshape(1,-1,3) # 1404 => [1,356,3]
129147
out2 = out2/self.resolution
130148
elif self.blaze_app == "blazeposelandmark":
131-
out1 = infer_results[self.output_vstream_infos[0].name]
132-
out2 = infer_results[self.output_vstream_infos[1].name]
149+
#[BlazeLandmark.load_model] Model File : blaze_hailo/models/pose_landmark_lite.hef
150+
#[BlazeLandmark.load_model] Input VStream Infos : [VStreamInfo("pose_landmark_lite/input_layer1")]
151+
#[BlazeLandmark.load_model] Output VStream Infos : [VStreamInfo("pose_landmark_lite/conv46"), VStreamInfo("pose_landmark_lite/conv45"), VStreamInfo("pose_landmark_lite/conv54"), VStreamInfo("pose_landmark_lite/conv48"), VStreamInfo("pose_landmark_lite/conv47")]
152+
#[BlazeLandmark.load_model] Number of Inputs : 1
153+
#[BlazeLandmark.load_model] Input[ 0 ] Shape : (256, 256, 3)
154+
#[BlazeLandmark.load_model] Number of Outputs : 5
155+
#[BlazeLandmark.load_model] Output[ 0 ] Shape : (1, 1, 195)
156+
#[BlazeLandmark.load_model] Output[ 1 ] Shape : (1, 1, 1)
157+
#[BlazeLandmark.load_model] Output[ 2 ] Shape : (256, 256, 1)
158+
#[BlazeLandmark.load_model] Output[ 3 ] Shape : (64, 64, 39)
159+
#[BlazeLandmark.load_model] Output[ 4 ] Shape : (1, 1, 117)
160+
out1 = infer_results[self.output_vstream_infos[1].name]
161+
out2 = infer_results[self.output_vstream_infos[0].name]
133162
out2 = out2.reshape(1,-1,5) # 195 => [1,39,5]
134163
out2 = out2/self.resolution
135164

0 commit comments

Comments
 (0)