
    kh&                         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                    t         |           t        |t        j                        sJ || _        || _        | j                  ||||      \  | _        | _	        | _
        | _        | _        | _        | _        |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                  ||||      | _        y | j                  |k(  sJ d| j                   d| d       t        j.                         | _        y )	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/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/hybrid_embed.pyr"   zHybridEmbed.__init__   s}     	(BII...   !%'	   
	
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      feature_info)r   torchno_gradr   trainingevalzerosr   r#   listtupleshapetrainziphasattrr4   channelsnum_features)r,   r   r   r   r   r&   r7   osfpr'   r(   s                r.   r%   zHybridEmbed._init_backboneX   s    X&z*
 
.==11MM&&(MM%++aXVW["YZ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   B>GG
$G!
Gc           	         ||J |xs | j                   }d }|t        |      }|9|| j                  k7  r)t        | j                  t
        j                        sJ d       t        j                         5  t        j                  | j                  j                  | j                  j                  ||| j                  j                  d u      }|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   T)verbose)r   r   r   r   r&   )r   r   r   r#   r   r   r*   r5   r6   in_channelsout_channelsr   weightcopy_r   r%   r   r   r&   r'   r(   )r,   r   r   r   r   r&   new_patch_sizenew_projs           r.   set_input_sizezHybridEmbed.set_input_size{   s    #z'===,t}}!&z2N%.DOO*Kdii3u5uu3 %99II))II** .)t3 %%&:499;K;K^ei&jk99>>-MM''		7$	% (J24??
t}}$
doo(E ##!%)+' $ !"   )F% %s   8C GG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      r.   
feat_ratiozHybridEmbed.feat_ratio   sW    q!DOOA$66q!DOOA$66
 ''""r/   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      r.   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Yr/   enablec                     t        | j                  d      r| j                  j                  |       y t        | j                  d      r|| j                  _        y y Nset_grad_checkpointing)rZ   grad_checkpointingr?   r   r]   r^   r,   rZ   s     r.   r]   z"HybridEmbed.set_grad_checkpointing   F    4==":;MM000?T]]$89/5DMM, :r/   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 )Nr1   r   r      )r   r#   r:   r;   r<   r   r   Fpadr   r   	transposer   r	   r)   r
   )r,   x_HWpad_hpad_ws          r.   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r/   )   r   NN      TTTNTF)rn   r   NNN)NNNNNT)__name__
__module____qualname____doc__r	   __annotations__r5   jitFinalboolr   r$   r   intr   r   strr"   r%   rN   rT   rY   ignorer]   rm   __classcell__r-   s   @r.   r   r      s    YY__T**
 5867BFCG  (,$($):&ii:& CsCx01:& c5c?23	:&
 #5eCHo)=#>?:& $E#uS#X*>$?@:& :& :& :& :& :& !:& ":& ":&| 5867BFCG)-!fCsCx01!f c5c?23!f #5eCHo)=#>?	!f
 $E#uS#X*>$?@!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 YY6T 6 6r/   r   c                   2    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
                 6    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-   s             r.   r"   zHybridEmbedWithSize.__init__   s2     	!%' 	 
	
r/   rZ   c                     t        | j                  d      r| j                  j                  |       y t        | j                  d      r|| j                  _        y y r\   r_   r`   s     r.   r]   z*HybridEmbedWithSize.set_grad_checkpointing   ra   r/   rO   c                     | j                  |      }t        |t        t        f      r|d   }| j	                  |      }|j                  d      j                  dd      |j                  dd  fS )Nr1   rc   r   r2   )r   r#   r:   r;   r   r   rf   r<   )r,   rg   s     r.   rm   zHybridEmbedWithSize.forward   s^    MM!a$'"AIIaLyy|%%a+QWWRS\99r/   )rn   r   NNro   rp   TTrq   )rr   rs   rt   ru   r   r$   r   rz   r   r   r"   r5   rw   r|   ry   r]   Tensorr   rm   r}   r~   s   @r.   r   r      s    5867BFCG 
ii
 CsCx01
 c5c?23	

 #5eCHo)=#>?
 $E#uS#X*>$?@
 
 
0 YY6T 6 6:E%,,S	"9: :r/   r   )ru   loggingrV   typingr   r   r   r   r5   r   torch.nn.functional
functionalrd   formatr	   r
   helpersr   patch_embedr   	getLoggerrr   _loggerr$   r   r    r/   r.   <module>r      s`      / /     #  - '

H
%}")) }@(:+ (:r/   