Ë
    ÜÓ^j,  ã                   ó  — d 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 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mZ  ej>                  e «      Z! G d„ ded¬«      Z"e G d„ de«      «       Z#dgZ$y)z$Image processor class for MobileViT.é    )Ú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ÚloggingÚrequires_backendsc                   ó&   — e Zd ZU dZeed<   eed<   y)ÚMobileVitImageProcessorKwargsa  
    do_flip_channel_order (`bool`, *optional*, defaults to `self.do_flip_channel_order`):
        Whether to flip the color channels from RGB to BGR or vice versa.
    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_flip_channel_orderÚdo_reduce_labelsN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚboolÚ__annotations__© ó    úƒ/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/mobilevit/image_processing_mobilevit.pyr   r   -   s   … ñð  ÓØÔr"   r   F)Útotalc                   ó¨  ‡ — e Zd ZdZeZej                  Ze	Z
eZddiZd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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„Z%	 	 d+de#d   dede&dddede&ded e'd!edz  d"ed#ede#d   fd$„Z(	 	 d,d%e#e)e*e*f      dz  d&edd'fd(„Z+ˆ xZ,S )-ÚMobileViTImageProcessorzSTorchvision backend for MobileViT with flip_channel_order and reduce_label support.Úshortest_edgeéà   Fé   )ÚheightÚwidthTNÚkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )Nr!   )ÚsuperÚ__init__)Úselfr,   Ú	__class__s     €r#   r/   z MobileViTImageProcessor.__init__O   s   ø€ Ü‰ÑÑ"˜6Ó"r"   ÚimagesÚsegmentation_mapsÚreturnc                 ó&   •— t        ‰| �  ||fi |¤ŽS )zp
        segmentation_maps (`ImageInput`, *optional*):
            The segmentation maps to preprocess.
        )r.   Ú
preprocess)r0   r2   r3   r,   r1   s       €r#   r6   z"MobileViTImageProcessor.preprocessR   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t        j                  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.)r2   r7   r8   r:   Fr   Úpixel_valuesé   )r2   Úexpected_ndimsr7   r8   )Ú
do_rescaler   Úresampler2   r   Úlabels)ÚdataÚtensor_typer!   )Ú_prepare_image_like_inputsÚcopyÚ_preprocessr   ÚFIRSTÚupdater   ÚNEARESTÚsqueezeÚtoÚtorchÚint64r   )r0   r2   r3   r7   r8   r9   r:   r,   Úimages_kwargsrB   Úprocessed_segmentation_mapsÚsegmentation_maps_kwargsÚprocessed_segmentation_maps                r#   Ú_preprocess_image_like_inputsz5MobileViTImageProcessor._preprocess_image_like_inputs_   s9  € ð ×0Ñ0Ø¨.ÐL]Ðflð 1ó 
ˆð Ÿ™›ˆØ,1ˆÐ(Ñ)ØˆØ/˜t×/Ñ/°ÑH¸-ÑHˆˆ^ÑàÐ(Ø*.×*IÑ*IØ(Ø Ø$Ü"2×"8Ñ"8ð	 +Jó +Ð'ð (.§{¡{£}Ð$Ø$×+Ñ+à"'Ø-2ä 2× :Ñ :ñ	ôð +;¨$×*:Ñ*:ñ +Ø2ð+Ø6Nñ+Ð'ð 3Nö+à.ð +×2Ñ2°1Ó5×8Ñ8¼¿¹ÕEð+Ð'ð +ð 9ˆD�‰Nä °>ÔBÐBùò+s   Â35C<rA   ú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   éÿ   )Údtyper:   é   éþ   )ÚrangeÚlenrL   ÚwhereÚtensorrV   r:   )r0   rA   ÚidxÚlabels       r#   Úreduce_labelz$MobileViTImageProcessor.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"   c                 óÆ   — |j                   dk(  r|j                  «       }|g d¢   |dd |S |j                   dk(  r&|j                  «       }|dd…g d¢f   |dd…dd…f<   |S |S )zFlip RGB to BGR or vice versa.r   )r=   rW   r   r   é   N)ÚndimÚclone)r0   r2   Úflippeds      r#   Úflip_channel_orderz*MobileViTImageProcessor.flip_channel_orderš   si   € à�;‰;˜!Òà—l‘l“nˆGØ!¢)Ñ,ˆG�A�aˆLØˆNØ�[‰[˜AÒà—l‘l“nˆGØ$¢Qª	 \Ñ2ˆG’A�q˜�s�F‰OØˆNØˆr"   Ú	do_resizeÚsizer@   z7PILImageResampling | tvF.InterpolationMode | int | NoneÚdo_center_cropÚ	crop_sizer?   Úrescale_factorÚdisable_groupingr   r   c                 ó¸  — |
r| j                  |«      }t        ||	¬«      \  }}i }|j                  «       D ]  \  }}|r| j                  |||«      }|||<   Œ! t	        ||«      }t        ||	¬«      \  }}i }|j                  «       D ]E  \  }}|r| j                  ||«      }|r| j                  ||«      }|r| j                  |«      }|||<   ŒG t	        ||«      }|S )z#Custom preprocessing for MobileViT.)rk   )r_   r	   ÚitemsÚresizer
   Úcenter_cropÚrescalere   )r0   r2   rf   rg   r@   rh   ri   r?   rj   rk   r   r   r,   Úgrouped_imagesÚgrouped_images_indexÚresized_images_groupedÚshapeÚstacked_imagesÚresized_imagesÚprocessed_images_groupedÚprocessed_imagess                        r#   rF   z#MobileViTImageProcessor._preprocess¨   s  € ñ  Ø×&Ñ& vÓ.ˆFä/DÀVÐ^nÔ/oÑ,ˆÐ,Ø!#ÐØ%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%§¡¨^¸TÀ8Ó!L�Ø,:Ð" 5Ò)ð	;ô (Ð(>Ð@TÓUˆä/DÀ^ÐfvÔ/wÑ,ˆÐ,Ø#%Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>ÙØ!%×!1Ñ!1°.À)Ó!L�ÙØ!%§¡¨n¸nÓ!M�Ù$Ø!%×!8Ñ!8¸Ó!H�Ø.<Ð$ UÒ+ð	=ô *Ð*BÐDXÓYÐØÐr"   Útarget_sizesÚreturn_segmentation_scoreszBlist[torch.Tensor] | list[SemanticSegmentationPostProcessorOutput]c                 ó¼  — t        | d«       |j                  }t        |«      }|�Öt        |«      t        |«      k7  rt        d«      ‚t	        |t
        j                  «      r|j                  «       }g }t        |«      D ]y  }t
        j                  j                  j                  ||   j                  d¬«      ||   dd¬«      }|j                  t        |d   j                  d¬«      |d   dœ¬	«      «       Œ{ n;t        |«      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 [`MobileViTForSemanticSegmentation`] into semantic segmentation maps.

        Args:
            outputs ([`MobileViTForSemanticSegmentation`]):
                Raw outputs of the model.
            target_sizes (`list[tuple[int, int]]`, *optional*):
                List of tuples corresponding to the requested final size (height, width) of each prediction.
            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).
        rL   zTMake sure that you pass in as many target sizes as the batch dimension of the logitsr   )ÚdimÚbilinearF)rg   ÚmodeÚalign_corners)ÚsegmentationÚsegmentation_scores)rB   )r   ÚlogitsrZ   Ú
