
# 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(    UpperCamelCase__			):

  """simple docstring"""
  SCREAMING_SNAKE_CASE__         =      (
      """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."""
  )
  SCREAMING_SNAKE_CASE__         =      """CIDAS/clipseg-rd64-refined"""
  SCREAMING_SNAKE_CASE__         =      """image_segmenter"""
  SCREAMING_SNAKE_CASE__         =      CLIPSegForImageSegmentation

  SCREAMING_SNAKE_CASE__         =      ["""image""", """text"""]
  SCREAMING_SNAKE_CASE__         =      ["""image"""]







  def __init__(self	,      *SCREAMING_SNAKE_CASE_	,      **SCREAMING_SNAKE_CASE_						):
       requires_backends(self	,      ["""vision"""]						)
       super().__init__(*__lowerCamelCase	,      **__lowerCamelCase						)







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_	,      SCREAMING_SNAKE_CASE_						):
       return self.pre_processor(text=[label]	,      images=[image]	,      padding=__lowerCamelCase	,      return_tensors="""pt"""						)







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_						):
       with torch.no_grad():
            UpperCamelCase__				=    self.model(**__lowerCamelCase						).logits
       return logits







  def 	UpperCAmelCase_ (self	,      SCREAMING_SNAKE_CASE_						):
       UpperCamelCase__				=    outputs.cpu().detach().numpy()
       UpperCamelCase__				=    0
       UpperCamelCase__				=    1
       return Image.fromarray((array * 2_55).astype(np.uinta						)						)







def 						__magic_name__			(   __a      :	int	,		__a      :	int						):



     '''simple docstring'''




     while a != 0:
          UpperCamelCase__		,	UpperCamelCase__				=    b % a, a
     return b






def 						__magic_name__			(   __a      :	int	,		__a      :	int						):



     '''simple docstring'''




     if gcd(__a	,		__a						) != 1:
          UpperCamelCase__				=    f"mod inverse of {a!r} and {m!r} does not exist"
          raise ValueError(__a						)
     UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__				=    1, 0, a
     UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__				=    0, 1, m
     while va != 0:
          UpperCamelCase__				=    ua // va
          UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__		,	UpperCamelCase__				=    (ua - q * va), (ua - q * va), (ua - q * va), va, va, va
     return ua % m





