Ë
    ÛÓ^j¦)  ã                   óò   — d Z ddlmZ ddlZddlmc m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 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!e G d„ de«      «       Z"dgZ#y)zImage processor class for BEiT.é    )ÚUnionN)Ú
functionalé   )ÚTorchvisionBackend)Ú'SemanticSegmentationPostProcessorOutput)ÚBatchFeature)Úgroup_images_by_shapeÚreorder_images)ÚIMAGENET_STANDARD_MEANÚIMAGENET_STANDARD_STDÚChannelDimensionÚ
ImageInputÚPILImageResamplingÚSizeDict)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstringÚis_torch_availablec                   ó   — e Zd ZU dZeed<   y)ÚBeitImageProcessorKwargsak  
    do_reduce_labels (`bool`, *optional*, defaults to `self.do_reduce_labels`):
        Whether or not to reduce all label values of segmentation maps by 1. Usually used for datasets where 0
        is used for background, and background itself is not included in all classes of a dataset (e.g.
        ADE20k). The background label will be replaced by 255.
    Údo_reduce_labelsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚboolÚ__annotations__© ó    úy/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/beit/image_processing_beit.pyr   r   &   s   … ñð Ôr    r   F)Útotalc                   ó¸  ‡ — e Zd ZdZeZej                  Ze	Z
eZdddœZdZdddœZdZdZdZdZdZdee   fˆ fd„Ze	 d(d	ed
edz  dee   defˆ fd„«       Z	 d(d	ed
edz  dededeez  dz  deedf   dz  defd„Z de!d   de!d   fd„Z"	 d)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  d"ede!d   fd#„Z%	 d*d$e!e&   dz  d%edd&fd'„Z'ˆ xZ(S )+ÚBeitImageProcessorz/PIL backend for BEiT with reduce_label support.éà   )ÚheightÚwidthTFÚkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )Nr   )ÚsuperÚ__init__)Úselfr(   Ú	__class__s     €r!   r+   zBeitImageProcessor.__init__C   s   ø€ Ü‰ÑÑ"˜6Ó"r    NÚimagesÚsegmentation_mapsÚreturnc                 ó&   •— t        ‰| �  ||fi |¤ŽS )zp
        segmentation_maps (`ImageInput`, *optional*):
            The segmentation maps to preprocess.
        )r*   Ú
preprocess)r,   r.   r/   r(   r-   s       €r!   r2   zBeitImageProcessor.preprocessF   s   ø€ ô ‰wÑ! &Ð*;ÑF¸vÑFÐFr    Údo_convert_rgbÚinput_data_formatÚreturn_tensorsÚdeviceztorch.devicec                 óä  — | j                  ||||¬«      }|j                  «       }d|d<   i }	 | j                  |fi |¤Ž|	d<   |�›| j                  |ddt        j                  ¬«      }
|j                  «       }|j                  dddœ«        | j                  dd|
i|¤Ž}
|
D �cg c]0  }|j                  d	«      j                  t        j                  «      ‘Œ2 }
}|
|	d
<   t        |	|¬«      S c c}w )z"Handle extra inputs beyond images.)r.   r3   r4   r6   Fr   Úpixel_valuesé   )r.   Úexpected_ndimsr3   r4   )Údo_normalizeÚ
do_rescaler.   r   Úlabels)ÚdataÚtensor_typer   )Ú_prepare_image_like_inputsÚcopyÚ_preprocessr   ÚFIRSTÚupdateÚsqueezeÚtoÚtorchÚint64r   )r,   r.   r/   r3   r4   r5   r6   r(   Úimages_kwargsr>   Úprocessed_segmentation_mapsÚsegmentation_maps_kwargsÚprocessed_segmentation_maps                r!   Ú_preprocess_image_like_inputsz0BeitImageProcessor._preprocess_image_like_inputsS   s+  € ð ×0Ñ0Ø¨.ÐL]Ðflð 1ó 
ˆð Ÿ™›ˆØ,1ˆÐ(Ñ)ØˆØ/˜t×/Ñ/°ÑH¸-ÑHˆˆ^Ñð Ð(Ø*.×*IÑ*IØ(Ø Ø$Ü"2×"8Ñ"8ð	 +Jó +Ð'ð (.§{¡{£}Ð$Ø$×+Ñ+¸UÐRWÑ,XÔYØ*:¨$×*:Ñ*:ñ +Ø2ð+Ø6Nñ+Ð'ð 3Nö+à.ð +×2Ñ2°1Ó5×8Ñ8¼¿¹ÕEð+Ð'ð +ð 9ˆD�‰Nä °>ÔBÐBùò+s   Â$5C-r=   ztorch.Tensorc           	      óf  — t        t        |«      «      D ]™  }||   }t        j                  |dk(  t        j                  d|j
                  |j                  ¬«      |«      }|dz
  }t        j                  |dk(  t        j                  d|j
                  |j                  ¬«      |«      }|||<   Œ› |S )z/Reduce label values by 1, replacing 0 with 255.r   éÿ   )Údtyper6   é   éþ   )ÚrangeÚlenrG   ÚwhereÚtensorrP   r6   )r,   r=   ÚidxÚlabels       r!   Úreduce_labelzBeitImageProcessor.reduce_label   sš   € äœ˜V›Ó%ò 	 ˆCØ˜3‘KˆEÜ—K‘K ¨¡
