
    Ng&                         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dS )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   r   N      TFbackboneimg_size
patch_sizefeature_sizefeature_ratioin_chans	embed_dimbiasprojflattenstrict_img_sizec                    t                                                       t          |t          j                  sJ || _        || _        |                     ||||          \  | _        | _	        | _
        | _        | _        | _        | _        |d| _        t!          |          | _        n|
| _        t           j        | _        || _        || _        |s@| j
        d         | j	        d         z  dk    r| j
        d         | j	        d         z  dk    sJ |	r%t          j        | j        ||||          | _        d S | j        |k    sJ d| j         d| d            t          j                    | _        d S )	N)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   	__class__s                 T/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/hybrid_embed.pyr%   zHybridEmbed.__init__   s     	(BI.....   !%'	   
 
	
MON ! DL$Z00DOO #DL$kDO.. 	u$Q'$/!*<<AAdFWXYFZ]a]lmn]oFostFtFtFtFt 	&	 &!  DIII #y000sD$4ssYsss 100DIII    r)   c           
         t          |          }t          |          }|t          j                    5  | j        j        }|r| j                                         |                     t          j        d| j        |d         |d                             }t          |t          t          f          r|d         }|j        dd          }|j        d         }| j                            |           d d d            n# 1 swxY w Y   t          d t          ||          D                       }nht          |          }t          |pd          }|Ft          | j        d          r%| j        j                                        d         }n| j        j        }t          d t          ||          D                       }|d         |d         z  }	|||||||	fS )	Nr   r   c                     g | ]
\  }}||z  S  r7   ).0sfs      r1   
<listcomp>z.HybridEmbed._init_backbone.<locals>.<listcomp>n   s     "R"R"Rda16"R"R"Rr2      feature_infoc                     g | ]
\  }}||z  S r7   r7   )r8   r:   ps      r1   r;   z.HybridEmbed._init_backbone.<locals>.<listcomp>w   s     LLLda16LLLr2   )r   torchno_gradr   trainingevalzerosr   r&   listtupleshapetrainziphasattrr=   channelsnum_features)
r/   r   r   r   r   r)   rB   or*   r+   s
             r1   r(   zHybridEmbed._init_backboneX   s    X&&z**
 
. 
.=1 )M&&(((MM%+aXVW["Y"YZZa$// "A wrss|gaj##H---
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. ""R"Rc(L6Q6Q"R"R"RSSMM$\22L%m&9r::M"4=.99 ="&-"<"E"E"G"G"KKK"&-"<KLLc,
.K.KLLLMM	lYq\1\=+yZeees   B=C>>DDc           	      &   ||J |p| j         }d }|t          |          }||| j        k    rt          | j        t
          j                  s
J d            t          j                    5  t          j        | j        j	        | j        j
        ||| j        j        d u          }|j                            t          | j        j        |d                     | j        j        $|j                            | j        j                   || _        d d d            n# 1 swxY w Y   |}|p| j        }|| j         k    s|| j        k    rG|                     |||||          \  | _         | _        | _        | _        | _        | _        | _        d S d S )Nz>HybridEmbed must have a projection layer to change patch size.r!   T)verbose)r   r   r   r   r)   )r   r   r   r&   r   r   r-   r@   rA   in_channelsout_channelsr   weightcopy_r   r(   r   r   r)   r*   r+   )r/   r   r   r   r   r)   new_patch_sizenew_projs           r1   set_input_sizezHybridEmbed.set_input_size{   s    #z'='='=,t}!&z22N%.DO*K*Kdi33uu5uuuu % %9I)I* .)t3   %%&:49;K^ei&j&j&jkkk9>-M''	777$	% % % % % % % % % % % % % % % (J24?
