
    sg%                        d dl mZmZmZmZ d dlZddlmZm	Z	m
Z
mZmZ ddlmZmZ  e
       rd dlmZ ddlmZ  e	       rdd	lmZmZmZmZ  ej2                  e      Zeeef   Zee   Z e ed
             G d de             Zy)    )AnyDictListUnionN   )add_end_docstringsis_torch_availableis_vision_availableloggingrequires_backends   )Pipelinebuild_pipeline_init_args)Image)
load_image)*MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES-MODEL_FOR_INSTANCE_SEGMENTATION_MAPPING_NAMES-MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES.MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMEST)has_image_processorc                   b     e Zd ZdZ fdZd Zd	deeee	   f   f fdZ
d
dZd Z	 ddZ xZS )ImageSegmentationPipelinea  
    Image segmentation pipeline using any `AutoModelForXXXSegmentation`. This pipeline predicts masks of objects and
    their classes.

    Example:

    ```python
    >>> from transformers import pipeline

    >>> segmenter = pipeline(model="facebook/detr-resnet-50-panoptic")
    >>> segments = segmenter("https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png")
    >>> len(segments)
    2

    >>> segments[0]["label"]
    'bird'

    >>> segments[1]["label"]
    'bird'

    >>> type(segments[0]["mask"])  # This is a black and white mask showing where is the bird on the original image.
    <class 'PIL.Image.Image'>

    >>> segments[0]["mask"].size
    (768, 512)
    ```


    This image segmentation pipeline can currently be loaded from [`pipeline`] using the following task identifier:
    `"image-segmentation"`.

    See the list of available models on
    [huggingface.co/models](https://huggingface.co/models?filter=image-segmentation).
    c                 T   t        |   |i | | j                  dk(  rt        d| j                   d      t        | d       t        j                         }|j                  t               |j                  t               |j                  t               | j                  |       y )NtfzThe z is only available in PyTorch.vision)super__init__	framework
ValueError	__class__r   r   copyupdater   r   r   check_model_type)selfargskwargsmappingr    s       \/var/www/html/venv/lib/python3.12/site-packages/transformers/pipelines/image_segmentation.pyr   z"ImageSegmentationPipeline.__init__C   s    $)&)>>T!tDNN#33QRSS$)<AACDEDEEFg&    c                     i }i }d|v r|d   |d<   |d   |d<   d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   |i |fS )Nsubtask	thresholdmask_thresholdoverlap_mask_area_thresholdtimeout )r$   r&   preprocess_kwargspostprocess_kwargss       r(   _sanitize_parametersz.ImageSegmentationPipeline._sanitize_parametersP   s    ,29,=y)+1)+<i(& .4[.A{+v%39:J3K/0(F2@FGd@e<=+1)+<i( "&888r)   returnc                 h    d|v r|j                  d      }|t        d      t        |   |fi |S )a	  
        Perform segmentation (detect masks & classes) in the image(s) passed as inputs.

        Args:
            inputs (`str`, `List[str]`, `PIL.Image` or `List[PIL.Image]`):
                The pipeline handles three types of images:

                - A string containing an HTTP(S) link pointing to an image
                - A string containing a local path to an image
                - An image loaded in PIL directly

                The pipeline accepts either a single image or a batch of images. Images in a batch must all be in the
                same format: all as HTTP(S) links, all as local paths, or all as PIL images.
            subtask (`str`, *optional*):
                Segmentation task to be performed, choose [`semantic`, `instance` and `panoptic`] depending on model
                capabilities. If not set, the pipeline will attempt tp resolve in the following order:
                  `panoptic`, `instance`, `semantic`.
            threshold (`float`, *optional*, defaults to 0.9):
                Probability threshold to filter out predicted masks.
            mask_threshold (`float`, *optional*, defaults to 0.5):
                Threshold to use when turning the predicted masks into binary values.
            overlap_mask_area_threshold (`float`, *optional*, defaults to 0.5):
                Mask overlap threshold to eliminate small, disconnected segments.
            timeout (`float`, *optional*, defaults to None):
                The maximum time in seconds to wait for fetching images from the web. If None, no timeout is set and
                the call may block forever.

        Return:
            A dictionary or a list of dictionaries containing the result. If the input is a single image, will return a
            list of dictionaries, if the input is a list of several images, will return a list of list of dictionaries
            corresponding to each image.

            The dictionaries contain the mask, label and score (where applicable) of each detected object and contains
            the following keys:

            - **label** (`str`) -- The class label identified by the model.
            - **mask** (`PIL.Image`) -- A binary mask of the detected object as a Pil Image of shape (width, height) of
              the original image. Returns a mask filled with zeros if no object is found.
            - **score** (*optional* `float`) -- Optionally, when the model is capable of estimating a confidence of the
              "object" described by the label and the mask.
        imageszICannot call the image-classification pipeline without an inputs argument!)popr   r   __call__)r$   inputsr&   r    s      r(   r8   z"ImageSegmentationPipeline.__call__a   sB    V vZZ)F>hiiw1&11r)   c                 T   t        ||      }|j                  |j                  fg}| j                  j                  j
                  j                  dk(  r|i }nd|gi} | j                  d
