Ë
    ÜÓ^jG7  ã                   óŒ  — d 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
 dd	lmZ d
dlm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 G d„ de
«      «       Z ed¬«       G d„ de«      «       ZddgZy)zrPyTorch UperNet model. Based on OpenMMLab's implementation, found in https://github.com/open-mmlab/mmsegmentation.é    N)Únn)ÚCrossEntropyLossé   )Úload_backbone)ÚSemanticSegmenterOutput)ÚPreTrainedModel)Úauto_docstringé   )ÚUperNetConfigc                   ó¶   ‡ — e Zd ZdZ	 	 	 ddededeeeef   z  deeeef   z  ez  dedeeeef   z  dd	fˆ fd
„Zde	j                  de	j                  fd„Zˆ xZS )ÚUperNetConvModulezã
    A convolutional block that bundles conv/norm/activation layers. This block simplifies the usage of convolution
    layers, which are commonly used with a norm layer (e.g., BatchNorm) and activation layer (e.g., ReLU).
    Úin_channelsÚout_channelsÚkernel_sizeÚpaddingÚbiasÚdilationÚreturnNc                 óÈ   •— t         ‰| �  «        t        j                  ||||||¬«      | _        t        j
                  |«      | _        t        j                  «       | _        y )N)r   r   r   r   r   r   )	ÚsuperÚ__init__r   ÚConv2dÚconvÚBatchNorm2dÚ
batch_normÚReLUÚ
activation)Úselfr   r   r   r   r   r   Ú	__class__s          €úw/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/upernet/modeling_upernet.pyr   zUperNetConvModule.__init__!   sQ   ø€ ô 	‰ÑÔÜ—I‘IØ#Ø%Ø#ØØØô
ˆŒ	ô Ÿ.™.¨Ó6ˆŒÜŸ'™'›)ˆ�ó    Úinputc                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S ©N)r   r   r   )r   r"   Úoutputs      r    ÚforwardzUperNetConvModule.forward6   s1   € Ø—‘˜5Ó!ˆØ—‘ Ó(ˆØ—‘ Ó(ˆàˆr!   )r   Fr
   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚtupleÚstrÚboolr   ÚtorchÚTensorr&   Ú__classcell__©r   s   @r    r   r      s£   ø„ ñð 01ØØ*+ñ$àð$ð ð$ð ˜5  c ™?Ñ*ð	$ð
 �u˜S #˜X‘Ñ&¨Ñ,ð$ð ð$ð ˜˜c 3˜h™Ñ'ð$ð 
õ$ð*˜UŸ\™\ð ¨e¯l©l÷ r!   r   c                   óh   ‡ — e Zd Zdedededdfˆ fd„Zdej                  dej                  fd„Zˆ xZS )	ÚUperNetPyramidPoolingBlockÚ
pool_scaler   Úchannelsr   Nc                 óâ   •— t         ‰| �  «        t        j                  |«      t	        ||d¬«      g| _        t        | j
                  «      D ]   \  }}| j                  t        |«      |«       Œ" y )Nr
   ©r   )	r   r   r   ÚAdaptiveAvgPool2dr   ÚlayersÚ	enumerateÚ
