Ë
    ëÓ^j©.  ã                   ó°  — d Z ddlmZmZmZmZ ddlZddlZddl	m
Z
 ddlm
c mZ  G d„ de
j                  «      Zdeeeeege
j                  f   f      dedee
j                     fd	„Zdd
„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y)z
Projector.é    )ÚCallableÚOptionalÚSequenceÚUnionNc                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )Ú	LayerNormaH  A LayerNorm variant, popularized by Transformers, that performs point-wise mean and variance normalization over
    the channel dimension for inputs that have shape (batch_size, channels, height, width).

    https://github.com/facebookresearch/ConvNeXt/blob/d1fa8f6fef0a165b27399986cc2bdacc92777e40/models/convnext.py#L119
    c                 óô   •— t         ‰| �  «        t        j                  t	        j
                  |«      «      | _        t        j                  t	        j                  |«      «      | _        || _	        |f| _
        y ©N)ÚsuperÚ__init__ÚnnÚ	ParameterÚtorchÚonesÚweightÚzerosÚbiasÚepsÚnormalized_shape)Úselfr   r   Ú	__class__s      €úk/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/models/backbone/projector.pyr   zLayerNorm.__init__   sT   ø€ Ü‰ÑÔÜ—l‘l¤5§:¡:Ð.>Ó#?Ó@ˆŒÜ—L‘L¤§¡Ð-=Ó!>Ó?ˆŒ	ØˆŒØ!1Ð 3ˆÕó    c                 óØ   — |j                  dddd«      }t        j                  || j                  | j                  | j
                  | j                  «      }|j                  dddd«      }|S )zb
        LayerNorm forward
        TODO: this is a hack to avoid overflow when using fp16
        r   é   é   é   )ÚpermuteÚFÚ
layer_normr   r   r   r   ©r   Úxs     r   ÚforwardzLayerNorm.forward$   sY   € ð
 �I‰I�a˜˜A˜qÓ!ˆÜ�L‰L˜˜D×1Ñ1°4·;±;ÀÇ	Á	È4Ï8É8ÓTˆØ�I‰I�a˜˜A˜qÓ!ˆØˆr   )g�íµ ÷Æ°>©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   Ú__classcell__©r   s   @r   r   r      s   ø„ ñõ4ör   r   ÚnormÚout_channelsÚreturnc                 óf   — | €yt        | t        «      rt        | «      dk(  rydd„ i|    }  | |«      S )zÞ
    Args:
        norm: Either one of BN, SyncBN, FrozenBN, GN;
            or a callable that takes a channel number and returns the normalization layer as a nn.Module.

    Returns:
        The normalization layer.
    Nr   ÚLNc                 ó   — t        | «      S r
   )r   )Úchannelss    r   ú<lambda>zget_norm.<locals>.<lambda>>   s   € ¤9¨XÓ#6€ r   )Ú
isinstanceÚstrÚlen)r+   r,   s     r   Úget_normr6   /   sF   € ð €|ØÜ�$œÔÜˆt‹9˜Š>ØàÑ6ð
à
ñˆñ �ÓÐr   c                 ó  — | dk(  rt        j                  |¬«      }|S | dk(  rt        j                  |¬«      }|S | dv rt        j                  d|¬«      }|S | €t        j                  «       }|S t        dj                  | «      «      ‚)zGet activation.Úsilu©ÚinplaceÚrelu)Ú	LeakyReLUÚ	leakyreluÚlrelugš™™™™™¹?zUnsupported act type: {})r   ÚSiLUÚReLUr<   ÚIdentityÚAttributeErrorÚformat)Únamer:   Úmodules      r   Úget_activationrF   C   s�   € àˆv‚~Ü—‘ Ô)ˆð €Mð 
�ŠÜ—‘ Ô)ˆð €Mð 
Ð4Ñ	4Ü—‘˜c¨7Ô3ˆð
 €Mð	 
