Ë
    ÛÓ^jˆq  ã            
       óä  — d Z ddlZddlmZ ddlZddlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZmZmZ dd
lmZmZmZmZmZmZ ddlmZmZ ddlmZmZmZ  G d„ ded¬«      Z 	 	 d$ddde!e"e"f   dz  de"dz  fd„Z#de!e$e"f   de%e"e"f   fd„Z&de'ejP                     de'e'e"      de%e'ejP                     e'e'e"      f   fd„Z)d„ Z*d%d„Z+	 	 	 d&de,de,d e%e"e"f   dz  fd!„Z-e G d"„ d#e	«      «       Z.d#gZ/y)'zImage processor class for EoMT.é    N)ÚUnion)Ú
functionalé   )ÚTorchvisionBackend)Ú'SemanticSegmentationPostProcessorOutput)ÚBatchFeature)Úget_size_with_aspect_ratioÚgroup_images_by_shapeÚreorder_images)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STDÚChannelDimensionÚ
ImageInputÚPILImageResamplingÚSizeDict)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstringÚfilter_out_non_signature_kwargsc                   ó,   — e Zd ZU dZeed<   edz  ed<   y)ÚEomtImageProcessorKwargsa{  
    do_split_image (`bool`, *optional*, defaults to `self.do_split_image`):
        Whether to split the input images into overlapping patches for semantic segmentation. If set to `True`, the
        input images will be split into patches of size `size["shortest_edge"]` with an overlap between patches.
        Otherwise, the input images will be padded to the target size.
    ignore_index (`int`, *optional*, defaults to `self.ignore_index`):
        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`.
    Údo_split_imageNÚignore_index)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚboolÚ__annotations__Úint© ó    úy/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/eomt/image_processing_eomt.pyr   r   *   s   … ñð ÓØ˜‘*Ôr#   r   F)ÚtotalÚsegmentation_mapútorch.TensorÚinstance_id_to_semantic_idr   c                 ór  — |�t        j                  | dk(  || dz
  «      } t        j                  | «      }|�|||k7     }|D �cg c]  }| |k(  ‘Œ	 }}|rt        j                  |d¬«      }n/t        j                  dg| j
                  ¢­| j                  ¬«      }|�vt        j                  |j
                  d   | j                  ¬«      }t        |«      D ]9  \  }}||�|j                  «       dz   n|j                  «          }|�|dz
  n|||<   Œ; n|}|j                  «       |j                  «       fS c c}w )Nr   é   ©Údim©Údevice)ÚtorchÚwhereÚuniqueÚstackÚzerosÚshaper.   Ú	enumerateÚitemÚfloatÚlong)	r&   r(   r   Ú
all_labelsÚiÚbinary_masksÚlabelsÚlabelÚclass_ids	            r$   Ú-convert_segmentation_map_to_binary_masks_fastr?   :   sE  € ð
 ÐÜ Ÿ;™;Ð'7¸1Ñ'<¸lÐL\Ð_`ÑL`ÓaÐä—‘Ð.Ó/€JàÐØ 
¨lÑ :Ñ;ˆ
à5?Ö@°Ð%¨Ó*Ð@€LÐ@ÙÜ—{‘{ <°QÔ7‰ä—{‘{ AÐ#?Ð(8×(>Ñ(>Ñ#?ÐHX×H_ÑH_Ô`ˆð "Ð-Ü—‘˜Z×-Ñ-¨aÑ0Ð9I×9PÑ9PÔQˆä! *Ó-ò 	O‰HˆAˆuØ1À|ÐG_°5·:±:³<À!Ò3CÐej×eoÑeoÓeqÑsˆHØ(4Ð(@˜ 1šÀhˆF�1ŠIñ	Oð ˆØ×ÑÓ §¡£Ð.Ð.ùò As   ÁD4Ú	size_dictÚreturnc                 ó&   — | d   }| d   xs |}||fS )z.Returns the height and width from a size dict.Úshortest_edgeÚlongest_edger"   )r@   Útarget_heightÚtarget_widths      r$   Úget_target_sizerG   Y   s&   € à˜oÑ.€MØ˜^Ñ,Ò=°€Là˜,Ð&Ð&r#   ÚpatchesÚoffsetsc                 ó”   — t        t        || «      «      }|j                  d„ ¬«       t        |Ž \  }}t        |«      t        |«      fS )z@Sorts patches and offsets according to the original image index.c                 ó   — | d   d   S )Nr   r"   )Úxs    r$   ú<lambda>z-reorder_patches_and_offsets.<locals>.<lambda>g   s   €   !¡ Q¡€ r#   )Úkey)ÚlistÚzipÚsort)rH   rI   ÚcombinedÚsorted_offsetsÚsorted_patchess        r$   Úreorder_patches_and_offsetsrU   a   sG   € ô
 ”C˜ Ó)Ó*€HØ‡M�MÑ'€MÔ(Ü%(¨( ^Ñ"€N�Nä�Ó¤ nÓ!5Ð5Ð5r#   c                 óÞ   — | j                   d   |j                   d   cxk(  r|j                   d   k(  st        d«      ‚ t        d«      ‚|j                  |«      ||kD  z  }| |   ||   ||   fS )a	  
    Binarize the given masks using `object_mask_threshold`, it returns the associated values of `masks`, `scores` and
    `labels`.

    Args:
        masks (`torch.Tensor`):
            A tensor of shape `(num_queries, height, width)`.
        scores (`torch.Tensor`):
            A tensor of shape `(num_queries)`.
        labels (`torch.Tensor`):
            A tensor of shape `(num_queries)`.
        object_mask_threshold (`float`):
            A number between 0 and 1 used to binarize the masks.
    Raises:
        `ValueError`: Raised when the first dimension doesn't match in all input tensors.
    Returns:
        `tuple[`torch.Tensor`, `torch.Tensor`, `torch.Tensor`]`: The `masks`, `scores` and `labels` without the region
        < `object_mask_threshold`.
    r   z1mask, scores and labels must have the same shape!)r4   Ú