|gdd|}| j                  dk(  r|j                  | j                        }| j                  |d   d| j                  j                  j                  | j                        d   |d<   n>| j                  |gd      }| j                  dk(  r|j                  | j                        }||d	<   |S )N)r/   OneFormerConfigtask_inputspt)r6   return_tensors
max_length)paddingr?   r>   	input_idstarget_sizer0   )r   heightwidthmodelconfigr    __name__image_processorr   totorch_dtype	tokenizertask_seq_len)r$   imager+   r/   rB   r&   r9   s          r(   
preprocessz$ImageSegmentationPipeline.preprocess   s&   5'2ekk23::&&//3DD''3)T))X%XQWXF~~%4#3#34$(NN}%$::,,99#~~	 %3 %
 %F=! ))%)NF~~%4#3#34 +}r)   c                 V    |j                  d      } | j                  di |}||d<   |S )NrB   r0   )r7   rE   )r$   model_inputsrB   model_outputss       r(   _forwardz"ImageSegmentationPipeline._forward   s5    "&&}5"

2\2'2m$r)   c                 <   d }|dv r-t        | j                  d      r| j                  j                  }n0|dv r,t        | j                  d      r| j                  j                  }| ||||||d         d   }g }|d   }	|d	   D ]  }
|	|
d
   k(  dz  }t	        j
                  |j                         j                  t        j                        d      }| j                  j                  j                  |
d      }|
d   }|j                  |||d        |S |dv rt        | j                  d      r| j                  j                  ||d         d   }g }|j                         }	t        j                  |	      }|D ]v  }|	|k(  dz  }t	        j
                  |j                  t        j                        d      }| j                  j                  j                  |   }|j                  d ||d       x |S t!        d| dt#        | j                               )N>   Npanoptic"post_process_panoptic_segmentation>   Ninstance"post_process_instance_segmentationrB   )r,   r-   r.   target_sizesr   segmentationsegments_infoid   L)modelabel_idscore)r`   labelmask>   Nsemantic"post_process_semantic_segmentation)rX   zSubtask z is not supported for model )hasattrrH   rU   rW   r   	fromarraynumpyastypenpuint8rE   rF   id2labelappendrd   uniquer   type)r$   rQ   r+   r,   r-   r.   fnoutputs
annotationrY   segmentrb   ra   r`   labelss                  r(   postprocessz%ImageSegmentationPipeline.postprocess   s4    ((WT5I5IKo-p%%HHB**wt7K7KMq/r%%HHB>#-,G*=9 G J">2L"?3 R$5<tzz|':':288'D3O

))227:3FG(!!EE4"PQR. ! **wt7K7KMq/r**MMM-,H N G J"==?LYY|,F Q$-4t{{288'<3G

))2259!!D5$"OP	Q  xy0LTRVR\R\M]L^_``r)   )N)NN)Ng?      ?ru   )rG   
__module____qualname____doc__r   r3   r   Predictionsr   
Predictionr8   rN   rR   rt   __classcell__)r    s   @r(   r   r      sE    !F'9"/2{DDT7T1U /2b0 kn,r)   r   ) typingr   r   r   r   rg   ri   utilsr   r	   r
   r   r   baser   r   PILr   image_utilsr   models.auto.modeling_autor   r   r   r   
get_loggerrG   loggerstrrz   ry   r   r0   r)   r(   <module>r      s    ) )  k k 4 (  
		H	% #s(^
: ,FG} } H}r)   