Ë
    éÓ^jÜ(  ã                   óâ   — d Z ddlZddlZddlmZmZmZmZ ddlZddlm	Z	 ddl
m	c mZ ddlmZmZ ddlmZ ddlmZ  ej(                  e«      Z G d	„ d
e	j.                  «      Z G d„ de«      Zy)zZ Image to Patch Hybird Embedding Layer

Hacked together by / Copyright 2020 Ross Wightman
é    N)ÚListÚOptionalÚTupleÚUnion)Únné   )ÚFormatÚnchw_to)Ú	to_2tuple)Úresample_patch_embedc                   óà  ‡ — e Zd ZU dZeed<   ej                  j                  e	   ed<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 dde
j                  deeeeef   f   deeeeef   f   deeeeeef   f      deeeeeef   f      d	ed
ede	de	de	dee   de	de	fˆ fd„Z	 	 	 	 	 	 	 ddeeeeef   f   deeeeef   f   deeeeeef   f      deeeeeef   f      dee   f
d„Z	 	 	 	 	 ddeeeeeef   f      deeeeeef   f      deeeeeef   f      deeeeeef   f      dee   f
d„Zddeeeef   ef   fd„Zdeeef   deeef   fd„Zej                  j,                  dde	fd„«       Zd„ Zˆ xZS )ÚHybridEmbedúd CNN Feature Map Embedding
    Extract feature map from CNN, flatten, project to embedding dim.
    Ú
output_fmtÚdynamic_img_padÚbackboneÚimg_sizeÚ
patch_sizeÚfeature_sizeÚfeature_ratioÚin_chansÚ	embed_dimÚbiasÚprojÚflattenÚstrict_img_sizec                 óö  •— ||dœ}t         ‰| �  «        t        |t        j                  «      sJ ‚|| _        || _         | j                  d
||||dœ|¤Ž\  | _        | _	        | _
        | _        | _        | _        | _        |�d| _        t!        |«      | _        n|
| _        t         j$                  | _        || _        || _        |sF| j                  d   | j                  d   z  dk(  r"| j                  d   | j                  d   z  dk(  sJ ‚|	r+t        j*                  | j                  |f|||dœ|¤Ž| _        y | j                  |k(  sJ d| j                  › d|› d	�«       ‚t        j.                  «       | _        y )N©ÚdeviceÚdtype)r   r   r   r   Fr   r   )Úkernel_sizeÚstrider   zThe feature dim (z must match embed dim (z) when projection disabled.© )ÚsuperÚ__init__Ú
isinstancer   ÚModuler   r   Ú_init_backboner   r   r   r   Úfeature_dimÚ	grid_sizeÚnum_patchesr   r	   r   ÚNCHWr   r   ÚConv2dr   ÚIdentity)Úselfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r    ÚddÚ	__class__s                    €úc/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/hybrid_embed.pyr%   zHybridEmbed.__init__   s¤  ø€ ð$ ¨Ñ/ˆÜ‰ÑÔÜ˜(¤B§I¡IÔ.Ð.Ð.Ø ˆŒØ ˆŒð  ˆD×Ñð 
ØØ!Ø%Ø'ñ	
ð
 ñ
ñ	
ØŒMØŒOØÔØÔØÔØŒNØÔð Ð!Ø ˆDŒLÜ$ ZÓ0ˆD�Oð #ˆDŒLÜ$Ÿk™kˆDŒOØ.ˆÔØ.ˆÔÙØ×$Ñ$ QÑ'¨$¯/©/¸!Ñ*<Ñ<ÀÒAÀd×FWÑFWÐXYÑFZÐ]a×]lÑ]lÐmnÑ]oÑFoÐstÒFtÐtÐtáÜŸ	™	Ø× Ñ Øðð 'Ø!Øñð ñˆD�Ið ×#Ñ# yÒ0ð tØ# D×$4Ñ$4Ð#5Ð5LÈYÈKÐWrÐsótÐ0äŸ™›ˆD�Ió    r)   c                 óÔ  — t        |«      }t        |«      }|�€	t        j                  «       5  | j                  j                  }|r| j                  j                  «        | j                  t        j                  d| j                  |d   |d   ||¬«      «      }	t        |	t        t        f«      r|	d   }	|	j                  dd  }|	j                  d   }| j                  j                  |«       d d d «       t        t        ||«      D �
�cg c]
  \  }
}|
|z  ‘Œ c}}
«      }npt        |«      }t        |xs d«      }|€Tt        | j                  d«      r(| j                  j                  j!                  «       d   }n| j                  j"                  }t        t        ||«      D ��cg c]
  \  }}||z  ‘Œ c}}«      }|d   |d   z  }|||||||fS # 1 sw Y   ŒäxY wc c}}