ˆÜ—‘“ˆð €Mô Ð7×>Ñ>¸tÓDÓEÐEr   c                   ó8   ‡ — e Zd ZdZ	 	 	 	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )ÚConvXzConv-bn module.c
           
      ód  •— t         t        | �  «        t        |t        «      s||f}|d   dz  |d   dz  f}
t        j                  |||||
||d¬«      | _        |	rt        j                  |«      | _	        n(|rt        d|«      nt        j                  |«      | _	        t        |d¬«      | _        y )	Nr   r   r   F)Úkernel_sizeÚstrideÚpaddingÚgroupsÚdilationr   r/   Tr9   )r   rH   r   r3   Útupler   ÚConv2dÚconvÚRMSNormÚbnr6   ÚBatchNorm2drF   Úact)r   Ú	in_planesÚ
out_planesÚkernelrK   rM   rN   rU   r    Úrms_normrL   r   s              €r   r   zConvX.__init__U   s§   ø€ ô 	Œe�TÑ#Ô%Ü˜&¤%Ô(Ø˜fÐ%ˆFØ˜!‘9 ‘> 6¨!¡9°¡>Ð2ˆÜ—I‘IØØØØØØØØô	
ˆŒ	ñ Ü—j‘j Ó,ˆD�Gá4>”h˜t ZÔ0ÄBÇNÁNÐS]ÓD^ˆDŒGÜ! #¨tÔ4ˆ�r   c                 ó€   — | j                  | j                  | j                  |j                  «       «      «      «      }|S )úforward.)rU   rS   rQ   Ú
contiguous©r   r"   Úouts      r   r#   zConvX.forwardu   s-   € à�h‰h�t—w‘w˜tŸy™y¨¯©«Ó8Ó9Ó:ˆØˆ
r   )r   r   r   r   r;   FFr$   r*   s   @r   rH   rH   R   s(   ø„ Ùð ØØØØØØõ5ö@r   rH   c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )Ú
BottleneckzStandard bottleneck.c
           
      óÄ   •— t         ‰| �  «        t        ||z  «      }
