def _create_coco_gt_results(dataset): from mmdet.core import bbox2result from mmtrack.core import track2result results = defaultdict(list) for img_info in dataset.data_infos: ann = dataset.get_ann_info(img_info) scores = np.ones((ann['bboxes'].shape[0], 1), dtype=np.float) bboxes = np.concatenate((ann['bboxes'], scores), axis=1) bbox_results = bbox2result(bboxes, ann['labels'], len(dataset.CLASSES)) track_results = track2result(bboxes, ann['labels'], ann['instance_ids'].astype(np.int), len(dataset.CLASSES)) results['bbox_results'].append(bbox_results) results['track_results'].append(track_results) return results
def test_track2result(): from mmtrack.core import track2result # pseudo data num_objects, num_classes = 8, 4 bboxes = random_boxes(num_objects, 640) scores = torch.FloatTensor(num_objects, 1).uniform_(0, 1) bboxes = torch.cat([bboxes, scores], dim=1) # leave the results of the last class as empty labels = torch.randint(0, num_classes - 1, (num_objects, )) ids = torch.arange(num_objects) # run result = track2result(bboxes, labels, ids, num_classes) # test assert len(result) == num_classes assert result[-1].shape == (0, 6) assert isinstance(result[0], np.ndarray) for i in range(num_classes): assert result[i].shape[0] == (labels == i).sum() assert result[i].shape[1] == 6
def simple_test(self, img, img_metas, rescale=False, public_bboxes=None, **kwargs): """Test without augmentations. Args: img (Tensor): of shape (N, C, H, W) encoding input images. Typically these should be mean centered and std scaled. img_metas (list[dict]): list of image info dict where each dict has: 'img_shape', 'scale_factor', 'flip', and may also contain 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. rescale (bool, optional): If False, then returned bboxes and masks will fit the scale of img, otherwise, returned bboxes and masks will fit the scale of original image shape. Defaults to False. public_bboxes (list[Tensor], optional): Public bounding boxes from the benchmark. Defaults to None. Returns: dict[str : list(ndarray)]: The tracking results. """ frame_id = img_metas[0].get('frame_id', -1) if frame_id == 0: self.tracker.reset() x = self.detector.extract_feat(img) if hasattr(self.detector, 'roi_head'): # TODO: check whether this is the case if public_bboxes is not None: public_bboxes = [_[0] for _ in public_bboxes] proposals = public_bboxes else: proposals = self.detector.rpn_head.simple_test_rpn( x, img_metas) det_bboxes, det_labels = self.detector.roi_head.simple_test_bboxes( x, img_metas, proposals, self.detector.roi_head.test_cfg, rescale=rescale) # TODO: support batch inference det_bboxes = det_bboxes[0] det_labels = det_labels[0] num_classes = self.detector.roi_head.bbox_head.num_classes elif hasattr(self.detector, 'bbox_head'): outs = self.detector.bbox_head(x) result_list = self.detector.bbox_head.get_bboxes( *outs, img_metas=img_metas, rescale=rescale) # TODO: support batch inference det_bboxes = result_list[0][0] det_labels = result_list[0][1] num_classes = self.detector.bbox_head.num_classes else: raise TypeError('detector must has roi_head or bbox_head.') bboxes, labels, ids = self.tracker.track(img=img, img_metas=img_metas, model=self, feats=x, bboxes=det_bboxes, labels=det_labels, frame_id=frame_id, rescale=rescale, **kwargs) track_result = track2result(bboxes, labels, ids, num_classes) bbox_result = bbox2result(det_bboxes, det_labels, num_classes) return dict(bbox_results=bbox_result, track_results=track_result)