

'''simple docstring'''
# Copyright 2023 The HuggingFace Inc. team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import numpy as np
import torch

from ..models.clipseg import CLIPSegForImageSegmentation
from ..utils import is_vision_available, requires_backends
from .base import PipelineTool


if is_vision_available():
     from PIL import Image







class 							A__    (       A__  ):
  A__		 =				(
      'This is a tool that creates a segmentation mask of an image according to a label. It cannot create an image.'
      'It takes two arguments named `image` which should be the original image, and `label` which should be a text '
      'describing the elements what should be identified in the segmentation mask. The tool returns the mask.'
  )
  A__		 =				'CIDAS/clipseg-rd64-refined'
  A__		 =				'image_segmenter'
  A__		 =				CLIPSegForImageSegmentation

  A__		 =				['image', 'text']
  A__		 =				['image']





  def __init__(		self      :	Any							,					*_a      :	Dict							,					**_a      :	str )	->    Any:





       '''simple docstring'''






       requires_backends(self							,					['vision'] )
       super().__init__(*_a							,					**_a )





  def 						A  (		self      :	int							,					_a      :	"Image"							,					_a      :	str )	->    Optional[Any]:





       '''simple docstring'''






       return self.pre_processor(text=[label]							,					images=[image]							,					padding=_a							,					return_tensors='pt' )





  def 						A  (		self      :	Dict							,					_a      :	Dict )	->    str:





       '''simple docstring'''






       with torch.no_grad():
            _SCREAMING_SNAKE_CASE							    =self.model(**_a ).logits
       return logits





  def 						A  (		self      :	Any							,					_a      :	str )	->    Union[str, Any]:





       '''simple docstring'''






       _SCREAMING_SNAKE_CASE							    =outputs.cpu().detach().numpy()
       _SCREAMING_SNAKE_CASE							    =0
       _SCREAMING_SNAKE_CASE							    =1
       return Image.fromarray((array * 255).astype(np.uinta ) )

from typing import List, Optional, Union

import numpy as np
import PIL.Image

from ...image_processing_utils import BaseImageProcessor, BatchFeature
from ...image_transforms import rescale, resize, to_channel_dimension_format
from ...image_utils import (
    ChannelDimension,
    PILImageResampling,
    get_image_size,
    make_list_of_images,
    to_numpy_array,
    valid_images,
)
from ...utils import TensorType, logging


__lowerCamelCase			: Union[str, Any]							   =		logging.get_logger(__name__)







class __snake_case				(						lowerCamelCase_		):
   lowerCAmelCase_														=							["pixel_values"]




   def __init__(    self			:				Any       ,	_lowercase			:				bool = True       ,	_lowercase			:				int = 32       ,	_lowercase			:				Any=PILImageResampling.BILINEAR       ,	_lowercase			:				bool = True       ,	**_lowercase			:				Union[str, Any]       ,	):



     """simple docstring"""






     SCREAMING_SNAKE_CASE__										=      do_resize
     SCREAMING_SNAKE_CASE__										=      do_rescale
     SCREAMING_SNAKE_CASE__										=      size_divisor
     SCREAMING_SNAKE_CASE__										=      resample
     super().__init__(**_lowercase      )




   def 	__a						(    self			:				int       ,	_lowercase			:				np.ndarray       ,	_lowercase			:				int       ,	_lowercase			:				int       ,	_lowercase			:				Optional[ChannelDimension] = None       ,	**_lowercase			:				int      ):



     """simple docstring"""






     SCREAMING_SNAKE_CASE__							,     SCREAMING_SNAKE_CASE__										=      get_image_size(_lowercase      )
     # Rounds the height and width down to the closest multiple of size_divisor
     SCREAMING_SNAKE_CASE__										=      height // size_divisor * size_divisor
     SCREAMING_SNAKE_CASE__										=      width // size_divisor * size_divisor
     SCREAMING_SNAKE_CASE__										=      resize(_lowercase       ,	(new_h, new_w)       ,	resample=_lowercase       ,	data_format=_lowercase       ,	**_lowercase      )
     return image




   def 	__a						(    self			:				int       ,	_lowercase			:				np.ndarray       ,	_lowercase			:				float       ,	_lowercase			:				Optional[ChannelDimension] = None       ,	**_lowercase			:				str      ):



     """simple docstring"""






     return rescale(image=_lowercase       ,	scale=_lowercase       ,	data_format=_lowercase       ,	**_lowercase      )




   def 	__a						(    self			:				Tuple       ,	_lowercase			:				Union["PIL.Image.Image", TensorType, List["PIL.Image.Image"], List[TensorType]]       ,	_lowercase			:				Optional[bool] = None       ,	_lowercase			:				Optional[int] = None       ,	_lowercase			:				int=None       ,	_lowercase			:				Optional[bool] = None       ,	_lowercase			:				Optional[Union[TensorType, str]] = None       ,	_lowercase			:				ChannelDimension = ChannelDimension.FIRST       ,	**_lowercase			:				Optional[int]       ,	):



     """simple docstring"""






     SCREAMING_SNAKE_CASE__										=      do_resize if do_resize is not None else self.do_resize
     SCREAMING_SNAKE_CASE__										=      do_rescale if do_rescale is not None else self.do_rescale
     SCREAMING_SNAKE_CASE__										=      size_divisor if size_divisor is not None else self.size_divisor
     SCREAMING_SNAKE_CASE__										=      resample if resample is not None else self.resample

     if do_resize and size_divisor is None:
       raise ValueError("""size_divisor is required for resizing"""      )

     SCREAMING_SNAKE_CASE__										=      make_list_of_images(_lowercase      )

     if not valid_images(_lowercase      ):
       raise ValueError("""Invalid image(s)"""      )

     # All transformations expect numpy arrays.
     SCREAMING_SNAKE_CASE__										=      [to_numpy_array(_lowercase      ) for img in images]

     if do_resize:
       SCREAMING_SNAKE_CASE__										=      [self.resize(_lowercase       ,	size_divisor=_lowercase       ,	resample=_lowercase      ) for image in images]

     if do_rescale:
       SCREAMING_SNAKE_CASE__										=      [self.rescale(_lowercase       ,	scale=1 / 2_55      ) for image in images]

     SCREAMING_SNAKE_CASE__										=      [to_channel_dimension_format(_lowercase       ,	_lowercase      ) for image in images]

     SCREAMING_SNAKE_CASE__										=      {"""pixel_values""": images}
     return BatchFeature(data=_lowercase       ,	tensor_type=_lowercase      )