ValueErrorÚne)ÚmasksÚscoresr<   Úobject_mask_thresholdÚ
num_labelsÚto_keeps         r$   Úremove_low_and_no_objectsr^   m   sy   € ð( �K‰K˜‰N˜fŸl™l¨1™oÔ@°·±¸a±Ò@ÜÐLÓMÐMð AÜÐLÓMÐMà�i‰i˜
Ó# vÐ0EÑ'EÑF€Gà�‰>˜6 '™?¨F°7©OÐ;Ð;r#   c                 óì   — | |k(  }|j                  «       }||   |k\  }|j                  «       }||z  }	|	j                  «       }
|dkD  xr |dkD  xr |
dkD  }|r||z  }|j                  «       |kD  sd}||	fS )Nr   F)Úsumr6   )Úmask_labelsÚ
mask_probsÚkÚmask_thresholdÚoverlap_mask_area_thresholdÚmask_kÚmask_k_areaÚoriginal_maskÚoriginal_areaÚ
final_maskÚfinal_mask_areaÚmask_existsÚ
area_ratios                r$   Úcheck_segment_validityrn   ‰   s•   € à˜AÑ€FØ—*‘*“,€Kð ˜q‘M ^Ñ3€MØ!×%Ñ%Ó'€Mà˜-Ñ'€JØ —n‘nÓ&€Oà ‘/ÒO m°aÑ&7ÒO¸OÈaÑ<O€KáØ  =Ñ0ˆ
Ø�‰Ó Ð#>Ò>ØˆKà˜
Ð"Ð"r#   rd   re   Útarget_sizec                 ób  — |€| j                   d   n|d   }|€| j                   d   n|d   }t        j                  ||ft        j                  | j                  ¬«      dz
  }	g }
| j                  «       } |d d …d d f   | z  j                  d«      }d}i }t        |j                   d   «      D ]~  }||   j                  «       }t        || |||«      \  }}|sŒ+|r||v r||v r	||   |	|<   Œ>|||<   ||	|<   t        ||   j                  «       d«      }|
j                  |||dœ«       |dz  }Œ€ |	|
fS )Nr*   r   é   )Údtyper.   é   ©ÚidÚlabel_idÚscore)r4   r/   r3   r8   r.   ÚsigmoidÚargmaxÚranger6   rn   ÚroundÚappend)rb   Úpred_scoresÚpred_labelsÚstuff_classesrd   re   ro   ÚheightÚwidthÚsegmentationÚsegmentsra   Úcurrent_segment_idÚstuff_memory_listrc   Ú
pred_classrl   rj   Úsegment_scores                      r$   Úcompute_segmentsrˆ   Ÿ   s€  € ð %0Ð$7ˆZ×Ñ˜aÒ ¸[È¹^€FØ#.Ð#6ˆJ×Ñ˜QÒ¸KÈ¹N€Eä—;‘; ¨˜´e·j±jÈ×IZÑIZÔ[Ð^_Ñ_€LØ€Hð ×#Ñ#Ó%€JØšq $¨˜}Ñ-°
Ñ:×BÑBÀ1ÓE€Kð ÐØ(*Ðä�;×$Ñ$ QÑ'Ó(ò  ˆØ  ‘^×(Ñ(Ó*ˆ
ô #9Ø˜ Q¨Ð8Só#
Ñˆ�Zñ Øá˜Z¨=Ñ8ØÐ.Ñ.Ø+<¸ZÑ+H�˜ZÑ(Øà0BÐ! *Ñ-à#5ˆ�ZÑ Ü˜k¨!™n×1Ñ1Ó3°QÓ7ˆØ�‰à(Ø&Ø&ñô	
ð 	˜aÑÑð7 ð8 ˜Ð!Ð!r#   c                   óÜ  ‡ — e Zd ZeZej                  ZeZ	e
ZdddœZdZdZdZdZdZdZdZdee   fˆ fd„Zdej.                  d	ed
ee   deeef   fd„Zdej.                  d	edej.                  fd„Ze	 	 d2dedeej.                     dz  de eef   dz  dee   de!f
ˆ fd„«       Z"	 d3dededz  de eef   dz  de#de$de%e&z  dz  de'e%df   dz  dee   de!fd„Z(ded   de#d	eddde#de)de#de#de#d e)ee)   z  dz  d!e)ee)   z  dz  d"e#dz  fd#„Z*d$ej.                  d%eeeeef      d&eeeef      d	e e%ef   deej.                     f
d'„Z+d$ej.                  d&eeeef      d	e e%ef   deej.                     fd(„Z,	 	 d4d&eeeef      d	e e%ef   dz  d)e#dd*fd+„Z-	 	 	 	 	 d5d&eeeef      d,e)d-e)d.e)d/ee   dz  d	e e%ef   dz  fd0„Z. e/«       	 	 d6d&eeeef      d,e)d	e e%ef   dz  fd1„«       Z0ˆ xZ1S )7ÚEomtImageProcessori€  ©rC   rD   FTNÚkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )Nr"   )ÚsuperÚ__init__)ÚselfrŒ   Ú	__class__s     €r$   r�   zEomtImageProcessor.__init__ä   s   ø€ Ü‰ÑÑ"˜6Ó"r#   ÚimagesÚsizeÚimage_indicesrA   c                 óþ  — g g }}|j                   \  }}}}|j                  }	t        ||«      }
t        j                  |
|	z  «      }||	z  |
z
  }|dkD  r||dz
  z  nd}t        |«      D ]�  }t        ||	|z
  z  «      }||	z   }||kD  r|dd…dd…||…dd…f   }n|dd…dd…dd…||…f   }t        t        j                  |d¬«      «      D ]-  \  }}|j                  |«       |j                  ||   ||g«       Œ/ Œ’ ||fS )zCSlices an image into overlapping patches for semantic segmentation.r*   r   Nr+   )r4   rC   ÚmaxÚmathÚceilrz   r!   r5   r/   Úunbindr|   )r�   r’   r“   r”   rH   Úpatch_offsetsÚ_r€   r�   Ú
