Ë
    ÜÓ^j™(  ã                   óú   — d dl mZmZm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mZ  e«       rd dlZd d	lmZ dd
lmZ  ej.                  e«      Z e ed¬«      «       G d„ de«      «       Zy)é    )ÚAnyÚUnionÚoverloadé   )Úadd_end_docstringsÚis_torch_availableÚis_vision_availableÚloggingÚrequires_backendsé   )ÚChunkPipelineÚbuild_pipeline_init_args)ÚImage)Ú
load_imageÚvalid_imagesN)ÚBaseModelOutput)Ú2MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMEST)Úhas_image_processorc                   ón  ‡ — e Zd ZdZdZdZdZdZˆ fd„Ze	de
edf   deee   z  ded	eeeef      fd
„«       Ze	deeeef      ded	eeeeef         fd„«       Z	 dde
edeeeef      f   deee   z  dz  ded	eeeef      eeeeef         z  fˆ fd„Zd„ Zdd„Zd„ Zdd„Zddd	eeef   fd„Zˆ xZS )ÚZeroShotObjectDetectionPipelineaª  
    Zero shot object detection pipeline using `OwlViTForObjectDetection`. This pipeline predicts bounding boxes of
    objects when you provide an image and a set of `candidate_labels`.

    Example:

    ```python
    >>> from transformers import pipeline

    >>> detector = pipeline(model="google/owlvit-base-patch32", task="zero-shot-object-detection")
    >>> detector(
    ...     "http://images.cocodataset.org/val2017/000000039769.jpg",
    ...     candidate_labels=["cat", "couch"],
    ... )
    [{'score': 0.287, 'label': 'cat', 'box': {'xmin': 324, 'ymin': 20, 'xmax': 640, 'ymax': 373}}, {'score': 0.254, 'label': 'cat', 'box': {'xmin': 1, 'ymin': 55, 'xmax': 315, 'ymax': 472}}, {'score': 0.121, 'label': 'couch', 'box': {'xmin': 4, 'ymin': 0, 'xmax': 642, 'ymax': 476}}]

    >>> detector(
    ...     "https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png",
    ...     candidate_labels=["head", "bird"],
    ... )
    [{'score': 0.119, 'label': 'bird', 'box': {'xmin': 71, 'ymin': 170, 'xmax': 410, 'ymax': 508}}]
    ```

    Learn more about the basics of using a pipeline in the [pipeline tutorial](../pipeline_tutorial)

    This object detection pipeline can currently be loaded from [`pipeline`] using the following task identifier:
    `"zero-shot-object-detection"`.

    See the list of available models on
    [huggingface.co/models](https://huggingface.co/models?filter=zero-shot-object-detection).
    FTc                 óf   •— t        ‰| �  di |¤Ž t        | d«       | j                  t        «       y )NÚvision© )ÚsuperÚ__init__r   Úcheck_model_typer   )ÚselfÚkwargsÚ	__class__s     €ú|/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/pipelines/zero_shot_object_detection.pyr   z(ZeroShotObjectDetectionPipeline.__init__=   s,   ø€ Ü‰ÑÑ"˜6Ò"ä˜$ Ô)Ø×ÑÔPÕQó    ÚimagezImage.ImageÚcandidate_labelsr   Úreturnc                  ó   — y ©Nr   )r   r"   r#   r   s       r    Ú__call__z(ZeroShotObjectDetectionPipeline.__call__C   s   € ð  #r!   c                  ó   — y r&   r   )r   r"   r   s      r    r'   z(ZeroShotObjectDetectionPipeline.__call__H   s   € Øber!   Nc           	      ó:  •— d|v r|j                  d«      }t        |t        t        j                  f«      r||dœ}nNt        |t        t
        f«      r5t        |«      r*t	        t        ‰| �   d„ t        ||«      D «       fi |¤Ž«      S 	 |}t        ‰| �   |fi |¤Ž}|S )a|  
        Detect objects (bounding boxes & classes) in the image(s) passed as inputs.

        Args:
            image (`str`, `PIL.Image` or `list[dict[str, Any]]`):
                The pipeline handles three types of images:

                - A string containing an http url pointing to an image
                - A string containing a local path to an image
                - An image loaded in PIL directly

                You can use this parameter to send directly a list of images, or a dataset or a generator like so:

                ```python
                >>> from transformers import pipeline

                >>> detector = pipeline(model="google/owlvit-base-patch32", task="zero-shot-object-detection")
                >>> detector(
                ...     [
                ...         {
                ...             "image": "http://images.cocodataset.org/val2017/000000039769.jpg",
                ...             "candidate_labels": ["cat", "couch"],
                ...         },
                ...         {
                ...             "image": "http://images.cocodataset.org/val2017/000000039769.jpg",
                ...             "candidate_labels": ["cat", "couch"],
                ...         },
                ...     ]
                ... )
                [[{'score': 0.287, 'label': 'cat', 'box': {'xmin': 324, 'ymin': 20, 'xmax': 640, 'ymax': 373}}, {'score': 0.25, 'label': 'cat', 'box': {'xmin': 1, 'ymin': 55, 'xmax': 315, 'ymax': 472}}, {'score': 0.121, 'label': 'couch', 'box': {'xmin': 4, 'ymin': 0, 'xmax': 642, 'ymax': 476}}], [{'score': 0.287, 'label': 'cat', 'box': {'xmin': 324, 'ymin': 20, 'xmax': 640, 'ymax': 373}}, {'score': 0.254, 'label': 'cat', 'box': {'xmin': 1, 'ymin': 55, 'xmax': 315, 'ymax': 472}}, {'score': 0.121, 'label': 'couch', 'box': {'xmin': 4, 'ymin': 0, 'xmax': 642, 'ymax': 476}}]]
                ```


            candidate_labels (`str` or `list[str]` or `list[list[str]]`):
                What the model should recognize in the image.

            threshold (`float`, *optional*, defaults to 0.1):
                The probability necessary to make a prediction.

            top_k (`int`, *optional*, defaults to None):
                The number of top predictions that will be returned by the pipeline. If the provided number is `None`
                or higher than the number of predictions available, it will default to the number of predictions.

            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 list of lists containing prediction results, one list per input image. Each list contains dictionaries
            with the following keys:

            - **label** (`str`) -- Text query corresponding to the found object.
            - **score** (`float`) -- Score corresponding to the object (between 0 and 1).
            - **box** (`dict[str,int]`) -- Bounding box of the detected object in image's original size. It is a
              dictionary with `x_min`, `x_max`, `y_min`, `y_max` keys.
        Útext_queries©r"   r#   c              3   ó,   K  — | ]  \  }}||d œ–— Œ y­w)r+   Nr   )Ú.0ÚimgÚlabelss      r    ú	<genexpr>z;ZeroShotObjectDetectionPipeline.__call__.<locals>.<genexpr>’   s   è ø€ ÒpÁKÀCÈ˜s¸Õ?Ñpùs   ‚)