¬E¯L©L¸ÀEÇKÁKÐX]×XdÑXdÔ,eÐglÓmˆEØ˜A‘IˆEÜ—K‘K ¨¡¬e¯l©l¸3ÀeÇkÁkÐZ_×ZfÑZfÔ.gÐinÓoˆEØˆF�3ŠKð	 ð ˆr    Ú	do_resizeÚsizeÚresamplez7PILImageResampling | tvF.InterpolationMode | int | NoneÚdo_center_cropÚ	crop_sizer<   Úrescale_factorr;   Ú
image_meanÚ	image_stdÚdisable_groupingr   c           	      ó–  — |r| j                  |«      }t        ||¬«      \  }}i }|j                  «       D ]  \  }}|r| j                  |||«      }|||<   Œ! t	        ||«      }t        ||¬«      \  }}i }|j                  «       D ]4  \  }}|r| j                  ||«      }| j                  ||||	|
|«      }|||<   Œ6 t	        ||«      }|S )zCustom preprocessing for BEiT.)rb   )rY   r	   ÚitemsÚresizer
   Úcenter_cropÚrescale_and_normalize)r,   r.   rZ   r[   r\   r]   r^   r<   r_   r;   r`   ra   rb   r   r(   Úgrouped_imagesÚgrouped_images_indexÚresized_images_groupedÚshapeÚstacked_imagesÚresized_imagesÚprocessed_images_groupedÚprocessed_imagess                          r!   rB   zBeitImageProcessor._preprocess‰   s  € ñ$ Ø×&Ñ& vÓ.ˆFô 0EÀVÐ^nÔ/oÑ,ˆÐ,Ø!#ÐØ%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%§¡¨^¸TÀ8Ó!L�Ø,:Ð" 5Ò)ð	;ô (Ð(>Ð@TÓUˆô 0EÀ^ÐfvÔ/wÑ,ˆÐ,Ø#%Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>ÙØ!%×!1Ñ!1°.À)Ó!L�à!×7Ñ7Ø 
¨N¸LÈ*ÐV_óˆNð /=Ð$ UÒ+ð	=ô *Ð*BÐDXÓYÐàÐr    Útarget_sizesÚreturn_segmentation_scoreszBlist[torch.Tensor] | list[SemanticSegmentationPostProcessorOutput]c                 óÄ  — t        «       st        d«      ‚|j                  }|�Ít        |«      t        |«      k7  rt	        d«      ‚t        |t        j                  «      r|j                  «       }g }t        t        |«      «      D ]g  }t        j                  ||   j                  d¬«      ||   dd¬«      }|d   j                  d¬«      }|j                  t        ||d   dœ¬	«      «       Œi nJ|j                  d
¬«      }	t        |j                   d   «      D �
cg c]  }
t        |	|
   ||
   dœ¬	«      ‘Œ }}
|s|D �cg c]  }|j"                  ‘Œ }}|S c c}
w c c}w )aÿ  
        Converts the output of [`BeitForSemanticSegmentation`] into semantic segmentation maps.

        Args:
            outputs ([`BeitForSemanticSegmentation`]):
                Raw outputs of the model.
            target_sizes (`list[Tuple]` of length `batch_size`, *optional*):
                List of tuples corresponding to the requested final size (height, width) of each prediction. If unset,
                predictions will not be resized.
            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 (if `target_sizes` is specified).
        z:PyTorch is required for post_process_semantic_segmentationzTMake sure that you pass in as many target sizes as the batch dimension of the logitsr   )ÚdimÚbilinearF)r[   ÚmodeÚalign_corners)ÚsegmentationÚsegmentation_scores)r>   rQ   )r   ÚImportErrorÚlogitsrT   Ú
ValueErrorÚ
isinstancerG   ÚTensorÚnumpyrS   ÚFÚinterpolateÚ	unsqueezeÚargmaxÚappendr   rk   rw   )r,   Úoutputsrp   rq   rz   Úsemantic_segmentationrW   Úresized_logitsÚsemantic_mapÚseg_mapsÚiÚitems               r!   Ú"post_process_semantic_segmentationz5BeitImageProcessor.post_process_semantic_segmentation·   sy  € ô2 "Ô#ÜÐZÓ[Ð[à—‘ˆð Ð#Ü�6‹{œc ,Ó/Ò/Ü Øjóð ô ˜,¬¯©Ô5Ø+×1Ñ1Ó3�à$&Ð!äœS ›[Ó)ò 	�Ü!"§¡Ø˜3‘K×)Ñ)¨aÐ)Ó0°|ÀCÑ7HÈzÐinô"�ð  .¨aÑ0×7Ñ7¸AÐ7Ó>�Ø%×,Ñ,Ü;Ø.:ÐSaÐbcÑSdÑeôõñ	ð —}‘}¨�}Ó+ˆHô
 ˜vŸ|™|¨A™Ó/ö	%ð ô 8Ø*2°1©+ÈfÐUVÉiÑXöð%Ð!ð %ñ *ØCXÖ$Y¸4 T×%6Ó%6Ð$YÐ!Ð$Yà$Ð$ùò%ùò %Zs   ÄEÅE)N)F)NF))r   r   r   r   r   Úvalid_kwargsr   ÚBICUBICr\   r   r`   r   ra   r[   Údefault_to_squarer^   rZ   r]   r<   r;   r   r   r+   r   r   r   r2   r   r   Ústrr   r   rM   ÚlistrY   r   ÚfloatrB   Útupler‹   Ú__classcell__)r-   s   @r!   r$   r$   1   s9  ø„ á9à+€Là!×)Ñ)€HØ'€JØ%€IØ CÑ(€DØÐØ¨Ñ-€IØ€IØ€NØ€JØ€LØÐð# Ð(@Ñ!Aõ #ð ð 04ñ