t}$$
do(E(E ##!%)+' $  !"     )F(Es   -B%DD"%D"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      r1   
feat_ratiozHybridEmbed.feat_ratio   sU    q!DOA$66q!DOA$66
  	#'''""r2   c                 `   |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      r1   dynamic_feat_sizezHybridEmbed.dynamic_feat_size   s     a[D$6q$998A;$J\]^J_;_`	 	Z9Yq\DOA,>>??9UV<Z^ZijkZlKlAmAmmmQ<4?1#55y|tWXGY7YYYr2   enablec                     t          | j        d          r| j                            |           d S t          | j        d          r|| j        _        d S d S Nset_grad_checkpointing)rb   grad_checkpointingrJ   r   re   rf   r/   rb   s     r1   re   z"HybridEmbed.set_grad_checkpointing   e    4=":;; 	6M000?????T]$899 	6/5DM,,,	6 	6r2   c                 `   |                      |          }t          |t          t          f          r|d         }|j        \  }}}}| j        rq| j        d         || j        d         z  z
  | j        d         z  }| j        d         || j        d         z  z
  | j        d         z  }t          j        |d|d|f          }| 	                    |          }| j
        r*|
                    d                              dd          }n*| j        t          j        k    rt          || j                  }|S )Nr4   r   r      )r   r&   rE   rF   rG   r   r   Fpadr   r   	transposer   r	   r,   r
   )r/   x_HWpad_hpad_ws          r1   forwardzHybridEmbed.forward   s   MM!a$'' 	"AW
1a 	/_Q'!doa.@*@@DOTUDVVE_Q'!doa.@*@@DOTUDVVEa!UAu-..AIIaLL< 	,		!&&q!,,AA_++4?++Ar2   )r   r   NNr   r   TTTNTF)r   r   NNN)NNNNNT)__name__
__module____qualname____doc__r	   __annotations__r@   jitFinalboolr   r'   r   intr   r   strr%   r(   rV   r\   ra   ignorere   ru   __classcell__r0   s   @r1   r   r      s          Y_T****
 5867BFCG  (,$($):& :&i:& CsCx01:& c5c?23	:&
 #5eCHo)=#>?:& $E#uS#X*>$?@:& :& :& :& :& :& !:& ":& ":& :& :& :& :& :&| 5867BFCG)-!f !fCsCx01!f c5c?23!f #5eCHo)=#>?	!f
 $E#uS#X*>$?@!f "#!f !f !f !fJ ?C@DBFCG)-- -uS%S/%9:;- !sE#s(O';!<=- #5eCHo)=#>?	-
 $E#uS#X*>$?@- "#- - - -^# #E%S/32F,G # # # #Z%S/ ZeCHo Z Z Z Z Y6 6T 6 6 6 6      r2   r   c                   X    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   Nr   r   Tr   r   r   r   r   r   r   c
                 \    t                                          |||||||||		  	         d S )N)	r   r   r   r   r   r   r   r   r   )r$   r%   )r/   r   r   r   r   r   r   r   r   r   r0   s             r1   r%   zHybridEmbedWithSize.__init__   sK     	!%' 	 
	
 
	
 
	
 
	
 
	
r2   rb   c                     t          | j        d          r| j                            |           d S t          | j        d          r|| j        _        d S d S rd   rg   rh   s     r1   re   z*HybridEmbedWithSize.set_grad_checkpointing   ri   r2   rW   c                    |                      |          }t          |t          t          f          r|d         }|                     |          }|                    d                              dd          |j        dd          fS )Nr4   rk   r   r5   )r   r&   rE   rF   r   r   rn   rG   )r/   ro   s     r1   ru   zHybridEmbedWithSize.forward   sp    MM!a$'' 	"AIIaLLyy||%%a++QWRSS\99r2   )r   r   NNr   r   TTrv   )rw   rx   ry   rz   r   r'   r   r   r   r   r%   r@   r|   r   r~   re   Tensorr   ru   r   r   s   @r1   r   r      s[         5867BFCG 
 
i
 CsCx01
 c5c?23	

 #5eCHo)=#>?
 $E#uS#X*>$?@
 
 
 
 
 
 
 
0 Y6 6T 6 6 6 6:E%,S	"9: : : : : : : : :r2   r   )rz   loggingr^   typingr   r   r   r   r@   r   torch.nn.functional
functionalrl   formatr	   r
   helpersr   patch_embedr   	getLoggerrw   _loggerr'   r   r   r7   r2   r1   <module>r      s6      / / / / / / / / / / / /                 # # # # # # # #       - - - - - - '
H
%
%} } } } }") } } }@(: (: (: (: (:+ (: (: (: (: (:r2   