patch_sizeÚlonger_sideÚnum_patchesÚtotal_overlapÚoverlap_per_patchr:   ÚstartÚendÚbatch_patchÚ	batch_idxÚsingles                       r$   Ú_split_imagezEomtImageProcessor._split_imageç   s3  € ð "$ R�ˆà$Ÿl™lÑˆˆ1ˆf�eØ×'Ñ'ˆ
ä˜& %Ó(ˆÜ—i‘i ¨jÑ 8Ó9ˆØ# jÑ0°;Ñ>ˆØALÈqÂ˜M¨[¸1©_Ò=ÐVWÐä�{Ó#ò 	MˆAÜ˜˜ZÐ*;Ñ;Ñ<Ó=ˆEØ˜*Ñ$ˆCà˜Š~Ø$¢Qª¨5°¨9²aÐ%7Ñ8‘à$¢Qªª1¨e°C¨iÐ%7Ñ8�ä%.¬u¯|©|¸KÈQÔ/OÓ%Pò MÑ!�	˜6Ø—‘˜vÔ&Ø×$Ñ$ m°IÑ&>ÀÀsÐ%KÕLñMð	Mð ˜Ð%Ð%r#   c                 ó0  — |j                   \  }}}}t        |j                  |j                  xs |j                  dœ«      \  }}t	        d||z
  «      }t	        d||z
  «      }	d|	d|f}
t
        j                  j                  j                  ||
dd¬«      }|S )z5Pads the image to the target size using zero padding.r‹   r   Úconstantg        )ÚmodeÚvalue)	r4   rG   rC   rD   r–   r/   Únnr   Úpad)r�   r’   r“   r›   r€   r�   rE   rF   Úpad_hÚpad_wÚpaddingÚpadded_imagess               r$   Ú_padzEomtImageProcessor._pad  sŸ   € à$Ÿl™lÑˆˆ1ˆf�eä&5Ø"×0Ñ0À$×BSÑBSÒBiÐW[×WiÑWiÑjó'
Ñ#ˆ�|ô �A�} vÑ-Ó.ˆÜ�A�| eÑ+Ó,ˆØ�e˜Q Ð&ˆäŸ™×+Ñ+×/Ñ/°¸ÀjÐX[Ð/Ó\ˆØÐr#   Úsegmentation_mapsr(   c                 ó(   •— t        ‰| �  |||fi |¤ŽS )a'  
        segmentation_maps (`ImageInput`, *optional*):
            The segmentation maps to preprocess for corresponding images.
        instance_id_to_semantic_id (`list[dict[int, int]]` or `dict[int, int]`, *optional*):
            A mapping between object instance ids and class ids.
        )rŽ   Ú
preprocess)r�   r’   r²   r(   rŒ   r‘   s        €r$   r´   zEomtImageProcessor.preprocess  s!   ø€ ô ‰wÑ! &Ð*;Ð=WÑbÐ[aÑbÐbr#   Údo_convert_rgbÚinput_data_formatÚreturn_tensorsr.   ztorch.devicec                 óf  — | j                  ||||¬«      }|j                  dd«      }	|j                  «       }
i } | j                  |fi |
¤Ž\  }}||d<   ||d<   |��| j                  |ddt        j
                  ¬«      }|j                  «       }|j                  ddt        j                  d	œ«        | j                  dd