ValueErrorÚ
isinstancerL   ÚTensorÚtolistrY   Únnr   ÚinterpolateÚ	unsqueezeÚappendr   Úargmaxr€   )r0   Úoutputsry   rz   r‚   Ú
batch_sizeÚsemantic_segmentationr]   Úresized_logitsÚiÚitems              r#   Ú"post_process_semantic_segmentationz:MobileViTImageProcessor.post_process_semantic_segmentationÐ   sx  € ô6 	˜$ Ô(Ø—‘ˆÜ˜“[ˆ
ØÐ#Ü�6‹{œc ,Ó/Ò/Ü Øjóð ô ˜,¬¯©Ô5Ø+×2Ñ2Ó4�Ø$&Ð!Ü˜ZÓ(ò �Ü!&§¡×!4Ñ!4×!@Ñ!@Ø˜3‘K×)Ñ)¨aÐ)Ó0°|ÀCÑ7HÈzÐinð "Aó "�ð &×,Ñ,Ü;à,:¸1Ñ,=×,DÑ,DÈÐ,DÓ,KØ3AÀ!Ñ3Dñôõñ	ô" ˜zÓ*ö	%ð ô 8Ø*0°©)×*:Ñ*:¸qÐ*:Ó*AÐZ`ÐabÑZcÑdöð%Ð!ð %ñ *ØCXÖ$Y¸4 T×%6Ó%6Ð$YÐ!Ð$Yà$Ð$ùò%ùò %Zs   Ä	,EÄ=E)N)r2   rS   r4   rS   )FT)NF)-r   r   r   r   r   Úvalid_kwargsr   ÚBICUBICr@   r   Ú
image_meanr   Ú	image_stdrg   Údefault_to_squareri   rf   rh   r?   Údo_normalizer7   r   r   r   r/   r   r   r   r6   r   r   Ústrr   r   rR   Úlistr_   re   r   ÚfloatrF   ÚtupleÚintr’   Ú__classcell__)r1   s   @r#   r&   r&   ;   s)  ø„ á]à0€Là!×)Ñ)€HØ'€JØ%€IØ˜SÐ!€DØÐØ¨Ñ-€IØ€IØ€NØ€JØ€LØ€NØ ÐØÐð# Ð(EÑ!Fõ #ð ð 04ñ
Gàð
Gð &¨Ñ,ð
Gð Ð6Ñ7ð	
Gð
 
ô
Gó ð
Gð& 59ñ/Càð/Cð &¨Ñ,ð/Cð ð	/Cð
 ,ð/Cð ˜jÑ(¨4Ñ/ð/Cð �c˜>Ð)Ñ*¨TÑ1ð/Cð 
ó/Cðb 4¨Ñ#7ð ¸DÀÑ<Pó óð2 "'Ø&*ñ& à�^Ñ$ð& ð ð& ð ð	& ð
 Lð& ð ð& ð ð& ð ð& ð ð& ð  ™+ð& ð ð& ð  $ð& ð 
ˆnÑ	ó& ðV 6:Ø+0ñ	=%ð ˜5  c ™?Ñ+¨dÑ2ð=%ð %)ð	=%ð
 
N÷=%r"   r&   )%r   Útypingr   rL   Útorchvision.transforms.v2r   Ú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   Ú
get_loggerr   Úloggerr   r&   Ú__all__r!   r"   r#   ú<module>r¬      s„   ðñ +å ã Ý 7å ;Ý OÝ 2ß E÷÷ ÷ 5÷ó ð 
ˆ×	Ñ	˜HÓ	%€ô L¸õ ð ôQ%Ð0ó Q%ó ðQ%ðh %Ð
%�r"   