Ë
    ÜÓ^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  ed¬«      e G d„ de«      «       «       Ze G d„ de«      «       Z G d„ dej&                  «      Z G d„ dej&                  «      Z G d„ dej&                  «      Z G d„ dej&                  «      Z G d„ dej&                  «      Z ed¬«       G d„ de«      «       ZddgZy)zPyTorch ViTMatte model.é    )Ú	dataclassN)Únné   )Úinitialization)Úload_backbone)ÚPreTrainedModel)ÚModelOutputÚauto_docstringé   )ÚVitMatteConfigz4
    Class for outputs of image matting models.
    )Úcustom_introc                   ó¾   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	e
ej                     dz  ed<   dZe
ej                     dz  ed<   y)ÚImageMattingOutputaµ  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided):
        Loss.
    alphas (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
        Estimated alpha values.
    hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings, if the model has an embedding layer, +
        one for the output of each stage) of shape `(batch_size, sequence_length, hidden_size)`. Hidden-states
        (also called feature maps) of the model at the output of each stage.
    NÚlossÚalphasÚhidden_statesÚ
attentions)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚFloatTensorÚ__annotations__r   r   Útupler   © ó    úy/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/vitmatte/modeling_vitmatte.pyr   r      sg   … ñ	ð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø'+€FˆE×Ñ Ñ$Ó+Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ô6r   r   c                   ó|   ‡ — e Zd ZU eed<   dZdZdZg Z e	j                  «       dej                  fˆ fd„«       Zˆ xZS )ÚVitMattePreTrainedModelÚconfigÚpixel_values)ÚimageTÚmodulec                 óò  •— t         ‰| �  |«       t        |t        j                  «      rÍt        j                  |j                  d| j                  j                  ¬«       |j                  �t        j                  |j                  «       t        |dd «      �^t        j                  |j                  «       t        j                  |j                  «       t        j                  |j                   «       y y y )Ng        )ÚmeanÚstdÚrunning_mean)ÚsuperÚ_init_weightsÚ
isinstancer   ÚBatchNorm2dÚinitÚnormal_Úweightr!   Úinitializer_rangeÚbiasÚzeros_Úgetattrr(   Úones_Úrunning_varÚnum_batches_tracked)Úselfr$   Ú	__class__s     €r   r*   z%VitMattePreTrainedModel._init_weights<   s¦   ø€ ä‰Ñ˜fÔ%Ü�fœbŸn™nÔ-Ü�L‰L˜Ÿ™¨S°d·k±k×6SÑ6SÕTØ�{‰{Ð&Ü—‘˜FŸK™KÔ(Ü�v˜~¨tÓ4Ð@Ü—‘˜F×/Ñ/Ô0Ü—
‘
˜6×-Ñ-Ô.Ü—‘˜F×6Ñ6Õ7ð Að	 .r   )r   r   r   r   r   Úmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesr   Úno_gradr   ÚModuler*   Ú__classcell__©r8   s   @r   r    r    4   sE   ø… àÓØ$€OØ!ÐØ&*Ð#ØÐà€U‡]�]ƒ_ð	8 B§I¡Iô 	8ó ô	8r   r    c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )ÚVitMatteBasicConv3x3zP
    Basic convolution layers including: Conv3x3, BatchNorm2d, ReLU layers.
    c                 óà   •— t         ‰| �  «        t        j                  ||d||d¬«      | _        t        j
                  ||j                  ¬«      | _        t        j                  «       | _	        y )Nr   F)Úin_channelsÚout_channelsÚkernel_sizeÚstrideÚpaddingr1   )Úeps)