|i|¤Ž\  }}|D �cg c]0  }|j                  d«      j                  t        j                  «      ‘Œ2 }}g g }}t        |«      D ]P  \  }}t        |t        «      r||   }n|}t!        |||	¬«      \  }}|j#                  |«       |j#                  |«       ŒR ||d<   ||d<   |r&|D �cg c]  }t        j$                  |«      ‘Œ c}|d<   t'        ||g d¢¬«      S c c}w c c}w )z/
        Preprocess image-like inputs.
        )r’   rµ   r¶   r.   r   NÚpixel_valuesrš   rq   F)r’   Úexpected_ndimsrµ   r¶   )Údo_normalizeÚ
do_rescaleÚresampler’   r   )r   ra   Úclass_labels)rš   ra   r¾   )ÚdataÚtensor_typeÚskip_tensor_conversionr"   )Ú_prepare_image_like_inputsÚpopÚcopyÚ_preprocessr   ÚFIRSTÚupdater   ÚNEARESTÚsqueezeÚtor/   Úint64r5   Ú
isinstancerO   r?   r|   Útensorr   )r�   r’   r²   r(   rµ   r¶   r·   r.   rŒ   r   Úimages_kwargsr¿   Úprocessed_imagesrš   Úprocessed_segmentation_mapsÚsegmentation_maps_kwargsr›   r&   ra   r¾   ÚidxÚinstance_idrY   ÚclassesrI   s                            r$   Ú_preprocess_image_like_inputsz0EomtImageProcessor._preprocess_image_like_inputs!  s  € ð ×0Ñ0Ø¨.ÐL]Ðflð 1ó 
ˆð —z‘z .°$Ó7ˆØŸ™›ˆØˆØ*:¨$×*:Ñ*:¸6Ñ*SÀ]Ñ*SÑ'Ð˜-Ø/ˆˆ^ÑØ -ˆˆ_ÑàÑ(Ø*.×*IÑ*IØ(Ø Ø$Ü"2×"8Ñ"8ð	 +Jó +Ð'ð (.§{¡{£}Ð$Ø$×+Ñ+à$)Ø"'ä 2× :Ñ :ñ	ôð .>¨T×-=Ñ-=ñ .Ø2ð.Ø6Nñ.Ñ*Ð'¨ð Upö+Ø@PÐ ×(Ñ(¨Ó+×.Ñ.¬u¯{©{Õ;ð+Ð'ð +ð )+¨B˜ˆKÜ)2Ð3NÓ)Oò -Ñ%�Ð%ÜÐ8¼$Ô?Ø"<¸SÑ"A‘Kà"<�Kä!NØ$ØØ!-ô"‘��wð ×"Ñ" 5Ô)Ø×#Ñ# GÕ,ð-ð  #.ˆD�ÑØ#/ˆD�Ñ áØJWÖ$X¸w¤U§\¡\°'Õ%:Ò$XˆD�Ñ!äØØ&Ú#Sô
ð 	
ùò7+ùò2 %Ys   Ã5F)Å7F.r'   Ú	do_resizer½   z7PILImageResampling | tvF.InterpolationMode | int | Noner¼   Úrescale_factorr»   r   Údo_padÚ
image_meanÚ	image_stdÚdisable_groupingc           	      óR  — g }t        ||¬«      \  }}i }|j                  «       D ]   \  }}|r| j                  |||¬«      }|||<   Œ" t        ||«      }|r t        ||¬«      \  }}g g }}|j                  «       D ]j  \  }}|j                  «       D ���cg c]  \  }\  }}||k(  sŒ|‘Œ }}}}| j	                  |||«      \  }}|j                  |«       |j                  |«       Œl t        ||«      \  }}|	rOt        ||¬«      \  }}|j                  «       D ��ci c]  \  }}|| j                  ||«      “Œ }}}t        ||«      }t        ||¬«      \  }}i }|j                  «       D ]   \  }}| j                  |||||
|«      }|||<   Œ" t        ||«      }||fS c c}}}w c c}}w )z4Preprocesses the input images and masks if provided.)rÛ   )Úimager“   r½   )	r
   ÚitemsÚresizer   r¦   ÚextendrU   r±   Úrescale_and_normalize)r�   r’   rÖ   r“   r½   r¼   r×   r»   r   rØ   rÙ   rÚ   rÛ   rŒ   rš   Úgrouped_imagesÚgrouped_images_indexÚresized_images_groupedr4   Ústacked_imagesrH   Úoriginal_idxÚ	img_shaper›   Úoriginal_indicesÚsplit_patchesrI   Úpadded_groupedÚprocessed_images_groupedrÏ   s                                 r$   rÅ   zEomtImageProcessor._preprocesso  s  € ð" ˆä/DÀVÐ^nÔ/oÑ,ˆÐ,Ø!#ÐØ%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%§¡°>ÈÐW_ Ó!`�Ø,:Ð" 5Ò)ð	;ô  Ð 6Ð8LÓMˆáÜ3HÈÐbrÔ3sÑ0ˆNÐ0Ø%'¨�]ˆGØ)7×)=Ñ)=Ó)?ò .Ñ%��~àEY×E_ÑE_ÓEa÷$ð $Ù%A \±>°I¸qÐenÐrwÓew’Lð$Ð ò $ð *.×):Ñ):¸>È4ÐQaÓ)bÑ&�˜wØ—‘˜}Ô-Ø×$Ñ$ WÕ-ð.ô %@ÀÈÓ$WÑ!ˆF�MáÜ3HÈÐbrÔ3sÑ0ˆNÐ0àTb×ThÑThÓTj÷Ù;P¸5À.��t—y‘y °Ó6Ñ6ðˆNñ ô $ NÐ4HÓIˆFä/DÀVÐ^nÔ/oÑ,ˆÐ,Ø#%Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>Ø!×7Ñ7Ø 