w c c}}w )Nr   r   r   éÿÿÿÿéþÿÿÿé   Úfeature_info)r   ÚtorchÚno_gradr   ÚtrainingÚevalÚzerosr   r&   ÚlistÚtupleÚshapeÚtrainÚzipÚhasattrr8   ÚchannelsÚnum_features)r/   r   r   r   r   r)   r   r    r;   ÚoÚsÚfÚpr*   r+   s                  r2   r(   zHybridEmbed._init_backbone]   s©  € ô ˜XÓ&ˆÜ˜zÓ*ˆ
ØÑÜ—‘“ñ .àŸ=™=×1Ñ1�ÙØ—M‘M×&Ñ&Ô(à—M‘M¤%§+¡+¨a°·±ÀÈÁÈXÐVWÉ[ÐagÐotÔ"uÓv�Ü˜a¤$¬ Ô/Ø˜"™�AØ Ÿw™w r s˜|�ØŸg™g a™j�Ø—‘×#Ñ# HÔ-÷.ô "´c¸(ÀLÓ6Q×"R©d¨a° 1¨£6Ó"RÓS‰Mä$ \Ó2ˆLÜ% mÒ&9°rÓ:ˆMØÐ"Ü˜4Ÿ=™=¨.Ô9Ø"&§-¡-×"<Ñ"<×"EÑ"EÓ"GÈÑ"K‘Kà"&§-¡-×"<Ñ"<�KÜ¬c°,À
Ó.K×L¡d a¨˜1 ›6ÓLÓMˆ	Ø ‘l Y¨q¡\Ñ1ˆØ˜ \°=À+ÈyÐZeÐeÐe÷/.ð .üó #Sùó Ms   ®CGÄG
Æ'G$
ÇGc           
      ó  — |€|€J ‚|xs | j                   }d }|�t        |«      }|��c|| j                  k7  �rSt        | j                  t
        j                  «      sJ d«       ‚t        j                  «       5  t        j                  | j                  j                  | j                  j                  ||| j                  j                  d u| j                  j                  | j                  j                  ¬«      }|j                  j                  t!        | j                  j                  |d¬«      «       | j                  j                  �/|j                  j                  | j                  j                  «       || _        d d d «       |}|xs | j                  }|| j                   k7  s|| j                  k7  rB| j#                  |||||¬«      \  | _         | _        | _        | _        | _        | _        | _        y y # 1 sw Y   Œ|xY w)Nz>HybridEmbed must have a projection layer to change patch size.)r!   r"   r   r   r    T)Úverbose)r   r   r   r   r)   )r   r   r   r&   r   r   r-   r9   r:   Úin_channelsÚout_channelsr   r   r    ÚweightÚcopy_r   r(   r   r   r)   r*   r+   )r/   r   r   r   r   r)   Únew_patch_sizeÚnew_projs           r2   Úset_input_sizezHybridEmbed.set_input_sizeƒ   sµ  € ð Ð# zÐ'=Ð=Ð=ØÒ,˜tŸ}™}ˆØˆØÐ!Ü& zÓ2ˆNØÑ%¨.¸D¿O¹OÓ*KÜ˜dŸi™i¬¯©Ô3ÐuÐ5uÓuÐ3Ü—‘“ñ %ÜŸ9™9Ø—I‘I×)Ñ)Ø—I‘I×*Ñ*Ø .Ø)ØŸ™Ÿ™¨tÐ3ØŸ9™9×+Ñ+ØŸ)™)Ÿ/™/ô�ð —‘×%Ñ%Ô&:¸4¿9¹9×;KÑ;KÈ^ÐeiÔ&jÔkØ—9‘9—>‘>Ð-Ø—M‘M×'Ñ'¨¯	©	¯©Ô7Ø$�”	÷%ð (ˆJØÒ2 4§?¡?ˆ
