
    RЦi(                         S r SSKrSSKrSSKJrJrJrJr  SSKrSSKJ	r	  SSK
J	s  Jr  SSKJrJr  SSKJr  SSKJr  \R(                  " \5      r " S	 S
\	R.                  5      r " S S\5      rg)zYImage 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                      ^  \ rS rSr% Sr\\S'   \R                  R                  \
   \S'                 SS\R                  S\\\\\4   4   S\\\\\4   4   S\\\\\\4   4      S	\\\\\\4   4      S
\S\S\
S\
S\
S\\   S\
S\
4U 4S jjjr       SS\\\\\4   4   S\\\\\4   4   S\\\\\\4   4      S	\\\\\\4   4      S\\   4
S jjr     SS\\\\\\4   4      S\\\\\\4   4      S\\\\\\4   4      S	\\\\\\4   4      S\\   4
S jjrSS\\\\4   \4   4S jjrS\\\4   S\\\4   4S jr\R                  R.                  SS\
4S jj5       rS rSrU =r$ )HybridEmbed   [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                   > XS.n[         TU ]  5         [        U[        R                  5      (       d   eXl        X`l        U R                  " S
UUUUS.UD6u  U l        U l	        U l
        U l        U l        U l        U l        Ub  SU l        [!        U5      U l        OXl        [         R$                  U l        Xl        Xl        U(       dH  U R                  S   U R                  S   -  S:X  a#  U R                  S   U R                  S   -  S:X  d   eU	(       a,  [        R*                  " U R                  U4UUUS.UD6U l        g U R                  U:X  d   SU R                   SU S	35       e[        R.                  " 5       U l        g )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                    W/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/hybrid_embed.pyr&   HybridEmbed.__init__   s   $ /(BII....    
!%'	

 
	
MON ! DL$Z0DO #L$kkDO..$$Q'$//!*<<AdFWFWXYFZ]a]l]lmn]oFostFttt		   '! DI ##y0 t#D$4$4#55LYKWrst0DI    r*   c                     [        U5      n[        U5      nUGc  [        R                  " 5          U R                  R                  nU(       a  U R                  R                  5         U R                  [        R                  " SU R                  US   US   XgS95      n	[        U	[        [        45      (       a  U	S   n	U	R                  SS  nU	R                  S   nU R                  R                  U5        S S S 5        [        [        X5       V
Vs/ s H	  u  pX-  PM     snn
5      nO{[        U5      n[        U=(       d    S5      nUcY  [        U R                  S5      (       a(  U R                  R                  R!                  5       S   nOU R                  R"                  n[        [        X25       VVs/ s H	  u  pX-  PM     snn5      nUS   US   -  nXX4X]U4$ ! , (       d  f       N= fs  snn
f s  snnf )Nr   r   r      feature_info)r   torchno_gradr   trainingevalzerosr   r'   listtupleshapetrainziphasattrr:   channelsnum_features)r0   r   r   r   r   r*   r    r!   r=   osfpr+   r,   s                  r3   r)   HybridEmbed._init_backbone]   s    X&z*
==11MM&&(MM%++aXVW[ag"uva$//"A wwrs|ggaj##H- ! "c(6Q"R6Qda166Q"RSM$\2L%m&9r:M"4==.99"&--"<"<"E"E"G"KK"&--"<"<Kc,.KL.Kda16.KLM	lYq\1\+Zeee/ ! #S Ms   CG#G4
:G:
#
G1c                 4   Uc  Uc   eU=(       d    U R                   nS nUb  [        U5      nUGbd  X`R                  :w  GaT  [        U R                  [
        R                  5      (       d   S5       e[        R                  " 5          [
        R                  " U R                  R                  U R                  R                  UUU R                  R                  S LU R                  R                  U R                  R                  S9nUR                  R                  [!        U R                  R                  USS95        U R                  R                  b/  UR                  R                  U R                  R                  5        Xpl        S S S 5        UnU=(       d    U R                  nXR                   :w  d  X R                  :w  a?  U R#                  UUUUUS9u  U l         U l        U l        U l        U l        U l        U l        g g ! , (       d  f       N= f)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.   r;   r<   in_channelsout_channelsr   r    r!   weightcopy_r   r)   r   r   r*   r+   r,   )r0   r   r   r   r   r*   new_patch_sizenew_projs           r3   set_input_sizeHybridEmbed.set_input_size   s    #z'===,t}}!&z2N%.OO*Kdii33u5uu399II))II** .)t399++))// %%&:499;K;K^ei&jk99>>-MM''		7$	 ! (J24??
}}$
oo(E ##!%)+' $ !"   )F# !s   DH		
Hreturnc                     U R                   S   U R                  S   -  U R                   S   U R                  S   -  4nU(       a  [        U5      $ U$ )Nr   r   )r   r   max)r0   	as_scalartotal_reductions      r3   
feat_ratioHybridEmbed.feat_ratio   sW    q!DOOA$66q!DOOA$66
 ''""r5   c                 p   US   U R                   S   -  US   U R                   S   -  4nU R                  (       aR  [        R                  " US   U R                  S   -  5      [        R                  " US   U R                  S   -  5      4$ US   U R                  S   -  US   U R                  S   -  4$ )zaGet feature grid size taking account dynamic padding and backbone network feat reduction
        r   r   )r   r   mathceilr   )r0   r   	feat_sizes      r3   dynamic_feat_sizeHybridEmbed.dynamic_feat_size   s     a[D$6$6q$998A;$J\J\]^J_;_`	99Yq\DOOA,>>?9UV<Z^ZiZijkZlKlAmmmQ<4??1#55y|tWXGY7YYYr5   enablec                     [        U R                  S5      (       a  U R                  R                  US9  g [        U R                  S5      (       a  XR                  l        g g Nset_grad_checkpointing)rd   grad_checkpointingrE   r   rg   rh   r0   rd   s     r3   rg   "HybridEmbed.set_grad_checkpointing   J    4==":;;MM000?T]]$899/5MM, :r5   c                    U R                  U5      n[        U[        [        45      (       a  US   nUR                  u    p#nU R
                  (       a}  U R                  S   X0R                  S   -  -
  U R                  S   -  nU R                  S   X@R                  S   -  -
  U R                  S   -  n[        R                  " USUSU45      nU R                  U5      nU R                  (       a#  UR                  S5      R                  SS5      nU$ U R                  [        R                  :w  a  [        XR                  5      nU$ )Nr7   r   r      )r   r'   r@   rA   rB   r   r   Fpadr   r   	transposer   r	   r-   r
   )r0   x_HWpad_hpad_ws          r3   forwardHybridEmbed.forward   s   MM!a$''"AWW
1__Q'!ooa.@*@@DOOTUDVVE__Q'!ooa.@*@@DOOTUDVVEa!UAu-.AIIaL<<		!&&q!,A  __+??+Ar5   )r   r   r*   r   r   r   r+   r   r   r,   r   r   r   r   )   r   NN      TTTNTFNN)rz   r   NNNNN)NNNNNT)__name__
__module____qualname____firstlineno____doc__r	   __annotations__r;   jitFinalboolr   r(   r   intr   r   strr&   r)   rU   r\   rb   ignorerg   rx   __static_attributes____classcell__r2   s   @r3   r   r      s    YY__T**
 5867BFCG  (,$($)!?&ii?& CsCx01?& c5c?23	?&
 #5eCHo)=#>??& $E#uS#X*>$?@?& ?& ?& ?& ?& ?& !?& "?& "?& ?&F 5867BFCG)-$fCsCx01$f c5c?23$f #5eCHo)=#>?	$f
 $E#uS#X*>$?@$f "#$fP ?C@DBFCG)-0uS%S/%9:;0 !sE#s(O';!<=0 #5eCHo)=#>?	0
 $E#uS#X*>$?@0 "#0d#E%S/32F,G #Z%S/ ZeCHo Z YY6T 6 6 r5   r   c                   J  ^  \ rS rSrSr          SS\R                  S\\\	\\4   4   S\\\	\\4   4   S\
\\\	\\4   4      S\
\\\	\\4   4      S\S	\4U 4S
 jjjr\R                  R                  SS\4S jj5       rS\	\R"                  \\   4   4S jrSrU =r$ )HybridEmbedWithSizerz   r   r   r   r   r   r   r   r   c                 4   > [         TU ]  UUUUUUUUU	U
US9  g )N)r   r   r   r   r   r   r   r   r   r    r!   )r%   r&   )r0   r   r   r   r   r   r   r   r   r   r    r!   r2   s               r3   r&   HybridEmbedWithSize.__init__   s8     	!%' 	 	
r5   rd   c                     [        U R                  S5      (       a  U R                  R                  US9  g [        U R                  S5      (       a  XR                  l        g g rf   ri   rj   s     r3   rg   *HybridEmbedWithSize.set_grad_checkpointing   rl   r5   rW   c                     U R                  U5      n[        U[        [        45      (       a  US   nU R	                  U5      nUR                  S5      R                  SS5      UR                  SS  4$ )Nr7   rn   r   r8   )r   r'   r@   rA   r   r   rq   rB   )r0   rr   s     r3   rx   HybridEmbedWithSize.forward  sa    MM!a$''"AIIaLyy|%%a+QWWRS\99r5   r$   )
rz   r   NNr{   r|   TTNNr}   )r~   r   r   r   r   r   r(   r   r   r   r   r&   r;   r   r   r   rg   Tensorr   rx   r   r   r   s   @r3   r   r      s    5867BFCG 
ii
 CsCx01
 c5c?23	

 #5eCHo)=#>?
 $E#uS#X*>$?@
 
 
 
8 YY6T 6 6:E%,,S	"9: : :r5   r   )r   loggingr_   typingr   r   r   r   r;   r   torch.nn.functional
functionalro   formatr	   r
   helpersr   patch_embedr   	getLoggerr~   _loggerr(   r   r   r$   r5   r3   <module>r      s^      / /     #  - 

H
%H")) HV,:+ ,:r5   