¨N¸LÈ*ÐV_óˆNð /=Ð$ UÒ+ð		=ô
 *Ð*BÐDXÓYÐà Ð.Ð.ùô1$ùós   ÂF
Â%F
ÄF#Úsegmentation_logitsrš   Útarget_sizesc                 óT  — |j                   d   }g }g }|D ]~  }t        ||d   |d   «      \  }	}
|j                  t        j                  ||	|
f|j
                  ¬«      «       |j                  t        j                  ||	|
f|j
                  ¬«      «       Œ€ t        |«      D ]…  \  }\  }}}||   d   ||   d   kD  r6||   dd…||…dd…fxx   ||   z  cc<   ||   dd…||…dd…fxx   dz  cc<   ŒQ||   dd…dd…||…fxx   ||   z  cc<   ||   dd…dd…||…fxx   dz  cc<   Œ‡ g }t        t        ||«      «      D ]d  \  }\  }}||j                  d¬«      z  }t        j                  j                  j                  |d   ||   d	d
¬«      d   }|j                  |«       Œf |S )a¾  
        Reconstructs full-size semantic segmentation logits from patch predictions.

        Args:
            segmentation_logits (`torch.Tensor`):
                A tensor of shape `(num_patches, num_classes, patch_height, patch_width)` representing predicted logits
                for each image patch.
            patch_offsets (`list[tuple[int, int, int]]`):
                A list of tuples where each tuple contains:
                - `image_index` (int): Index of the original image this patch belongs to.
                - `start` (int): Start pixel index of the patch along the long dimension (height or width).
                - `end` (int): End pixel index of the patch along the long dimension.
            target_sizes (`list[tuple[int, int]]`):
                list of original (height, width) dimensions for each image before preprocessing.
            size (`dict[str, int]`):
                A size dict which was used to resize.
        r*   rC   rD   r-   r   N)Úmin©N.ÚbilinearF©r“   r©   Úalign_corners)r4   r	   r|   r/   r3   r.   r5   rP   Úclampr«   r   Úinterpolate)r�   rì   rš   rí   r“   Únum_classesÚaggregated_logitsÚpatch_countsÚ
image_sizer€   r�   Ú	patch_idxÚ	image_idxÚpatch_startÚ	patch_endÚreconstructed_logitsrÒ   Ú	logit_sumÚcountÚaveraged_logitsÚresized_logitss                        r$   Úmerge_image_patchesz&EomtImageProcessor.merge_image_patches¨  s	  € ð0 *×/Ñ/°Ñ2ˆØÐØˆà&ò 	nˆJÜ6°zÀ4ÈÑCXÐZ^Ð_mÑZnÓo‰MˆF�EØ×$Ñ$¤U§[¡[°+¸vÀuÐ1MÐVi×VpÑVpÔ%qÔrØ×Ñ¤§¡¨[¸&À%Ð,HÐQd×QkÑQkÔ lÕmð	nô ?HÈÓ>Vò 	JÑ:ˆIÑ:˜	 ;°	Ø˜IÑ& qÑ)¨L¸Ñ,CÀAÑ,FÒFØ! )Ñ,ªQ°¸IÐ0EÂqÐ-HÓIÐM`ÐajÑMkÑkÓIØ˜YÑ'ª¨;°yÐ+@Â!Ð(CÓDÈÑIÔDà! )Ñ,ªQ²°;¸yÐ3HÐ-HÓIÐM`ÐajÑMkÑkÓIØ˜YÑ'ªª1¨k¸)Ð.CÐ(CÓDÈÑIÔDð	Jð  "ÐÜ'0´Ð5FÈÓ1UÓ'Vò 		8Ñ#ˆCÑ#�)˜UØ'¨%¯+©+¸!¨+Ó*<Ñ<ˆOÜ"ŸX™X×0Ñ0×<Ñ<Ø 	Ñ*Ø! #Ñ&ØØ#ð	 =ó ð
 ñˆNð !×'Ñ'¨Õ7ð		8ð $Ð#r#   c                 ó  — g }t        |«      D ]p  \  }}t        ||d   |d   «      \  }}||   dd…d|…d|…f   }	t        j                  j                  j                  |	d   |dd¬«      d   }
|j                  |
«       Œr |S )	zJRestores panoptic segmentation logits to their original image resolutions.rC   rD   Nrð   rñ   Frò   r   )r5   r	   r/   r«   r   rõ   r|   )r�   rì   rí   r“   r  rÒ   Úoriginal_sizerE   rF   Úcropped_logitsÚupsampled_logitss              r$   Úunpad_imagezEomtImageProcessor.unpad_imageá  s²   € ð ˆä"+¨LÓ"9ò 	4ÑˆC�Ü*DØ˜t OÑ4°d¸>Ñ6Jó+Ñ'ˆM˜<ð 1°Ñ5²a¸¸-¸ÈÈ,ÈÐ6VÑWˆNÜ$Ÿx™x×2Ñ2×>Ñ>Ø˜yÑ)°ÀJÐ^cð  ?ó  àñ Ðð ×!Ñ!Ð"2Õ3ð	4ð Ðr#   Úreturn_segmentation_scoreszBlist[torch.Tensor] | list[SemanticSegmentationPostProcessorOutput]c                 ó  — |�|n| j                   }|j                  }|j                  }|j                  }t	        |«      }t
        j                  j                  j                  ||d¬«      }|j                  d¬«      ddd…f   }	|j                  «       }
