Esempio n. 1
0
    def translate(self,
                  out_shape,
                  offset,
                  direction='horizontal',
                  fill_val=0,
                  interpolation='bilinear'):
        """Translate the BitmapMasks.

        Args:
            out_shape (tuple[int]): Shape for output mask, format (h, w).
            offset (int | float): The offset for translate.
            direction (str): The translate direction, either "horizontal"
                or "vertical".
            fill_val (int | float): Border value. Default 0 for masks.
            interpolation (str): Same as :func:`mmcv.imtranslate`.

        Returns:
            BitmapMasks: Translated BitmapMasks.
        """
        if len(self.masks) == 0:
            translated_masks = np.empty((0, *out_shape), dtype=np.uint8)
        else:
            translated_masks = mmcv.imtranslate(self.masks.transpose(
                (1, 2, 0)),
                                                offset,
                                                direction,
                                                border_value=fill_val,
                                                interpolation=interpolation)
            if translated_masks.ndim == 2:
                translated_masks = translated_masks[:, :, None]
            translated_masks = translated_masks.transpose(
                (2, 0, 1)).astype(self.masks.dtype)
        return BitmapMasks(translated_masks, *out_shape)
Esempio n. 2
0
 def _translate_seg(self,
                    results,
                    offset,
                    direction='horizontal',
                    fill_val=255):
     """Translate segmentation maps horizontally or vertically."""
     for key in results.get('seg_fields', []):
         seg = results[key].copy()
         results[key] = mmcv.imtranslate(seg, offset, direction,
                                         fill_val).astype(seg.dtype)
Esempio n. 3
0
 def _translate_img(self, results, offset, direction='horizontal'):
     """Translate the image.
     Args:
         results (dict): Result dict from loading pipeline.
         offset (int | float): The offset for translate.
         direction (str): The translate direction, either "horizontal"
             or "vertical".
     """
     for key in results.get('img_fields', ['img']):
         img = results[key].copy()
         results[key] = mmcv.imtranslate(
             img, offset, direction, self.img_fill_val).astype(img.dtype)
Esempio n. 4
0
    def translate(self,
                  out_shape,
                  offset,
                  direction='horizontal',
                  fill_val=0,
                  interpolation='bilinear'):
        """Translate the BitmapMasks.

        Args:
            out_shape (tuple[int]): Shape for output mask, format (h, w).
            offset (int | float): The offset for translate.
            direction (str): The translate direction, either "horizontal"
                or "vertical".
            fill_val (int | float): Border value. Default 0 for masks.
            interpolation (str): Same as :func:`mmcv.imtranslate`.

        Returns:
            BitmapMasks: Translated BitmapMasks.

        Example:
            >>> from mmdet.core.mask.structures import BitmapMasks
            >>> self = BitmapMasks.random(dtype=np.uint8)
            >>> out_shape = (32, 32)
            >>> offset = 4
            >>> direction = 'horizontal'
            >>> fill_val = 0
            >>> interpolation = 'bilinear'
            >>> # Note, There seem to be issues when:
            >>> # * out_shape is different than self's shape
            >>> # * the mask dtype is not supported by cv2.AffineWarp
            >>> new = self.translate(out_shape, offset, direction, fill_val,
            >>>                      interpolation)
            >>> assert len(new) == len(self)
            >>> assert new.height, new.width == out_shape
        """
        if len(self.masks) == 0:
            translated_masks = np.empty((0, *out_shape), dtype=np.uint8)
        else:
            translated_masks = mmcv.imtranslate(
                self.masks.transpose((1, 2, 0)),
                offset,
                direction,
                border_value=fill_val,
                interpolation=interpolation)
            if translated_masks.ndim == 2:
                translated_masks = translated_masks[:, :, None]
            translated_masks = translated_masks.transpose(
                (2, 0, 1)).astype(self.masks.dtype)
        return BitmapMasks(translated_masks, *out_shape)
Esempio n. 5
0
 def __call__(self, results):
     if np.random.rand() > self.prob:
         return results
     magnitude = random_negative(self.magnitude, self.random_negative_prob)
     for key in results.get('img_fields', ['img']):
         img = results[key]
         height, width = img.shape[:2]
         if self.direction == 'horizontal':
             offset = magnitude * width
         else:
             offset = magnitude * height
         img_translated = mmcv.imtranslate(img,
                                           offset,
                                           direction=self.direction,
                                           border_value=self.pad_val,
                                           interpolation=self.interpolation)
         results[key] = img_translated.astype(img.dtype)
     return results
Esempio n. 6
0
 def test_imtranslate(self):
     img = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=np.uint8)
     assert_array_equal(mmcv.imtranslate(img, 0), img)
     # offset=1, horizontal
     img_translated = np.array([[128, 1, 2], [128, 4, 5], [128, 7, 8]],
                               dtype=np.uint8)
     assert_array_equal(mmcv.imtranslate(img, 1, border_value=128),
                        img_translated)
     # offset=-1, vertical
     img_translated = np.array([[4, 5, 6], [7, 8, 9], [0, 0, 0]],
                               dtype=np.uint8)
     assert_array_equal(mmcv.imtranslate(img, -1, 'vertical'),
                        img_translated)
     # offset=-2, horizontal
     img = np.array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=np.uint8)
     img = np.stack([img, img, img], axis=-1)
     img_translated = [[3, 4, 128, 128], [7, 8, 128, 128]]
     img_translated = np.stack(
         [img_translated, img_translated, img_translated], axis=-1)
     assert_array_equal(mmcv.imtranslate(img, -2, border_value=128),
                        img_translated)
     # offset=2, vertical
     border_value = (110, 120, 130)
     img_translated = np.stack([
         np.ones((2, 4)) * border_value[0],
         np.ones((2, 4)) * border_value[1],
         np.ones((2, 4)) * border_value[2]
     ],
                               axis=-1).astype(np.uint8)
     assert_array_equal(mmcv.imtranslate(img, 2, 'vertical', border_value),
                        img_translated)
     # test invalid number elements in border_value
     with pytest.raises(AssertionError):
         mmcv.imtranslate(img, 1, border_value=(1, ))
     # test invalid type of border_value
     with pytest.raises(ValueError):
         mmcv.imtranslate(img, 1, border_value=[1, 2, 3])
     # test invalid value of direction
     with pytest.raises(AssertionError):
         mmcv.imtranslate(img, 1, 'diagonal')