r)   Ú__init__r   ÚConv2dÚconvr,   Úbatch_norm_epsÚ
batch_normÚReLUÚrelu)r7   r!   rD   rE   rG   rH   r8   s         €r   rJ   zVitMatteBasicConv3x3.__init__N   sW   ø€ Ü‰ÑÔÜ—I‘IØ#Ø%ØØØØô
ˆŒ	ô Ÿ.™.¨¸6×;PÑ;PÔQˆŒÜ—G‘G“Iˆ�	r   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S ©N)rL   rN   rP   ©r7   Úhidden_states     r   ÚforwardzVitMatteBasicConv3x3.forward[   s2   € Ø—y‘y Ó.ˆØ—‘ |Ó4ˆØ—y‘y Ó.ˆàÐr   )é   r   ©r   r   r   r   rJ   rU   r?   r@   s   @r   rB   rB   I   s   ø„ ñõör   rB   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚVitMatteConvStreamzc
    Simple ConvStream containing a series of basic conv3x3 layers to extract detail features.
    c                 ó¶  •— t         ‰| �  «        d}|j                  �|j                  j                  }t	        |j
                  «      }t        j                  «       | _        |g|z   | _	        t        t        | j                  «      dz
  «      D ]I  }| j                  |   }| j                  |dz      }| j                  j                  t        |||«      «       ŒK y )Né   r   )r)   rJ   Úbackbone_configÚnum_channelsÚlistÚconvstream_hidden_sizesr   Ú