t        ||
|d   d|||	¬«      | _        t        |
||d   d||||	¬«      | _        |xr ||k(  | _        y)z1ch_in, ch_out, shortcut, groups, kernels, expand.r   r   ©rU   r    rY   )rM   rU   r    rY   N)r   r   ÚintrH   Úcv1Úcv2Úadd)r   Úc1Úc2ÚshortcutÚgÚkÚerU   r    rY   Úc_r   s              €r   r   zBottleneck.__init__~   sg   ø€ ä‰ÑÔÜ��a‘‹[ˆÜ˜˜R  1¡ q¨c¸jÐS[Ô\ˆŒÜ˜˜R  1¡ q°¸È
Ð]eÔfˆŒØÒ(  b¡ˆ�r   c                 ó    — | j                   r#|| j                  | j                  |«      «      z   S | j                  | j                  |«      «      S )z1'forward()' applies the YOLOv5 FPN to input data.)rf   re   rd   r!   s     r   r#   zBottleneck.forward†   s:   € à,0¯HªHˆq�4—8‘8˜DŸH™H Q›KÓ(Ñ(ÐO¸$¿(¹(À4Ç8Á8ÈAÃ;Ó:OÐOr   )Tr   ©r   r   ç      à?r8   FFr$   r*   s   @r   r`   r`   {   s   ø„ Ùõ)öPr   r`   c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )ÚC2fz<Faster Implementation of CSP Bottleneck with 2 convolutions.c
           	      óJ  •‡ ‡‡‡‡‡	— t         ‰
‰ �  «        t        ||z  «      ‰ _        t	        |d‰ j                  z  dd‰‰‰	¬«      ‰ _        t	        d|z   ‰ j                  z  |d‰‰‰	¬«      ‰ _        t        j                  ˆˆˆˆ	ˆ ˆfd„t        |«      D «       «      ‰ _
        y)z3ch_in, ch_out, number, shortcut, groups, expansion.r   r   rb   c              3   ón   •K  — | ],  }t        ‰j                  ‰j                  ‰‰d d‰‰‰¬«	      –— Œ. y­w)ro   ç      ð?)rk   rl   rU   r    rY   N)r`   Úc)Ú.0Ú_rU   rj   r    rY   r   ri   s     €€€€€€r   ú	<genexpr>zC2f.__init__.<locals>.<genexpr>–   s;   øè ø€ ò 
àô �t—v‘v˜tŸv™v x°°fÀÈÐYcÐnv×wÐwñ
ùs   ƒ25N)r   r   rc   rv   rH   rd   re   r   Ú
ModuleListÚrangeÚm)r   rg   rh   Únri   rj   rl   rU   r    rY   r   s   `   `` ```€r   r   zC2f.__init__Ž   sŒ   þ€ ä‰ÑÔÜ�R˜!‘V“ˆŒÜ˜˜Q §¡™Z¨¨A°3À:ÐX`ÔaˆŒÜØ�‰U�d—f‘fÑ˜b !¨¸Èhô
ˆŒô —‘÷ 
ð 
ä˜1“Xô
ó 
ˆ�r   c                 ó  ‡— t        | j                  |«      j                  | j                  | j                  fd«      «      Š‰j	                  ˆfd„| j
                  D «       «       | j                  t        j                  ‰d«      «      S )z.Forward pass using split() instead of chunk().r   c              3   ó4   •K  — | ]  } |‰d    «      –— Œ y­w)éÿÿÿÿN© )rw   r|   Úys     €r   ry   zC2f.forward.<locals>.<genexpr>ž   s   øè ø€ Ò*˜a‘�1�R‘5—Ñ*ùs   ƒ)	Úlistrd   Úsplitrv   Úextendr|   re   r   Úcat)r   r"   r‚   s     @r   r#   zC2f.forward›   s^   ø€ ä�—‘˜!“×"Ñ" D§F¡F¨D¯F©FÐ#3°QÓ7Ó8ˆØ	�‰Ó* 4§6¡6Ô*Ô*Ø�x‰xœŸ	™	 ! Q›Ó(Ð(r   )r   Fr   rp   r8   FFr$   r*   s   @r   rr   rr   ‹   s   ø„ ÙFõ
ö)r   rr   c                   óf   ‡ — e Zd ZdZ	 	 	 	 	 ddee   dedee   dedededed	ed
dfˆ fd„Zd„ Z	ˆ xZ
S )ÚMultiScaleProjectorz‹This module implements MultiScaleProjector in :paper:`lwdetr`.

    It creates pyramid features built on top of the input feature map.
    Úin_channelsr,   Úscale_factorsÚ
num_blocksr    rY   Úsurvival_probÚforce_drop_last_n_featuresr-   Nc	                 óB  •‡— t         t        | �  «        || _        || _        || _        g }	g }
d| _        |D �]±  Š|	j                  g «       |D �]!  }g }‰dk(  rl|j                  t        j                  ||dz  dd¬«      t        d|dz  «      t        j                  «       t        j                  |dz  |dz  dd¬«      g«       n…‰dk(  r-|j                  t        j                  ||dz  dd¬«      g«       nS‰dk(  rnM‰d	k(  r!|j                  t        ||d
d|¬«      g«       n'‰dk(  rd| _        Œât        dj                  ‰«      «      ‚t        j                   |Ž }|	d   j                  |«       �Œ$ t        j"                  |	d   «      |	d<   t%        t'        ˆfd„|D «       «      «      }t)        ||||¬«      t        d|«      g}t        j                   |Ž }|
j                  |«       �Œ´ t        j"                  |	«      | _        t        j"                  |
«      | _        y)a2  
        Args:
            in_channels: Channels in each input feature map level.
            out_channels: Number of channels in the output feature maps.
            scale_factors: List of scaling factors to upsample or downsample
                the input features for creating pyramid features.
        Fg      @r   )rJ   rK   r/   é   g       @ru   rp   r   )r    g      Ð?TzUnsupported scale_factor:{}r€   c              3   ó<   •K  — | ]  }|t        d ‰«      z  –— Œ y­w)r   N)Úmax)rw   Ú
