Safemotion Lib
Loading...
Searching...
No Matches
result_transforms.py
Go to the documentation of this file.
1import numpy as np
2import torch
3
4def bbox2result(bboxes, labels, num_classes):
5 """Convert detection results to a list of numpy arrays.
6
7 Args:
8 bboxes (torch.Tensor | np.ndarray): shape (n, 5)
9 labels (torch.Tensor | np.ndarray): shape (n, )
10 num_classes (int): class number, including background class
11
12 Returns:
13 list(ndarray): bbox results of each class
14 """
15 if bboxes.shape[0] == 0:
16 return [np.zeros((0, 5), dtype=np.float32) for i in range(num_classes)]
17 else:
18 if isinstance(bboxes, torch.Tensor):
19 bboxes = bboxes.detach().cpu().numpy()
20 labels = labels.detach().cpu().numpy()
21 return [bboxes[labels == i, :] for i in range(num_classes)]
22
23
24def outs2results(bboxes=None,
25 labels=None,
26 masks=None,
27 ids=None,
28 num_classes=None,
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
outs2results(bboxes=None, labels=None, masks=None, ids=None, num_classes=None, **kwargs)
bbox2result(bboxes, labels, num_classes)