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)
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)
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)
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)
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
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')