def eval_one(net, loss_fn, config, loader, image_id, device, plot=False, verbose=False): input, label_map, image_id = loader.dataset[image_id] input = input.to(device) label_map, label_list = loader.dataset.get_label(image_id) loader.dataset.reg_target_transform(label_map) label_map = torch.from_numpy(label_map).permute(2, 0, 1).unsqueeze_(0).to(device) # Forward Pass t_start = time.time() pred = net(input.unsqueeze(0)) t_forward = time.time() - t_start loss, cls_loss, loc_loss = loss_fn(pred, label_map) pred.squeeze_(0) cls_pred = pred[0, ...] if verbose: print("Forward pass time", t_forward) # Filter Predictions t_start = time.time() corners, scores = filter_pred(config, pred) t_post = time.time() - t_start if verbose: print("Non max suppression time:", t_post) gt_boxes = np.array(label_list) gt_match, pred_match, overlaps = compute_matches(gt_boxes, corners, scores, iou_threshold=0.5) num_gt = len(label_list) num_pred = len(scores) input_np = input.cpu().permute(1, 2, 0).numpy() pred_image = get_bev(input_np, corners) if plot == True: # Visualization plot_bev(input_np, label_list, window_name='GT') plot_bev(input_np, corners, window_name='Prediction') plot_label_map(cls_pred.numpy()) return num_gt, num_pred, scores, pred_image, pred_match, loss.item( ), t_forward, t_post
def __call__(self, velo, path): t_start = time.time() bev = self.preprocess(velo, path) t_pre = time.time() with torch.no_grad(): pred = self.net(bev.unsqueeze(0)).squeeze_(0) t_m = time.time() corners, scores = filter_pred(self.config, pred) input_np = bev.permute(1, 2, 0).cpu().numpy() t_post = time.time() pred_bev = get_bev(input_np, corners) t_s = [t_pre - t_start, t_m - t_pre, t_post - t_m] return t_s, corners, scores, pred_bev