in_channelÚscales     €r   ry   z/MultiScaleProjector.__init__.<locals>.<genexpr>÷   s   øè ø€ ÒW¸Z˜Z¬3¨q°%«=Õ8ÑWùs   ƒN)r   rˆ   r   rŠ   rŒ   r�   Úuse_extra_poolÚappendr…   r   ÚConvTranspose2dr6   ÚGELUrH   ÚNotImplementedErrorrC   Ú
Sequentialrz   rc   Úsumrr   Ústages_samplingÚstages)r   r‰   r,   rŠ   r‹   r    rY   rŒ   r�   r›   rœ   Úin_dimÚlayersr“   r   s                @€r   r   zMultiScaleProjector.__init__¨   s  ù€ ô$ 	Ô! 4Ñ1Ô3à*ˆÔØ*ˆÔØ*DˆÔ'àˆØˆà#ˆÔØ"ó 9	"ˆEØ×"Ñ" 2Ô&Ø%ó .3�Ø�ð ˜C’<Ø—M‘Mä×.Ñ.¨v°vÀ±{ÐPQÐZ[Ô\Ü$ T¨6°Q©;Ó7ÜŸG™G›IÜ×.Ñ.¨v¸©{¸FÀa¹KÐUVÐ_`Ôað	õð ˜c’\ð —M‘Mä×.Ñ.¨v°vÀ±{ÐPQÐZ[Ô\ðõð ˜c’\ØØ˜c’\Ø—M‘Mä! &¨&°!°QÀ:ÔNðõð
 ˜d’]Ø*.�DÔ'Øä-Ð.K×.RÑ.RÐSXÓ.YÓZÐZÜŸ™¨Ð/�Ø Ñ#×*Ñ*¨6Ö2ð].3ô^ #%§-¡-°ÀÑ0CÓ"DˆO˜BÑäœÓWÈ;ÔWÓWÓXˆFä�F˜L¨*ÀÔLÜ˜˜|Ó,ðˆFô —]‘] FÐ+ˆFØ�M‰M˜&Ö!ðs9	"ôv  "Ÿ}™}¨_Ó=ˆÔÜ—m‘m FÓ+ˆ�r   c                 óB  — t        |«      }| j                  dk  rd| j                  rXd| j                  z
  }t        j                  j                  «       }t        d|«      D ]  }|||dz
  z  z  }||k  sŒd||   dd Œ nL| j                  dkD  r=t        | j                  «      D ]%  }t        j                  ||dz       «      ||dz    <   Œ' g }t        | j                  «      D ]ƒ  \  }}g }	t        | j                  |   «      D ]  \  }
}|	j                   |||
   «      «       Œ! t        |	«      dkD  rt        j                  |	d¬«      }	n|	d   }	|j                   ||	«      «       Œ… | j                  r+|j                  t!        j"                  |d   ddd¬«      «       |S )	aÆ  
        Args:
            x: Tensor of shape (N,C,H,W). H, W must be a multiple of ``self.size_divisibility``.
        Returns:
            dict[str->Tensor]:
                mapping from feature map name to pyramid feature map tensor
                in high to low resolution order. Returned feature names follow the FPN
                convention: "p<stage>", where stage has stride = 2 ** stage e.g.,
                ["p2", "p3", ..., "p6"].
        ru   r   r   N)Údimr€   r   )rJ   rK   rL   )r5   rŒ   ÚtrainingÚnpÚrandomÚuniformr{   r�   r   Ú
zeros_likeÚ	enumeraterœ   r›   r•   r†   r”   r   Ú
max_pool2d)r   r"   Únum_featuresÚfinal_drop_probÚdrop_pÚiÚcritical_drop_probÚresultsÚstageÚ	feat_fuseÚjÚstage_samplings               r   r#   zMultiScaleProjector.forward  s›  € ô ˜1“vˆØ×Ñ Ò#¨¯ªØ $×"4Ñ"4Ñ4ˆOÜ—Y‘Y×&Ñ&Ó(ˆFÜ˜1˜lÓ+ò  �Ø%&¨/¸\ÈAÑ=MÑ*NÑ%OÐ"ØÐ.Ó.Ø�A�a‘D™‘Gñ ð ×,Ñ,¨qÒ0Ü˜4×:Ñ:Ó;ò <�ä#×.Ñ.¨q°1°q±5°©{Ó;��A˜‘E�(’ð<ð ˆä! $§+¡+Ó.ò 	-‰HˆAˆuØˆIÜ%.¨t×/CÑ/CÀAÑ/FÓ%Gò 7Ñ!��>Ø× Ñ ¡°°!±Ó!5Õ6ð7ä�9‹~ Ò!Ü!ŸI™I i°QÔ7‘	à% a™L�	Ø�N‰N™5 Ó+Õ,ð	-ð ×ÒØ�N‰Nœ1Ÿ<™<¨°©ÀÈ1ÐVWÔXÔYØˆr   )r   FFru   r   )r%   r&   r'   r(   r   rc   ÚfloatÚboolr   r#   r)   r*   s   @r   rˆ   rˆ   ¢   sŽ   ø„ ñð Ø ØØ"Ø*+ñX,à˜c‘]ðX,ð ðX,ð   ‘ð	X,ð
 ðX,ð ðX,ð ðX,ð ðX,ð %(ðX,ð 
õX,öt%r   rˆ   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚSimpleProjectorc                 ó  •— t         t        | �  «        |s/t        ||dz  dd¬«      | _        t        |dz  |dd¬«      | _        n*t        ||ddd¬«      | _        t        ||ddd¬«      | _        t        d|«      | _        y )	Nr   Tr8   )r    rU   )r   r   )rX   r    rU   )r   r   r/   )r   rµ   r   rH   Úconvx1Úconvx2r6   Úln)r   r�   Úout_dimÚfactor_kernelr   s       €r   r   zSimpleProjector.__init__+  sw   ø€ ÜŒo˜tÑ-Ô/ÙÜ ¨°©
¸tÈÔPˆDŒKÜ ¨¡
¨GÀÈ&ÔQˆD�Kä ¨¸È4ÐU[Ô\ˆDŒKÜ ¨¸ÈDÐV\Ô]ˆDŒKÜ˜4 Ó)ˆ�r   c                 ól   — | j                  | j                  | j                  |d   «      «      «      }|gS )r[   r   )r¹   r¸   r·   r]   s      r   r#   zSimpleProjector.forward5  s-   € à�g‰g�d—k‘k $§+¡+¨a°©dÓ"3Ó4Ó5ˆØˆuˆr   ©F)r%   r&   r'   r   r#   r)   r*   s   @r   rµ   rµ   *  s   ø„ õ*ör   rµ   r½   )r(   Útypingr   r   r   r   Únumpyr¢   r   Útorch.nnr   Útorch.nn.functionalÚ
functionalr   ÚModuler   r4   rc   r6   rF   rH   r`   rr   rˆ   rµ   r�   r   r   ú<module>rÄ      sÑ   ðñ ç 6Ó 6ã Û Ý ß Ð ô�—	‘	ô ð2�8˜E # x°°°r·y±yÐ0@Ñ'AÐ"AÑBÑCð ÐSVð Ð[cÐdf×dmÑdmÑ[nó ó(ô&ˆB�I‰Iô &ôRP�—‘ô Pô )ˆ"�)‰)ô )ô.E˜"Ÿ)™)ô EôP�b—i‘iõ r   