add_moduler-   )r   r5   r   r6   ÚiÚlayerr   s         €r    r   z#UperNetPyramidPoolingBlock.__init__?   sa   ø€ Ü‰ÑÔä× Ñ  Ó,Ü˜k¨8ÀÔCð
ˆŒô " $§+¡+Ó.ò 	+‰HˆAˆuØ�O‰OœC ›F EÕ*ñ	+r!   r"   c                 ó<   — |}| j                   D ]
  } ||«      }Œ |S r$   )r:   )r   r"   Úhidden_stater>   s       r    r&   z"UperNetPyramidPoolingBlock.forwardH   s*   € ØˆØ—[‘[ò 	/ˆEÙ  Ó.‰Lð	/àÐr!   )	r'   r(   r)   r+   r   r/   r0   r&   r1   r2   s   @r    r4   r4   >   s?   ø„ ð+ 3ð +°Sð +ÀCð +ÈDõ +ð˜UŸ\™\ð ¨e¯l©l÷ r!   r4   c            
       ó€   ‡ — e Zd ZdZdeedf   dedededdf
ˆ fd	„Zd
ej                  de
ej                     fd„Zˆ xZS )ÚUperNetPyramidPoolingModulea}  
    Pyramid Pooling Module (PPM) used in PSPNet.

    Args:
        pool_scales (`tuple[int]`):
            Pooling scales used in Pooling Pyramid Module.
        in_channels (`int`):
            Input channels.
        channels (`int`):
            Channels after modules, before conv_seg.
        align_corners (`bool`):
            align_corners argument of F.interpolate.
    Úpool_scales.r   r6   Úalign_cornersr   Nc                 ó  •— t         ‰| �  «        || _        || _        || _        || _        g | _        t        |«      D ]I  \  }}t        |||¬«      }| j                  j                  |«       | j                  t        |«      |«       ŒK y )N)r5   r   r6   )r   r   rC   rD   r   r6   Úblocksr;   r4   Úappendr<   r-   )	r   rC   r   r6   rD   r=   r5   Úblockr   s	           €r    r   z$UperNetPyramidPoolingModule.__init__^   s€   ø€ Ü‰ÑÔØ&ˆÔØ*ˆÔØ&ˆÔØ ˆŒØˆŒÜ& {Ó3ò 	+‰MˆAˆzÜ.¸*ÐR]ÐhpÔqˆEØ�K‰K×Ñ˜uÔ%Ø�O‰OœC ›F EÕ*ñ	+r!   Úxc                 óÚ   — g }| j                   D ]Y  } ||«      }t        j                  j                  ||j	                  «       dd  d| j
                  ¬«      }|j                  |«       Œ[ |S )Né   Úbilinear©ÚsizeÚmoderD   )rF   r   Ú
