
    ^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 )HybridEmbedd 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   $ /(BII...    D 
!%'	

 
	
MON ! DL$Z0DO #DL$kkDO..$$Q'$//!*<<AdFWFWXYFZ]a]l]lmn]oFostFttt		   '! DI ##y0 t#D$4$4#55LYKWrst0DI    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MM&&(MM%++aXVW[agot"uva$/"A wwrs|ggaj##H-. "c(L6Q"Rda16"RSM$\2L%m&9r:M"4==.9"&--"<"<"E"E"G"KK"&--"<"<Kc,
.KLda16LM	lYq\1\=+yZe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2N%.DOO*Kdii3u5uu3 %99II))II** .)t399++))// %%&:499;K;K^ei&jk99>>-MM''		7$	% (J24??
t}}$
doo(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!DOOA$66q!DOOA$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$6q$998A;$J\J\]^J_;_`	99Yq\DOOA,>>?9UV<Z^ZiZijkZlKlAmmmQ<4??1#55y|tWXGY7Y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==":;MM000?T]]$89/5DMM, :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   MM!a$'"AWW
1a__Q'!dooa.@*@@DOOTUDVVE__Q'!dooa.@*@@DOOTUDVVEa!UAu-.AIIaL<<		!&&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    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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^    MM!a$'"AIIaLyy|%%a+QWWRS\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
    5867BFCG 
ii
 CsCx01
 c5c?23	

 #5eCHo)=#>?
 $E#uS#X*>$?@
 
 
8 YY6T 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   