├── FPS.py ├── HandTracker.py ├── README.md ├── docker_tflite2tensorflow.sh ├── img ├── gestures.gif └── hand_tracker.gif ├── mediapipe_utils.py ├── models ├── convert_models.sh ├── hand_landmark_FP32.bin ├── hand_landmark_FP32.xml ├── palm_detection_FP32.bin └── palm_detection_FP32.xml └── requirements.txt /FPS.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Fri Sep 22 15:29:32 2017 4 | 5 | @author: geaxx 6 | """ 7 | import time 8 | import cv2 9 | 10 | def now(): 11 | return time.perf_counter() 12 | 13 | class FPS: # To measure the number of frame per second 14 | def __init__(self, mean_nb_frames=10): 15 | self.nbf=0 16 | self.fps=0 17 | self.start=0 18 | self.mean_nb_frames = mean_nb_frames 19 | 20 | def update(self): 21 | if self.nbf%self.mean_nb_frames==0: 22 | if self.start != 0: 23 | self.stop=now() 24 | self.fps=self.mean_nb_frames/(self.stop-self.start) 25 | self.start=self.stop 26 | else : 27 | self.start=now() 28 | self.nbf+=1 29 | 30 | def get(self): 31 | return self.fps 32 | 33 | def display(self, win, orig=(10,30), font=cv2.FONT_HERSHEY_SIMPLEX, size=2, color=(0,255,0), thickness=2): 34 | cv2.putText(win,f"FPS={self.get():.2f}",orig,font,size,color,thickness) 35 | 36 | -------------------------------------------------------------------------------- /HandTracker.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from collections import namedtuple 3 | import mediapipe_utils as mpu 4 | import cv2 5 | from pathlib import Path 6 | from FPS import FPS, now 7 | import argparse 8 | import os 9 | from openvino.inference_engine import IENetwork, IECore 10 | 11 | class HandTracker: 12 | def __init__(self, input_src=None, 13 | pd_xml="models/palm_detection_FP32.xml", 14 | pd_device="CPU", 15 | pd_score_thresh=0.5, pd_nms_thresh=0.3, 16 | use_lm=True, 17 | lm_xml="models/hand_landmark_FP32.xml", 18 | lm_device="CPU", 19 | lm_score_threshold=0.5, 20 | use_gesture=False, 21 | crop=False): 22 | 23 | self.pd_score_thresh = pd_score_thresh 24 | self.pd_nms_thresh = pd_nms_thresh 25 | self.use_lm = use_lm 26 | self.lm_score_threshold = lm_score_threshold 27 | self.use_gesture = use_gesture 28 | self.crop = crop 29 | 30 | 31 | if input_src.endswith('.jpg') or input_src.endswith('.png') : 32 | self.image_mode = True 33 | self.img = cv2.imread(input_src) 34 | else: 35 | self.image_mode = False 36 | if input_src.isdigit(): 37 | input_src = int(input_src) 38 | self.cap = cv2.VideoCapture(input_src) 39 | 40 | # Create SSD anchors 41 | # https://github.com/google/mediapipe/blob/master/mediapipe/modules/palm_detection/palm_detection_cpu.pbtxt 42 | anchor_options = mpu.SSDAnchorOptions(num_layers=4, 43 | min_scale=0.1484375, 44 | max_scale=0.75, 45 | input_size_height=128, 46 | input_size_width=128, 47 | anchor_offset_x=0.5, 48 | anchor_offset_y=0.5, 49 | strides=[8, 16, 16, 16], 50 | aspect_ratios= [1.0], 51 | reduce_boxes_in_lowest_layer=False, 52 | interpolated_scale_aspect_ratio=1.0, 53 | fixed_anchor_size=True) 54 | self.anchors = mpu.generate_anchors(anchor_options) 55 | self.nb_anchors = self.anchors.shape[0] 56 | print(f"{self.nb_anchors} anchors have been created") 57 | 58 | # Load Openvino models 59 | self.load_models(pd_xml, pd_device, lm_xml, lm_device) 60 | 61 | # Rendering flags 62 | if self.use_lm: 63 | self.show_pd_box = False 64 | self.show_pd_kps = False 65 | self.show_rot_rect = False 66 | self.show_handedness = False 67 | self.show_landmarks = True 68 | self.show_scores = False 69 | self.show_gesture = self.use_gesture 70 | else: 71 | self.show_pd_box = True 72 | self.show_pd_kps = False 73 | self.show_rot_rect = False 74 | self.show_scores = False 75 | 76 | 77 | def load_models(self, pd_xml, pd_device, lm_xml, lm_device): 78 | 79 | print("Loading Inference Engine") 80 | self.ie = IECore() 81 | print("Device info:") 82 | versions = self.ie.get_versions(pd_device) 83 | print("{}{}".format(" "*8, pd_device)) 84 | print("{}MKLDNNPlugin version ......... {}.{}".format(" "*8, versions[pd_device].major, versions[pd_device].minor)) 85 | print("{}Build ........... {}".format(" "*8, versions[pd_device].build_number)) 86 | 87 | # Pose detection model 88 | pd_name = os.path.splitext(pd_xml)[0] 89 | pd_bin = pd_name + '.bin' 90 | print("Palm Detection model - Reading network files:\n\t{}\n\t{}".format(pd_xml, pd_bin)) 91 | self.pd_net = self.ie.read_network(model=pd_xml, weights=pd_bin) 92 | # Input blob: input - shape: [1, 3, 128, 128] 93 | # Output blob: classificators - shape: [1, 896, 1] : scores 94 | # Output blob: regressors - shape: [1, 896, 18] : bboxes 95 | self.pd_input_blob = next(iter(self.pd_net.input_info)) 96 | print(f"Input blob: {self.pd_input_blob} - shape: {self.pd_net.input_info[self.pd_input_blob].input_data.shape}") 97 | _,_,self.pd_h,self.pd_w = self.pd_net.input_info[self.pd_input_blob].input_data.shape 98 | for o in self.pd_net.outputs.keys(): 99 | print(f"Output blob: {o} - shape: {self.pd_net.outputs[o].shape}") 100 | self.pd_scores = "classificators" 101 | self.pd_bboxes = "regressors" 102 | print("Loading palm detection model into the plugin") 103 | self.pd_exec_net = self.ie.load_network(network=self.pd_net, num_requests=1, device_name=pd_device) 104 | self.pd_infer_time_cumul = 0 105 | self.pd_infer_nb = 0 106 | 107 | self.infer_nb = 0 108 | self.infer_time_cumul = 0 109 | 110 | # Landmarks model 111 | if self.use_lm: 112 | if lm_device != pd_device: 113 | print("Device info:") 114 | versions = self.ie.get_versions(pd_device) 115 | print("{}{}".format(" "*8, pd_device)) 116 | print("{}MKLDNNPlugin version ......... {}.{}".format(" "*8, versions[pd_device].major, versions[pd_device].minor)) 117 | print("{}Build ........... {}".format(" "*8, versions[pd_device].build_number)) 118 | 119 | lm_name = os.path.splitext(lm_xml)[0] 120 | lm_bin = lm_name + '.bin' 121 | print("Landmark model - Reading network files:\n\t{}\n\t{}".format(lm_xml, lm_bin)) 122 | self.lm_net = self.ie.read_network(model=lm_xml, weights=lm_bin) 123 | # Input blob: input_1 - shape: [1, 3, 224, 224] 124 | # Output blob: Identity_1 - shape: [1, 1] 125 | # Output blob: Identity_2 - shape: [1, 1] 126 | # Output blob: Identity_dense/BiasAdd/Add - shape: [1, 63] 127 | self.lm_input_blob = next(iter(self.lm_net.input_info)) 128 | print(f"Input blob: {self.lm_input_blob} - shape: {self.lm_net.input_info[self.lm_input_blob].input_data.shape}") 129 | _,_,self.lm_h,self.lm_w = self.lm_net.input_info[self.lm_input_blob].input_data.shape 130 | # Batch reshaping if lm_2 is True 131 | for o in self.lm_net.outputs.keys(): 132 | print(f"Output blob: {o} - shape: {self.lm_net.outputs[o].shape}") 133 | self.lm_score = "Identity_1" 134 | self.lm_handedness = "Identity_2" 135 | self.lm_landmarks = "Identity_dense/BiasAdd/Add" 136 | print("Loading landmark model to the plugin") 137 | self.lm_exec_net = self.ie.load_network(network=self.lm_net, num_requests=1, device_name=lm_device) 138 | self.lm_infer_time_cumul = 0 139 | self.lm_infer_nb = 0 140 | self.lm_hand_nb = 0 141 | 142 | 143 | def pd_postprocess(self, inference): 144 | scores = np.squeeze(inference[self.pd_scores]) # 896 145 | bboxes = inference[self.pd_bboxes][0] # 896x18 146 | # Decode bboxes 147 | self.regions = mpu.decode_bboxes(self.pd_score_thresh, scores, bboxes, self.anchors) 148 | # Non maximum suppression 149 | self.regions = mpu.non_max_suppression(self.regions, self.pd_nms_thresh) 150 | if self.use_lm: 151 | mpu.detections_to_rect(self.regions) 152 | mpu.rect_transformation(self.regions, self.frame_size, self.frame_size) 153 | 154 | def pd_render(self, frame): 155 | for r in self.regions: 156 | if self.show_pd_box: 157 | box = (np.array(r.pd_box) * self.frame_size).astype(int) 158 | cv2.rectangle(frame, (box[0], box[1]), (box[0]+box[2], box[1]+box[3]), (0,255,0), 2) 159 | if self.show_pd_kps: 160 | for i,kp in enumerate(r.pd_kps): 161 | x = int(kp[0] * self.frame_size) 162 | y = int(kp[1] * self.frame_size) 163 | cv2.circle(frame, (x, y), 6, (0,0,255), -1) 164 | cv2.putText(frame, str(i), (x, y+12), cv2.FONT_HERSHEY_PLAIN, 1.5, (0,255,0), 2) 165 | if self.show_scores: 166 | cv2.putText(frame, f"Palm score: {r.pd_score:.2f}", 167 | (int(r.pd_box[0] * self.frame_size+10), int((r.pd_box[1]+r.pd_box[3])*self.frame_size+60)), 168 | cv2.FONT_HERSHEY_PLAIN, 2, (255,255,0), 2) 169 | 170 | def recognize_gesture(self, r): 171 | 172 | # Finger states 173 | # state: -1=unknown, 0=close, 1=open 174 | d_3_5 = mpu.distance(r.landmarks[3], r.landmarks[5]) 175 | d_2_3 = mpu.distance(r.landmarks[2], r.landmarks[3]) 176 | angle0 = mpu.angle(r.landmarks[0], r.landmarks[1], r.landmarks[2]) 177 | angle1 = mpu.angle(r.landmarks[1], r.landmarks[2], r.landmarks[3]) 178 | angle2 = mpu.angle(r.landmarks[2], r.landmarks[3], r.landmarks[4]) 179 | r.thumb_angle = angle0+angle1+angle2 180 | if angle0+angle1+angle2 > 460 and d_3_5 / d_2_3 > 1.2: 181 | r.thumb_state = 1 182 | else: 183 | r.thumb_state = 0 184 | 185 | if r.landmarks[8][1] < r.landmarks[7][1] < r.landmarks[6][1]: 186 | r.index_state = 1 187 | elif r.landmarks[6][1] < r.landmarks[8][1]: 188 | r.index_state = 0 189 | else: 190 | r.index_state = -1 191 | 192 | if r.landmarks[12][1] < r.landmarks[11][1] < r.landmarks[10][1]: 193 | r.middle_state = 1 194 | elif r.landmarks[10][1] < r.landmarks[12][1]: 195 | r.middle_state = 0 196 | else: 197 | r.middle_state = -1 198 | 199 | if r.landmarks[16][1] < r.landmarks[15][1] < r.landmarks[14][1]: 200 | r.ring_state = 1 201 | elif r.landmarks[14][1] < r.landmarks[16][1]: 202 | r.ring_state = 0 203 | else: 204 | r.ring_state = -1 205 | 206 | if r.landmarks[20][1] < r.landmarks[19][1] < r.landmarks[18][1]: 207 | r.little_state = 1 208 | elif r.landmarks[18][1] < r.landmarks[20][1]: 209 | r.little_state = 0 210 | else: 211 | r.little_state = -1 212 | 213 | # Gesture 214 | if r.thumb_state == 1 and r.index_state == 1 and r.middle_state == 1 and r.ring_state == 1 and r.little_state == 1: 215 | r.gesture = "FIVE" 216 | elif r.thumb_state == 0 and r.index_state == 0 and r.middle_state == 0 and r.ring_state == 0 and r.little_state == 0: 217 | r.gesture = "FIST" 218 | elif r.thumb_state == 1 and r.index_state == 0 and r.middle_state == 0 and r.ring_state == 0 and r.little_state == 0: 219 | r.gesture = "OK" 220 | elif r.thumb_state == 0 and r.index_state == 1 and r.middle_state == 1 and r.ring_state == 0 and r.little_state == 0: 221 | r.gesture = "PEACE" 222 | elif r.thumb_state == 0 and r.index_state == 1 and r.middle_state == 0 and r.ring_state == 0 and r.little_state == 0: 223 | r.gesture = "ONE" 224 | elif r.thumb_state == 1 and r.index_state == 1 and r.middle_state == 0 and r.ring_state == 0 and r.little_state == 0: 225 | r.gesture = "TWO" 226 | elif r.thumb_state == 1 and r.index_state == 1 and r.middle_state == 1 and r.ring_state == 0 and r.little_state == 0: 227 | r.gesture = "THREE" 228 | elif r.thumb_state == 0 and r.index_state == 1 and r.middle_state == 1 and r.ring_state == 1 and r.little_state == 1: 229 | r.gesture = "FOUR" 230 | else: 231 | r.gesture = None 232 | 233 | def lm_postprocess(self, region, inference): 234 | region.lm_score = np.squeeze(inference[self.lm_score]) 235 | region.handedness = np.squeeze(inference[self.lm_handedness]) 236 | lm_raw = np.squeeze(inference[self.lm_landmarks]) 237 | 238 | lm = [] 239 | for i in range(int(len(lm_raw)/3)): 240 | # x,y,z -> x/w,y/h,z/w (here h=w) 241 | lm.append(lm_raw[3*i:3*(i+1)]/self.lm_w) 242 | region.landmarks = lm 243 | if self.use_gesture: self.recognize_gesture(region) 244 | 245 | 246 | 247 | def lm_render(self, frame, region): 248 | if region.lm_score > self.lm_score_threshold: 249 | if self.show_rot_rect: 250 | cv2.polylines(frame, [np.array(region.rect_points)], True, (0,255,255), 2, cv2.LINE_AA) 251 | if self.show_landmarks: 252 | src = np.array([(0, 0), (1, 0), (1, 1)], dtype=np.float32) 253 | dst = np.array([ (x, y) for x,y in region.rect_points[1:]], dtype=np.float32) # region.rect_points[0] is left bottom point ! 254 | mat = cv2.getAffineTransform(src, dst) 255 | lm_xy = np.expand_dims(np.array([(l[0], l[1]) for l in region.landmarks]), axis=0) 256 | lm_xy = np.squeeze(cv2.transform(lm_xy, mat)).astype(np.int32) 257 | list_connections = [[0, 1, 2, 3, 4], 258 | [0, 5, 6, 7, 8], 259 | [5, 9, 10, 11, 12], 260 | [9, 13, 14 , 15, 16], 261 | [13, 17], 262 | [0, 17, 18, 19, 20]] 263 | lines = [np.array([lm_xy[point] for point in line]) for line in list_connections] 264 | cv2.polylines(frame, lines, False, (255, 0, 0), 2, cv2.LINE_AA) 265 | if self.use_gesture: 266 | # color depending on finger state (1=open, 0=close, -1=unknown) 267 | color = { 1: (0,255,0), 0: (0,0,255), -1:(0,255,255)} 268 | radius = 6 269 | cv2.circle(frame, (lm_xy[0][0], lm_xy[0][1]), radius, color[-1], -1) 270 | for i in range(1,5): 271 | cv2.circle(frame, (lm_xy[i][0], lm_xy[i][1]), radius, color[region.thumb_state], -1) 272 | for i in range(5,9): 273 | cv2.circle(frame, (lm_xy[i][0], lm_xy[i][1]), radius, color[region.index_state], -1) 274 | for i in range(9,13): 275 | cv2.circle(frame, (lm_xy[i][0], lm_xy[i][1]), radius, color[region.middle_state], -1) 276 | for i in range(13,17): 277 | cv2.circle(frame, (lm_xy[i][0], lm_xy[i][1]), radius, color[region.ring_state], -1) 278 | for i in range(17,21): 279 | cv2.circle(frame, (lm_xy[i][0], lm_xy[i][1]), radius, color[region.little_state], -1) 280 | else: 281 | for x,y in lm_xy: 282 | cv2.circle(frame, (x, y), 6, (0,128,255), -1) 283 | if self.show_handedness: 284 | cv2.putText(frame, f"RIGHT {region.handedness:.2f}" if region.handedness > 0.5 else f"LEFT {1-region.handedness:.2f}", 285 | (int(region.pd_box[0] * self.frame_size+10), int((region.pd_box[1]+region.pd_box[3])*self.frame_size+20)), 286 | cv2.FONT_HERSHEY_PLAIN, 2, (0,255,0) if region.handedness > 0.5 else (0,0,255), 2) 287 | if self.show_scores: 288 | cv2.putText(frame, f"Landmark score: {region.lm_score:.2f}", 289 | (int(region.pd_box[0] * self.frame_size+10), int((region.pd_box[1]+region.pd_box[3])*self.frame_size+90)), 290 | cv2.FONT_HERSHEY_PLAIN, 2, (255,255,0), 2) 291 | if self.use_gesture and self.show_gesture: 292 | cv2.putText(frame, region.gesture, (int(region.pd_box[0]*self.frame_size+10), int(region.pd_box[1]*self.frame_size-50)), 293 | cv2.FONT_HERSHEY_PLAIN, 3, (255,255,255), 3) 294 | 295 | 296 | 297 | def run(self): 298 | 299 | self.fps = FPS(mean_nb_frames=20) 300 | 301 | nb_pd_inferences = 0 302 | nb_lm_inferences = 0 303 | glob_pd_rtrip_time = 0 304 | glob_lm_rtrip_time = 0 305 | while True: 306 | self.fps.update() 307 | if self.image_mode: 308 | vid_frame = self.img 309 | else: 310 | ok, vid_frame = self.cap.read() 311 | if not ok: 312 | break 313 | h, w = vid_frame.shape[:2] 314 | if self.crop: 315 | # Cropping the long side to get a square shape 316 | self.frame_size = min(h, w) 317 | dx = (w - self.frame_size) // 2 318 | dy = (h - self.frame_size) // 2 319 | video_frame = vid_frame[dy:dy+self.frame_size, dx:dx+self.frame_size] 320 | else: 321 | # Padding on the small side to get a square shape 322 | self.frame_size = max(h, w) 323 | pad_h = int((self.frame_size - h)/2) 324 | pad_w = int((self.frame_size - w)/2) 325 | video_frame = cv2.copyMakeBorder(vid_frame, pad_h, pad_h, pad_w, pad_w, cv2.BORDER_CONSTANT) 326 | 327 | # Resize image to NN square input shape 328 | frame_nn = cv2.resize(video_frame, (self.pd_w, self.pd_h), interpolation=cv2.INTER_AREA) 329 | # Transpose hxwx3 -> 1x3xhxw 330 | frame_nn = np.transpose(frame_nn, (2,0,1))[None,] 331 | 332 | annotated_frame = video_frame.copy() 333 | 334 | # Get palm detection 335 | pd_rtrip_time = now() 336 | inference = self.pd_exec_net.infer(inputs={self.pd_input_blob: frame_nn}) 337 | glob_pd_rtrip_time += now() - pd_rtrip_time 338 | self.pd_postprocess(inference) 339 | self.pd_render(annotated_frame) 340 | nb_pd_inferences += 1 341 | 342 | # Hand landmarks 343 | if self.use_lm: 344 | for i,r in enumerate(self.regions): 345 | frame_nn = mpu.warp_rect_img(r.rect_points, video_frame, self.lm_w, self.lm_h) 346 | # Transpose hxwx3 -> 1x3xhxw 347 | frame_nn = np.transpose(frame_nn, (2,0,1))[None,] 348 | # Get hand landmarks 349 | lm_rtrip_time = now() 350 | inference = self.lm_exec_net.infer(inputs={self.lm_input_blob: frame_nn}) 351 | glob_lm_rtrip_time += now() - lm_rtrip_time 352 | nb_lm_inferences += 1 353 | self.lm_postprocess(r, inference) 354 | self.lm_render(annotated_frame, r) 355 | 356 | if not self.crop: 357 | annotated_frame = annotated_frame[pad_h:pad_h+h, pad_w:pad_w+w] 358 | 359 | self.fps.display(annotated_frame, orig=(50,50),color=(240,180,100)) 360 | cv2.imshow("video", annotated_frame) 361 | 362 | key = cv2.waitKey(1) 363 | if key == ord('q') or key == 27: 364 | break 365 | elif key == 32: 366 | # Pause on space bar 367 | cv2.waitKey(0) 368 | elif key == ord('1'): 369 | self.show_pd_box = not self.show_pd_box 370 | elif key == ord('2'): 371 | self.show_pd_kps = not self.show_pd_kps 372 | elif key == ord('3'): 373 | self.show_rot_rect = not self.show_rot_rect 374 | elif key == ord('4'): 375 | self.show_landmarks = not self.show_landmarks 376 | elif key == ord('5'): 377 | self.show_handedness = not self.show_handedness 378 | elif key == ord('6'): 379 | self.show_scores = not self.show_scores 380 | elif key == ord('7'): 381 | self.show_gesture = not self.show_gesture 382 | 383 | # Print some stats 384 | print(f"# palm detection inferences : {nb_pd_inferences}") 385 | print(f"# hand landmark inferences : {nb_lm_inferences}") 386 | print(f"Palm detection round trip : {glob_pd_rtrip_time/nb_pd_inferences*1000:.1f} ms") 387 | print(f"Hand landmark round trip : {glob_lm_rtrip_time/nb_lm_inferences*1000:.1f} ms") 388 | 389 | 390 | if __name__ == "__main__": 391 | parser = argparse.ArgumentParser() 392 | parser.add_argument('-i', '--input', type=str, default='0', 393 | help="Path to video or image file to use as input (default=%(default)s)") 394 | parser.add_argument('-g', '--gesture', action="store_true", 395 | help="enable gesture recognition") 396 | parser.add_argument("--pd_m", default="models/palm_detection_FP32.xml", type=str, 397 | help="Path to an .xml file for palm detection model (default=%(default)s)") 398 | parser.add_argument("--pd_device", default='CPU', type=str, 399 | help="Target device for the palm detection model (default=%(default)s)") 400 | parser.add_argument('--no_lm', action="store_true", 401 | help="only the palm detection model is run, not the hand landmark model") 402 | parser.add_argument("--lm_m", default="models/hand_landmark_FP32.xml", type=str, 403 | help="Path to an .xml file for landmark model (default=%(default)s)") 404 | parser.add_argument("--lm_device", default='CPU', type=str, 405 | help="Target device for the landmark regression model (default=%(default)s)") 406 | parser.add_argument('-c', '--crop', action="store_true", 407 | help="center crop frames to a square shape before feeding palm detection model") 408 | 409 | args = parser.parse_args() 410 | 411 | ht = HandTracker(input_src=args.input, 412 | pd_device=args.pd_device, 413 | use_lm= not args.no_lm, 414 | lm_device=args.lm_device, 415 | use_gesture=args.gesture, 416 | crop=args.crop) 417 | ht.run() 418 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hand tracking with OpenVINO 2 | 3 | Running Google Mediapipe Hand Tracking models on OpenVINO. 4 | 5 | There is a version for DepthAI there : [depthai_hand_tracker](https://github.com/geaxgx/depthai_hand_tracker) 6 | 7 | ![Demo](img/hand_tracker.gif) 8 | ## Install 9 | 10 | You just need to have OpenVINO installed on your computer and to clone/download this repository. 11 | 12 | Note that the models were generated using OpenVINO 2021.2. 13 | 14 | ## Run 15 | 16 | To use default webcam camera as input : 17 | 18 | ```python3 HandTracker.py``` 19 | 20 | To use a file (video or image) as input : 21 | 22 | ```python3 HandTracker.py -i filename``` 23 | 24 | To enable gesture recognition : 25 | 26 | ```python3 HandTracker.py -g``` 27 | 28 | ![Gesture recognition](img/gestures.gif) 29 | 30 | By default, the inferences are run on the CPU. For each model, you can choose the device where to run the model. For instance, if you want to run both models on a NCS2 : 31 | 32 | ```python3 HandTracker.py --pd_device MYRIAD --lm_device MYRIAD``` 33 | 34 | To run only the palm detection model (without hand landmarks), use *--no_lm* argument. Of course, gesture recognition is not possible in this mode. 35 | 36 | Use keypress between 1 and 7 to enable/disable the display of hand features (palm bounding box, palm landmarks, hand landmarks, handedness, gesture,...), spacebar to pause, Esc to exit. 37 | 38 | 39 | 40 | ## The models 41 | You can find the models *palm_detector.blob* and *hand_landmark.blob* under the 'models' directory, but below I describe how to get the files. 42 | 43 | 1) Clone this github repository in a local directory (DEST_DIR) 44 | 2) In DEST_DIR/models directory, download the source tflite models from Mediapipe: 45 | * [Palm Detection model](https://github.com/google/mediapipe/blob/master/mediapipe/modules/palm_detection/palm_detection.tflite) 46 | * [Hand Landmarks model](https://github.com/google/mediapipe/blob/master/mediapipe/modules/hand_landmark/hand_landmark.tflite) 47 | 3) Install the amazing [PINTO's tflite2tensorflow tool](https://github.com/PINTO0309/tflite2tensorflow). Use the docker installation which includes many packages including a recent version of Openvino. 48 | 3) From DEST_DIR, run the tflite2tensorflow container: ```./docker_tflite2tensorflow.sh``` 49 | 4) From the running container: 50 | ``` 51 | cd workdir/models 52 | ./convert_models.sh 53 | ``` 54 | The *convert_models.sh* converts the tflite models in tensorflow (.pb), then converts the pb file into Openvino IR format (.xml and .bin). By default, the precision used is FP32. To generate in FP16 precision, run ```./convert_models.sh FP16``` 55 | 56 | 57 | 58 | **Explanation about the Model Optimizer params :** 59 | The frames read by OpenCV are BGR [0, 255] frames. The original tflite palm detection model is expecting RGB [-1, 1] frames. ```--reverse_input_channels``` converts BGR to RGB. ```--mean_values [127.5,127.5,127.5] --scale_values [127.5,127.5,127.5]``` normalizes the frames between [-1, 1]. The original hand landmark model is expecting RGB [0, 1] frames. Therefore, the following arguments are used ```--reverse_input_channels --scale_values [255.0, 255.0, 255.0]``` 60 | 61 | **IR models vs tflite models** 62 | The palm detection OpenVINO IR does not exactly give the same results as the tflite version, because the tflite ResizeBilinear instruction is converted into IR Interpolate-1. Yet the difference is almost imperceptible thanks to the great help of PINTO (see [issue](https://github.com/PINTO0309/tflite2tensorflow/issues/4) ). 63 | 64 | 65 | -------------------------------------------------------------------------------- /docker_tflite2tensorflow.sh: -------------------------------------------------------------------------------- 1 | # Used to convert original Mediapipe tflite models to Openvino IR and MyriadX blob 2 | # https://github.com/PINTO0309/tflite2tensorflow 3 | # 4 | # First run: docker pull pinto0309/tflite2tensorflow 5 | docker run --gpus all -it --rm \ 6 | -v `pwd`:/home/user/workdir \ 7 | -v /tmp/.X11-unix/:/tmp/.X11-unix:rw \ 8 | --device /dev/video0:/dev/video0:mwr \ 9 | --net=host \ 10 | -e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \ 11 | -e DISPLAY=$DISPLAY \ 12 | --privileged \ 13 | pinto0309/tflite2tensorflow:latest bash 14 | -------------------------------------------------------------------------------- /img/gestures.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geaxgx/openvino_hand_tracker/a2a881a330ccf9d4d48534f51d6bf973f6e278b1/img/gestures.gif -------------------------------------------------------------------------------- /img/hand_tracker.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geaxgx/openvino_hand_tracker/a2a881a330ccf9d4d48534f51d6bf973f6e278b1/img/hand_tracker.gif -------------------------------------------------------------------------------- /mediapipe_utils.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | from collections import namedtuple 4 | from math import ceil, sqrt, exp, pi, floor, sin, cos, atan2 5 | 6 | 7 | class HandRegion: 8 | def __init__(self, pd_score, pd_box, pd_kps=0): 9 | self.pd_score = pd_score # Palm detection score 10 | self.pd_box = pd_box # Palm detection box [x, y, w, h] normalized 11 | self.pd_kps = pd_kps # Palm detection keypoints 12 | 13 | def print(self): 14 | attrs = vars(self) 15 | print('\n'.join("%s: %s" % item for item in attrs.items())) 16 | 17 | 18 | SSDAnchorOptions = namedtuple('SSDAnchorOptions',[ 19 | 'num_layers', 20 | 'min_scale', 21 | 'max_scale', 22 | 'input_size_height', 23 | 'input_size_width', 24 | 'anchor_offset_x', 25 | 'anchor_offset_y', 26 | 'strides', 27 | 'aspect_ratios', 28 | 'reduce_boxes_in_lowest_layer', 29 | 'interpolated_scale_aspect_ratio', 30 | 'fixed_anchor_size']) 31 | 32 | def calculate_scale(min_scale, max_scale, stride_index, num_strides): 33 | if num_strides == 1: 34 | return (min_scale + max_scale) / 2 35 | else: 36 | return min_scale + (max_scale - min_scale) * stride_index / (num_strides - 1) 37 | 38 | def generate_anchors(options): 39 | """ 40 | option : SSDAnchorOptions 41 | # https://github.com/google/mediapipe/blob/master/mediapipe/calculators/tflite/ssd_anchors_calculator.cc 42 | """ 43 | anchors = [] 44 | layer_id = 0 45 | n_strides = len(options.strides) 46 | while layer_id < n_strides: 47 | anchor_height = [] 48 | anchor_width = [] 49 | aspect_ratios = [] 50 | scales = [] 51 | # For same strides, we merge the anchors in the same order. 52 | last_same_stride_layer = layer_id 53 | while last_same_stride_layer < n_strides and \ 54 | options.strides[last_same_stride_layer] == options.strides[layer_id]: 55 | scale = calculate_scale(options.min_scale, options.max_scale, last_same_stride_layer, n_strides) 56 | if last_same_stride_layer == 0 and options.reduce_boxes_in_lowest_layer: 57 | # For first layer, it can be specified to use predefined anchors. 58 | aspect_ratios += [1.0, 2.0, 0.5] 59 | scales += [0.1, scale, scale] 60 | else: 61 | aspect_ratios += options.aspect_ratios 62 | scales += [scale] * len(options.aspect_ratios) 63 | if options.interpolated_scale_aspect_ratio > 0: 64 | if last_same_stride_layer == n_strides -1: 65 | scale_next = 1.0 66 | else: 67 | scale_next = calculate_scale(options.min_scale, options.max_scale, last_same_stride_layer+1, n_strides) 68 | scales.append(sqrt(scale * scale_next)) 69 | aspect_ratios.append(options.interpolated_scale_aspect_ratio) 70 | last_same_stride_layer += 1 71 | 72 | for i,r in enumerate(aspect_ratios): 73 | ratio_sqrts = sqrt(r) 74 | anchor_height.append(scales[i] / ratio_sqrts) 75 | anchor_width.append(scales[i] * ratio_sqrts) 76 | 77 | stride = options.strides[layer_id] 78 | feature_map_height = ceil(options.input_size_height / stride) 79 | feature_map_width = ceil(options.input_size_width / stride) 80 | 81 | for y in range(feature_map_height): 82 | for x in range(feature_map_width): 83 | for anchor_id in range(len(anchor_height)): 84 | x_center = (x + options.anchor_offset_x) / feature_map_width 85 | y_center = (y + options.anchor_offset_y) / feature_map_height 86 | # new_anchor = Anchor(x_center=x_center, y_center=y_center) 87 | if options.fixed_anchor_size: 88 | new_anchor = [x_center, y_center, 1.0, 1.0] 89 | # new_anchor.w = 1.0 90 | # new_anchor.h = 1.0 91 | else: 92 | new_anchor = [x_center, y_center, anchor_width[anchor_id], anchor_height[anchor_id]] 93 | # new_anchor.w = anchor_width[anchor_id] 94 | # new_anchor.h = anchor_height[anchor_id] 95 | anchors.append(new_anchor) 96 | 97 | layer_id = last_same_stride_layer 98 | return np.array(anchors) 99 | 100 | 101 | def decode_bboxes(score_thresh, scores, bboxes, anchors): 102 | """ 103 | wi, hi : NN input shape 104 | mediapipe/calculators/tflite/tflite_tensors_to_detections_calculator.cc 105 | # Decodes the detection tensors generated by the model, based on 106 | # the SSD anchors and the specification in the options, into a vector of 107 | # detections. Each detection describes a detected object. 108 | 109 | https://github.com/google/mediapipe/blob/master/mediapipe/modules/palm_detection/palm_detection_cpu.pbtxt : 110 | node { 111 | calculator: "TensorsToDetectionsCalculator" 112 | input_stream: "TENSORS:detection_tensors" 113 | input_side_packet: "ANCHORS:anchors" 114 | output_stream: "DETECTIONS:unfiltered_detections" 115 | options: { 116 | [mediapipe.TensorsToDetectionsCalculatorOptions.ext] { 117 | num_classes: 1 118 | num_boxes: 896 119 | num_coords: 18 120 | box_coord_offset: 0 121 | keypoint_coord_offset: 4 122 | num_keypoints: 7 123 | num_values_per_keypoint: 2 124 | sigmoid_score: true 125 | score_clipping_thresh: 100.0 126 | reverse_output_order: true 127 | 128 | x_scale: 128.0 129 | y_scale: 128.0 130 | h_scale: 128.0 131 | w_scale: 128.0 132 | min_score_thresh: 0.5 133 | } 134 | } 135 | } 136 | 137 | scores: shape = [number of anchors 896] 138 | bboxes: shape = [ number of anchors x 18], 18 = 4 (bounding box : (cx,cy,w,h) + 14 (7 palm keypoints) 139 | """ 140 | regions = [] 141 | scores = 1 / (1 + np.exp(-scores)) 142 | detection_mask = scores > score_thresh 143 | det_scores = scores[detection_mask] 144 | if det_scores.size == 0: return regions 145 | det_bboxes = bboxes[detection_mask] 146 | det_anchors = anchors[detection_mask] 147 | scale = 128 # x_scale, y_scale, w_scale, h_scale 148 | 149 | # cx, cy, w, h = bboxes[i,:4] 150 | # cx = cx * anchor.w / wi + anchor.x_center 151 | # cy = cy * anchor.h / hi + anchor.y_center 152 | # lx = lx * anchor.w / wi + anchor.x_center 153 | # ly = ly * anchor.h / hi + anchor.y_center 154 | det_bboxes = det_bboxes* np.tile(det_anchors[:,2:4], 9) / scale + np.tile(det_anchors[:,0:2],9) 155 | # w = w * anchor.w / wi (in the prvious line, we add anchor.x_center and anchor.y_center to w and h, we need to substract them now) 156 | # h = h * anchor.h / hi 157 | det_bboxes[:,2:4] = det_bboxes[:,2:4] - det_anchors[:,0:2] 158 | # box = [cx - w*0.5, cy - h*0.5, w, h] 159 | det_bboxes[:,0:2] = det_bboxes[:,0:2] - det_bboxes[:,3:4] * 0.5 160 | 161 | for i in range(det_bboxes.shape[0]): 162 | score = det_scores[i] 163 | box = det_bboxes[i,0:4] 164 | kps = [] 165 | # 0 : wrist 166 | # 1 : index finger joint 167 | # 2 : middle finger joint 168 | # 3 : ring finger joint 169 | # 4 : little finger joint 170 | # 5 : 171 | # 6 : thumb joint 172 | # for j, name in enumerate(["0", "1", "2", "3", "4", "5", "6"]): 173 | # kps[name] = det_bboxes[i,4+j*2:6+j*2] 174 | for kp in range(7): 175 | kps.append(det_bboxes[i,4+kp*2:6+kp*2]) 176 | regions.append(HandRegion(float(score), box, kps)) 177 | return regions 178 | 179 | def non_max_suppression(regions, nms_thresh): 180 | 181 | # cv2.dnn.NMSBoxes(boxes, scores, 0, nms_thresh) needs: 182 | # boxes = [ [x, y, w, h], ...] with x, y, w, h of type int 183 | # Currently, x, y, w, h are float between 0 and 1, so we arbitrarily multiply by 1000 and cast to int 184 | # boxes = [r.box for r in regions] 185 | boxes = [ [int(x*1000) for x in r.pd_box] for r in regions] 186 | scores = [r.pd_score for r in regions] 187 | indices = cv2.dnn.NMSBoxes(boxes, scores, 0, nms_thresh) 188 | return [regions[i] for i in indices] 189 | 190 | def normalize_radians(angle): 191 | return angle - 2 * pi * floor((angle + pi) / (2 * pi)) 192 | 193 | def rot_vec(vec, rotation): 194 | vx, vy = vec 195 | return [vx * cos(rotation) - vy * sin(rotation), vx * sin(rotation) + vy * cos(rotation)] 196 | 197 | def detections_to_rect(regions): 198 | # https://github.com/google/mediapipe/blob/master/mediapipe/modules/hand_landmark/palm_detection_detection_to_roi.pbtxt 199 | # # Converts results of palm detection into a rectangle (normalized by image size) 200 | # # that encloses the palm and is rotated such that the line connecting center of 201 | # # the wrist and MCP of the middle finger is aligned with the Y-axis of the 202 | # # rectangle. 203 | # node { 204 | # calculator: "DetectionsToRectsCalculator" 205 | # input_stream: "DETECTION:detection" 206 | # input_stream: "IMAGE_SIZE:image_size" 207 | # output_stream: "NORM_RECT:raw_roi" 208 | # options: { 209 | # [mediapipe.DetectionsToRectsCalculatorOptions.ext] { 210 | # rotation_vector_start_keypoint_index: 0 # Center of wrist. 211 | # rotation_vector_end_keypoint_index: 2 # MCP of middle finger. 212 | # rotation_vector_target_angle_degrees: 90 213 | # } 214 | # } 215 | 216 | target_angle = pi * 0.5 # 90 = pi/2 217 | for region in regions: 218 | 219 | region.rect_w = region.pd_box[2] 220 | region.rect_h = region.pd_box[3] 221 | region.rect_x_center = region.pd_box[0] + region.rect_w / 2 222 | region.rect_y_center = region.pd_box[1] + region.rect_h / 2 223 | 224 | x0, y0 = region.pd_kps[0] # wrist center 225 | x1, y1 = region.pd_kps[2] # middle finger 226 | rotation = target_angle - atan2(-(y1 - y0), x1 - x0) 227 | region.rotation = normalize_radians(rotation) 228 | 229 | def rotated_rect_to_points(cx, cy, w, h, rotation, wi, hi): 230 | b = cos(rotation) * 0.5 231 | a = sin(rotation) * 0.5 232 | points = [] 233 | p0x = cx - a*h - b*w 234 | p0y = cy + b*h - a*w 235 | p1x = cx + a*h - b*w 236 | p1y = cy - b*h - a*w 237 | p2x = int(2*cx - p0x) 238 | p2y = int(2*cy - p0y) 239 | p3x = int(2*cx - p1x) 240 | p3y = int(2*cy - p1y) 241 | p0x, p0y, p1x, p1y = int(p0x), int(p0y), int(p1x), int(p1y) 242 | return [(p0x,p0y), (p1x,p1y), (p2x,p2y), (p3x,p3y)] 243 | 244 | def rect_transformation(regions, w, h): 245 | """ 246 | w, h : image input shape 247 | """ 248 | # https://github.com/google/mediapipe/blob/master/mediapipe/modules/hand_landmark/palm_detection_detection_to_roi.pbtxt 249 | # # Expands and shifts the rectangle that contains the palm so that it's likely 250 | # # to cover the entire hand. 251 | # node { 252 | # calculator: "RectTransformationCalculator" 253 | # input_stream: "NORM_RECT:raw_roi" 254 | # input_stream: "IMAGE_SIZE:image_size" 255 | # output_stream: "roi" 256 | # options: { 257 | # [mediapipe.RectTransformationCalculatorOptions.ext] { 258 | # scale_x: 2.6 259 | # scale_y: 2.6 260 | # shift_y: -0.5 261 | # square_long: true 262 | # } 263 | # } 264 | scale_x = 2.6 265 | scale_y = 2.6 266 | shift_x = 0 267 | shift_y = -0.5 268 | for region in regions: 269 | width = region.rect_w 270 | height = region.rect_h 271 | rotation = region.rotation 272 | if rotation == 0: 273 | region.rect_x_center_a = (region.rect_x_center + width * shift_x) * w 274 | region.rect_y_center_a = (region.rect_y_center + height * shift_y) * h 275 | else: 276 | x_shift = (w * width * shift_x * cos(rotation) - h * height * shift_y * sin(rotation)) #/ w 277 | y_shift = (w * width * shift_x * sin(rotation) + h * height * shift_y * cos(rotation)) #/ h 278 | region.rect_x_center_a = region.rect_x_center*w + x_shift 279 | region.rect_y_center_a = region.rect_y_center*h + y_shift 280 | 281 | # square_long: true 282 | long_side = max(width * w, height * h) 283 | region.rect_w_a = long_side * scale_x 284 | region.rect_h_a = long_side * scale_y 285 | region.rect_points = rotated_rect_to_points(region.rect_x_center_a, region.rect_y_center_a, region.rect_w_a, region.rect_h_a, region.rotation, w, h) 286 | 287 | def warp_rect_img(rect_points, img, w, h): 288 | src = np.array(rect_points[1:], dtype=np.float32) # rect_points[0] is left bottom point ! 289 | dst = np.array([(0, 0), (h, 0), (h, w)], dtype=np.float32) 290 | mat = cv2.getAffineTransform(src, dst) 291 | return cv2.warpAffine(img, mat, (w, h)) 292 | 293 | def distance(a, b): 294 | """ 295 | a, b: 2 points in 3D (x,y,z) 296 | """ 297 | return np.linalg.norm(a-b) 298 | 299 | def angle(a, b, c): 300 | # https://stackoverflow.com/questions/35176451/python-code-to-calculate-angle-between-three-point-using-their-3d-coordinates 301 | # a, b and c : points as np.array([x, y, z]) 302 | ba = a - b 303 | bc = c - b 304 | cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc)) 305 | angle = np.arccos(cosine_angle) 306 | 307 | return np.degrees(angle) -------------------------------------------------------------------------------- /models/convert_models.sh: -------------------------------------------------------------------------------- 1 | # This script has to be run from the docker container started by ./docker_tflite2tensorflow.sh 2 | 3 | FP=${1:-FP32} 4 | 5 | source /opt/intel/openvino_2021/bin/setupvars.sh 6 | 7 | # Palm detection model 8 | tflite2tensorflow \ 9 | --model_path palm_detection.tflite \ 10 | --model_output_path palm_detection \ 11 | --flatc_path ../../flatc \ 12 | --schema_path ../../schema.fbs \ 13 | --output_pb \ 14 | --optimizing_for_openvino_and_myriad 15 | # Generate Openvino "non normalized input" models: the normalization has to be mode explictly in the code 16 | #tflite2tensorflow \ 17 | # --model_path palm_detection.tflite \ 18 | # --model_output_path palm_detection \ 19 | # --flatc_path ../../flatc \ 20 | # --schema_path ../../schema.fbs \ 21 | # --output_openvino_and_myriad 22 | # Generate Openvino "normalized input" models 23 | /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.py --input_model palm_detection/model_float32.pb --model_name palm_detection_${FP} --data_type ${FP} --mean_values "[127.5, 127.5, 127.5]" --scale_values "[127.5, 127.5, 127.5]" --reverse_input_channels 24 | 25 | # Hand landmark model 26 | tflite2tensorflow \ 27 | --model_path hand_landmark.tflite \ 28 | --model_output_path hand_landmark \ 29 | --flatc_path ../../flatc \ 30 | --schema_path ../../schema.fbs \ 31 | --output_pb 32 | # Generate Openvino "non normalized input" models: the normalization has to be mode explictly in the code 33 | # tflite2tensorflow \ 34 | # --model_path hand_landmark.tflite \ 35 | # --model_output_path hand_landmark \ 36 | # --flatc_path ../../flatc \ 37 | # --schema_path ../../schema.fbs \ 38 | # --output_openvino_and_myriad 39 | # Generate Openvino "normalized input" models 40 | /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.py --input_model hand_landmark/model_float32.pb --model_name hand_landmark_${FP} --data_type ${FP} --scale_values "[255.0, 255.0, 255.0]" --reverse_input_channels 41 | -------------------------------------------------------------------------------- /models/hand_landmark_FP32.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geaxgx/openvino_hand_tracker/a2a881a330ccf9d4d48534f51d6bf973f6e278b1/models/hand_landmark_FP32.bin -------------------------------------------------------------------------------- /models/hand_landmark_FP32.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 9 | 3 10 | 224 11 | 224 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 24 20 | 3 21 | 3 22 | 3 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 31 | 3 32 | 224 33 | 224 34 | 35 | 36 | 24 37 | 3 38 | 3 39 | 3 40 | 41 | 42 | 43 | 44 | 1 45 | 24 46 | 112 47 | 112 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 1 56 | 24 57 | 1 58 | 1 59 | 60 | 61 | 62 | 63 | 64 | 65 | 1 66 | 24 67 | 112 68 | 112 69 | 70 | 71 | 1 72 | 24 73 | 1 74 | 1 75 | 76 | 77 | 78 | 79 | 1 80 | 24 81 | 112 82 | 112 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 1 91 | 24 92 | 112 93 | 112 94 | 95 | 96 | 97 | 98 | 1 99 | 24 100 | 112 101 | 112 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 24 110 | 1 111 | 1 112 | 3 113 | 3 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 1 122 | 24 123 | 112 124 | 112 125 | 126 | 127 | 24 128 | 1 129 | 1 130 | 3 131 | 3 132 | 133 | 134 | 135 | 136 | 1 137 | 24 138 | 112 139 | 112 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 1 148 | 24 149 | 1 150 | 1 151 | 152 | 153 | 154 | 155 | 156 | 157 | 1 158 | 24 159 | 112 160 | 112 161 | 162 | 163 | 1 164 | 24 165 | 1 166 | 1 167 | 168 | 169 | 170 | 171 | 1 172 | 24 173 | 112 174 | 112 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 1 183 | 24 184 | 112 185 | 112 186 | 187 | 188 | 189 | 190 | 1 191 | 24 192 | 112 193 | 112 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 8 202 | 24 203 | 1 204 | 1 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 1 213 | 24 214 | 112 215 | 112 216 | 217 | 218 | 8 219 | 24 220 | 1 221 | 1 222 | 223 | 224 | 225 | 226 | 1 227 | 8 228 | 112 229 | 112 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 1 238 | 8 239 | 1 240 | 1 241 | 242 | 243 | 244 | 245 | 246 | 247 | 1 248 | 8 249 | 112 250 | 112 251 | 252 | 253 | 1 254 | 8 255 | 1 256 | 1 257 | 258 | 259 | 260 | 261 | 1 262 | 8 263 | 112 264 | 112 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 32 273 | 8 274 | 1 275 | 1 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 1 284 | 8 285 | 112 286 | 112 287 | 288 | 289 | 32 290 | 8 291 | 1 292 | 1 293 | 294 | 295 | 296 | 297 | 1 298 | 32 299 | 112 300 | 112 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 1 309 | 32 310 | 1 311 | 1 312 | 313 | 314 | 315 | 316 | 317 | 318 | 1 319 | 32 320 | 112 321 | 112 322 | 323 | 324 | 1 325 | 32 326 | 1 327 | 1 328 | 329 | 330 | 331 | 332 | 1 333 | 32 334 | 112 335 | 112 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 1 344 | 32 345 | 112 346 | 112 347 | 348 | 349 | 350 | 351 | 1 352 | 32 353 | 112 354 | 112 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 32 363 | 1 364 | 1 365 | 3 366 | 3 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 1 375 | 32 376 | 112 377 | 112 378 | 379 | 380 | 32 381 | 1 382 | 1 383 | 3 384 | 3 385 | 386 | 387 | 388 | 389 | 1 390 | 32 391 | 56 392 | 56 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 1 401 | 32 402 | 1 403 | 1 404 | 405 | 406 | 407 | 408 | 409 | 410 | 1 411 | 32 412 | 56 413 | 56 414 | 415 | 416 | 1 417 | 32 418 | 1 419 | 1 420 | 421 | 422 | 423 | 424 | 1 425 | 32 426 | 56 427 | 56 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 1 436 | 32 437 | 56 438 | 56 439 | 440 | 441 | 442 | 443 | 1 444 | 32 445 | 56 446 | 56 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 16 455 | 32 456 | 1 457 | 1 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 1 466 | 32 467 | 56 468 | 56 469 | 470 | 471 | 16 472 | 32 473 | 1 474 | 1 475 | 476 | 477 | 478 | 479 | 1 480 | 16 481 | 56 482 | 56 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 1 491 | 16 492 | 1 493 | 1 494 | 495 | 496 | 497 | 498 | 499 | 500 | 1 501 | 16 502 | 56 503 | 56 504 | 505 | 506 | 1 507 | 16 508 | 1 509 | 1 510 | 511 | 512 | 513 | 514 | 1 515 | 16 516 | 56 517 | 56 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 96 526 | 16 527 | 1 528 | 1 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 1 537 | 16 538 | 56 539 | 56 540 | 541 | 542 | 96 543 | 16 544 | 1 545 | 1 546 | 547 | 548 | 549 | 550 | 1 551 | 96 552 | 56 553 | 56 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 1 562 | 96 563 | 1 564 | 1 565 | 566 | 567 | 568 | 569 | 570 | 571 | 1 572 | 96 573 | 56 574 | 56 575 | 576 | 577 | 1 578 | 96 579 | 1 580 | 1 581 | 582 | 583 | 584 | 585 | 1 586 | 96 587 | 56 588 | 56 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 1 597 | 96 598 | 56 599 | 56 600 | 601 | 602 | 603 | 604 | 1 605 | 96 606 | 56 607 | 56 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 96 616 | 1 617 | 1 618 | 3 619 | 3 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 1 628 | 96 629 | 56 630 | 56 631 | 632 | 633 | 96 634 | 1 635 | 1 636 | 3 637 | 3 638 | 639 | 640 | 641 | 642 | 1 643 | 96 644 | 56 645 | 56 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 1 654 | 96 655 | 1 656 | 1 657 | 658 | 659 | 660 | 661 | 662 | 663 | 1 664 | 96 665 | 56 666 | 56 667 | 668 | 669 | 1 670 | 96 671 | 1 672 | 1 673 | 674 | 675 | 676 | 677 | 1 678 | 96 679 | 56 680 | 56 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 1 689 | 96 690 | 56 691 | 56 692 | 693 | 694 | 695 | 696 | 1 697 | 96 698 | 56 699 | 56 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 16 708 | 96 709 | 1 710 | 1 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 1 719 | 96 720 | 56 721 | 56 722 | 723 | 724 | 16 725 | 96 726 | 1 727 | 1 728 | 729 | 730 | 731 | 732 | 1 733 | 16 734 | 56 735 | 56 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 1 744 | 16 745 | 1 746 | 1 747 | 748 | 749 | 750 | 751 | 752 | 753 | 1 754 | 16 755 | 56 756 | 56 757 | 758 | 759 | 1 760 | 16 761 | 1 762 | 1 763 | 764 | 765 | 766 | 767 | 1 768 | 16 769 | 56 770 | 56 771 | 772 | 773 | 774 | 775 | 776 | 777 | 1 778 | 16 779 | 56 780 | 56 781 | 782 | 783 | 1 784 | 16 785 | 56 786 | 56 787 | 788 | 789 | 790 | 791 | 1 792 | 16 793 | 56 794 | 56 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 96 803 | 16 804 | 1 805 | 1 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 1 814 | 16 815 | 56 816 | 56 817 | 818 | 819 | 96 820 | 16 821 | 1 822 | 1 823 | 824 | 825 | 826 | 827 | 1 828 | 96 829 | 56 830 | 56 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 1 839 | 96 840 | 1 841 | 1 842 | 843 | 844 | 845 | 846 | 847 | 848 | 1 849 | 96 850 | 56 851 | 56 852 | 853 | 854 | 1 855 | 96 856 | 1 857 | 1 858 | 859 | 860 | 861 | 862 | 1 863 | 96 864 | 56 865 | 56 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 1 874 | 96 875 | 56 876 | 56 877 | 878 | 879 | 880 | 881 | 1 882 | 96 883 | 56 884 | 56 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 96 893 | 1 894 | 1 895 | 5 896 | 5 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 1 905 | 96 906 | 56 907 | 56 908 | 909 | 910 | 96 911 | 1 912 | 1 913 | 5 914 | 5 915 | 916 | 917 | 918 | 919 | 1 920 | 96 921 | 28 922 | 28 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 1 931 | 96 932 | 1 933 | 1 934 | 935 | 936 | 937 | 938 | 939 | 940 | 1 941 | 96 942 | 28 943 | 28 944 | 945 | 946 | 1 947 | 96 948 | 1 949 | 1 950 | 951 | 952 | 953 | 954 | 1 955 | 96 956 | 28 957 | 28 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 1 966 | 96 967 | 28 968 | 28 969 | 970 | 971 | 972 | 973 | 1 974 | 96 975 | 28 976 | 28 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 24 985 | 96 986 | 1 987 | 1 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 1 996 | 96 997 | 28 998 | 28 999 | 1000 | 1001 | 24 1002 | 96 1003 | 1 1004 | 1 1005 | 1006 | 1007 | 1008 | 1009 | 1 1010 | 24 1011 | 28 1012 | 28 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1 1021 | 24 1022 | 1 1023 | 1 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1 1031 | 24 1032 | 28 1033 | 28 1034 | 1035 | 1036 | 1 1037 | 24 1038 | 1 1039 | 1 1040 | 1041 | 1042 | 1043 | 1044 | 1 1045 | 24 1046 | 28 1047 | 28 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | 1055 | 144 1056 | 24 1057 | 1 1058 | 1 1059 | 1060 | 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | 1 1067 | 24 1068 | 28 1069 | 28 1070 | 1071 | 1072 | 144 1073 | 24 1074 | 1 1075 | 1 1076 | 1077 | 1078 | 1079 | 1080 | 1 1081 | 144 1082 | 28 1083 | 28 1084 | 1085 | 1086 | 1087 | 1088 | 1089 | 1090 | 1091 | 1 1092 | 144 1093 | 1 1094 | 1 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1 1102 | 144 1103 | 28 1104 | 28 1105 | 1106 | 1107 | 1 1108 | 144 1109 | 1 1110 | 1 1111 | 1112 | 1113 | 1114 | 1115 | 1 1116 | 144 1117 | 28 1118 | 28 1119 | 1120 | 1121 | 1122 | 1123 | 1124 | 1125 | 1126 | 1 1127 | 144 1128 | 28 1129 | 28 1130 | 1131 | 1132 | 1133 | 1134 | 1 1135 | 144 1136 | 28 1137 | 28 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 144 1146 | 1 1147 | 1 1148 | 5 1149 | 5 1150 | 1151 | 1152 | 1153 | 1154 | 1155 | 1156 | 1157 | 1 1158 | 144 1159 | 28 1160 | 28 1161 | 1162 | 1163 | 144 1164 | 1 1165 | 1 1166 | 5 1167 | 5 1168 | 1169 | 1170 | 1171 | 1172 | 1 1173 | 144 1174 | 28 1175 | 28 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 1182 | 1183 | 1 1184 | 144 1185 | 1 1186 | 1 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | 1193 | 1 1194 | 144 1195 | 28 1196 | 28 1197 | 1198 | 1199 | 1 1200 | 144 1201 | 1 1202 | 1 1203 | 1204 | 1205 | 1206 | 1207 | 1 1208 | 144 1209 | 28 1210 | 28 1211 | 1212 | 1213 | 1214 | 1215 | 1216 | 1217 | 1218 | 1 1219 | 144 1220 | 28 1221 | 28 1222 | 1223 | 1224 | 1225 | 1226 | 1 1227 | 144 1228 | 28 1229 | 28 1230 | 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | 1237 | 24 1238 | 144 1239 | 1 1240 | 1 1241 | 1242 | 1243 | 1244 | 1245 | 1246 | 1247 | 1248 | 1 1249 | 144 1250 | 28 1251 | 28 1252 | 1253 | 1254 | 24 1255 | 144 1256 | 1 1257 | 1 1258 | 1259 | 1260 | 1261 | 1262 | 1 1263 | 24 1264 | 28 1265 | 28 1266 | 1267 | 1268 | 1269 | 1270 | 1271 | 1272 | 1273 | 1 1274 | 24 1275 | 1 1276 | 1 1277 | 1278 | 1279 | 1280 | 1281 | 1282 | 1283 | 1 1284 | 24 1285 | 28 1286 | 28 1287 | 1288 | 1289 | 1 1290 | 24 1291 | 1 1292 | 1 1293 | 1294 | 1295 | 1296 | 1297 | 1 1298 | 24 1299 | 28 1300 | 28 1301 | 1302 | 1303 | 1304 | 1305 | 1306 | 1307 | 1 1308 | 24 1309 | 28 1310 | 28 1311 | 1312 | 1313 | 1 1314 | 24 1315 | 28 1316 | 28 1317 | 1318 | 1319 | 1320 | 1321 | 1 1322 | 24 1323 | 28 1324 | 28 1325 | 1326 | 1327 | 1328 | 1329 | 1330 | 1331 | 1332 | 144 1333 | 24 1334 | 1 1335 | 1 1336 | 1337 | 1338 | 1339 | 1340 | 1341 | 1342 | 1343 | 1 1344 | 24 1345 | 28 1346 | 28 1347 | 1348 | 1349 | 144 1350 | 24 1351 | 1 1352 | 1 1353 | 1354 | 1355 | 1356 | 1357 | 1 1358 | 144 1359 | 28 1360 | 28 1361 | 1362 | 1363 | 1364 | 1365 | 1366 | 1367 | 1368 | 1 1369 | 144 1370 | 1 1371 | 1 1372 | 1373 | 1374 | 1375 | 1376 | 1377 | 1378 | 1 1379 | 144 1380 | 28 1381 | 28 1382 | 1383 | 1384 | 1 1385 | 144 1386 | 1 1387 | 1 1388 | 1389 | 1390 | 1391 | 1392 | 1 1393 | 144 1394 | 28 1395 | 28 1396 | 1397 | 1398 | 1399 | 1400 | 1401 | 1402 | 1403 | 1 1404 | 144 1405 | 28 1406 | 28 1407 | 1408 | 1409 | 1410 | 1411 | 1 1412 | 144 1413 | 28 1414 | 28 1415 | 1416 | 1417 | 1418 | 1419 | 1420 | 1421 | 1422 | 144 1423 | 1 1424 | 1 1425 | 3 1426 | 3 1427 | 1428 | 1429 | 1430 | 1431 | 1432 | 1433 | 1434 | 1 1435 | 144 1436 | 28 1437 | 28 1438 | 1439 | 1440 | 144 1441 | 1 1442 | 1 1443 | 3 1444 | 3 1445 | 1446 | 1447 | 1448 | 1449 | 1 1450 | 144 1451 | 14 1452 | 14 1453 | 1454 | 1455 | 1456 | 1457 | 1458 | 1459 | 1460 | 1 1461 | 144 1462 | 1 1463 | 1 1464 | 1465 | 1466 | 1467 | 1468 | 1469 | 1470 | 1 1471 | 144 1472 | 14 1473 | 14 1474 | 1475 | 1476 | 1 1477 | 144 1478 | 1 1479 | 1 1480 | 1481 | 1482 | 1483 | 1484 | 1 1485 | 144 1486 | 14 1487 | 14 1488 | 1489 | 1490 | 1491 | 1492 | 1493 | 1494 | 1495 | 1 1496 | 144 1497 | 14 1498 | 14 1499 | 1500 | 1501 | 1502 | 1503 | 1 1504 | 144 1505 | 14 1506 | 14 1507 | 1508 | 1509 | 1510 | 1511 | 1512 | 1513 | 1514 | 40 1515 | 144 1516 | 1 1517 | 1 1518 | 1519 | 1520 | 1521 | 1522 | 1523 | 1524 | 1525 | 1 1526 | 144 1527 | 14 1528 | 14 1529 | 1530 | 1531 | 40 1532 | 144 1533 | 1 1534 | 1 1535 | 1536 | 1537 | 1538 | 1539 | 1 1540 | 40 1541 | 14 1542 | 14 1543 | 1544 | 1545 | 1546 | 1547 | 1548 | 1549 | 1550 | 1 1551 | 40 1552 | 1 1553 | 1 1554 | 1555 | 1556 | 1557 | 1558 | 1559 | 1560 | 1 1561 | 40 1562 | 14 1563 | 14 1564 | 1565 | 1566 | 1 1567 | 40 1568 | 1 1569 | 1 1570 | 1571 | 1572 | 1573 | 1574 | 1 1575 | 40 1576 | 14 1577 | 14 1578 | 1579 | 1580 | 1581 | 1582 | 1583 | 1584 | 1585 | 240 1586 | 40 1587 | 1 1588 | 1 1589 | 1590 | 1591 | 1592 | 1593 | 1594 | 1595 | 1596 | 1 1597 | 40 1598 | 14 1599 | 14 1600 | 1601 | 1602 | 240 1603 | 40 1604 | 1 1605 | 1 1606 | 1607 | 1608 | 1609 | 1610 | 1 1611 | 240 1612 | 14 1613 | 14 1614 | 1615 | 1616 | 1617 | 1618 | 1619 | 1620 | 1621 | 1 1622 | 240 1623 | 1 1624 | 1 1625 | 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1 1632 | 240 1633 | 14 1634 | 14 1635 | 1636 | 1637 | 1 1638 | 240 1639 | 1 1640 | 1 1641 | 1642 | 1643 | 1644 | 1645 | 1 1646 | 240 1647 | 14 1648 | 14 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 | 1656 | 1 1657 | 240 1658 | 14 1659 | 14 1660 | 1661 | 1662 | 1663 | 1664 | 1 1665 | 240 1666 | 14 1667 | 14 1668 | 1669 | 1670 | 1671 | 1672 | 1673 | 1674 | 1675 | 240 1676 | 1 1677 | 1 1678 | 3 1679 | 3 1680 | 1681 | 1682 | 1683 | 1684 | 1685 | 1686 | 1687 | 1 1688 | 240 1689 | 14 1690 | 14 1691 | 1692 | 1693 | 240 1694 | 1 1695 | 1 1696 | 3 1697 | 3 1698 | 1699 | 1700 | 1701 | 1702 | 1 1703 | 240 1704 | 14 1705 | 14 1706 | 1707 | 1708 | 1709 | 1710 | 1711 | 1712 | 1713 | 1 1714 | 240 1715 | 1 1716 | 1 1717 | 1718 | 1719 | 1720 | 1721 | 1722 | 1723 | 1 1724 | 240 1725 | 14 1726 | 14 1727 | 1728 | 1729 | 1 1730 | 240 1731 | 1 1732 | 1 1733 | 1734 | 1735 | 1736 | 1737 | 1 1738 | 240 1739 | 14 1740 | 14 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 1748 | 1 1749 | 240 1750 | 14 1751 | 14 1752 | 1753 | 1754 | 1755 | 1756 | 1 1757 | 240 1758 | 14 1759 | 14 1760 | 1761 | 1762 | 1763 | 1764 | 1765 | 1766 | 1767 | 40 1768 | 240 1769 | 1 1770 | 1 1771 | 1772 | 1773 | 1774 | 1775 | 1776 | 1777 | 1778 | 1 1779 | 240 1780 | 14 1781 | 14 1782 | 1783 | 1784 | 40 1785 | 240 1786 | 1 1787 | 1 1788 | 1789 | 1790 | 1791 | 1792 | 1 1793 | 40 1794 | 14 1795 | 14 1796 | 1797 | 1798 | 1799 | 1800 | 1801 | 1802 | 1803 | 1 1804 | 40 1805 | 1 1806 | 1 1807 | 1808 | 1809 | 1810 | 1811 | 1812 | 1813 | 1 1814 | 40 1815 | 14 1816 | 14 1817 | 1818 | 1819 | 1 1820 | 40 1821 | 1 1822 | 1 1823 | 1824 | 1825 | 1826 | 1827 | 1 1828 | 40 1829 | 14 1830 | 14 1831 | 1832 | 1833 | 1834 | 1835 | 1836 | 1837 | 1 1838 | 40 1839 | 14 1840 | 14 1841 | 1842 | 1843 | 1 1844 | 40 1845 | 14 1846 | 14 1847 | 1848 | 1849 | 1850 | 1851 | 1 1852 | 40 1853 | 14 1854 | 14 1855 | 1856 | 1857 | 1858 | 1859 | 1860 | 1861 | 1862 | 240 1863 | 40 1864 | 1 1865 | 1 1866 | 1867 | 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1 1874 | 40 1875 | 14 1876 | 14 1877 | 1878 | 1879 | 240 1880 | 40 1881 | 1 1882 | 1 1883 | 1884 | 1885 | 1886 | 1887 | 1 1888 | 240 1889 | 14 1890 | 14 1891 | 1892 | 1893 | 1894 | 1895 | 1896 | 1897 | 1898 | 1 1899 | 240 1900 | 1 1901 | 1 1902 | 1903 | 1904 | 1905 | 1906 | 1907 | 1908 | 1 1909 | 240 1910 | 14 1911 | 14 1912 | 1913 | 1914 | 1 1915 | 240 1916 | 1 1917 | 1 1918 | 1919 | 1920 | 1921 | 1922 | 1 1923 | 240 1924 | 14 1925 | 14 1926 | 1927 | 1928 | 1929 | 1930 | 1931 | 1932 | 1933 | 1 1934 | 240 1935 | 14 1936 | 14 1937 | 1938 | 1939 | 1940 | 1941 | 1 1942 | 240 1943 | 14 1944 | 14 1945 | 1946 | 1947 | 1948 | 1949 | 1950 | 1951 | 1952 | 240 1953 | 1 1954 | 1 1955 | 3 1956 | 3 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 | 1964 | 1 1965 | 240 1966 | 14 1967 | 14 1968 | 1969 | 1970 | 240 1971 | 1 1972 | 1 1973 | 3 1974 | 3 1975 | 1976 | 1977 | 1978 | 1979 | 1 1980 | 240 1981 | 14 1982 | 14 1983 | 1984 | 1985 | 1986 | 1987 | 1988 | 1989 | 1990 | 1 1991 | 240 1992 | 1 1993 | 1 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 1 2001 | 240 2002 | 14 2003 | 14 2004 | 2005 | 2006 | 1 2007 | 240 2008 | 1 2009 | 1 2010 | 2011 | 2012 | 2013 | 2014 | 1 2015 | 240 2016 | 14 2017 | 14 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 1 2026 | 240 2027 | 14 2028 | 14 2029 | 2030 | 2031 | 2032 | 2033 | 1 2034 | 240 2035 | 14 2036 | 14 2037 | 2038 | 2039 | 2040 | 2041 | 2042 | 2043 | 2044 | 40 2045 | 240 2046 | 1 2047 | 1 2048 | 2049 | 2050 | 2051 | 2052 | 2053 | 2054 | 2055 | 1 2056 | 240 2057 | 14 2058 | 14 2059 | 2060 | 2061 | 40 2062 | 240 2063 | 1 2064 | 1 2065 | 2066 | 2067 | 2068 | 2069 | 1 2070 | 40 2071 | 14 2072 | 14 2073 | 2074 | 2075 | 2076 | 2077 | 2078 | 2079 | 2080 | 1 2081 | 40 2082 | 1 2083 | 1 2084 | 2085 | 2086 | 2087 | 2088 | 2089 | 2090 | 1 2091 | 40 2092 | 14 2093 | 14 2094 | 2095 | 2096 | 1 2097 | 40 2098 | 1 2099 | 1 2100 | 2101 | 2102 | 2103 | 2104 | 1 2105 | 40 2106 | 14 2107 | 14 2108 | 2109 | 2110 | 2111 | 2112 | 2113 | 2114 | 1 2115 | 40 2116 | 14 2117 | 14 2118 | 2119 | 2120 | 1 2121 | 40 2122 | 14 2123 | 14 2124 | 2125 | 2126 | 2127 | 2128 | 1 2129 | 40 2130 | 14 2131 | 14 2132 | 2133 | 2134 | 2135 | 2136 | 2137 | 2138 | 2139 | 240 2140 | 40 2141 | 1 2142 | 1 2143 | 2144 | 2145 | 2146 | 2147 | 2148 | 2149 | 2150 | 1 2151 | 40 2152 | 14 2153 | 14 2154 | 2155 | 2156 | 240 2157 | 40 2158 | 1 2159 | 1 2160 | 2161 | 2162 | 2163 | 2164 | 1 2165 | 240 2166 | 14 2167 | 14 2168 | 2169 | 2170 | 2171 | 2172 | 2173 | 2174 | 2175 | 1 2176 | 240 2177 | 1 2178 | 1 2179 | 2180 | 2181 | 2182 | 2183 | 2184 | 2185 | 1 2186 | 240 2187 | 14 2188 | 14 2189 | 2190 | 2191 | 1 2192 | 240 2193 | 1 2194 | 1 2195 | 2196 | 2197 | 2198 | 2199 | 1 2200 | 240 2201 | 14 2202 | 14 2203 | 2204 | 2205 | 2206 | 2207 | 2208 | 2209 | 2210 | 1 2211 | 240 2212 | 14 2213 | 14 2214 | 2215 | 2216 | 2217 | 2218 | 1 2219 | 240 2220 | 14 2221 | 14 2222 | 2223 | 2224 | 2225 | 2226 | 2227 | 2228 | 2229 | 240 2230 | 1 2231 | 1 2232 | 5 2233 | 5 2234 | 2235 | 2236 | 2237 | 2238 | 2239 | 2240 | 2241 | 1 2242 | 240 2243 | 14 2244 | 14 2245 | 2246 | 2247 | 240 2248 | 1 2249 | 1 2250 | 5 2251 | 5 2252 | 2253 | 2254 | 2255 | 2256 | 1 2257 | 240 2258 | 14 2259 | 14 2260 | 2261 | 2262 | 2263 | 2264 | 2265 | 2266 | 2267 | 1 2268 | 240 2269 | 1 2270 | 1 2271 | 2272 | 2273 | 2274 | 2275 | 2276 | 2277 | 1 2278 | 240 2279 | 14 2280 | 14 2281 | 2282 | 2283 | 1 2284 | 240 2285 | 1 2286 | 1 2287 | 2288 | 2289 | 2290 | 2291 | 1 2292 | 240 2293 | 14 2294 | 14 2295 | 2296 | 2297 | 2298 | 2299 | 2300 | 2301 | 2302 | 1 2303 | 240 2304 | 14 2305 | 14 2306 | 2307 | 2308 | 2309 | 2310 | 1 2311 | 240 2312 | 14 2313 | 14 2314 | 2315 | 2316 | 2317 | 2318 | 2319 | 2320 | 2321 | 56 2322 | 240 2323 | 1 2324 | 1 2325 | 2326 | 2327 | 2328 | 2329 | 2330 | 2331 | 2332 | 1 2333 | 240 2334 | 14 2335 | 14 2336 | 2337 | 2338 | 56 2339 | 240 2340 | 1 2341 | 1 2342 | 2343 | 2344 | 2345 | 2346 | 1 2347 | 56 2348 | 14 2349 | 14 2350 | 2351 | 2352 | 2353 | 2354 | 2355 | 2356 | 2357 | 1 2358 | 56 2359 | 1 2360 | 1 2361 | 2362 | 2363 | 2364 | 2365 | 2366 | 2367 | 1 2368 | 56 2369 | 14 2370 | 14 2371 | 2372 | 2373 | 1 2374 | 56 2375 | 1 2376 | 1 2377 | 2378 | 2379 | 2380 | 2381 | 1 2382 | 56 2383 | 14 2384 | 14 2385 | 2386 | 2387 | 2388 | 2389 | 2390 | 2391 | 2392 | 336 2393 | 56 2394 | 1 2395 | 1 2396 | 2397 | 2398 | 2399 | 2400 | 2401 | 2402 | 2403 | 1 2404 | 56 2405 | 14 2406 | 14 2407 | 2408 | 2409 | 336 2410 | 56 2411 | 1 2412 | 1 2413 | 2414 | 2415 | 2416 | 2417 | 1 2418 | 336 2419 | 14 2420 | 14 2421 | 2422 | 2423 | 2424 | 2425 | 2426 | 2427 | 2428 | 1 2429 | 336 2430 | 1 2431 | 1 2432 | 2433 | 2434 | 2435 | 2436 | 2437 | 2438 | 1 2439 | 336 2440 | 14 2441 | 14 2442 | 2443 | 2444 | 1 2445 | 336 2446 | 1 2447 | 1 2448 | 2449 | 2450 | 2451 | 2452 | 1 2453 | 336 2454 | 14 2455 | 14 2456 | 2457 | 2458 | 2459 | 2460 | 2461 | 2462 | 2463 | 1 2464 | 336 2465 | 14 2466 | 14 2467 | 2468 | 2469 | 2470 | 2471 | 1 2472 | 336 2473 | 14 2474 | 14 2475 | 2476 | 2477 | 2478 | 2479 | 2480 | 2481 | 2482 | 336 2483 | 1 2484 | 1 2485 | 5 2486 | 5 2487 | 2488 | 2489 | 2490 | 2491 | 2492 | 2493 | 2494 | 1 2495 | 336 2496 | 14 2497 | 14 2498 | 2499 | 2500 | 336 2501 | 1 2502 | 1 2503 | 5 2504 | 5 2505 | 2506 | 2507 | 2508 | 2509 | 1 2510 | 336 2511 | 14 2512 | 14 2513 | 2514 | 2515 | 2516 | 2517 | 2518 | 2519 | 2520 | 1 2521 | 336 2522 | 1 2523 | 1 2524 | 2525 | 2526 | 2527 | 2528 | 2529 | 2530 | 1 2531 | 336 2532 | 14 2533 | 14 2534 | 2535 | 2536 | 1 2537 | 336 2538 | 1 2539 | 1 2540 | 2541 | 2542 | 2543 | 2544 | 1 2545 | 336 2546 | 14 2547 | 14 2548 | 2549 | 2550 | 2551 | 2552 | 2553 | 2554 | 2555 | 1 2556 | 336 2557 | 14 2558 | 14 2559 | 2560 | 2561 | 2562 | 2563 | 1 2564 | 336 2565 | 14 2566 | 14 2567 | 2568 | 2569 | 2570 | 2571 | 2572 | 2573 | 2574 | 56 2575 | 336 2576 | 1 2577 | 1 2578 | 2579 | 2580 | 2581 | 2582 | 2583 | 2584 | 2585 | 1 2586 | 336 2587 | 14 2588 | 14 2589 | 2590 | 2591 | 56 2592 | 336 2593 | 1 2594 | 1 2595 | 2596 | 2597 | 2598 | 2599 | 1 2600 | 56 2601 | 14 2602 | 14 2603 | 2604 | 2605 | 2606 | 2607 | 2608 | 2609 | 2610 | 1 2611 | 56 2612 | 1 2613 | 1 2614 | 2615 | 2616 | 2617 | 2618 | 2619 | 2620 | 1 2621 | 56 2622 | 14 2623 | 14 2624 | 2625 | 2626 | 1 2627 | 56 2628 | 1 2629 | 1 2630 | 2631 | 2632 | 2633 | 2634 | 1 2635 | 56 2636 | 14 2637 | 14 2638 | 2639 | 2640 | 2641 | 2642 | 2643 | 2644 | 1 2645 | 56 2646 | 14 2647 | 14 2648 | 2649 | 2650 | 1 2651 | 56 2652 | 14 2653 | 14 2654 | 2655 | 2656 | 2657 | 2658 | 1 2659 | 56 2660 | 14 2661 | 14 2662 | 2663 | 2664 | 2665 | 2666 | 2667 | 2668 | 2669 | 336 2670 | 56 2671 | 1 2672 | 1 2673 | 2674 | 2675 | 2676 | 2677 | 2678 | 2679 | 2680 | 1 2681 | 56 2682 | 14 2683 | 14 2684 | 2685 | 2686 | 336 2687 | 56 2688 | 1 2689 | 1 2690 | 2691 | 2692 | 2693 | 2694 | 1 2695 | 336 2696 | 14 2697 | 14 2698 | 2699 | 2700 | 2701 | 2702 | 2703 | 2704 | 2705 | 1 2706 | 336 2707 | 1 2708 | 1 2709 | 2710 | 2711 | 2712 | 2713 | 2714 | 2715 | 1 2716 | 336 2717 | 14 2718 | 14 2719 | 2720 | 2721 | 1 2722 | 336 2723 | 1 2724 | 1 2725 | 2726 | 2727 | 2728 | 2729 | 1 2730 | 336 2731 | 14 2732 | 14 2733 | 2734 | 2735 | 2736 | 2737 | 2738 | 2739 | 2740 | 1 2741 | 336 2742 | 14 2743 | 14 2744 | 2745 | 2746 | 2747 | 2748 | 1 2749 | 336 2750 | 14 2751 | 14 2752 | 2753 | 2754 | 2755 | 2756 | 2757 | 2758 | 2759 | 336 2760 | 1 2761 | 1 2762 | 5 2763 | 5 2764 | 2765 | 2766 | 2767 | 2768 | 2769 | 2770 | 2771 | 1 2772 | 336 2773 | 14 2774 | 14 2775 | 2776 | 2777 | 336 2778 | 1 2779 | 1 2780 | 5 2781 | 5 2782 | 2783 | 2784 | 2785 | 2786 | 1 2787 | 336 2788 | 14 2789 | 14 2790 | 2791 | 2792 | 2793 | 2794 | 2795 | 2796 | 2797 | 1 2798 | 336 2799 | 1 2800 | 1 2801 | 2802 | 2803 | 2804 | 2805 | 2806 | 2807 | 1 2808 | 336 2809 | 14 2810 | 14 2811 | 2812 | 2813 | 1 2814 | 336 2815 | 1 2816 | 1 2817 | 2818 | 2819 | 2820 | 2821 | 1 2822 | 336 2823 | 14 2824 | 14 2825 | 2826 | 2827 | 2828 | 2829 | 2830 | 2831 | 2832 | 1 2833 | 336 2834 | 14 2835 | 14 2836 | 2837 | 2838 | 2839 | 2840 | 1 2841 | 336 2842 | 14 2843 | 14 2844 | 2845 | 2846 | 2847 | 2848 | 2849 | 2850 | 2851 | 56 2852 | 336 2853 | 1 2854 | 1 2855 | 2856 | 2857 | 2858 | 2859 | 2860 | 2861 | 2862 | 1 2863 | 336 2864 | 14 2865 | 14 2866 | 2867 | 2868 | 56 2869 | 336 2870 | 1 2871 | 1 2872 | 2873 | 2874 | 2875 | 2876 | 1 2877 | 56 2878 | 14 2879 | 14 2880 | 2881 | 2882 | 2883 | 2884 | 2885 | 2886 | 2887 | 1 2888 | 56 2889 | 1 2890 | 1 2891 | 2892 | 2893 | 2894 | 2895 | 2896 | 2897 | 1 2898 | 56 2899 | 14 2900 | 14 2901 | 2902 | 2903 | 1 2904 | 56 2905 | 1 2906 | 1 2907 | 2908 | 2909 | 2910 | 2911 | 1 2912 | 56 2913 | 14 2914 | 14 2915 | 2916 | 2917 | 2918 | 2919 | 2920 | 2921 | 1 2922 | 56 2923 | 14 2924 | 14 2925 | 2926 | 2927 | 1 2928 | 56 2929 | 14 2930 | 14 2931 | 2932 | 2933 | 2934 | 2935 | 1 2936 | 56 2937 | 14 2938 | 14 2939 | 2940 | 2941 | 2942 | 2943 | 2944 | 2945 | 2946 | 336 2947 | 56 2948 | 1 2949 | 1 2950 | 2951 | 2952 | 2953 | 2954 | 2955 | 2956 | 2957 | 1 2958 | 56 2959 | 14 2960 | 14 2961 | 2962 | 2963 | 336 2964 | 56 2965 | 1 2966 | 1 2967 | 2968 | 2969 | 2970 | 2971 | 1 2972 | 336 2973 | 14 2974 | 14 2975 | 2976 | 2977 | 2978 | 2979 | 2980 | 2981 | 2982 | 1 2983 | 336 2984 | 1 2985 | 1 2986 | 2987 | 2988 | 2989 | 2990 | 2991 | 2992 | 1 2993 | 336 2994 | 14 2995 | 14 2996 | 2997 | 2998 | 1 2999 | 336 3000 | 1 3001 | 1 3002 | 3003 | 3004 | 3005 | 3006 | 1 3007 | 336 3008 | 14 3009 | 14 3010 | 3011 | 3012 | 3013 | 3014 | 3015 | 3016 | 3017 | 1 3018 | 336 3019 | 14 3020 | 14 3021 | 3022 | 3023 | 3024 | 3025 | 1 3026 | 336 3027 | 14 3028 | 14 3029 | 3030 | 3031 | 3032 | 3033 | 3034 | 3035 | 3036 | 336 3037 | 1 3038 | 1 3039 | 5 3040 | 5 3041 | 3042 | 3043 | 3044 | 3045 | 3046 | 3047 | 3048 | 1 3049 | 336 3050 | 14 3051 | 14 3052 | 3053 | 3054 | 336 3055 | 1 3056 | 1 3057 | 5 3058 | 5 3059 | 3060 | 3061 | 3062 | 3063 | 1 3064 | 336 3065 | 7 3066 | 7 3067 | 3068 | 3069 | 3070 | 3071 | 3072 | 3073 | 3074 | 1 3075 | 336 3076 | 1 3077 | 1 3078 | 3079 | 3080 | 3081 | 3082 | 3083 | 3084 | 1 3085 | 336 3086 | 7 3087 | 7 3088 | 3089 | 3090 | 1 3091 | 336 3092 | 1 3093 | 1 3094 | 3095 | 3096 | 3097 | 3098 | 1 3099 | 336 3100 | 7 3101 | 7 3102 | 3103 | 3104 | 3105 | 3106 | 3107 | 3108 | 3109 | 1 3110 | 336 3111 | 7 3112 | 7 3113 | 3114 | 3115 | 3116 | 3117 | 1 3118 | 336 3119 | 7 3120 | 7 3121 | 3122 | 3123 | 3124 | 3125 | 3126 | 3127 | 3128 | 96 3129 | 336 3130 | 1 3131 | 1 3132 | 3133 | 3134 | 3135 | 3136 | 3137 | 3138 | 3139 | 1 3140 | 336 3141 | 7 3142 | 7 3143 | 3144 | 3145 | 96 3146 | 336 3147 | 1 3148 | 1 3149 | 3150 | 3151 | 3152 | 3153 | 1 3154 | 96 3155 | 7 3156 | 7 3157 | 3158 | 3159 | 3160 | 3161 | 3162 | 3163 | 3164 | 1 3165 | 96 3166 | 1 3167 | 1 3168 | 3169 | 3170 | 3171 | 3172 | 3173 | 3174 | 1 3175 | 96 3176 | 7 3177 | 7 3178 | 3179 | 3180 | 1 3181 | 96 3182 | 1 3183 | 1 3184 | 3185 | 3186 | 3187 | 3188 | 1 3189 | 96 3190 | 7 3191 | 7 3192 | 3193 | 3194 | 3195 | 3196 | 3197 | 3198 | 3199 | 576 3200 | 96 3201 | 1 3202 | 1 3203 | 3204 | 3205 | 3206 | 3207 | 3208 | 3209 | 3210 | 1 3211 | 96 3212 | 7 3213 | 7 3214 | 3215 | 3216 | 576 3217 | 96 3218 | 1 3219 | 1 3220 | 3221 | 3222 | 3223 | 3224 | 1 3225 | 576 3226 | 7 3227 | 7 3228 | 3229 | 3230 | 3231 | 3232 | 3233 | 3234 | 3235 | 1 3236 | 576 3237 | 1 3238 | 1 3239 | 3240 | 3241 | 3242 | 3243 | 3244 | 3245 | 1 3246 | 576 3247 | 7 3248 | 7 3249 | 3250 | 3251 | 1 3252 | 576 3253 | 1 3254 | 1 3255 | 3256 | 3257 | 3258 | 3259 | 1 3260 | 576 3261 | 7 3262 | 7 3263 | 3264 | 3265 | 3266 | 3267 | 3268 | 3269 | 3270 | 1 3271 | 576 3272 | 7 3273 | 7 3274 | 3275 | 3276 | 3277 | 3278 | 1 3279 | 576 3280 | 7 3281 | 7 3282 | 3283 | 3284 | 3285 | 3286 | 3287 | 3288 | 3289 | 576 3290 | 1 3291 | 1 3292 | 5 3293 | 5 3294 | 3295 | 3296 | 3297 | 3298 | 3299 | 3300 | 3301 | 1 3302 | 576 3303 | 7 3304 | 7 3305 | 3306 | 3307 | 576 3308 | 1 3309 | 1 3310 | 5 3311 | 5 3312 | 3313 | 3314 | 3315 | 3316 | 1 3317 | 576 3318 | 7 3319 | 7 3320 | 3321 | 3322 | 3323 | 3324 | 3325 | 3326 | 3327 | 1 3328 | 576 3329 | 1 3330 | 1 3331 | 3332 | 3333 | 3334 | 3335 | 3336 | 3337 | 1 3338 | 576 3339 | 7 3340 | 7 3341 | 3342 | 3343 | 1 3344 | 576 3345 | 1 3346 | 1 3347 | 3348 | 3349 | 3350 | 3351 | 1 3352 | 576 3353 | 7 3354 | 7 3355 | 3356 | 3357 | 3358 | 3359 | 3360 | 3361 | 3362 | 1 3363 | 576 3364 | 7 3365 | 7 3366 | 3367 | 3368 | 3369 | 3370 | 1 3371 | 576 3372 | 7 3373 | 7 3374 | 3375 | 3376 | 3377 | 3378 | 3379 | 3380 | 3381 | 96 3382 | 576 3383 | 1 3384 | 1 3385 | 3386 | 3387 | 3388 | 3389 | 3390 | 3391 | 3392 | 1 3393 | 576 3394 | 7 3395 | 7 3396 | 3397 | 3398 | 96 3399 | 576 3400 | 1 3401 | 1 3402 | 3403 | 3404 | 3405 | 3406 | 1 3407 | 96 3408 | 7 3409 | 7 3410 | 3411 | 3412 | 3413 | 3414 | 3415 | 3416 | 3417 | 1 3418 | 96 3419 | 1 3420 | 1 3421 | 3422 | 3423 | 3424 | 3425 | 3426 | 3427 | 1 3428 | 96 3429 | 7 3430 | 7 3431 | 3432 | 3433 | 1 3434 | 96 3435 | 1 3436 | 1 3437 | 3438 | 3439 | 3440 | 3441 | 1 3442 | 96 3443 | 7 3444 | 7 3445 | 3446 | 3447 | 3448 | 3449 | 3450 | 3451 | 1 3452 | 96 3453 | 7 3454 | 7 3455 | 3456 | 3457 | 1 3458 | 96 3459 | 7 3460 | 7 3461 | 3462 | 3463 | 3464 | 3465 | 1 3466 | 96 3467 | 7 3468 | 7 3469 | 3470 | 3471 | 3472 | 3473 | 3474 | 3475 | 3476 | 576 3477 | 96 3478 | 1 3479 | 1 3480 | 3481 | 3482 | 3483 | 3484 | 3485 | 3486 | 3487 | 1 3488 | 96 3489 | 7 3490 | 7 3491 | 3492 | 3493 | 576 3494 | 96 3495 | 1 3496 | 1 3497 | 3498 | 3499 | 3500 | 3501 | 1 3502 | 576 3503 | 7 3504 | 7 3505 | 3506 | 3507 | 3508 | 3509 | 3510 | 3511 | 3512 | 1 3513 | 576 3514 | 1 3515 | 1 3516 | 3517 | 3518 | 3519 | 3520 | 3521 | 3522 | 1 3523 | 576 3524 | 7 3525 | 7 3526 | 3527 | 3528 | 1 3529 | 576 3530 | 1 3531 | 1 3532 | 3533 | 3534 | 3535 | 3536 | 1 3537 | 576 3538 | 7 3539 | 7 3540 | 3541 | 3542 | 3543 | 3544 | 3545 | 3546 | 3547 | 1 3548 | 576 3549 | 7 3550 | 7 3551 | 3552 | 3553 | 3554 | 3555 | 1 3556 | 576 3557 | 7 3558 | 7 3559 | 3560 | 3561 | 3562 | 3563 | 3564 | 3565 | 3566 | 576 3567 | 1 3568 | 1 3569 | 5 3570 | 5 3571 | 3572 | 3573 | 3574 | 3575 | 3576 | 3577 | 3578 | 1 3579 | 576 3580 | 7 3581 | 7 3582 | 3583 | 3584 | 576 3585 | 1 3586 | 1 3587 | 5 3588 | 5 3589 | 3590 | 3591 | 3592 | 3593 | 1 3594 | 576 3595 | 7 3596 | 7 3597 | 3598 | 3599 | 3600 | 3601 | 3602 | 3603 | 3604 | 1 3605 | 576 3606 | 1 3607 | 1 3608 | 3609 | 3610 | 3611 | 3612 | 3613 | 3614 | 1 3615 | 576 3616 | 7 3617 | 7 3618 | 3619 | 3620 | 1 3621 | 576 3622 | 1 3623 | 1 3624 | 3625 | 3626 | 3627 | 3628 | 1 3629 | 576 3630 | 7 3631 | 7 3632 | 3633 | 3634 | 3635 | 3636 | 3637 | 3638 | 3639 | 1 3640 | 576 3641 | 7 3642 | 7 3643 | 3644 | 3645 | 3646 | 3647 | 1 3648 | 576 3649 | 7 3650 | 7 3651 | 3652 | 3653 | 3654 | 3655 | 3656 | 3657 | 3658 | 96 3659 | 576 3660 | 1 3661 | 1 3662 | 3663 | 3664 | 3665 | 3666 | 3667 | 3668 | 3669 | 1 3670 | 576 3671 | 7 3672 | 7 3673 | 3674 | 3675 | 96 3676 | 576 3677 | 1 3678 | 1 3679 | 3680 | 3681 | 3682 | 3683 | 1 3684 | 96 3685 | 7 3686 | 7 3687 | 3688 | 3689 | 3690 | 3691 | 3692 | 3693 | 3694 | 1 3695 | 96 3696 | 1 3697 | 1 3698 | 3699 | 3700 | 3701 | 3702 | 3703 | 3704 | 1 3705 | 96 3706 | 7 3707 | 7 3708 | 3709 | 3710 | 1 3711 | 96 3712 | 1 3713 | 1 3714 | 3715 | 3716 | 3717 | 3718 | 1 3719 | 96 3720 | 7 3721 | 7 3722 | 3723 | 3724 | 3725 | 3726 | 3727 | 3728 | 1 3729 | 96 3730 | 7 3731 | 7 3732 | 3733 | 3734 | 1 3735 | 96 3736 | 7 3737 | 7 3738 | 3739 | 3740 | 3741 | 3742 | 1 3743 | 96 3744 | 7 3745 | 7 3746 | 3747 | 3748 | 3749 | 3750 | 3751 | 3752 | 3753 | 576 3754 | 96 3755 | 1 3756 | 1 3757 | 3758 | 3759 | 3760 | 3761 | 3762 | 3763 | 3764 | 1 3765 | 96 3766 | 7 3767 | 7 3768 | 3769 | 3770 | 576 3771 | 96 3772 | 1 3773 | 1 3774 | 3775 | 3776 | 3777 | 3778 | 1 3779 | 576 3780 | 7 3781 | 7 3782 | 3783 | 3784 | 3785 | 3786 | 3787 | 3788 | 3789 | 1 3790 | 576 3791 | 1 3792 | 1 3793 | 3794 | 3795 | 3796 | 3797 | 3798 | 3799 | 1 3800 | 576 3801 | 7 3802 | 7 3803 | 3804 | 3805 | 1 3806 | 576 3807 | 1 3808 | 1 3809 | 3810 | 3811 | 3812 | 3813 | 1 3814 | 576 3815 | 7 3816 | 7 3817 | 3818 | 3819 | 3820 | 3821 | 3822 | 3823 | 3824 | 1 3825 | 576 3826 | 7 3827 | 7 3828 | 3829 | 3830 | 3831 | 3832 | 1 3833 | 576 3834 | 7 3835 | 7 3836 | 3837 | 3838 | 3839 | 3840 | 3841 | 3842 | 3843 | 576 3844 | 1 3845 | 1 3846 | 5 3847 | 5 3848 | 3849 | 3850 | 3851 | 3852 | 3853 | 3854 | 3855 | 1 3856 | 576 3857 | 7 3858 | 7 3859 | 3860 | 3861 | 576 3862 | 1 3863 | 1 3864 | 5 3865 | 5 3866 | 3867 | 3868 | 3869 | 3870 | 1 3871 | 576 3872 | 7 3873 | 7 3874 | 3875 | 3876 | 3877 | 3878 | 3879 | 3880 | 3881 | 1 3882 | 576 3883 | 1 3884 | 1 3885 | 3886 | 3887 | 3888 | 3889 | 3890 | 3891 | 1 3892 | 576 3893 | 7 3894 | 7 3895 | 3896 | 3897 | 1 3898 | 576 3899 | 1 3900 | 1 3901 | 3902 | 3903 | 3904 | 3905 | 1 3906 | 576 3907 | 7 3908 | 7 3909 | 3910 | 3911 | 3912 | 3913 | 3914 | 3915 | 3916 | 1 3917 | 576 3918 | 7 3919 | 7 3920 | 3921 | 3922 | 3923 | 3924 | 1 3925 | 576 3926 | 7 3927 | 7 3928 | 3929 | 3930 | 3931 | 3932 | 3933 | 3934 | 3935 | 96 3936 | 576 3937 | 1 3938 | 1 3939 | 3940 | 3941 | 3942 | 3943 | 3944 | 3945 | 3946 | 1 3947 | 576 3948 | 7 3949 | 7 3950 | 3951 | 3952 | 96 3953 | 576 3954 | 1 3955 | 1 3956 | 3957 | 3958 | 3959 | 3960 | 1 3961 | 96 3962 | 7 3963 | 7 3964 | 3965 | 3966 | 3967 | 3968 | 3969 | 3970 | 3971 | 1 3972 | 96 3973 | 1 3974 | 1 3975 | 3976 | 3977 | 3978 | 3979 | 3980 | 3981 | 1 3982 | 96 3983 | 7 3984 | 7 3985 | 3986 | 3987 | 1 3988 | 96 3989 | 1 3990 | 1 3991 | 3992 | 3993 | 3994 | 3995 | 1 3996 | 96 3997 | 7 3998 | 7 3999 | 4000 | 4001 | 4002 | 4003 | 4004 | 4005 | 1 4006 | 96 4007 | 7 4008 | 7 4009 | 4010 | 4011 | 1 4012 | 96 4013 | 7 4014 | 7 4015 | 4016 | 4017 | 4018 | 4019 | 1 4020 | 96 4021 | 7 4022 | 7 4023 | 4024 | 4025 | 4026 | 4027 | 4028 | 4029 | 4030 | 576 4031 | 96 4032 | 1 4033 | 1 4034 | 4035 | 4036 | 4037 | 4038 | 4039 | 4040 | 4041 | 1 4042 | 96 4043 | 7 4044 | 7 4045 | 4046 | 4047 | 576 4048 | 96 4049 | 1 4050 | 1 4051 | 4052 | 4053 | 4054 | 4055 | 1 4056 | 576 4057 | 7 4058 | 7 4059 | 4060 | 4061 | 4062 | 4063 | 4064 | 4065 | 4066 | 1 4067 | 576 4068 | 1 4069 | 1 4070 | 4071 | 4072 | 4073 | 4074 | 4075 | 4076 | 1 4077 | 576 4078 | 7 4079 | 7 4080 | 4081 | 4082 | 1 4083 | 576 4084 | 1 4085 | 1 4086 | 4087 | 4088 | 4089 | 4090 | 1 4091 | 576 4092 | 7 4093 | 7 4094 | 4095 | 4096 | 4097 | 4098 | 4099 | 4100 | 4101 | 1 4102 | 576 4103 | 7 4104 | 7 4105 | 4106 | 4107 | 4108 | 4109 | 1 4110 | 576 4111 | 7 4112 | 7 4113 | 4114 | 4115 | 4116 | 4117 | 4118 | 4119 | 4120 | 576 4121 | 1 4122 | 1 4123 | 3 4124 | 3 4125 | 4126 | 4127 | 4128 | 4129 | 4130 | 4131 | 4132 | 1 4133 | 576 4134 | 7 4135 | 7 4136 | 4137 | 4138 | 576 4139 | 1 4140 | 1 4141 | 3 4142 | 3 4143 | 4144 | 4145 | 4146 | 4147 | 1 4148 | 576 4149 | 7 4150 | 7 4151 | 4152 | 4153 | 4154 | 4155 | 4156 | 4157 | 4158 | 1 4159 | 576 4160 | 1 4161 | 1 4162 | 4163 | 4164 | 4165 | 4166 | 4167 | 4168 | 1 4169 | 576 4170 | 7 4171 | 7 4172 | 4173 | 4174 | 1 4175 | 576 4176 | 1 4177 | 1 4178 | 4179 | 4180 | 4181 | 4182 | 1 4183 | 576 4184 | 7 4185 | 7 4186 | 4187 | 4188 | 4189 | 4190 | 4191 | 4192 | 4193 | 1 4194 | 576 4195 | 7 4196 | 7 4197 | 4198 | 4199 | 4200 | 4201 | 1 4202 | 576 4203 | 7 4204 | 7 4205 | 4206 | 4207 | 4208 | 4209 | 4210 | 4211 | 4212 | 576 4213 | 1 4214 | 1 4215 | 3 4216 | 3 4217 | 4218 | 4219 | 4220 | 4221 | 4222 | 4223 | 4224 | 1 4225 | 576 4226 | 7 4227 | 7 4228 | 4229 | 4230 | 576 4231 | 1 4232 | 1 4233 | 3 4234 | 3 4235 | 4236 | 4237 | 4238 | 4239 | 1 4240 | 576 4241 | 4 4242 | 4 4243 | 4244 | 4245 | 4246 | 4247 | 4248 | 4249 | 4250 | 1 4251 | 576 4252 | 1 4253 | 1 4254 | 4255 | 4256 | 4257 | 4258 | 4259 | 4260 | 1 4261 | 576 4262 | 4 4263 | 4 4264 | 4265 | 4266 | 1 4267 | 576 4268 | 1 4269 | 1 4270 | 4271 | 4272 | 4273 | 4274 | 1 4275 | 576 4276 | 4 4277 | 4 4278 | 4279 | 4280 | 4281 | 4282 | 4283 | 4284 | 4285 | 1 4286 | 576 4287 | 4 4288 | 4 4289 | 4290 | 4291 | 4292 | 4293 | 1 4294 | 576 4295 | 4 4296 | 4 4297 | 4298 | 4299 | 4300 | 4301 | 4302 | 4303 | 4304 | 144 4305 | 576 4306 | 1 4307 | 1 4308 | 4309 | 4310 | 4311 | 4312 | 4313 | 4314 | 4315 | 1 4316 | 576 4317 | 4 4318 | 4 4319 | 4320 | 4321 | 144 4322 | 576 4323 | 1 4324 | 1 4325 | 4326 | 4327 | 4328 | 4329 | 1 4330 | 144 4331 | 4 4332 | 4 4333 | 4334 | 4335 | 4336 | 4337 | 4338 | 4339 | 4340 | 1 4341 | 144 4342 | 1 4343 | 1 4344 | 4345 | 4346 | 4347 | 4348 | 4349 | 4350 | 1 4351 | 144 4352 | 4 4353 | 4 4354 | 4355 | 4356 | 1 4357 | 144 4358 | 1 4359 | 1 4360 | 4361 | 4362 | 4363 | 4364 | 1 4365 | 144 4366 | 4 4367 | 4 4368 | 4369 | 4370 | 4371 | 4372 | 4373 | 4374 | 4375 | 4 4376 | 4377 | 4378 | 4379 | 4380 | 4381 | 4382 | 1 4383 | 144 4384 | 4 4385 | 4 4386 | 4387 | 4388 | 4 4389 | 4390 | 4391 | 4392 | 4393 | 1 4394 | 4 4395 | 4 4396 | 144 4397 | 4398 | 4399 | 4400 | 4401 | 4402 | 4403 | 4404 | 1 4405 | 4406 | 4407 | 4408 | 4409 | 4410 | 4411 | 4412 | 1 4413 | 2304 4414 | 4415 | 4416 | 4417 | 4418 | 4419 | 4420 | 4421 | 1 4422 | 2304 4423 | 4424 | 4425 | 4426 | 4427 | 2 4428 | 4429 | 4430 | 4431 | 4432 | 4433 | 4434 | 4435 | 1 4436 | 4437 | 4438 | 4439 | 4440 | 4441 | 4442 | 4443 | 4444 | 4445 | 4446 | 4447 | 4448 | 2 4449 | 4450 | 4451 | 1 4452 | 4453 | 4454 | 4455 | 4456 | 4457 | 1 4458 | 4459 | 4460 | 4461 | 4462 | 4463 | 4464 | 4465 | 1 4466 | 4467 | 4468 | 1 4469 | 4470 | 4471 | 4472 | 4473 | 2 4474 | 4475 | 4476 | 4477 | 4478 | 4479 | 4480 | 4481 | 1 4482 | 4 4483 | 4 4484 | 144 4485 | 4486 | 4487 | 2 4488 | 4489 | 4490 | 4491 | 4492 | 1 4493 | 2304 4494 | 4495 | 4496 | 4497 | 4498 | 4499 | 4500 | 4501 | 63 4502 | 2304 4503 | 4504 | 4505 | 4506 | 4507 | 4508 | 4509 | 4510 | 1 4511 | 2304 4512 | 4513 | 4514 | 63 4515 | 2304 4516 | 4517 | 4518 | 4519 | 4520 | 1 4521 | 63 4522 | 4523 | 4524 | 4525 | 4526 | 4527 | 4528 | 4529 | 1 4530 | 63 4531 | 4532 | 4533 | 4534 | 4535 | 4536 | 4537 | 1 4538 | 63 4539 | 4540 | 4541 | 1 4542 | 63 4543 | 4544 | 4545 | 4546 | 4547 | 1 4548 | 63 4549 | 4550 | 4551 | 4552 | 4553 | 4554 | 4555 | 1 4556 | 63 4557 | 4558 | 4559 | 4560 | 4561 | 4562 | 4563 | 4564 | 1 4565 | 2304 4566 | 4567 | 4568 | 4569 | 4570 | 4571 | 4572 | 4573 | 1 4574 | 2304 4575 | 4576 | 4577 | 1 4578 | 2304 4579 | 4580 | 4581 | 4582 | 4583 | 1 4584 | 1 4585 | 4586 | 4587 | 4588 | 4589 | 4590 | 4591 | 4592 | 1 4593 | 1 4594 | 4595 | 4596 | 4597 | 4598 | 4599 | 4600 | 1 4601 | 1 4602 | 4603 | 4604 | 1 4605 | 1 4606 | 4607 | 4608 | 4609 | 4610 | 1 4611 | 1 4612 | 4613 | 4614 | 4615 | 4616 | 4617 | 4618 | 1 4619 | 1 4620 | 4621 | 4622 | 4623 | 4624 | 1 4625 | 1 4626 | 4627 | 4628 | 4629 | 4630 | 4631 | 4632 | 1 4633 | 1 4634 | 4635 | 4636 | 4637 | 4638 | 4639 | 4640 | 4641 | 1 4642 | 2304 4643 | 4644 | 4645 | 1 4646 | 2304 4647 | 4648 | 4649 | 4650 | 4651 | 1 4652 | 1 4653 | 4654 | 4655 | 4656 | 4657 | 4658 | 4659 | 4660 | 1 4661 | 1 4662 | 4663 | 4664 | 4665 | 4666 | 4667 | 4668 | 1 4669 | 1 4670 | 4671 | 4672 | 1 4673 | 1 4674 | 4675 | 4676 | 4677 | 4678 | 1 4679 | 1 4680 | 4681 | 4682 | 4683 | 4684 | 4685 | 4686 | 1 4687 | 1 4688 | 4689 | 4690 | 4691 | 4692 | 1 4693 | 1 4694 | 4695 | 4696 | 4697 | 4698 | 4699 | 4700 | 1 4701 | 1 4702 | 4703 | 4704 | 4705 | 4706 | 4707 | 4708 | 4709 | 4710 | 4711 | 4712 | 4713 | 4714 | 4715 | 4716 | 4717 | 4718 | 4719 | 4720 | 4721 | 4722 | 4723 | 4724 | 4725 | 4726 | 4727 | 4728 | 4729 | 4730 | 4731 | 4732 | 4733 | 4734 | 4735 | 4736 | 4737 | 4738 | 4739 | 4740 | 4741 | 4742 | 4743 | 4744 | 4745 | 4746 | 4747 | 4748 | 4749 | 4750 | 4751 | 4752 | 4753 | 4754 | 4755 | 4756 | 4757 | 4758 | 4759 | 4760 | 4761 | 4762 | 4763 | 4764 | 4765 | 4766 | 4767 | 4768 | 4769 | 4770 | 4771 | 4772 | 4773 | 4774 | 4775 | 4776 | 4777 | 4778 | 4779 | 4780 | 4781 | 4782 | 4783 | 4784 | 4785 | 4786 | 4787 | 4788 | 4789 | 4790 | 4791 | 4792 | 4793 | 4794 | 4795 | 4796 | 4797 | 4798 | 4799 | 4800 | 4801 | 4802 | 4803 | 4804 | 4805 | 4806 | 4807 | 4808 | 4809 | 4810 | 4811 | 4812 | 4813 | 4814 | 4815 | 4816 | 4817 | 4818 | 4819 | 4820 | 4821 | 4822 | 4823 | 4824 | 4825 | 4826 | 4827 | 4828 | 4829 | 4830 | 4831 | 4832 | 4833 | 4834 | 4835 | 4836 | 4837 | 4838 | 4839 | 4840 | 4841 | 4842 | 4843 | 4844 | 4845 | 4846 | 4847 | 4848 | 4849 | 4850 | 4851 | 4852 | 4853 | 4854 | 4855 | 4856 | 4857 | 4858 | 4859 | 4860 | 4861 | 4862 | 4863 | 4864 | 4865 | 4866 | 4867 | 4868 | 4869 | 4870 | 4871 | 4872 | 4873 | 4874 | 4875 | 4876 | 4877 | 4878 | 4879 | 4880 | 4881 | 4882 | 4883 | 4884 | 4885 | 4886 | 4887 | 4888 | 4889 | 4890 | 4891 | 4892 | 4893 | 4894 | 4895 | 4896 | 4897 | 4898 | 4899 | 4900 | 4901 | 4902 | 4903 | 4904 | 4905 | 4906 | 4907 | 4908 | 4909 | 4910 | 4911 | 4912 | 4913 | 4914 | 4915 | 4916 | 4917 | 4918 | 4919 | 4920 | 4921 | 4922 | 4923 | 4924 | 4925 | 4926 | 4927 | 4928 | 4929 | 4930 | 4931 | 4932 | 4933 | 4934 | 4935 | 4936 | 4937 | 4938 | 4939 | 4940 | 4941 | 4942 | 4943 | 4944 | 4945 | 4946 | 4947 | 4948 | 4949 | 4950 | 4951 | 4952 | 4953 | 4954 | 4955 | 4956 | 4957 | 4958 | 4959 | 4960 | 4961 | 4962 | 4963 | 4964 | 4965 | 4966 | 4967 | 4968 | 4969 | 4970 | 4971 | 4972 | 4973 | 4974 | 4975 | 4976 | 4977 | 4978 | 4979 | 4980 | 4981 | 4982 | 4983 | 4984 | 4985 | 4986 | 4987 | 4988 | 4989 | 4990 | 4991 | 4992 | 4993 | 4994 | 4995 | 4996 | 4997 | 4998 | 4999 | 5000 | 5001 | 5002 | 5003 | 5004 | 5005 | 5006 | 5007 | 5008 | 5009 | 5010 | 5011 | 5012 | 5013 | -------------------------------------------------------------------------------- /models/palm_detection_FP32.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geaxgx/openvino_hand_tracker/a2a881a330ccf9d4d48534f51d6bf973f6e278b1/models/palm_detection_FP32.bin -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | opencv-python >= 4.5.5.62 --------------------------------------------------------------------------------