functionalÚinterpolaterN   rD   rG   )r   rI   Úppm_outsÚppmÚppm_outÚupsampled_ppm_outs         r    r&   z#UperNetPyramidPoolingModule.forwardj   sn   € ØˆØ—;‘;ò 	/ˆCÙ˜!“fˆGÜ "§¡× 9Ñ 9Ø˜aŸf™f›h q r˜l°È4×K]ÑK]ð !:ó !Ðð �O‰OÐ-Õ.ð	/ð ˆr!   )r'   r(   r)   r*   r,   r+   r.   r   r/   r0   Úlistr&   r1   r2   s   @r    rB   rB   O   s[   ø„ ñð
+ E¨#¨s¨(¡Oð 
+À#ð 
+ÐQTð 
+Ðeið 
+Ðnrõ 
+ð˜Ÿ™ð ¨$¨u¯|©|Ñ*<÷ r!   rB   c                   ó`   ‡ — e Zd ZdZˆ fd„Zd„ Zdej                  dej                  fd„Zˆ xZ	S )ÚUperNetHeadz™
    Unified Perceptual Parsing for Scene Understanding. This head is the implementation of
    [UPerNet](https://huggingface.co/papers/1807.10221).
    c                 óö  •— t         ‰| �  «        || _        |j                  | _        || _        |j
                  | _        d| _        t        j                  | j                  |j                  d¬«      | _        t        | j                  | j                  d   | j                  | j                  ¬«      | _        t        | j                  d   t        | j                  «      | j                  z  z   | j                  dd¬«      | _        t        j"                  «       | _        t        j"                  «       | _        | j                  d d D ]s  }t        || j                  d¬«      }t        | j                  | j                  dd¬«      }| j$                  j)                  |«       | j&                  j)                  |«       Œu t        t        | j                  «      | j                  z  | j                  dd¬«      | _        y )NFr
   r8   éÿÿÿÿ)rD   r   ©r   r   )r   r   ÚconfigrC   r   Úhidden_sizer6   rD   r   r   Ú
num_labelsÚ
classifierrB   Úpsp_modulesr   ÚlenÚ
bottleneckÚ
ModuleListÚlateral_convsÚ	fpn_convsrG   Úfpn_bottleneck)r   r\   r   Úl_convÚfpn_convr   s        €r    r   zUperNetHead.__init__{   s•  ø€ Ü‰ÑÔàˆŒØ!×-Ñ-ˆÔØ&ˆÔØ×*Ñ*ˆŒØ"ˆÔÜŸ)™) D§M¡M°6×3DÑ3DÐRSÔTˆŒô 7Ø×ÑØ×Ñ˜RÑ Ø�M‰MØ×,Ñ,ô	
ˆÔô ,Ø×Ñ˜RÑ ¤3 t×'7Ñ'7Ó#8¸4¿=¹=Ñ#HÑHØ�M‰MØØô	
ˆŒô  Ÿ]™]›_ˆÔÜŸ™›ˆŒØ×+Ñ+¨C¨RÐ0ò 	,ˆKÜ& {°D·M±MÈqÔQˆFÜ(¨¯©¸¿¹ÐSTÐ^_Ô`ˆHØ×Ñ×%Ñ% fÔ-Ø�N‰N×!Ñ! (Õ+ð		,ô 0Ü�× Ñ Ó! D§M¡MÑ1Ø�M‰MØØô	
ˆÕr!   c                 ó¦   — |d   }|g}|j                  | j                  |«      «       t        j                  |d¬«      }| j	                  |«      }|S )NrZ   r
   ©Údim)Úextendr`   r/   Úcatrb   )r   ÚinputsrI   Úpsp_outsr%   s        r    Úpsp_forwardzUperNetHead.psp_forward¢   sL   € Ø�2‰JˆØ�3ˆØ�‰˜×(Ñ(¨Ó+Ô,Ü—9‘9˜X¨1Ô-ˆØ—‘ Ó*ˆàˆr!   Úencoder_hidden_statesr   c                 óP  — t        | j                  «      D ��cg c]  \  }} |||   «      ‘Œ }}}|j                  | j                  |«      «       t	        |«      }t        |dz
  dd«      D ]V  }||dz
     j                  dd  }||dz
     t        j                  j                  ||   |d| j                  ¬«      z   ||dz
  <   ŒX t        |dz
  «      D �cg c]  } | j                  |   ||   «      ‘Œ }}|j                  |d   «       t        |dz
  dd«      D ]E  }t        j                  j                  ||   |d   j                  dd  d| j                  ¬«      ||<   ŒG t        j                  |d¬«      }| j                  |«      }| j                  |«      }|S c c}}w c c}w )Nr
   r   rZ   rK   rL   rM   rj   )r;   rd   rG   rp   ra   ÚrangeÚshaper   rP   rQ   rD   re   r/   rm   rf   r_   )	r   rq   r=   Úlateral_convÚlateralsÚused_backbone_levelsÚ
prev_shapeÚfpn_outsr%   s	            r    r&   zUperNetHead.forward«   s¸  € äR[Ð\`×\nÑ\nÓRo×p¹¸qÀ,‘LÐ!6°qÑ!9Õ:ÐpˆÑpà�‰˜×(Ñ(Ð)>Ó?Ô@ô  # 8›}ÐÜÐ+¨aÑ/°°BÓ7ò 	ˆAØ! ! a¡%™×.Ñ.¨q¨rÐ2ˆJØ& q¨1¡u™o´·±×0IÑ0IØ˜‘ *°:ÈT×M_ÑM_ð 1Jó 1ñ ˆH�Q˜‘UŠOð	ô =BÐBVÐYZÑBZÓ<[Ö\°qÐ%�D—N‘N 1Ñ% h¨q¡kÕ2Ð\ˆÐ\à�‰˜ ™Ô%äÐ+¨aÑ/°°BÓ7ò 	ˆAÜŸ-™-×3Ñ3Ø˜‘ (¨1¡+×"3Ñ"3°A°BÐ"7¸jÐX\×XjÑXjð 4ó ˆH�QŠKð	ô —9‘9˜X¨1Ô-ˆØ×$Ñ$ XÓ.ˆØ—‘ Ó(ˆàˆùó3 qùò ]s   ™FÃF#)
r'   r(   r)   r*   r   rp   r/   r0   r&   r1   r2   s   @r    rX   rX   u   s.   ø„ ñô
%
òNð¨U¯\©\ð ¸e¿l¹l÷ r!   rX   c            
       ó€   ‡ — e Zd ZdZ	 d
dededeeeef   z  ddfˆ fd„Zdej                  dej                  fd	„Z	ˆ xZ
S )ÚUperNetFCNHeadaÄ  
    Fully Convolution Networks for Semantic Segmentation. This head is the implementation of
    [FCNNet](https://huggingface.co/papers/1411.4038>).

    Args:
        config:
            Configuration.
        in_channels (int):
            Number of input channels.
        kernel_size (int):
            The kernel size for convs in the head. Default: 3.
        dilation (int):
            The dilation rate for convs in the head. Default: 1.
    Úin_indexr   r   r   Nc           
      ól  •— t         ‰	| �  «        || _        |j                  €||   n|j                  | _        |j
                  | _        |j                  | _        |j                  | _
        || _        |dz  |z  }g }|j                  t        | j                  | j                  |||¬«      «       t        | j                  dz
  «      D ]5  }|j                  t        | j                  | j                  |||¬«      «       Œ7 | j                  dk(  rt        j                   «       | _        nt        j$                  |Ž | _        | j                  r8t        | j                  | j                  z   | j                  ||dz  ¬«      | _        t        j(                  | j                  |j*                  d¬«      | _        y )NrK   )r   r   r   r
   r   r[   r8   )r   r   r\   Úauxiliary_in_channelsr   Úauxiliary_channelsr6   Úauxiliary_num_convsÚ	num_convsÚauxiliary_concat_inputÚconcat_inputr|   rG   r   rs   r   ÚIdentityÚconvsÚ
SequentialÚconv_catr   r^   r_   )
r   r\   r   r|   r   r   Úconv_paddingr…   r=   r   s
            €r    r   zUperNetFCNHead.__init__Ù   sv  ø€ ô 	‰ÑÔàˆŒà%+×%AÑ%AÐ%IˆK˜Ò!Èv×OkÑOkð 	Ôð ×1Ñ1ˆŒØ×3Ñ3ˆŒØ"×9Ñ9ˆÔØ ˆŒà# qÑ(¨HÑ4ˆØˆØ�‰ÜØ× Ñ  $§-¡-¸[ÐR^Ðiqôô	
ô
 �t—~‘~¨Ñ)Ó*ò 	ˆAØ�L‰LÜ!Ø—M‘M 4§=¡=¸kÐS_Ðjrôõð	ð �>‰>˜QÒÜŸ™›ˆD�JäŸ™¨Ð.ˆDŒJØ×ÒÜ-Ø× Ñ  4§=¡=Ñ0°$·-±-È[ÐbmÐqrÑbrôˆDŒMô Ÿ)™) D§M¡M°6×3DÑ3DÐRSÔTˆ�r!   rq   c                 óÐ   — || j                      }| j                  |«      }| j                  r(| j                  t	        j
                  ||gd¬«      «      }| j                  |«      }|S )Nr
   rj   )r|   r…   rƒ   r‡   r/   rm   r_   )r   rq   Úhidden_statesr%   s       r    r&   zUperNetFCNHead.forwardÿ   sX   € à-¨d¯m©mÑ<ˆØ—‘˜MÓ*ˆØ×ÒØ—]‘]¤5§9¡9¨m¸VÐ-DÈ!Ô#LÓMˆFØ—‘ Ó(ˆØˆr!   )rK   r   r
   )r'   r(   r)   r*   r+   r,   r   r/   r0   r&   r1   r2   s   @r    r{   r{   É   sg   ø„ ñð  opñ$UØ-0ð$UØCFð$UØVYÐ\aÐbeÐgjÐbjÑ\kÑVkð$Uà	õ$UðL¨U¯\©\ð ¸e¿l¹l÷ r!   r{   c                   ó$   — e Zd ZU eed<   dZdZg Zy)ÚUperNetPreTrainedModelr\   Úpixel_values)ÚimageN)r'   r(   r)   r   Ú__annotations__Úmain_input_nameÚinput_modalitiesÚ_no_split_modules© r!   r    rŒ   rŒ   	  s   … àÓØ$€OØ!ÐØÑr!   rŒ   zW
    UperNet framework leveraging any vision backbone e.g. for ADE20k, CityScapes.
    )Úcustom_introc                   ó    ‡ — 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  dee	z  fd	„«       Z
ˆ xZS )ÚUperNetForSemanticSegmentationc                 ó  •— t         ‰| �  |«       t        |«      | _        t	        || j                  j
                  ¬«      | _        |j                  r!t        || j                  j
                  ¬«      nd | _	        | j                  «        y )N)r   )r   r   r   ÚbackbonerX   r6   Údecode_headÚuse_auxiliary_headr{   Úauxiliary_headÚ	post_init)r   r\   r   s     €r    r   z'UperNetForSemanticSegmentation.__init__  sj   ø€ Ü‰Ñ˜Ô ä% fÓ-ˆŒô ' v¸4¿=¹=×;QÑ;QÔRˆÔàJP×JcÒJcŒN˜6¨t¯}©}×/EÑ/EÕFÐimð 	Ôð
 	�‰Õr!   Nr�   Úoutput_attentionsÚoutput_hidden_statesÚlabelsÚreturn_dictr   c                 óŽ  — |�$| j                   j                  dk(  rt        d«      ‚|�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j
                  }| j                  j                  |||¬«      }|j                  }| j                  |«      }	t        j                  j                  |	|j                  dd dd¬«      }	d}
| j                  �A| j                  |«      }
t        j                  j                  |
|j                  dd dd¬«      }
d}|�Pt        | j                   j                   ¬	«      } ||	|«      }|
�% ||
|«      }|| j                   j"                  |z  z  }|s|r
|	f|dd z   }n	|	f|dd z   }|�|f|z   S |S t%        ||	|j&                  |j(                  ¬
«      S )aÈ  
        labels (`torch.LongTensor` of shape `(batch_size, height, width)`, *optional*):
            Ground truth semantic segmentation maps for computing the loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels > 1`, a classification loss is computed (Cross-Entropy).

        Examples:
        ```python
        >>> from transformers import AutoImageProcessor, UperNetForSemanticSegmentation
        >>> from PIL import Image
        >>> from huggingface_hub import hf_hub_download

        >>> image_processor = AutoImageProcessor.from_pretrained("openmmlab/upernet-convnext-tiny")
        >>> model = UperNetForSemanticSegmentation.from_pretrained("openmmlab/upernet-convnext-tiny")

        >>> filepath = hf_hub_download(
        ...     repo_id="hf-internal-testing/fixtures_ade20k", filename="ADE_val_00000001.jpg", repo_type="dataset"
        ... )
        >>> image = Image.open(filepath).convert("RGB")

        >>> inputs = image_processor(images=image, return_tensors="pt")

        >>> outputs = model(**inputs)

        >>> logits = outputs.logits  # shape (batch_size, num_labels, height, width)
        >>> list(logits.shape)
        [1, 150, 512, 512]
        ```Nr
   z/The number of labels should be greater than one)rž   r�   rK   rL   FrM   )Úignore_index)ÚlossÚlogitsrŠ   Ú