ModuleListÚconvsÚ
conv_chansÚrangeÚlenÚappendrB   )r7   r!   rD   rE   ÚiÚin_chan_Ú	out_chan_r8   s          €r   rJ   zVitMatteConvStream.__init__h   s½   ø€ Ü‰ÑÔð ˆØ×!Ñ!Ð-Ø ×0Ñ0×=Ñ=ˆKä˜F×:Ñ:Ó;ˆä—]‘]“_ˆŒ
Ø&˜-¨,Ñ6ˆŒä”s˜4Ÿ?™?Ó+¨aÑ/Ó0ò 	QˆAØ—‘ qÑ)ˆHØŸ™¨¨A©Ñ.ˆIØ�J‰J×ÑÔ2°6¸8ÀYÓOÕPñ	Qr   c                 ó®   — d|i}|}t        t        | j                  «      «      D ]-  } | j                  |   |«      }dt        |dz   «      z   }|||<   Œ/ |S )NÚdetailed_feature_map_0Údetailed_feature_map_r   )rc   rd   ra   Ústr)r7   r"   Úout_dictÚ
embeddingsrf   Úname_s         r   rU   zVitMatteConvStream.forward{   sc   € Ø,¨lÐ;ˆØ!ˆ
Ü”s˜4Ÿ:™:“Ó'ò 	)ˆAØ&˜Ÿ™ A™ zÓ2ˆJØ+¬c°!°a±%«jÑ8ˆEØ(ˆH�UŠOð	)ð
 ˆr   rW   r@   s   @r   rY   rY   c   s   ø„ ñôQö&r   rY   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚVitMatteFusionBlockz\
    Simple fusion block to fuse features from ConvStream and Plain Vision Transformer.
    c                 óL   •— t         ‰| �  «        t        |||dd¬«      | _        y )Nr   )rG   rH   )r)   rJ   rB   rL   )r7   r!   rD   rE   r8   s       €r   rJ   zVitMatteFusionBlock.__init__‹   s$   ø€ Ü‰ÑÔÜ(¨°¸lÐSTÐ^_Ô`ˆ�	r   c                 ó    — t         j                  j                  |ddd¬«      }t        j                  ||gd¬«      }| j                  |«      }|S )NrV   ÚbilinearF)Úscale_factorÚmodeÚalign_cornersr   )Údim)r   Ú
functionalÚinterpolater   ÚcatrL   )r7   ÚfeaturesÚdetailed_feature_mapÚupscaled_featuresÚouts        r   rU   zVitMatteFusionBlock.forward�   sK   € ÜŸM™M×5Ñ5°hÈQÐU_ÐotÐ5ÓuÐÜ�i‰iÐ-Ð/@ÐAÀqÔIˆØ�i‰i˜‹nˆàˆ
r   rW   r@   s   @r   rq   rq   †   s   ø„ ñôaör   rq   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚVitMatteHeadzJ
    Simple Matting Head, containing only conv3x3 and conv1x1 layers.
    c                 ó*  •— t         ‰| �  «        |j                  d   }d}t        j                  t        j
                  ||ddd¬«      t        j                  |«      t        j                  d«      t        j
                  |dddd¬«      «      | _        y )Néÿÿÿÿé   r   r   )rF   rG   rH   Tr   )	r)   rJ   Úfusion_hidden_sizesr   Ú
SequentialrK   r,   rO   Úmatting_convs)r7   r!   rD   Úmid_channelsr8   s       €r   rJ   zVitMatteHead.__init__œ   st   ø€ Ü‰ÑÔà×0Ñ0°Ñ4ˆØˆäŸ]™]Ü�I‰I�k <¸QÀqÐRSÔTÜ�N‰N˜<Ó(Ü�G‰G�D‹MÜ�I‰I�l A°1¸QÈÔJó	
ˆÕr   c                 ó(   — | j                  |«      }|S rR   )r‡   rS   s     r   rU   zVitMatteHead.forward©   s   € Ø×)Ñ)¨,Ó7ˆàÐr   rW   r@   s   @r   r�   r�   —   s   ø„ ñô
ör   r�   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚVitMatteDetailCaptureModulezG
    Simple and lightweight Detail Capture Module for ViT Matting.
    c           
      ó„  •— t         ‰| �  «        t        |j                  «      t        |j                  «      dz   k7  rt        d«      ‚|| _        t        |«      | _        | j                  j                  | _	        t        j                  «       | _        |j                  g|j                  z   | _        t        t        | j                  «      dz
  «      D ]Z  }| j                  j!                  t#        || j                  |   | j                  |dz       z   | j                  |dz      ¬«      «       Œ\ t%        |«      | _        y )Nr   z_The length of fusion_hidden_sizes should be equal to the length of convstream_hidden_sizes + 1.)r!   rD   rE   )r)   rJ   rd   r…   r_   Ú
ValueErrorr!   rY   Ú
convstreamrb   r   r`   Úfusion_blocksÚhidden_sizeÚfusion_channelsrc   re   rq   r�   Úmatting_head)r7   r!   rf   r8   s      €r   rJ   z$VitMatteDetailCaptureModule.__init__´   s  ø€ Ü‰ÑÔÜˆv×)Ñ)Ó*¬c°&×2PÑ2PÓ.QÐTUÑ.UÒUÜØqóð ð ˆŒÜ,¨VÓ4ˆŒØŸ/™/×4Ñ4ˆŒäŸ]™]›_ˆÔØ &× 2Ñ 2Ð3°f×6PÑ6PÑPˆÔä”s˜4×/Ñ/Ó0°1Ñ4Ó5ò 	ˆAØ×Ñ×%Ñ%Ü#Ø!Ø $× 4Ñ 4°QÑ 7¸$¿/¹/ÈAÐPQÉEÈ(Ñ:SÑ SØ!%×!5Ñ!5°a¸!±eÑ!<ôõð	ô )¨Ó0ˆÕr   c                 ó6  — | j                  |«      }t        t        | j                  «      «      D ]B  }dt	        t        | j                  «      |z
  dz
  «      z   } | j                  |   |||   «      }ŒD t        j                  | j                  |«      «      }|S )Nrk   r   )rŽ   rc   rd   r�   rl   r   Úsigmoidr’   )r7   r|   r"   Údetail_featuresrf   Údetailed_feature_map_namer   s          r   rU   z#VitMatteDetailCaptureModule.forwardÍ   s—   € ØŸ/™/¨,Ó7ˆÜ”s˜4×-Ñ-Ó.Ó/ò 	cˆAØ(?Ä#ÄcÈ$×J\ÑJ\ÓF]Ð`aÑFaÐdeÑFeÓBfÑ(fÐ%Ø,�t×)Ñ)¨!Ñ,¨X°ÐG`Ñ7aÓb‰Hð	cô —‘˜t×0Ñ0°Ó:Ó;ˆàˆr   rW   r@   s   @r   r‹   r‹   ¯   s   ø„ ñô1ö2r   r‹   zX
    ViTMatte framework leveraging any vision backbone e.g. for ADE20k, CityScapes.
    c                   ó–   ‡ — e Zd Zˆ fd„Ze	 	 	 	 	 d	dej                  dz  dedz  dedz  dej                  dz  dedz  f
