From 354ea4434052f36ec5ce506c13e5efc7cbdad8c1 Mon Sep 17 00:00:00 2001 From: amyeroberts <22614925+amyeroberts@users.noreply.github.com> Date: Mon, 23 Jan 2023 17:21:33 +0000 Subject: [PATCH] Replace reduce_labels with do_reduce_labels (#21218) * Replace reduce_labels with do_reduce_labels * Replace only for __init__ and preprocess * Update tests --- .../maskformer/image_processing_maskformer.py | 46 +++++++++++++++---- .../oneformer/image_processing_oneformer.py | 40 ++++++++++++---- .../segformer/image_processing_segformer.py | 4 +- .../test_image_processing_maskformer.py | 6 +-- .../test_image_processing_oneformer.py | 8 ++-- 5 files changed, 75 insertions(+), 29 deletions(-) diff --git a/src/transformers/models/maskformer/image_processing_maskformer.py b/src/transformers/models/maskformer/image_processing_maskformer.py index aea9bb784b..255522ec7b 100644 --- a/src/transformers/models/maskformer/image_processing_maskformer.py +++ b/src/transformers/models/maskformer/image_processing_maskformer.py @@ -373,7 +373,7 @@ class MaskFormerImageProcessor(BaseImageProcessor): ignore_index (`int`, *optional*): Label to be assigned to background pixels in segmentation maps. If provided, segmentation map pixels denoted with 0 (background) will be replaced with `ignore_index`. - reduce_labels (`bool`, *optional*, defaults to `False`): + do_reduce_labels (`bool`, *optional*, defaults to `False`): Whether or not to decrement all label values of segmentation maps by 1. Usually used for datasets where 0 is used for background, and background itself is not included in all classes of a dataset (e.g. ADE20k). The background label will be replaced by `ignore_index`. @@ -394,7 +394,7 @@ class MaskFormerImageProcessor(BaseImageProcessor): image_mean: Union[float, List[float]] = None, image_std: Union[float, List[float]] = None, ignore_index: Optional[int] = None, - reduce_labels: bool = False, + do_reduce_labels: bool = False, **kwargs ): if "size_divisibility" in kwargs: @@ -415,6 +415,13 @@ class MaskFormerImageProcessor(BaseImageProcessor): self._max_size = kwargs.pop("max_size") else: self._max_size = 1333 + if "reduce_labels" in kwargs: + warnings.warn( + "The `reduce_labels` argument is deprecated and will be removed in v4.27. Please use " + "`do_reduce_labels` instead.", + FutureWarning, + ) + do_reduce_labels = kwargs.pop("reduce_labels") size = size if size is not None else {"shortest_edge": 800, "longest_edge": self._max_size} size = get_size_dict(size, max_size=self._max_size, default_to_square=False) @@ -430,7 +437,7 @@ class MaskFormerImageProcessor(BaseImageProcessor): self.image_mean = image_mean if image_mean is not None else IMAGENET_DEFAULT_MEAN self.image_std = image_std if image_std is not None else IMAGENET_DEFAULT_STD self.ignore_index = ignore_index - self.reduce_labels = reduce_labels + self.do_reduce_labels = do_reduce_labels @classmethod def from_dict(cls, image_processor_dict: Dict[str, Any], **kwargs): @@ -463,6 +470,15 @@ class MaskFormerImageProcessor(BaseImageProcessor): ) return self.size["longest_edge"] + @property + def reduce_labels(self): + warnings.warn( + "The `reduce_labels` property is deprecated and will be removed in v4.27. Please use " + "`do_reduce_labels` instead.", + FutureWarning, + ) + return self.do_reduce_labels + def resize( self, image: np.ndarray, @@ -532,6 +548,7 @@ class MaskFormerImageProcessor(BaseImageProcessor): instance_id_to_semantic_id: Optional[Dict[int, int]] = None, ignore_index: Optional[int] = None, reduce_labels: bool = False, + **kwargs ): reduce_labels = reduce_labels if reduce_labels is not None else self.reduce_labels ignore_index = ignore_index if ignore_index is not None else self.ignore_index @@ -645,16 +662,26 @@ class MaskFormerImageProcessor(BaseImageProcessor): image_mean: Optional[Union[float, List[float]]] = None, image_std: Optional[Union[float, List[float]]] = None, ignore_index: Optional[int] = None, - reduce_labels: Optional[bool] = None, + do_reduce_labels: Optional[bool] = None, return_tensors: Optional[Union[str, TensorType]] = None, data_format: Union[str, ChannelDimension] = ChannelDimension.FIRST, **kwargs ) -> BatchFeature: if "pad_and_return_pixel_mask" in kwargs: warnings.warn( - "The `pad_and_return_pixel_mask` argument is deprecated and will be removed in a future version", + "The `pad_and_return_pixel_mask` argument is deprecated and will be removed in v4.27", FutureWarning, ) + if "reduce_labels" in kwargs: + warnings.warn( + "The `reduce_labels` argument is deprecated and will be removed in v4.27. Please use" + " `do_reduce_labels` instead.", + FutureWarning, + ) + if do_reduce_labels is not None: + raise ValueError( + "Cannot use both `reduce_labels` and `do_reduce_labels`. Please use `do_reduce_labels` instead." + ) do_resize = do_resize if do_resize is not None else self.do_resize size = size if size is not None else self.size @@ -667,7 +694,7 @@ class MaskFormerImageProcessor(BaseImageProcessor): image_mean = image_mean if image_mean is not None else self.image_mean image_std = image_std if image_std is not None else self.image_std ignore_index = ignore_index if ignore_index is not None else self.ignore_index - reduce_labels = reduce_labels if reduce_labels is not None else self.reduce_labels + do_reduce_labels = do_reduce_labels if do_reduce_labels is not None else self.do_reduce_labels if do_resize is not None and size is None or size_divisor is None: raise ValueError("If `do_resize` is True, `size` and `size_divisor` must be provided.") @@ -720,7 +747,7 @@ class MaskFormerImageProcessor(BaseImageProcessor): for segmentation_map in segmentation_maps ] encoded_inputs = self.encode_inputs( - images, segmentation_maps, instance_id_to_semantic_id, ignore_index, reduce_labels, return_tensors + images, segmentation_maps, instance_id_to_semantic_id, ignore_index, do_reduce_labels, return_tensors ) return encoded_inputs @@ -842,13 +869,12 @@ class MaskFormerImageProcessor(BaseImageProcessor): `annotations` are provided). They identify the labels of `mask_labels`, e.g. the label of `mask_labels[i][j]` if `class_labels[i][j]`. """ - ignore_index = self.ignore_index if ignore_index is None else ignore_index - reduce_labels = self.reduce_labels if reduce_labels is None else reduce_labels - if "pad_and_return_pixel_mask" in kwargs: warnings.warn( "The `pad_and_return_pixel_mask` argument has no effect and will be removed in v4.27", FutureWarning ) + ignore_index = self.ignore_index if ignore_index is None else ignore_index + reduce_labels = self.do_reduce_labels if reduce_labels is None else reduce_labels pixel_values_list = [to_numpy_array(pixel_values) for pixel_values in pixel_values_list] encoded_inputs = self.pad(pixel_values_list, return_tensors=return_tensors) diff --git a/src/transformers/models/oneformer/image_processing_oneformer.py b/src/transformers/models/oneformer/image_processing_oneformer.py index 2cbe1ca5bf..6fd6a9ca48 100644 --- a/src/transformers/models/oneformer/image_processing_oneformer.py +++ b/src/transformers/models/oneformer/image_processing_oneformer.py @@ -373,7 +373,7 @@ class OneFormerImageProcessor(BaseImageProcessor): ignore_index (`int`, *optional*): Label to be assigned to background pixels in segmentation maps. If provided, segmentation map pixels denoted with 0 (background) will be replaced with `ignore_index`. - reduce_labels (`bool`, *optional*, defaults to `False`): + do_reduce_labels (`bool`, *optional*, defaults to `False`): Whether or not to decrement all label values of segmentation maps by 1. Usually used for datasets where 0 is used for background, and background itself is not included in all classes of a dataset (e.g. ADE20k). The background label will be replaced by `ignore_index`. @@ -399,7 +399,7 @@ class OneFormerImageProcessor(BaseImageProcessor): image_mean: Union[float, List[float]] = None, image_std: Union[float, List[float]] = None, ignore_index: Optional[int] = None, - reduce_labels: bool = False, + do_reduce_labels: bool = False, repo_path: str = "shi-labs/oneformer_demo", class_info_file: str = None, num_text: Optional[int] = None, @@ -413,6 +413,14 @@ class OneFormerImageProcessor(BaseImageProcessor): size = size if size is not None else {"shortest_edge": 800, "longest_edge": self._max_size} size = get_size_dict(size, max_size=self._max_size, default_to_square=False) + if "reduce_labels" in kwargs: + warnings.warn( + "The `reduce_labels` argument is deprecated and will be removed in v4.27. " + "Please use `do_reduce_labels` instead.", + FutureWarning, + ) + do_reduce_labels = kwargs.pop("reduce_labels") + super().__init__(**kwargs) self.do_resize = do_resize self.size = size @@ -423,7 +431,7 @@ class OneFormerImageProcessor(BaseImageProcessor): self.image_mean = image_mean if image_mean is not None else IMAGENET_DEFAULT_MEAN self.image_std = image_std if image_std is not None else IMAGENET_DEFAULT_STD self.ignore_index = ignore_index - self.reduce_labels = reduce_labels + self.do_reduce_labels = do_reduce_labels self.class_info_file = class_info_file self.repo_path = repo_path self.metadata = prepare_metadata(repo_path, class_info_file) @@ -499,6 +507,7 @@ class OneFormerImageProcessor(BaseImageProcessor): instance_id_to_semantic_id: Optional[Dict[int, int]] = None, ignore_index: Optional[int] = None, reduce_labels: bool = False, + **kwargs ): reduce_labels = reduce_labels if reduce_labels is not None else self.reduce_labels ignore_index = ignore_index if ignore_index is not None else self.ignore_index @@ -607,16 +616,28 @@ class OneFormerImageProcessor(BaseImageProcessor): image_mean: Optional[Union[float, List[float]]] = None, image_std: Optional[Union[float, List[float]]] = None, ignore_index: Optional[int] = None, - reduce_labels: Optional[bool] = None, + do_reduce_labels: Optional[bool] = None, return_tensors: Optional[Union[str, TensorType]] = None, data_format: Union[str, ChannelDimension] = ChannelDimension.FIRST, **kwargs ) -> BatchFeature: if "pad_and_return_pixel_mask" in kwargs: warnings.warn( - "The `pad_and_return_pixel_mask` argument is deprecated and will be removed in a future version", + "The `pad_and_return_pixel_mask` argument is deprecated and will be removed in v4.27", FutureWarning, ) + if "reduce_labels" in kwargs: + warnings.warn( + "The `reduce_labels` argument is deprecated and will be removed in a v4.27. Please use" + " `do_reduce_labels` instead.", + FutureWarning, + ) + if do_reduce_labels is not None: + raise ValueError( + "You cannot use both `reduce_labels` and `do_reduce_labels` arguments. Please use" + " `do_reduce_labels` instead." + ) + do_reduce_labels = kwargs.pop("reduce_labels") do_resize = do_resize if do_resize is not None else self.do_resize size = size if size is not None else self.size @@ -628,7 +649,7 @@ class OneFormerImageProcessor(BaseImageProcessor): image_mean = image_mean if image_mean is not None else self.image_mean image_std = image_std if image_std is not None else self.image_std ignore_index = ignore_index if ignore_index is not None else self.ignore_index - reduce_labels = reduce_labels if reduce_labels is not None else self.reduce_labels + do_reduce_labels = do_reduce_labels if do_reduce_labels is not None else self.do_reduce_labels if do_resize is not None and size is None: raise ValueError("If `do_resize` is True, `size` must be provided.") @@ -684,7 +705,7 @@ class OneFormerImageProcessor(BaseImageProcessor): segmentation_maps, instance_id_to_semantic_id, ignore_index, - reduce_labels, + do_reduce_labels, return_tensors, ) return encoded_inputs @@ -910,14 +931,13 @@ class OneFormerImageProcessor(BaseImageProcessor): - **text_inputs** -- Optional list of text string entries to be fed to a model (when `annotations` are provided). They identify the binary masks present in the image. """ - ignore_index = self.ignore_index if ignore_index is None else ignore_index - reduce_labels = self.reduce_labels if reduce_labels is None else reduce_labels - if "pad_and_return_pixel_mask" in kwargs: warnings.warn( "The `pad_and_return_pixel_mask` argument has no effect and will be removed in v4.27", FutureWarning ) + ignore_index = self.ignore_index if ignore_index is None else ignore_index + reduce_labels = self.do_reduce_labels if reduce_labels is None else reduce_labels pixel_values_list = [to_numpy_array(pixel_values) for pixel_values in pixel_values_list] pad_size = get_max_height_width(pixel_values_list) encoded_inputs = self.pad(pixel_values_list, return_tensors=return_tensors) diff --git a/src/transformers/models/segformer/image_processing_segformer.py b/src/transformers/models/segformer/image_processing_segformer.py index b96c38b4fb..5e592cb042 100644 --- a/src/transformers/models/segformer/image_processing_segformer.py +++ b/src/transformers/models/segformer/image_processing_segformer.py @@ -122,8 +122,8 @@ class SegformerImageProcessor(BaseImageProcessor): @classmethod def from_dict(cls, image_processor_dict: Dict[str, Any], **kwargs): """ - Overrides the `from_dict` method from the base class to make sure `reduce_labels` is updated if image processor - is created using from_dict and kwargs e.g. `SegformerImageProcessor.from_pretrained(checkpoint, + Overrides the `from_dict` method from the base class to make sure `do_reduce_labels` is updated if image + processor is created using from_dict and kwargs e.g. `SegformerImageProcessor.from_pretrained(checkpoint, reduce_labels=True)` """ image_processor_dict = image_processor_dict.copy() diff --git a/tests/models/maskformer/test_image_processing_maskformer.py b/tests/models/maskformer/test_image_processing_maskformer.py index f8ddf8c9dc..cb4f448268 100644 --- a/tests/models/maskformer/test_image_processing_maskformer.py +++ b/tests/models/maskformer/test_image_processing_maskformer.py @@ -53,7 +53,7 @@ class MaskFormerFeatureExtractionTester(unittest.TestCase): image_mean=[0.5, 0.5, 0.5], image_std=[0.5, 0.5, 0.5], num_labels=10, - reduce_labels=True, + do_reduce_labels=True, ignore_index=255, ): self.parent = parent @@ -74,7 +74,7 @@ class MaskFormerFeatureExtractionTester(unittest.TestCase): self.height = 3 self.width = 4 self.num_labels = num_labels - self.reduce_labels = reduce_labels + self.do_reduce_labels = do_reduce_labels self.ignore_index = ignore_index def prepare_feat_extract_dict(self): @@ -86,7 +86,7 @@ class MaskFormerFeatureExtractionTester(unittest.TestCase): "image_std": self.image_std, "size_divisor": self.size_divisor, "num_labels": self.num_labels, - "reduce_labels": self.reduce_labels, + "do_reduce_labels": self.do_reduce_labels, "ignore_index": self.ignore_index, } diff --git a/tests/models/oneformer/test_image_processing_oneformer.py b/tests/models/oneformer/test_image_processing_oneformer.py index 79c6d82c3f..c94089d115 100644 --- a/tests/models/oneformer/test_image_processing_oneformer.py +++ b/tests/models/oneformer/test_image_processing_oneformer.py @@ -69,7 +69,7 @@ class OneFormerImageProcessorTester(unittest.TestCase): image_mean=[0.5, 0.5, 0.5], image_std=[0.5, 0.5, 0.5], num_labels=10, - reduce_labels=False, + do_reduce_labels=False, ignore_index=255, repo_path="shi-labs/oneformer_demo", class_info_file="ade20k_panoptic.json", @@ -97,7 +97,7 @@ class OneFormerImageProcessorTester(unittest.TestCase): self.height = 3 self.width = 4 self.num_labels = num_labels - self.reduce_labels = reduce_labels + self.do_reduce_labels = do_reduce_labels self.ignore_index = ignore_index def prepare_feat_extract_dict(self): @@ -108,7 +108,7 @@ class OneFormerImageProcessorTester(unittest.TestCase): "image_mean": self.image_mean, "image_std": self.image_std, "num_labels": self.num_labels, - "reduce_labels": self.reduce_labels, + "do_reduce_labels": self.do_reduce_labels, "ignore_index": self.ignore_index, "class_info_file": self.class_info_file, "metadata": self.metadata, @@ -180,7 +180,7 @@ class OneFormerImageProcessingTest(FeatureExtractionSavingTestMixin, unittest.Te self.assertTrue(hasattr(image_processor, "num_text")) self.assertTrue(hasattr(image_processor, "repo_path")) self.assertTrue(hasattr(image_processor, "metadata")) - self.assertTrue(hasattr(image_processor, "reduce_labels")) + self.assertTrue(hasattr(image_processor, "do_reduce_labels")) def test_batch_feature(self): pass