t        j                  d|	|
«      }|r| j                  ||||«      }nrg }t        t        |«      «      D ]Y  }t
        j                  j                  j                  ||   j                  d¬«      ||   dd	¬
«      }|j!                  |d   «       Œ[ |D �cg c]!  }t#        |j%                  d¬«      |dœ¬«      ‘Œ# }}|s|D �cg c]  }|j&                  ‘Œ }}|S c c}w c c}w )a@  
        Converts the output of [`EomtForUniversalSegmentation`] into semantic segmentation maps.

        Args:
            outputs ([`EomtForUniversalSegmentation`]):
                Raw outputs of the model.
            target_sizes (`list[tuple[int, int]]`):
                A list of tuples (`tuple[int, int]`) containing the target size (height, width) of each image in the
                batch.
            size (`dict[str, int]`, *optional*):
                The size to which the intermediate masks are interpolated. Defaults to `self.size`.
            return_segmentation_scores (`bool`, *optional*, defaults to `False`):
                Whether to return segmentation scores alongside the segmentation map. When `True`, each element of
                the returned list is a [`SemanticSegmentationPostProcessorOutput`] with fields `segmentation`
                (class IDs, shape `(height, width)`) and `segmentation_scores` (shape `(num_classes, height, width)`).

        Returns:
            `list[torch.Tensor]` or `list[SemanticSegmentationPostProcessorOutput]`: When
            `return_segmentation_scores=False` (default), a list of length `batch_size` where each item is a
            segmentation map of shape `(height, width)` with class IDs. When `return_segmentation_scores=True`,
            a list of [`SemanticSegmentationPostProcessorOutput`] with fields `segmentation` (class IDs, shape
            `(height, width)`) and `segmentation_scores` (shape `(num_classes, height, width)`). In both cases,
            `(height, width)` corresponds to the target size.
        Nrñ   ©r“   r©   éÿÿÿÿr+   .zbqc, bqhw -> bchwr   Frò   )r‚   Úsegmentation_scores)r¿   )r“   Úmasks_queries_logitsÚclass_queries_logitsrš   rG   r/   r«   r   rõ   Úsoftmaxrx   Úeinsumr  rz   ÚlenÚ	unsqueezer|   r   ry   r‚   )r�   Úoutputsrí   r“   r	  r  r  rš   Úoutput_sizeÚmasks_classesÚmasks_probsrì   Úoutput_logitsrÒ   r  ÚlogitÚsemantic_segmentationr6   s                     r$   Ú"post_process_semantic_segmentationz5EomtImageProcessor.post_process_semantic_segmentationö  s­  € ð> Ð'‰t¨T¯Y©Yˆà&×;Ñ;ÐØ&×;Ñ;ÐØ×-Ñ-ˆä% dÓ+ˆÜ$Ÿx™x×2Ñ2×>Ñ>Ø ØØð  ?ó  
Ðð -×4Ñ4¸Ð4Ó<¸SÀ#À2À#¸XÑFˆØ*×2Ñ2Ó4ˆä#Ÿl™lÐ+>ÀÈ{Ó[ÐáØ ×4Ñ4Ð5HÈ-ÐYeÐgkÓl‰MàˆMäœSÐ!4Ó5Ó6ò 8�Ü!&§¡×!4Ñ!4×!@Ñ!@Ø'¨Ñ,×6Ñ6¸1Ð6Ó=Ø% cÑ*Ø#Ø"'ð	 "Aó "�ð ×$Ñ$ ^°AÑ%6Õ7ð8ð 'ö	!
ð ô 4Ø&+§l¡l°q lÓ&9ÐRWÑXöð!
Ðð !
ñ *ØCXÖ$Y¸4 T×%6Ó%6Ð$YÐ!Ð$Yà$Ð$ùò!
ùò %Zs   Ä9&E>Å'FÚ	thresholdrd   re   r   c                 óä  — |�|n| j                   }|j                  }|j                  }	|	j                  d   }
|	j                  d   dz
  }t	        |«      }t
        j                  j                  j                  ||d¬«      }| j                  |||«      }|	j                  d¬«      j                  d«      \  }}g }t        |