d„«       Zˆ xZ	S )
ÚVitMatteForImageMattingc                 ó’   •— t         ‰| �  |«       || _        t        |«      | _        t        |«      | _        | j                  «        y rR   )r)   rJ   r!   r   Úbackboner‹   ÚdecoderÚ	post_init)r7   r!   r8   s     €r   rJ   z VitMatteForImageMatting.__init__Þ   s;   ø€ Ü‰Ñ˜Ô ØˆŒä% fÓ-ˆŒÜ2°6Ó:ˆŒð 	�‰Õr   Nr"   Úoutput_attentionsÚoutput_hidden_statesÚlabelsÚreturn_dictc                 óª  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }d}|�t	        d«      ‚| j
                  j                  |||¬«      }|j                  d   }	| j                  |	|«      }
|s|
f|dd z   }|�|f|z   S |S t        ||
|j                  |j                  ¬«      S )a8  
        labels (`torch.LongTensor` of shape `(batch_size, height, width)`, *optional*):
            Ground truth image matting for computing the loss.

        Examples:

        ```python
        >>> from transformers import VitMatteImageProcessor, VitMatteForImageMatting
        >>> import torch
        >>> from PIL import Image
        >>> from huggingface_hub import hf_hub_download

        >>> processor = VitMatteImageProcessor.from_pretrained("hustvl/vitmatte-small-composition-1k")
        >>> model = VitMatteForImageMatting.from_pretrained("hustvl/vitmatte-small-composition-1k")

        >>> filepath = hf_hub_download(
        ...     repo_id="hf-internal-testing/image-matting-fixtures", filename="image.png", repo_type="dataset"
        ... )
        >>> image = Image.open(filepath).convert("RGB")
        >>> filepath = hf_hub_download(
        ...     repo_id="hf-internal-testing/image-matting-fixtures", filename="trimap.png", repo_type="dataset"
        ... )
        >>> trimap = Image.open(filepath).convert("L")

        >>> # prepare image + trimap for the model
        >>> inputs = processor(images=image, trimaps=trimap, return_tensors="pt")

        >>> with torch.no_grad():
        ...     alphas = model(**inputs).alphas
        >>> print(alphas.shape)
        torch.Size([1, 1, 640, 960])
        ```NzTraining is not yet supported)rž   r�   rƒ   r   )r   r   r   r   )r!   r    rž   r�   ÚNotImplementedErrorrš   Úforward_with_filtered_kwargsÚfeature_mapsr›   r   r   r   )r7   r"   r�   rž   rŸ   r    Úkwargsr   Úoutputsr|   r   Úoutputs               r   rU   zVitMatteForImageMatting.forwardè   sÿ   € ðT &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐàˆØÐÜ%Ð&EÓFÐFà—-‘-×<Ñ<ØÐ/CÐWhð =ó 
ˆð ×'Ñ'¨Ñ+ˆØ—‘˜h¨Ó5ˆáØ�Y ¨¨ Ñ,ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä!ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r   )NNNNN)
r   r   r   rJ   r
   r   ÚTensorÚboolrU   r?   r@   s   @r   r˜   r˜   Ø   s‚   ø„ ôð ð -1Ø)-Ø,0Ø&*Ø#'ñC
à—l‘l TÑ)ðC
ð   $™;ðC
ð # T™kð	C
ð
 —‘˜tÑ#ðC
ð ˜D‘[òC
ó ôC
r   r˜   )r   Údataclassesr   r   r   Ú r   r-   Úbackbone_utilsr   Úmodeling_utilsr   Úutilsr	   r
   Úconfiguration_vitmatter   r   r    r>   rB   rY   rq   r�   r‹   r˜   Ú__all__r   r   r   ú<module>r±      sõ   ðñ å !ã Ý å &Ý +Ý -ß 0Ý 2ñ ðôð
 ô7˜ó 7ó óð7ð$ ô8˜oó 8ó ð8ô(˜2Ÿ9™9ô ô4 ˜Ÿ™ô  ôF˜"Ÿ)™)ô ô"�2—9‘9ô ô0& "§)¡)ô &ñR ðôô
O
Ð5ó O
óð
O
ðd %Ð&?Ð
@�r   