ÚpopÚ
isinstanceÚstrr   ÚlistÚtupler   r   r'   Úzip)r   r"   r#   r   ÚinputsÚresultsr   s         €r    r'   z(ZeroShotObjectDetectionPipeline.__call__K   s©   ø€ ð~ ˜VÑ#Ø%Ÿz™z¨.Ó9Ðä�eœc¤5§;¡;Ð/Ô0Ø$Ð:JÑK‰FÜ˜¤¤e˜}Ô-´,¸uÔ2EÜÜ‘Ñ ÙpÔSVÐW\Ð^nÓSoÔpñàñóð ðð ˆFä‘'Ñ" 6Ñ4¨VÑ4ˆØˆr!   c                 ó\   — i }d|v r|d   |d<   i }d|v r|d   |d<   d|v r|d   |d<   |i |fS )NÚtimeoutÚ	thresholdÚtop_kr   )r   r   Úpreprocess_paramsÚpostprocess_paramss       r    Ú_sanitize_parametersz4ZeroShotObjectDetectionPipeline._sanitize_parameters£   sc   € ØÐØ˜ÑØ+1°)Ñ+<Ð˜iÑ(ØÐØ˜&Ñ Ø.4°[Ñ.AÐ˜{Ñ+Ø�fÑØ*0°©/Ð˜wÑ'Ø  "Ð&8Ð8Ð8r!   c              #   óÎ  K  — t        |d   |¬«      }|d   }t        |t        «      r|j                  d«      }t	        j
                  |j                  |j                  ggt        j                  ¬«      }t        |«      D ]a  \  }}| j                  |d¬«      }| j                  |d¬«      }	|	j                  | j                  «      }	|t        |«      dz
  k(  ||d	œ|¥|	¥–— Œc y ­w)
Nr"   )r:   r#   ú,)ÚdtypeÚpt)Úreturn_tensorsr   )Úis_lastÚtarget_sizeÚcandidate_label)r   r2   r3   ÚsplitÚtorchÚtensorÚheightÚwidthÚint32Ú	enumerateÚ	tokenizerÚimage_processorÚtorB   Úlen)
r   r7   r:   r"   r#   rF   ÚirG   Útext_inputsÚimage_featuress
             r    Ú