à�t—}‘}Ò$¨
°d·o±oÒ(Eð ×#Ñ#Ø!Ø%Ø)Ø+Ø'ð $ó ñØ”Ø”ØÔ!ØÔ"ØÔ Ø”ØÕ ð )F÷#%ð %ús   Á8D
G=Ç=HÚreturnc                 óœ   — | j                   d   | j                  d   z  | j                   d   | j                  d   z  f}|rt        |«      S |S )Nr   r   )r   r   Úmax)r/   Ú	as_scalarÚtotal_reductions      r2   Ú
feat_ratiozHybridEmbed.feat_ratioµ   sW   € à×Ñ˜qÑ! D§O¡O°AÑ$6Ñ6Ø×Ñ˜qÑ! D§O¡O°AÑ$6Ñ6ð
ˆñ Ü�Ó'Ð'à"Ð"r3   c                 ób  — |d   | j                   d   z  |d   | j                   d   z  f}| j                  rPt        j                  |d   | j                  d   z  «      t        j                  |d   | j                  d   z  «      fS |d   | j                  d   z  |d   | j                  d   z  fS )zb Get feature grid size taking account dynamic padding and backbone network feat reduction
        r   r   )r   r   ÚmathÚceilr   )r/   r   Ú	feat_sizes      r2   Údynamic_feat_sizezHybridEmbed.dynamic_feat_size¿   s¶   € ð ˜a‘[ D×$6Ñ$6°qÑ$9Ñ9¸8ÀA¹;È$×J\ÑJ\Ð]^ÑJ_Ñ;_Ð`ˆ	Ø×ÒÜ—9‘9˜Y q™\¨D¯O©O¸AÑ,>Ñ>Ó?ÄÇÁÈ9ÐUVÉ<ÐZ^×ZiÑZiÐjkÑZlÑKlÓAmÐmÐmà˜Q‘< 4§?¡?°1Ñ#5Ñ5°yÀ±|ÀtÇÁÐWXÑGYÑ7YÐYÐYr3   Úenablec                 óº   — t        | j                  d«      r| j                  j                  |¬«       y t        | j                  d«      r|| j                  _        y y ©NÚset_grad_checkpointing)r^   Úgrad_checkpointing©rC   r   ra   rb   ©r/   r^   s     r2   ra   z"HybridEmbed.set_grad_checkpointingÈ   óF   € ä�4—=‘=Ð":Ô;Ø�M‰M×0Ñ0¸Ð0Õ?Ü�T—]‘]Ð$8Ô9Ø/5ˆD�M‰MÕ,ð :r3   c                 óz  — | j                  |«      }t        |t        t        f«      r|d   }|j                  \  }}}}| j
                  r~| j                  d   || j                  d   z  z
  | j                  d   z  }| j                  d   || j                  d   z  z
  | j                  d   z  }t        j                  |d|d|f«      }| j                  |«      }| j                  r#|j                  d«      j                  dd«      }|S | j                  t        j                  k7  rt        || j                  «      }|S )Nr5   r   r   é   )r   r&   r>   r?   r@   r   r   ÚFÚpadr   r   Ú	transposer   r	   r,   r
   )r/   ÚxÚ_ÚHÚWÚpad_hÚpad_ws          r2   ÚforwardzHybridEmbed.forwardÏ   s  € Ø�M‰M˜!ÓˆÜ�aœ$¤˜Ô'Ø�"‘ˆAØ—W‘W‰
ˆˆ1ˆa�Ø×ÒØ—_‘_ QÑ'¨!¨d¯o©o¸aÑ.@Ñ*@Ñ@ÀDÇOÁOÐTUÑDVÑVˆEØ—_‘_ QÑ'¨!¨d¯o©o¸aÑ.@Ñ*@Ñ@ÀDÇOÁOÐTUÑDVÑVˆEÜ—‘�a˜!˜U A uÐ-Ó.ˆAØ�I‰I�a‹LˆØ�<Š<Ø—	‘	˜!“×&Ñ& q¨!Ó,ˆAð ˆð �_‰_¤§¡Ò+Ü˜˜4Ÿ?™?Ó+ˆAØˆr3   )éà   r   NNé   é   TTTNTFNN)rr   r   NNNNN)NNNNN©T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   Ú__annotations__r9   ÚjitÚFinalÚboolr   r'   r   Úintr   r   Ústrr%   r(   rR   rX   r]   Úignorera   rq   Ú__classcell__©r1   s   @r2   r   r      sî  ø… ñð ÓØ—Y‘Y—_‘_ TÑ*Ó*ð
 58Ø67ØBFØCGØØ ØØØ Ø(,Ø$(Ø$)ØØñ!?&à—i‘ið?&ð ˜C  s¨C x¡Ð0Ñ1ð?&ð ˜c 5¨¨c¨¡?Ð2Ñ3ð	?&ð
 # 5¨¨e°C¸°H©oÐ)=Ñ#>Ñ?ð?&ð $ E¨#¨u°S¸#°X©Ð*>Ñ$?Ñ@ð?&ð ð?&ð ð?&ð ð?&ð ð?&ð ð?&ð ! ™ð?&ð "ð?&ð "õ?&ðF 58Ø67ØBFØCGØ)-ØØñ$fà˜C  s¨C x¡Ð0Ñ1ð$fð ˜c 5¨¨c¨¡?Ð2Ñ3ð$fð # 5¨¨e°C¸°H©oÐ)=Ñ#>Ñ?ð	$fð
 $ E¨#¨u°S¸#°X©Ð*>Ñ$?Ñ@ð$fð " #™ó$fðP ?CØ@DØBFØCGØ)-ñ0à˜u S¨%°°S°©/Ð%9Ñ:Ñ;ð0ð !  s¨E°#°s°(©OÐ';Ñ!<Ñ=ð0ð # 5¨¨e°C¸°H©oÐ)=Ñ#>Ñ?ð	0ð
 $ E¨#¨u°S¸#°X©Ð*>Ñ$?Ñ@ð0ð " #™ó0ñd#¨E°%¸¸S¸±/À3Ð2FÑ,Gó #ðZ¨%°°S°©/ð Z¸eÀCÈÀH¹oó Zð ‡Y�Y×Ññ6¨Tò 6ó ð6ör3   r   c                   ó6  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddej
                  deeeeef   f   deeeeef   f   de	eeeeef   f      de	eeeeef   f      dedefˆ fd	„Z
ej                  j                  dd
efd„«       Zdeej                   ee   f   fd„Zˆ xZS )ÚHybridEmbedWithSizer   r   r   r   r   r   r   r   c                 ó:   •— t         ‰| �  |||||||||	|
|¬«       y )N)r   r   r   r   r   r   r   r   r   r   r    )r$   r%   )r/   r   r   r   r   r   r   r   r   r   r   r    r1   s               €r2   r%   zHybridEmbedWithSize.__init__ä   s8   ø€ ô 	‰ÑØØØ!Ø%Ø'ØØØØØØð 	õ 	
r3   r^   c                 óº   — t        | j                  d«      r| j                  j                  |¬«       y t        | j                  d«      r|| j                  _        y y r`   rc   rd   s     r2   ra   z*HybridEmbedWithSize.set_grad_checkpointing   re   r3   rS   c                 óÜ   — | j                  |«      }t        |t        t        f«      r|d   }| j	                  |«      }|j                  d«      j                  dd«      |j                  dd  fS )Nr5   rg   r   r6   )r   r&   r>   r?   r   r   rj   r@   )r/   rk   s     r2   rq   zHybridEmbedWithSize.forward  s^   € Ø�M‰M˜!ÓˆÜ�aœ$¤˜Ô'Ø�"‘ˆAØ�I‰I�a‹LˆØ�y‰y˜‹|×%Ñ% a¨Ó+¨Q¯W©W°R°S¨\Ð9Ð9r3   )
rr   r   NNrs   rt   TTNNru   )rv   rw   rx   ry   r   r'   r   r~   r   r   r%   r9   r{   r€   r}   ra   ÚTensorr   rq   r�   r‚   s   @r2   r„   r„   à   s
  ø„ ñð 58Ø67ØBFØCGØØ ØØØØñ
à—i‘ið
ð ˜C  s¨C x¡Ð0Ñ1ð
ð ˜c 5¨¨c¨¡?Ð2Ñ3ð	
ð
 # 5¨¨e°C¸°H©oÐ)=Ñ#>Ñ?ð
ð $ E¨#¨u°S¸#°X©Ð*>Ñ$?Ñ@ð
ð ð
ð õ
ð8 ‡Y�Y×Ññ6¨Tò 6ó ð6ð:˜E %§,¡,°°S±	Ð"9Ñ:÷ :r3   r„   )ry   ÚloggingrZ   Útypingr   r   r   r   r9   r   Útorch.nn.functionalÚ
functionalrh   Úformatr	   r
   Úhelpersr   Úpatch_embedr   Ú	getLoggerrv   Ú_loggerr'   r   r„   r#   r3   r2   ú<module>r’      s`   ðñó Û ß /Ó /ã Ý ß Ð ç #Ý Ý -ð ˆ'×
Ñ
˜HÓ
%€ôH�"—)‘)ô HôV,:˜+õ ,:r3   