attentions)r\   r^   Ú
ValueErrorr    rž   r�   r˜   Úforward_with_filtered_kwargsÚfeature_mapsr™   r   rP   rQ   rt   r›   r   Úloss_ignore_indexÚauxiliary_loss_weightr   rŠ   r¥   )r   r�   r�   rž   rŸ   r    ÚkwargsÚoutputsÚfeaturesr¤   Úauxiliary_logitsr£   Úloss_fctÚauxiliary_lossr%   s                  r    r&   z&UperNetForSemanticSegmentation.forward%  sô  € ðJ Ð $§+¡+×"8Ñ"8¸AÒ"=ÜÐNÓOÐOà%0Ð%<‘kÀ$Ç+Á+×BYÑBYˆà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà—-‘-×<Ñ<ØÐ/CÐWhð =ó 
ˆð ×'Ñ'ˆà×!Ñ! (Ó+ˆÜ—‘×*Ñ*¨6¸×8JÑ8JÈ1È2Ð8NÐU_ÐotÐ*ÓuˆàÐØ×ÑÐ*Ø#×2Ñ2°8Ó<ÐÜ!Ÿ}™}×8Ñ8Ø  |×'9Ñ'9¸!¸"Ð'=ÀJÐ^cð  9ó  Ðð ˆØÐä'°T·[±[×5RÑ5RÔSˆHÙ˜F FÓ+ˆDØÐ+Ù!)Ð*:¸FÓ!C�Ø˜Ÿ™×9Ñ9¸NÑJÑJ�áÙ#Ø ˜ W¨Q¨R [Ñ0‘à ˜ W¨Q¨R [Ñ0�Ø)-Ð)9�T�G˜fÑ$ÐE¸vÐEä&ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r!   )NNNNN)r'   r(   r)   r   r	   r/   r0   r.   r,   r   r&   r1   r2   s   @r    r–   r–     s“   ø„ ôð ð -1Ø)-Ø,0Ø&*Ø#'ñQ
à—l‘l TÑ)ðQ
ð   $™;ðQ
ð # T™kð	Q
ð
 —‘˜tÑ#ðQ
ð ˜D‘[ðQ
ð 
Ð(Ñ	(òQ
ó ôQ
r!   r–   )r*   r/   r   Útorch.nnr   Úbackbone_utilsr   Úmodeling_outputsr   Úmodeling_utilsr   Úutilsr	   Úconfiguration_upernetr   ÚModuler   r4   rB   rX   r{   rŒ   r–   Ú__all__r“   r!   r    ú<module>r¹      sË   ðñ yã Ý Ý %å +Ý 7Ý -Ý #Ý 0ô ˜Ÿ	™	ô  ôF §¡ô ô"# "§)¡)ô #ôLQ�"—)‘)ô Qôh=�R—Y‘Yô =ð@ ô˜_ó ó ðñ ðôô
a
Ð%;ó a
óð
a
ðH ,Ð-EÐ
F�r!   