«      D ]¨  }t        ||   ||   ||   ||«      \  }}}|j                  d   dk  rH|�||   n|j                  dd \  }}t        j                  ||f«      dz
  }|j                  |g dœ«       Œyt!        |||||||�||   nd¬	«      \  }}|j                  ||dœ«       Œª |S )
zIPost-processes model outputs into final panoptic segmentation prediction.Nr   r  r*   rñ   r  r+   ©r‚   Úsegments_info)rb   r}   r~   r   rd   re   ro   )r“   r  r  r4   rG   r/   r«   r   rõ   r  r  r–   rz   r^   r3   r|   rˆ   )r�   r  rí   r  rd   re   r   r“   r  r  Ú
batch_sizer\   r  Úmask_probs_batchÚpred_scores_batchÚpred_labels_batchÚresultsr:   rb   r}   r~   r€   r�   r‚   rƒ   s                            r$   Ú"post_process_panoptic_segmentationz5EomtImageProcessor.post_process_panoptic_segmentationB  s»  € ð Ð'‰t¨T¯Y©Yˆà&×;Ñ;ÐØ&×;Ñ;Ðà)×/Ñ/°Ñ2ˆ
Ø)×/Ñ/°Ñ3°aÑ7ˆ
ä% dÓ+ˆÜ$Ÿx™x×2Ñ2×>Ñ>Ø ØØð  ?ó  
Ðð  ×+Ñ+Ð,@À,ÐPTÓUÐØ/C×/KÑ/KÐPRÐ/KÓ/S×/WÑ/WÐXZÓ/[Ñ,ÐÐ,àˆä�zÓ"ò 	VˆAÜ3LØ  Ñ#Ð%6°qÑ%9Ð;LÈQÑ;OÐQZÐ\fó4Ñ0ˆJ˜ [ð
 ×Ñ Ñ" aÒ'Ø3?Ð3K ¨Q¢ÐQ[×QaÑQaÐbcÐbdÐQe‘�˜Ü$Ÿ{™{¨F°E¨?Ó;¸aÑ?�Ø—‘°ÈrÑRÔSØä%5Ø%Ø'Ø'Ø+Ø-Ø,GØ/;Ð/G˜L¨šOÈTô&Ñ"ˆL˜(ð �N‰N¨LÈ8ÑTÕUð-	Vð. ˆr#   c           
      óh  — |�|n| j                   }|j                  }|j                  }t        |«      }t        j
                  j                  j                  ||d¬«      }| j                  |||«      }|j                  }	|j                  d   }
