def merge_aug_results(self, aug_bboxes, aug_poses, aug_scores, aug_areas,
                          aug_vis, img_metas):
        recovered_bboxes = []
        recovered_poses = []
        recovered_areas = []
        for bboxes, poses, areas, img_info in zip(aug_bboxes, aug_poses,
                                                  aug_areas, img_metas):
            img_shape = img_info[0]['img_shape']
            scale_factor = img_info[0]['scale_factor']
            flip = img_info[0]['flip']
            # assert not flip
            bboxes = bbox_mapping_back(bboxes, img_shape, scale_factor, flip)

            if flip:
                kpt_name, kpt_flip_map = get_keypoints()
                poses = poses.view(poses.shape[0], -1, 2)
                poses = flip_keypoints(kpt_name, kpt_flip_map, poses,
                                       img_shape[1])
                poses = poses.view(poses.shape[0], -1)
            poses = poses / scale_factor

            areas = areas / (scale_factor * scale_factor)
            recovered_bboxes.append(bboxes)
            recovered_poses.append(poses)
            recovered_areas.append(areas)

        bboxes = torch.cat(recovered_bboxes, dim=0)
        poses = torch.cat(recovered_poses, dim=0)
        areas = torch.cat(recovered_areas, dim=0)
        scores = torch.cat(aug_scores, dim=0)
        vis = torch.cat(aug_vis, dim=0)
        return bboxes, poses, areas, scores, vis
    def merge_aug_results(self, aug_bboxes, aug_scores, img_metas):
        """Merge augmented detection bboxes and scores.

        Args:
            aug_bboxes (list[Tensor]): shape (n, 4*#class)
            aug_scores (list[Tensor] or None): shape (n, #class)
            img_shapes (list[Tensor]): shape (3, ).

        Returns:
            tuple: (bboxes, scores)
        """
        recovered_bboxes = []
        for bboxes, img_info in zip(aug_bboxes, img_metas):
            img_shape = img_info[0]['img_shape']
            scale_factor = img_info[0]['scale_factor']
            flip = img_info[0]['flip']
            flip_direction = img_info[0]['flip_direction']
            bboxes = bbox_mapping_back(bboxes, img_shape, scale_factor, flip,
                                       flip_direction)
            recovered_bboxes.append(bboxes)
        bboxes = torch.cat(recovered_bboxes, dim=0)
        if aug_scores is None:
            return bboxes
        else:
            scores = torch.cat(aug_scores, dim=0)
            return bboxes, scores
    def merge_aug_results(self, aug_results, img_metas):
        """Merge augmented detection bboxes and score.

        Args:
            aug_results (list[list[Tensor]]): Det_bboxes and det_labels of each
                image.
            img_metas (list[list[dict]]): Meta information of each image, e.g.,
                image size, scaling factor, etc.

        Returns:
            tuple: (bboxes, labels)
        """
        recovered_bboxes, aug_labels = [], []
        for bboxes_labels, img_info in zip(aug_results, img_metas):
            img_shape = img_info[0]['img_shape']  # using shape before padding
            scale_factor = img_info[0]['scale_factor']
            flip = img_info[0]['flip']
            bboxes, labels = bboxes_labels
            bboxes, scores = bboxes[:, :4], bboxes[:, -1:]
            bboxes = bbox_mapping_back(bboxes, img_shape, scale_factor, flip)
            recovered_bboxes.append(torch.cat([bboxes, scores], dim=-1))
            aug_labels.append(labels)

        bboxes = torch.cat(recovered_bboxes, dim=0)
        labels = torch.cat(aug_labels)

        if bboxes.shape[0] > 0:
            out_bboxes, out_labels = self.bbox_head._bboxes_nms(
                bboxes, labels, self.bbox_head.test_cfg)
        else:
            out_bboxes, out_labels = bboxes, labels

        return out_bboxes, out_labels
    def merge_aug_vote_results(self, aug_bboxes, aug_labels, img_metas):
        """Merge augmented detection bboxes and scores.

        Args:
            aug_bboxes (list[Tensor]): shape (n, 4*#class)
            aug_scores (list[Tensor] or None): shape (n, #class)
            img_shapes (list[Tensor]): shape (3, ).
            rcnn_test_cfg (dict): rcnn test config.

        Returns:
            tuple: (bboxes, scores)
        """
        recovered_bboxes = []
        for bboxes, img_info in zip(aug_bboxes, img_metas):
            img_shape = img_info[0]['img_shape']
            scale_factor = img_info[0]['scale_factor']
            flip = img_info[0]['flip']
            bboxes[:, :4] = bbox_mapping_back(bboxes[:, :4], img_shape, scale_factor, flip)
            recovered_bboxes.append(bboxes)
        bboxes = torch.cat(recovered_bboxes, dim=0)
        if aug_labels is None:
            return bboxes
        else:
            labels = torch.cat(aug_labels, dim=0)
            return bboxes, labels
    def merge_aug_results(self, aug_bboxes, aug_masks, aug_scores, img_metas):
        recovered_bboxes = []
        recovered_masks = []
        for bboxes, masks, img_info in zip(aug_bboxes, aug_masks, img_metas):
            img_shape = img_info[0]['img_shape']
            scale_factor = img_info[0]['scale_factor']
            flip = img_info[0]['flip']
            bboxes = bbox_mapping_back(bboxes, img_shape, scale_factor, flip)
            masks = bbox_mapping_back(masks, img_shape, scale_factor, flip)
            recovered_bboxes.append(bboxes)
            recovered_masks.append(masks)

        bboxes = torch.cat(recovered_bboxes, dim=0)
        masks = torch.cat(recovered_masks, dim=0)

        if aug_scores is None:
            return bboxes, masks
        else:
            scores = torch.cat(aug_scores, dim=0)
            return bboxes, masks, scores
    def merge_aug_results(self, aug_bboxes, aug_scores, aug_points, aug_masks, img_metas):
        """
        Merge augmented detection bboxes and scores.

        Args:
            aug_bboxes (list[Tensor]): shape (n, 4*#class)
            aug_scores (list[Tensor] or None): shape (n, #class)
            aug_points (list[Tensor]): shape (n, pts_num*#class)
            img_shapes (list[Tensor]): shape (3, ).
            rcnn_test_cfg (dict): rcnn test config.

        Returns:
            tuple: (bboxes, scores)
        """

        def points_mapping_back(points, img_shape, scale_factor, flip):
            flipped = points.clone()
            if flip:
                flipped[:, 0] = img_shape[1] - points[:, 0]
            flipped = flipped / scale_factor
            return flipped

        recovered_bboxes = []
        recovered_points = []
        for bboxes, points, img_info in zip(aug_bboxes, aug_points, img_metas):
            img_shape = img_info[0]['img_shape']
            scale_factor = img_info[0]['scale_factor']
            flip = img_info[0]['flip']
            bboxes = bbox_mapping_back(bboxes, img_shape, scale_factor, flip)
            points = points_mapping_back(points, img_shape, scale_factor, flip)
            recovered_bboxes.append(bboxes)
            recovered_points.append(points)
        bboxes = torch.cat(recovered_bboxes, dim=0)
        points = torch.cat(recovered_points, dim=0)
        if aug_scores is None:
            return bboxes
        else:
            scores = torch.cat(aug_scores, dim=0)
            masks = torch.cat(aug_masks, dim=0)
            return bboxes, scores, points, masks