Gàð
Gð &¨Ñ,ð
Gð Ð1Ñ2ð	
Gð
 
ô
Gó ð
Gð& 59ñ*Càð*Cð &¨Ñ,ð*Cð ð	*Cð
 ,ð*Cð ˜jÑ(¨4Ñ/ð*Cð �c˜>Ð)Ñ*¨TÑ1ð*Cð 
ó*CðX 4¨Ñ#7ð ¸DÀÑ<Pó ð0 "'ñ, à�^Ñ$ð, ð ð, ð ð	, ð
 Lð, ð ð, ð ð, ð ð, ð ð, ð ð, ð ˜D ™KÑ'¨$Ñ.ð, ð ˜4 ™;Ñ&¨Ñ-ð, ð  ™+ð, ð ð, ð  
ˆnÑ	ó!, ð^ diñ@%Ø%)¨%¡[°4Ñ%7ð@%Ø\`ð@%à	M÷@%r    r$   )$r   Útypingr   rG   Útorch.nn.functionalÚnnr   r   Útorchvision.transforms.v2ÚtvFÚimage_processing_backendsr   Úimage_processing_outputsr   Úimage_processing_utilsr   Úimage_transformsr	   r
   Úimage_utilsr   r   r   r   r   r   Úprocessing_utilsr   r   Úutilsr   r   r   r   r$   Ú__all__r   r    r!   ú<module>r¡      sr   ðñ &å ã ß Ð Ý 7å ;Ý OÝ 2ß E÷÷ ÷ 5ß CÑ Cô˜|°5õ ð ôE%Ð+ó E%ó ðE%ðP  Ð
 �r    