|j                  d   }g }t        |
«      D �]„  }||   }||   }|j                  d¬«      ddd…f   j                  d«      \  }}|dkD  j                  «       }|j                  «       j!                  d	«      |j!                  d	«      z  j#                  d	«      |j!                  d	«      j#                  d	«      d
z   z  }||z  }t	        j$                  ||   |	¬«      d	z
  }g g }}d}t        |«      D ]‹  }||   j'                  «       }t	        j(                  ||   dk(  «      rŒ2||k\  sŒ8||||   d	k(  <   |j+                  |||   j'                  «       t-        |d«      dœ«       |d	z  }|j+                  ||   «       Œ� |j+                  ||dœ«       �Œ‡ |S )zDPost-processes model outputs into Instance Segmentation Predictions.Nrñ   r  r   éþÿÿÿr  r+   .r*   g�íµ ÷Æ°>r-   rs   rt   r  )r“   r  r  rG   r/   r«   r   rõ   r  r.   r4   rz   r  r–   r7   rx   Úflattenr`   r3   r6   Úallr|   r{   )r�   r  rí   r  r“   r  r  r  r!  r.   r   Únum_queriesr$  r:   Ú	mask_predÚ
mask_classrZ   Úpred_classesÚ
pred_masksÚmask_scoresr}   r‚   Úinstance_mapsrƒ   r„   Újrw   s                              r$   Ú"post_process_instance_segmentationz5EomtImageProcessor.post_process_instance_segmentation{  sa  € ð Ð'‰t¨T¯Y©Yˆà&×;Ñ;ÐØ&×;Ñ;Ðä% dÓ+ˆÜ$Ÿx™x×2Ñ2×>Ñ>Ø ØØð  ?ó  
Ðð  ×+Ñ+Ð,@À,ÐPTÓUÐà%×,Ñ,ˆØ)×/Ñ/°Ñ2ˆ
Ø*×0Ñ0°Ñ4ˆàˆä�zÓ"ó !	VˆAØ(¨Ñ+ˆIØ-¨aÑ0ˆJð $.×#5Ñ#5¸"Ð#5Ó#=¸cÀ3ÀBÀ3¸hÑ#G×#KÑ#KÈBÓ#OÑ ˆF�LØ# a™-×.Ñ.Ó0ˆJð %×,Ñ,Ó.×6Ñ6°qÓ9¸J×<NÑ<NÈqÓ<QÑQ×VÑVÐWXÓYØ×"Ñ" 1Ó%×)Ñ)¨!Ó,¨tÑ3ñˆKð ! ;Ñ.ˆKä Ÿ;™; |°A¡¸vÔFÈÑJˆLà&(¨"˜8ˆMØ!"ÐÜ˜;Ó'ò 8�Ø# A™×+Ñ+Ó-�ä—y‘y ¨A¡°!Ñ!3Õ4¸À)Ó9KØ7I�L ¨A¡°!Ñ!3Ñ4Ø—O‘Oà"4Ø(4°Q©×(<Ñ(<Ó(>Ü%*¨5°!£_ñôð '¨!Ñ+Ð&Ø!×(Ñ(¨°A©Õ7ð8ð �N‰N¨LÈ8ÑTÖUðC!	VðD ˆr#   ©NN)N)NF)çš™™™™™é?ç      à?r4  NN)r4  N)2r   r   r   r   Úvalid_kwargsr   ÚBILINEARr½   r   rÙ   r   rÚ   r“   Údefault_to_squarerÖ   r¼   r»   r   rØ   r   r   r�   r/   ÚTensorr   rO   r!   Útupler¦   r±   r   r   Údictr   r´   r   r   Ústrr   r   rÕ   r7   rÅ   r  r  r  r%  r   r2  Ú__classcell__)r‘   s   @r$   rŠ   rŠ   Õ   sD  ø„ à+€LØ!×*Ñ*€HØ&€JØ$€IØ °#Ñ6€DØÐØ€IØ€JØ€LØ€NØ€FØ€Lð# Ð(@Ñ!Aõ #ð& 5§<¡<ð &°xð &ÐPTÐUXÑPYð &Ð^cÐdhÐjnÐdnÑ^oó &ð8˜5Ÿ<™<ð ¨xð ¸E¿L¹Ló ð ð 8<Ø<@ñ	càðcð   §¡Ñ-°Ñ4ðcð %)¨¨c¨¡N°TÑ$9ð	cð
 Ð1Ñ2ðcð 
ôcó ðcð. 59ñL
àðL
ð &¨Ñ,ðL
ð %)¨¨c¨¡N°TÑ$9ð	L
ð
 ðL
ð ,ðL
ð ˜jÑ(¨4Ñ/ðL
ð �c˜>Ð)Ñ*¨TÑ1ðL
ð Ð1Ñ2ðL
ð 
óL
ð\7/à�^Ñ$ð7/ð ð7/ð ð	7/ð
 Lð7/ð ð7/ð ð7/ð ð7/ð ð7/ð ð7/ð ˜D ™KÑ'¨$Ñ.ð7/ð ˜4 ™;Ñ&¨Ñ-ð7/ð  ™+ó7/ðr7$à"Ÿ\™\ð7$ð ˜E # s¨C -Ñ0Ñ1ð7$ð ˜5  c ™?Ñ+ð	7$ð
 �3˜�8‰nð7$ð 
ˆe�l‰lÑ	ó7$ðrà"Ÿ\™\ðð ˜5  c ™?Ñ+ðð �3˜�8‰nð	ð
 
ˆe�l‰lÑ	óð2 '+Ø+0ñJ%ð ˜5  c ™?Ñ+ðJ%ð �3˜�8‰n˜tÑ#ð	J%ð
 %)ðJ%ð 
NóJ%ð` Ø #Ø-0Ø*.Ø&*ñ7ð ˜5  c ™?Ñ+ð7ð ð	7ð
 ð7ð &+ð7ð ˜C‘y 4Ñ'ð7ð �3˜�8‰n˜tÑ#ó7ñr %Ó&ð
 Ø&*ñ?ð ˜5  c ™?Ñ+ð?ð ð	?ð
 �3˜�8‰n˜tÑ#ò?ó 'ô?r#   rŠ   r3  )r5  r4  )r5  r4  N)0r   r—   Útypingr   r/   Útorchvision.transforms.v2r   ÚtvFÚimage_processing_backendsr   Úimage_processing_outputsr   Úimage_processing_utilsr   Úimage_transformsr	   r
   r   Úimage_utilsr   r   r   r   r   r   Úprocessing_utilsr   r   Úutilsr   r   r   r   r;  r!   r?   r<  r:  rG   rO   r9  rU   r^   rn   r7   rˆ   rŠ   Ú__all__r"   r#   r$   ú<module>rI     s`  ðñ &ã Ý ã Ý 7å ;Ý OÝ 2ß aÑ a÷÷ ÷ 5÷ñ ô˜|°5õ ð$ 9=Ø#ñ/Ø$ð/à $ S¨# X¡°Ñ 5ð/ð ˜‘*ó/ð>'˜t C¨ H™~ð '°%¸¸S¸±/ó 'ð	6Ø�%—,‘,Ñð	6Ø*.¨t°C©y©/ð	6à
ˆ4�—‘Ñ˜t D¨¡I™Ð.Ñ/ó	6ò<ó8#ð6  Ø),Ø*.ñ3"ð
 ð3"ð "'ð3"ð �s˜C�x‘ 4Ñ'ó3"ðl ôeÐ+ó eó ðeðP  Ð
 �r#   