29 **kwargs):
30 """Convert tracking/detection results to a list of numpy arrays.
31
32 Args:
33 bboxes (torch.Tensor | np.ndarray): shape (n, 5)
34 labels (torch.Tensor | np.ndarray): shape (n, )
35 masks (torch.Tensor | np.ndarray): shape (n, h, w)
36 ids (torch.Tensor | np.ndarray): shape (n, )
37 num_classes (int): class number, not including background class
38
39 Returns:
40 dict[str : list(ndarray) | list[list[np.ndarray]]]: tracking/detection
41 results of each class. It may contain keys as belows:
42
43 - bbox_results (list[np.ndarray]): Each list denotes bboxes of one
44 category.
45 - mask_results (list[list[np.ndarray]]): Each outer list denotes masks
46 of one category. Each inner list denotes one mask belonging to
47 the category. Each mask has shape (h, w).
48 """
49 assert labels is not None
50 assert num_classes is not None
51
52 results = dict()
53
54 if ids is not None:
55 valid_inds = ids > -1
56 ids = ids[valid_inds]
57 labels = labels[valid_inds]
58
59 if bboxes is not None:
60 if ids is not None:
61 bboxes = bboxes[valid_inds]
62 if bboxes.shape[0] == 0:
63 bbox_results = [
64 np.zeros((0, 6), dtype=np.float32)
65 for i in range(num_classes)
66 ]
67 else:
68 if isinstance(bboxes, torch.Tensor):
69 bboxes = bboxes.cpu().numpy()
70 labels = labels.cpu().numpy()
71 ids = ids.cpu().numpy()
72 bbox_results = [
73 np.concatenate(
74 (ids[labels == i, None], bboxes[labels == i, :]),
75 axis=1) for i in range(num_classes)
76 ]
77 else:
78 bbox_results = bbox2result(bboxes, labels, num_classes)
79 results['bbox_results'] = bbox_results
80
81 if masks is not None:
82 if ids is not None:
83 masks = masks[valid_inds]
84 if isinstance(masks, torch.Tensor):
85 masks = masks.detach().cpu().numpy()
86 masks_results = [[] for _ in range(num_classes)]
87 for i in range(bboxes.shape[0]):
88 masks_results[labels[i]].append(masks[i])
89 results['mask_results'] = masks_results
90
91 return results