def postprocess(self, boxes, ori_image_shape, threshold): over_thres_idx = np.nonzero(boxes[:, 1:2] >= threshold)[0] if len(over_thres_idx) == 0: pred_dets = np.zeros((1, 6), dtype=np.float32) pred_xyxys = np.zeros((1, 4), dtype=np.float32) return pred_dets, pred_xyxys else: boxes = boxes[over_thres_idx] pred_bboxes = boxes[:, 2:] pred_xyxys, keep_idx = clip_box(pred_bboxes, ori_image_shape) if len(keep_idx[0]) == 0: pred_dets = np.zeros((1, 6), dtype=np.float32) pred_xyxys = np.zeros((1, 4), dtype=np.float32) return pred_dets, pred_xyxys pred_scores = boxes[:, 1:2][keep_idx[0]] pred_cls_ids = boxes[:, 0:1][keep_idx[0]] pred_tlwhs = np.concatenate( (pred_xyxys[:, 0:2], pred_xyxys[:, 2:4] - pred_xyxys[:, 0:2] + 1), axis=1) pred_dets = np.concatenate((pred_tlwhs, pred_scores, pred_cls_ids), axis=1) return pred_dets, pred_xyxys
def postprocess(self, boxes, ori_image_shape, threshold, inputs, scaled=False): over_thres_idx = np.nonzero(boxes[:, 1:2] >= threshold)[0] if len(over_thres_idx) == 0: pred_dets = np.zeros((1, 6), dtype=np.float32) pred_xyxys = np.zeros((1, 4), dtype=np.float32) return pred_dets, pred_xyxys else: boxes = boxes[over_thres_idx] if not scaled: # scaled means whether the coords after detector outputs # have been scaled back to the original image, set True # in general detector, set False in JDE YOLOv3. input_shape = inputs['image'].shape[2:] im_shape = inputs['im_shape'][0] scale_factor = inputs['scale_factor'][0] pred_bboxes = scale_coords(boxes[:, 2:], input_shape, im_shape, scale_factor) else: pred_bboxes = boxes[:, 2:] pred_xyxys, keep_idx = clip_box(pred_bboxes, ori_image_shape) if len(keep_idx[0]) == 0: pred_dets = np.zeros((1, 6), dtype=np.float32) pred_xyxys = np.zeros((1, 4), dtype=np.float32) return pred_dets, pred_xyxys pred_scores = boxes[:, 1:2][keep_idx[0]] pred_cls_ids = boxes[:, 0:1][keep_idx[0]] pred_tlwhs = np.concatenate( (pred_xyxys[:, 0:2], pred_xyxys[:, 2:4] - pred_xyxys[:, 0:2] + 1), axis=1) pred_dets = np.concatenate((pred_tlwhs, pred_scores, pred_cls_ids), axis=1) return pred_dets, pred_xyxys
def reidprocess(self, det_results, repeats=1): pred_dets = det_results['boxes'] # cls_id, score, x0, y0, x1, y1 pred_xyxys = pred_dets[:, 2:6] ori_image = det_results['ori_image'] ori_image_shape = ori_image.shape[:2] pred_xyxys, keep_idx = clip_box(pred_xyxys, ori_image_shape) if len(keep_idx[0]) == 0: det_results['boxes'] = np.zeros((1, 6), dtype=np.float32) det_results['embeddings'] = None return det_results pred_dets = pred_dets[keep_idx[0]] pred_xyxys = pred_dets[:, 2:6] w, h = self.tracker.input_size crops = get_crops(pred_xyxys, ori_image, w, h) # to keep fast speed, only use topk crops crops = crops[:50] # reid_batch_size det_results['crops'] = np.array(crops).astype('float32') det_results['boxes'] = pred_dets[:50] input_names = self.reid_predictor.get_input_names() for i in range(len(input_names)): input_tensor = self.reid_predictor.get_input_handle(input_names[i]) input_tensor.copy_from_cpu(det_results[input_names[i]]) # model prediction for i in range(repeats): self.reid_predictor.run() output_names = self.reid_predictor.get_output_names() feature_tensor = self.reid_predictor.get_output_handle( output_names[0]) pred_embs = feature_tensor.copy_to_cpu() det_results['embeddings'] = pred_embs return det_results