preprocessz*ZeroShotObjectDetectionPipeline.preprocess®   sî   è ø€ Ü˜6 '™?°GÔ<ˆØ!Ð"4Ñ5ÐÜÐ&¬Ô,Ø/×5Ñ5°cÓ:Ðä—l‘l U§\¡\°5·;±;Ð$?Ð#@ÌÏÉÔTˆÜ"+Ð,<Ó"=ò 
	ÑˆAˆØŸ.™.¨È˜.ÓNˆKØ!×1Ñ1°%ÈÐ1ÓMˆNØ+×.Ñ.¨t¯z©zÓ:ˆNà¤Ð$4Ó 5¸Ñ 9Ñ9Ø*Ø#2ñð ð	ð
 !ðó ñ	
	ùs   ‚C#C%c                 ó    — |j                  d«      }|j                  d«      }|j                  d«      } | j                  di |¤Ž}|||dœ|¥}|S )NrF   rG   rE   )rF   rG   rE   r   )r1   Úmodel)r   Úmodel_inputsrF   rG   rE   ÚoutputsÚmodel_outputss          r    Ú_forwardz(ZeroShotObjectDetectionPipeline._forwardÁ   s_   € Ø"×&Ñ& }Ó5ˆØ&×*Ñ*Ð+<Ó=ˆØ×"Ñ" 9Ó-ˆà�$—*‘*Ñ,˜|Ñ,ˆà(3ÈÐdkÑwÐovÐwˆØÐr!   c                 ój  — g }|D ]•  }|d   }t        |«      }| j                  j                  |||d   ¬«      d   }|d   j                  «       D ]I  }|d   |   j	                  «       }	| j                  |d   |   d   «      }
|	||
dœ}|j                  |«       ŒK Œ— t        |d„ d	¬
«      }|r|d | }|S )NrG   rF   )rZ   r;   Útarget_sizesr   ÚscoresÚboxes)ÚscoreÚlabelÚboxc                 ó   — | d   S )Nra   r   )Úxs    r    ú<lambda>z=ZeroShotObjectDetectionPipeline.postprocess.<locals>.<lambda>Û   s
   € °°'±
€ r!   T)ÚkeyÚreverse)r   rP   Úpost_process_object_detectionÚnonzeroÚitemÚ_get_bounding_boxÚappendÚsorted)r   r[   r;   r<   r8   Úmodel_outputrb   rZ   Úindexra   rc   Úresults               r    Úpostprocessz+ZeroShotObjectDetectionPipeline.postprocessË   sî   € ØˆØ)ò 	'ˆLØ Ð!2Ñ3ˆEÜ*¨<Ó8ˆLØ×*Ñ*×HÑHØ$°	ÈÐUbÑHcð Ió àñˆGð ! Ñ*×2Ñ2Ó4ò '�Ø Ñ)¨%Ñ0×5Ñ5Ó7�Ø×,Ñ,¨W°WÑ-=¸eÑ-DÀQÑ-GÓH�à#(°5ÀÑE�Ø—‘˜vÕ&ñ'ð	'ô ˜Ñ&:ÀDÔIˆÙØ˜f˜u�oˆGàˆr!   rc   ztorch.Tensorc                 óZ   — |j                  «       j                  «       \  }}}}||||dœ}|S )a%  
        Turns list [xmin, xmax, ymin, ymax] into dict { "xmin": xmin, ... }

        Args:
            box (`torch.Tensor`): Tensor containing the coordinates in corners format.

        Returns:
            bbox (`dict[str, int]`): Dict containing the coordinates in corners format.
        )ÚxminÚyminÚxmaxÚymax)ÚintÚtolist)r   rc   rt   ru   rv   rw   Úbboxs          r    rl   z1ZeroShotObjectDetectionPipeline._get_bounding_boxá   s;   € ð "%§¡£×!1Ñ!1Ó!3Ñˆˆd�D˜$àØØØñ	
ˆð ˆr!   r&   )gš™™™™™¹?N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_load_processorÚ_load_image_processorÚ_load_feature_extractorÚ_load_tokenizerr   r   r   r3   r4   r   Údictr'   r?   rV   r\   rr   rx   rl   Ú__classcell__)r   s   @r    r   r      sl  ø„ ñð@ €OØ ÐØ#ÐØ€OôRð ð#Ø˜3 Ð-Ñ.ð#ØBEÈÈSÉ	Á/ð#Ø]`ð#à	ˆd�3˜�8‰nÑ	ò#ó ð#ð Øe˜d 4¨¨S¨¡>Ñ2Ðe¸cÐeÀdÈ4ÐPTÐUXÐZ]ÐU]ÑP^ÑK_ÑF`Òeó Øeð
 48ñVà�S˜-¨¨d°3¸°8©nÑ)=Ð=Ñ>ðVð   S¡	™/¨DÑ0ðVð ð	Vð
 
ˆd�3˜�8‰nÑ	  T¨$¨s°C¨x©.Ñ%9Ñ :Ñ	:õVòp	9óò&óð, ^ð ¸¸SÀ#¸X¹÷ r!   r   )Útypingr   r   r   Úutilsr   r   r	   r
   r   Úbaser   r   ÚPILr   Úimage_utilsr   r   rI   Útransformers.modeling_outputsr   Úmodels.auto.modeling_autor   Ú
get_loggerr{   Úloggerr   r   r!   r    ú<module>rŽ      sm   ðß 'Ñ 'ç kÕ kß 9ñ ÔÝç6áÔÛå=å^à	ˆ×	Ñ	˜HÓ	%€ñ Ñ,ÀÔFÓGô[ mó [ó Hñ[r!   