
    ^j                     J   d Z ddlmZ ddlmZ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 ddlmZmZ ddlmZmZmZmZmZmZmZmZ ddlmZmZ d	d
lmZ d	dl m!Z! d	dl"m#Z# d	dl$m%Z%m&Z& d	dl'm(Z(m)Z) dgZ* G d dejV                        Z, G d dejV                        Z- G d dejV                        Z. G d dejV                        Z/ G d dejV                        Z0 G d dejV                        Z1dedee2e2f   fdZ3e#dedee2e2f   d e2d!e2fd"       Z4 G d# d$ejV                        Z5 G d% d&ejV                        Z6 G d' d(ejV                        Z7 G d) dejV                        Z8d>d*Z9d+ Z:d?d,Z;d@d-Z< e( e<d./       e<d./       e<d./       e<        e<        e<        e<d0dd12       e<d3dd12      d4      Z=e)d?d5e8fd6       Z>e)d?d5e8fd7       Z?e)d?d5e8fd8       Z@e)d?d5e8fd9       ZAe)d?d5e8fd:       ZBe)d?d5e8fd;       ZCe)d?d5e8fd<       ZDe)d?d5e8fd=       ZEy)Aaf   DaViT: Dual Attention Vision Transformers

As described in https://arxiv.org/abs/2204.03645

Input size invariant transformer architecture that combines channel and spacial
attention in each block. The attention mechanisms used are linear in complexity.

DaViT model defs and weights adapted from https://github.com/dingmyu/davit, original copyright below

    )partial)ListOptionalTupleTypeUnionN)TensorIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathcalculate_drop_path_rates	to_2tupletrunc_normal_MlpLayerNorm2dget_norm_layeruse_fused_attn)NormMlpClassifierHeadClassifierHead   )build_model_with_cfg)feature_take_indices)register_notrace_function)
checkpointcheckpoint_seq)generate_default_cfgsregister_modelDaVitc                   B     e Zd Z	 	 	 	 ddededef fdZdefdZ xZS )
ConvPosEncdimkactc                     ||d}t         |           t        j                  ||f|d|dz  |d|| _        |rt        j
                         | _        y t        j                         | _        y )Ndevicedtyper      )kernel_sizestridepaddinggroups)super__init__nnConv2dprojGELUIdentityr$   )selfr"   r#   r$   r'   r(   dd	__class__s          \/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/davit.pyr/   zConvPosEnc.__init__#   sn     /II
 F
 
	 !$2779    xc                 P    | j                  |      }|| j                  |      z   }|S N)r2   r$   )r5   r:   feats      r8   forwardzConvPosEnc.forward9   s&    yy|r9   )   FNN	__name__
__module____qualname__intboolr/   r	   r>   __classcell__r7   s   @r8   r!   r!   "   s>     77 7 	7, r9   r!   c            
       h     e Zd ZdZdddeddfdededed	eej                     f fd
Z	de
fdZ xZS )Stemz Size-agnostic implementation of 2D image to patch embedding,
        allowing input size to be adjusted during model forward operation
    r?   `      Nin_chsout_chsr+   
norm_layerc                     ||d}t         |           t        |      }|| _        || _        || _        |d   dk(  sJ t        j                  ||fd|dd|| _         ||fi || _	        y )Nr&   r   rK      r?   r*   r+   r,   )
r.   r/   r   r+   rL   rM   r0   r1   convnorm)	r5   rL   rM   r+   rN   r'   r(   r6   r7   s	           r8   r/   zStem.__init__D   s     /6"ayA~~II
 
 
	 w-"-	r9   r:   c                 h   |j                   \  }}}}| 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                  |      }|S )Nr   r   )shaper+   FpadrR   rS   )r5   r:   BCHWpad_rpad_bs           r8   r>   zStem.forward^   s    WW
1aQ!dkk!n"44AFQ!dkk!n"44AFEE!a5)*IIaLIIaLr9   )rA   rB   rC   __doc__r   rD   r   r0   Moduler/   r	   r>   rF   rG   s   @r8   rI   rI   ?   s[     *5.. . 	.
 RYY.4 r9   rI   c            
       `     e Zd Zdeddfdedededeej                     f fdZde	fd	Z
 xZS )

Downsampler?   NrL   rM   r*   rN   c                     ||d}t         |           || _        || _         ||fi || _        |dz  dk(  | _        t        j                  ||f|d| j
                  rdn|dz  d|| _        y )Nr&   r)   r   rQ   )	r.   r/   rL   rM   rS   even_kr0   r1   rR   )	r5   rL   rM   r*   rN   r'   r(   r6   r7   s	           r8   r/   zDownsample.__init__i   s     /v,,	!Ao*II
 $A+*:
 
	r9   r:   c                    |j                   \  }}}}| j                  |      }| j                  rI| j                  j                  \  }}|||z  z
  |z  }|||z  z
  |z  }	t        j                  |d|d|	f      }| j                  |      }|S )Nr   )rU   rS   rc   rR   r*   rV   rW   )
r5   r:   rX   rY   rZ   r[   k_hk_wr\   r]   s
             r8   r>   zDownsample.forward   s    WW
1aIIaL;;yy,,HC1s7]c)E1s7]c)Ea!UQ./AIIaLr9   )rA   rB   rC   r   rD   r   r0   r_   r/   r	   r>   rF   rG   s   @r8   ra   ra   h   sP    
  !*5

 
 	

 RYY
2	 	r9   ra   c            	       B     e Zd Z	 	 	 	 	 ddedededef fdZd Z xZS )ChannelAttentionV2r"   	num_headsqkv_biasdynamic_scalec                     ||d}t         |           || _        ||z  | _        || _        t        j                  ||dz  fd|i|| _        t        j                  ||fi || _        y )Nr&   r?   bias)	r.   r/   r-   head_dimrk   r0   Linearqkvr2   )	r5   r"   ri   rj   rk   r'   r(   r6   r7   s	           r8   r/   zChannelAttentionV2.__init__   sl     /y(*99S#'??B?IIc3-"-	r9   c                 :   |j                   \  }}}| j                  |      j                  ||d| j                  || j                  z        j	                  ddddd      }|j                  d      \  }}}| j                  r	||dz  z  }n|| j                  dz  z  }|j                  dd      |z  }	|	j                  d	      }	|	|j                  dd      z  j                  dd      }|j                  dd      j                  |||      }| j                  |      }|S )
Nr?   r)   r   r   rK         r"   )rU   rp   reshaper-   permuteunbindrk   rn   	transposesoftmaxr2   
r5   r:   rX   NrY   rp   qr#   vattns
             r8   r>   zChannelAttentionV2.forward   s
   ''1ahhqk!!!Q4;;T[[8HIQQRSUVXY[\^_`**Q-1aAIADMMT))A{{2r"Q&|||#AKKB''222r:KK1%%aA.IIaLr9   )   TTNN)rA   rB   rC   rD   rE   r/   r>   rF   rG   s   @r8   rh   rh      sD    
 !"&.. . 	.
  .$r9   rh   c                   B     e Zd Z	 	 	 	 ddededef fdZdefdZ xZS )ChannelAttentionr"   ri   rj   c                     ||d}t         |           || _        ||z  }|dz  | _        t	        j
                  ||dz  fd|i|| _        t	        j
                  ||fi || _        y )Nr&   rr   r?   rm   )r.   r/   ri   scaler0   ro   rp   r2   )	r5   r"   ri   rj   r'   r(   r6   rn   r7   s	           r8   r/   zChannelAttention.__init__   sn     /")#%
99S#'??B?IIc3-"-	r9   r:   c                 
   |j                   \  }}}| j                  |      j                  ||d| j                  || j                  z        j	                  ddddd      }|j                  d      \  }}}|| j                  z  }|j                  dd      |z  }	|	j                  d      }	|	|j                  dd      z  j                  dd      }|j                  dd      j                  |||      }| j                  |      }|S )	Nr?   r)   r   r   rK   rs   rt   ru   )
rU   rp   rv   ri   rw   rx   r   ry   rz   r2   r{   s
             r8   r>   zChannelAttention.forward   s    ''1ahhqk!!!Q4>>1;NOWWXY[\^_abdef**Q-1a

N{{2r"Q&|||#AKKB''222r:KK1%%aA.IIaLr9   )r   FNNr@   rG   s   @r8   r   r      s>    
 ".. . 	." r9   r   c                        e Zd Zdddej                  ej
                  dddddf
dededed	ed
ede	ej                     de	ej                     dededef fdZdefdZ xZS )ChannelBlock      @F        TNr"   ri   	mlp_ratiorj   	drop_path	act_layerrN   ffncpe_actv2c                 4   ||d}t         |           t        d|d|	d|| _        || _         ||fi || _        |
rt        nt        } ||f||d|| _        |dkD  rt        |      nt        j                         | _        t        d|d|	d|| _        | j                  r^ ||fi || _        t        d|t!        ||z        |d|| _        |dkD  rt        |      | _        y t        j                         | _        y d | _        d | _        d | _        y Nr&   r?   )r"   r#   r$   )ri   rj   r   )in_featureshidden_featuresr    )r.   r/   r!   cpe1r   norm1rh   r   r   r   r0   r4   
drop_path1cpe2norm2r   rD   mlp
drop_path2)r5   r"   ri   r   rj   r   r   rN   r   r   r   r'   r(   r6   
attn_layerr7   s                  r8   r/   zChannelBlock.__init__   s'    /?3!?B?	*r*
+-'3C


 	
	 2;R(9-R[[]?3!?B?	88#C.2.DJ  #C)O 4# 	DH 6?^hy1DODODJDH"DOr9   r:   c                 `   |j                   \  }}}}| j                  |      j                  d      j                  dd      }| j	                  |      }| j                  |      }|| j                  |      z   }| j                  |j                  dd      j                  ||||            }| j                  w|j                  d      j                  dd      }|| j                  | j                  | j                  |                  z   }|j                  dd      j                  ||||      }|S )Nr)   r   )rU   r   flattenry   r   r   r   r   viewr   r   r   )r5   r:   rX   rY   rZ   r[   curs          r8   r>   zChannelBlock.forward  s    WW
1aIIaL  #--a3jjmiin$$IIakk!Q',,Q1a8988		!&&q!,ADOODHHTZZ]$;<<AAq!&&q!Q2Ar9   )rA   rB   rC   r0   r3   	LayerNormrD   floatrE   r   r_   r/   r	   r>   rF   rG   s   @r8   r   r      s      ""!)+*,,,!+#+# +# 	+#
 +# +# BII+# RYY+# +# +# +#Z r9   r   r:   window_sizec                     | j                   \  }}}}| j                  |||d   z  |d   ||d   z  |d   |      } | j                  dddddd      j                         j                  d|d   |d   |      }|S )z
    Args:
        x: (B, H, W, C)
        window_size (int): window size
    Returns:
        windows: (num_windows*B, window_size, window_size, C)
    r   r   r?   r)   rK      rs   rU   r   rw   
contiguous)r:   r   rX   rZ   r[   rY   windowss          r8   window_partitionr     s     JAq!Q	q!{1~%{1~qKN7JKXYN\]^Aii1aAq)446;;BAP[\]P^`abGNr9   r   rZ   r[   c                     | j                   d   }| j                  d||d   z  ||d   z  |d   |d   |      }|j                  dddddd      j                         j                  d|||      }|S )z
    Args:
        windows: (num_windows*B, window_size, window_size, C)
        window_size (int): Window size
        H (int): Height of image
        W (int): Width of image
    Returns:
        x: (B, H, W, C)
    rs   r   r   r?   r)   rK   r   r   )r   r   rZ   r[   rY   r:   s         r8   window_reverser   (  s     	bARk!n,a;q>.A;q>S^_`SacdeA			!Q1a#..055b!QBAHr9   c            	            e Zd ZU dZej
                  j                  e   ed<   	 	 	 d
de	de
e	e	f   de	def fdZdefd	Z xZS )WindowAttentiona   Window based multi-head self attention (W-MSA) module with relative position bias.
    It supports both of shifted and non-shifted window.
    Args:
        dim (int): Number of input channels.
        window_size (tuple[int]): The height and width of the window.
        num_heads (int): Number of attention heads.
        qkv_bias (bool, optional):  If True, add a learnable bias to query, key, value. Default: True
    
fused_attnr"   r   ri   rj   c                 B   ||d}t         	|           || _        || _        || _        ||z  }|dz  | _        t               | _        t        j                  ||dz  fd|i|| _
        t        j                  ||fi || _        t        j                  d      | _        y )Nr&   rr   r?   rm   rs   ru   )r.   r/   r"   r   ri   r   r   r   r0   ro   rp   r2   Softmaxrz   )
r5   r"   r   ri   rj   r'   r(   r6   rn   r7   s
            r8   r/   zWindowAttention.__init__D  s     /&")#%
(*99S#'??B?IIc3-"-	zzb)r9   r:   c                    |j                   \  }}}| j                  |      j                  ||d| j                  || j                  z        j	                  ddddd      }|j                  d      \  }}}| j                  rt        j                  |||      }n:|| j                  z  }||j                  dd      z  }	| j                  |	      }	|	|z  }|j                  dd      j                  |||      }| j                  |      }|S )Nr?   r)   r   r   rK   rt   rs   )rU   rp   rv   ri   rw   rx   r   rV   scaled_dot_product_attentionr   ry   rz   r2   )
r5   r:   B_r|   rY   rp   r}   r#   r~   r   s
             r8   r>   zWindowAttention.forward[  s    77Aqhhqk!!"aDNNA<OPXXYZ\]_`bcefg**Q-1a??..q!Q7ADJJAB++D<<%DqAKK1%%b!Q/IIaLr9   )TNN)rA   rB   rC   r^   torchjitFinalrE   __annotations__rD   r   r/   r	   r>   rF   rG   s   @r8   r   r   9  sg     		%% "** sCx* 	*
 *. r9   r   c                        e Zd ZdZddddej
                  ej                  ddddf
ded	ed
edede	dede
ej                     de
ej                     de	de	f fdZdefdZ xZS )SpatialBlocka<   Windows Block.
    Args:
        dim (int): Number of input channels.
        num_heads (int): Number of attention heads.
        window_size (int): Window size.
        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
        qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True
        drop_path (float, optional): Stochastic depth rate. Default: 0.0
        act_layer (nn.Module, optional): Activation layer. Default: nn.GELU
        norm_layer (nn.Module, optional): Normalization layer.  Default: nn.LayerNorm
    rP   r   Tr   FNr"   ri   r   r   rj   r   r   rN   r   r   c                    ||d}t         |           || _        |	| _        || _        t        |      | _        || _        t        d|d|
d|| _	         ||fi || _
        t        || j                  f||d|| _        |dkD  rt        |      nt        j                         | _        t        d|d|
d|| _        | j                  r` ||fi || _        t'        ||z        }t)        d|||d|| _        |dkD  rt        |      | _        y t        j                         | _        y d | _        d | _        d | _        y r   )r.   r/   r"   r   ri   r   r   r   r!   r   r   r   r   r   r0   r4   r   r   r   rD   r   r   r   )r5   r"   ri   r   r   rj   r   r   rN   r   r   r'   r(   r6   mlp_hidden_dimr7   s                  r8   r/   zSpatialBlock.__init__{  sN    /"$[1"?3!?B?	*r*
#
  	

 
	 2;R(9-R[[]?3!?B?	88#C.2.DJ y1N  .# 	DH 6?^hy1DODODJDH"DOr9   r:   c           	      4   |j                   \  }}}}| j                  |      j                  d      j                  dd      }| j	                  |      }|j                  ||||      }dx}}| j                  d   || j                  d   z  z
  | j                  d   z  }	| j                  d   || j                  d   z  z
  | j                  d   z  }
t        j                  |dd||	||
f      }|j                   \  }}}}t        || j                        }|j                  d| j                  d   | j                  d   z  |      }| j                  |      }|j                  d| j                  d   | j                  d   |      }t        || j                  ||      }|d d d |d |d d f   j                         }|j                  |||z  |      }|| j                  |      z   }| j                  |j                  dd      j                  ||||            }| j                  w|j                  d      j                  dd      }|| j!                  | j                  | j#                  |                  z   }|j                  dd      j                  ||||      }|S )Nr)   r   r   rs   )rU   r   r   ry   r   r   r   rV   rW   r   r   r   r   r   r   r   r   r   )r5   r:   rX   rY   rZ   r[   shortcutpad_lpad_tr\   r]   _HpWp	x_windowsattn_windowss                   r8   r>   zSpatialBlock.forward  sy   WW
1a99Q<''*44Q:JJx FF1aA!!!$q4+;+;A+>'>>$BRBRSTBUU!!!$q4+;+;A+>'>>$BRBRSTBUUEE!aE5%78ww2r1$Q(8(89	NN2t'7'7':T=M=Ma=P'PRST	 yy+ $((T-=-=a-@$BRBRSTBUWXY<)9)92rB a!RaRlO&&(FF1a!eQtq))IIakk!Q',,Q1a8988		!&&q!,ADOODHHTZZ]$;<<AAq!&&q!Q2Ar9   )rA   rB   rC   r^   r0   r3   r   rD   r   rE   r   r_   r/   r	   r>   rF   rG   s   @r8   r   r   n  s    
   !!!!)+*,,,!0#0# 0# 	0#
 0# 0# 0# BII0# RYY0# 0# 0#d% %r9   r   c            #       *    e Zd Zddddddddeej
                  ddd	ddd
d
fdededededee	df   dedede
dedee
df   deej                     deej                     dededededef" fdZej                  j                   d!d       Zdefd Z xZS )"
DaVitStager   Tspatialchannelr?   rP   r   )r   r   Fr)   NrL   rM   depth
downsample
attn_types.ri   r   r   rj   drop_path_ratesrN   norm_layer_clr   r   down_kernel_sizenamed_blockschannel_attn_v2c                    ||d}t         |           d| _        |rt        ||f||d|| _        nt        j                         | _        	 g }t        |      D ]  }ddlm	} g }t        |      D ]c  \  }}|dk(  r*|j                  dt        d||||	|
|   ||||d	|f       5|d	k(  s;|j                  d
t        d||||	|
|   ||||d	|f       e |r+|j                  t        j                   ||                   |j                  t        j                  |D cg c]  }|d   	 c}         t        j                  | | _        y c c}w )Nr&   F)r*   rN   r   )OrderedDictr   spatial_block)	r"   ri   r   rj   r   rN   r   r   r   r   channel_block)	r"   ri   r   rj   r   rN   r   r   r   r   r   )r.   r/   grad_checkpointingra   r   r0   r4   rangecollectionsr   	enumerateappendr   r   
Sequentialblocks)r5   rL   rM   r   r   r   ri   r   r   rj   r   rN   r   r   r   r   r   r   r'   r(   r6   stage_blocks	block_idxr   dual_attention_blockattn_idx	attn_typebr7   s                               r8   r/   zDaVitStage.__init__  s   , /"' (tFVcmtqstDO kkmDO	 u !	ZI/#% '0'< #)	)(//, C#"+"+!)"1)"<#0 '$/C C 1  )+(//, C#"+"+!)"1)"<#0 '*C C 1 6 ##BMM+>R2S$TU##BMMBV3WQAaD3W$XYC!	ZD mm\2 4Xs   "Ec                     || _         y r<   )r   )r5   enables     r8   set_grad_checkpointingz!DaVitStage.set_grad_checkpointing#  s
    "(r9   r:   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S r<   )r   r   r   r   is_scriptingr   r   r5   r:   s     r8   r>   zDaVitStage.forward'  sS    OOA""599+A+A+Ct{{A.A  AAr9   T)rA   rB   rC   r   r0   r   rD   rE   r   strr   r   r_   r/   r   r   ignorer   r	   r>   rF   rG   s   @r8   r   r     sG   
 #*@ !!17*5-/\\!$%!&$))K3K3 K3 	K3
 K3 c3hK3 K3 K3 K3 K3 #5#:.K3 RYYK3  		?K3 K3 K3  "!K3" #K3$ "%K3Z YY) ) r9   r   c            +           e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-dedeedf   deedf   deedf   deded	ed
edededeedf   dedededededededededef* fdZ	d Z
ej                  j                  d.d       Zej                  j                  d/d       Zej                  j                  dej"                  fd       Zd0dedee   fdZ	 	 	 	 	 d1dej*                  d eeeee   f      d!ed"ed#ed$edeeej*                     eej*                  eej*                     f   f   fd%Z	 	 	 d2d eeee   f   d&ed'efd(Zd) Zd.d*efd+Zd, Z xZS )3r   a   DaViT
        A PyTorch implementation of `DaViT: Dual Attention Vision Transformers`  - https://arxiv.org/abs/2204.03645
        Supports arbitrary input sizes and pyramid feature extraction

    Args:
        in_chans (int): Number of input image channels. Default: 3
        num_classes (int): Number of classes for classification head. Default: 1000
        depths (tuple(int)): Number of blocks in each stage. Default: (1, 1, 3, 1)
        embed_dims (tuple(int)): Patch embedding dimension. Default: (96, 192, 384, 768)
        num_heads (tuple(int)): Number of attention heads in different layers. Default: (3, 6, 12, 24)
        window_size (int): Window size. Default: 7
        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4
        qkv_bias (bool): If True, add a learnable bias to query, key, value. Default: True
        drop_path_rate (float): Stochastic depth rate. Default: 0.1
        norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm.
    in_chansdepths.
embed_dimsri   r   r   rj   rN   r   norm_epsr   r   r   r   r   r   	drop_ratedrop_path_ratenum_classesglobal_poolhead_norm_firstc                    t          |           ||d}t        |      }|t        |      cxk(  rt        |      k(  sJ  J t        t	        |      |
      }t        t	        |	      |
      }	|| _        || _        |d   x| _        | _        || _	        d| _
        g | _        t        ||d   fd|i|| _        |d   }t        ||d      }g }t        |      D ]n  }||   }t!        ||f||   |dkD  |||   |||||   ||	|||||d	|}|}|j#                  |       | xj                  t%        |d
|d
z   z  d|       gz  c_        p t'        j(                  | | _        |rB || j                  fi || _        t/        | j                  |f|| j                  d|| _        nCt'        j2                         | _        t5        | j                  |f|| j                  |d|| _        | j7                  | j8                         y )Nr&   )epsrs   Fr   rN   T)	stagewise)r   r   r   ri   r   r   rj   r   rN   r   r   r   r   r   r   r)   zstages.)num_chs	reductionmodule)	pool_typer   )r   r   rN   )r.   r/   lenr   r   r   r   num_featureshead_hidden_sizer   r   feature_inforI   stemr   r   r   r   dictr0   r   stagesnorm_prer   headr4   r   apply_init_weights)!r5   r   r   r   ri   r   r   rj   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r(   r6   
num_stagesrL   dprr  irM   stager7   s!                                   r8   r/   zDaVit.__init__B  sQ   4 	/_
S^:s6{:::::^J7XF
} =8L& 4>rNBD1""':a=NZN2N	A'$Oz" 	cA mG Qiq5%#A,'#! #A%+!1 /)#$ %E( FMM% $w!ac(U\]^\_S`"a!bb1	c4 mmV,
 &t'8'8?B?DM&!! &..	
 DI KKMDM-!! &..% DI 	

4%%&r9   c                    t        |t        j                        rjt        |j                  d       t        |t        j                        r8|j
                  +t        j                  j                  |j
                  d       y y y y )Ng{Gz?)stdr   )
isinstancer0   ro   r   weightrm   init	constant_)r5   ms     r8   r  zDaVit._init_weights  sZ    a#!((,!RYY'AFF,>!!!&&!, -?' $r9   c                 2    t        d|rd      S g d      S )Nz^stemz^stages\.(\d+)))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)z	^norm_pre)i )r  r   )r  )r5   coarses     r8   group_matcherzDaVit.group_matcher  s'    (.$
 	
5
 	
r9   c                 X    || _         | j                  D ]  }|j                  |        y )N)r   )r   r  r   )r5   r   r  s      r8   r   zDaVit.set_grad_checkpointing  s.    "([[ 	8E(((7	8r9   returnc                 .    | j                   j                  S r<   )r  fc)r5   s    r8   get_classifierzDaVit.get_classifier  s    yy||r9   c                 J    || _         | j                  j                  ||       y r<   )r   r  reset)r5   r   r   s      r8   reset_classifierzDaVit.reset_classifier  s    &		[1r9   r:   indicesrS   
stop_early
output_fmtintermediates_onlyc                 r   |dv sJ d       g }t        t        | j                        |      \  }}	| j                  |      }t        | j                        dz
  }
t        j
                  j                         s|s| j                  }n| j                  d|	dz    }t        |      D ]u  \  }}| j                  r+t        j
                  j                         st        ||      }n ||      }||v sJ|r||
k(  r| j                  |      }n|}|j                  |       w |r|S |
k(  r| j                  |      }||fS )a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )NCHWzOutput shape must be NCHW.r   N)r   r   r  r  r   r   r   r   r   r   r  r   )r5   r:   r  rS   r  r   r!  intermediatestake_indices	max_indexlast_idxr  feat_idxr  x_inters                  r8   forward_intermediateszDaVit.forward_intermediates  s,   * Y&D(DD&"6s4;;7G"Qi IIaLt{{#a'99!!#:[[F[[)a-0F(0 
	.OHe&&uyy/E/E/Gua(!H<'H0"mmA.GG$$W-
	.   xa A-r9   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |rt        j                         | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r   r  r0   r4   r  r  )r5   r  r+  r,  r%  r&  s         r8   prune_intermediate_layerszDaVit.prune_intermediate_layers  s]     #7s4;;7G"Qikk.9q=1KKMDM!!!R(r9   c                     | j                  |      }| j                  r5t        j                  j	                         st        | j                  |      }n| j                  |      }| j                  |      }|S r<   )r  r   r   r   r   r   r  r  r   s     r8   forward_featureszDaVit.forward_features  sW    IIaL""599+A+A+Ct{{A.AAAMM!r9   
pre_logitsc                 N    |r| j                  |d      S | j                  |      S )NT)r2  )r  )r5   r:   r2  s      r8   forward_headzDaVit.forward_head  s$    0:tyyty,L		!Lr9   c                 J    | j                  |      }| j                  |      }|S r<   )r1  r4  r   s     r8   r>   zDaVit.forward  s'    !!!$a r9   )r?   r   r   r?   r   rJ           r?            rP   rK   Tlayernorm2d	layernormgh㈵>r   TFr)   FFr   r     avgFNNFr   r<   )NFFr#  F)r   FT)rA   rB   rC   r^   rD   r   r   rE   r   r/   r  r   r   r   r  r   r0   r_   r  r   r  r	   r   r   r*  r/  r1  r4  r>   rF   rG   s   @r8   r   r   0  s   & &2*=)7  !+!,"*@!$%$)!&!$&#$$)1^'^' #s(O^' c3h	^'
 S#X^' ^' ^' ^' ^' ^' ^' c3h^' ^' ^' "^'  "!^'" #^'$ %^'& "'^'( )^'* +^', "-^'@- YY
 
 YY8 8
 YY		  2C 2hsm 2 8<$$',3 ||3  eCcN343  	3 
 3  3  !%3  
tELL!5tELL7I)I#JJ	K3 n ./$#	3S	>*  	 M$ Mr9   c                 N   dd l }i }| j                         D ]
  \  }}|j                  |      r|j                  |d      }n,|j	                  dd|      }|j	                  dd|      }|j                  dd      }|j                  d	d
      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|||<    |S )Nr   r.  zconvs.([0-9]+)stages.\1.downsamplezblocks.([0-9]+)stages.\1.blocksdownsample.projdownsample.convstages.0.downsampler  zwindow_attn.norm.znorm1.zwindow_attn.fn.zattn.zchannel_attn.norm.zchannel_attn.fn.z	ffn.norm.znorm2.zffn.fn.net.zmlp.zconv1.fn.dwz	cpe1.projzconv2.fn.dwz	cpe2.proj)reitems
startswithreplacesub)
state_dictmodelprefixrJ  out_dictr#   r~   s          r8   _convert_florence2rS    s&   H  " 1<<		&"%AFF$&=qAFF%':A>II'):;II+V4 II)84II'1II*H5II('2IIk8,IImV,IIm[1IIm[1'* Or9   c                    d| v r| S d| v r| d   } d| v rt        | |      S ddl}i }| j                         D ]  \  }}|j                  dd|      }|j                  dd	|      }|j	                  d
d      }|j	                  dd      }|j	                  dd      }|j	                  dd      }|j	                  dd      }|j	                  dd      }|||<    |S )z  Remap MSFT checkpoints -> timm zhead.fc.weightrO  z vision_tower.convs.0.proj.weightr   Nzpatch_embeds.([0-9]+)rE  zmain_blocks.([0-9]+)rF  rG  rH  rI  r  zhead.zhead.fc.znorms.z
head.norm.zcpe.0r   zcpe.1r   )rS  rJ  rK  rN  rM  )rO  rP  rJ  rR  r#   r~   s         r8   checkpoint_filter_fnrU  4  s    :%z!-
)Z7!*e44H  " 	1FF+-DaHFF*,?CII'):;II+V4IIgz*IIh-IIgv&IIgv&	 Or9   c           	         t        d t        |j                  dd            D              }|j                  d|      }|j                  dd      }| j	                  d      rd}t        t        | |ft        t        d|	      |d
|}|S )Nc              3   &   K   | ]	  \  }}|  y wr<   r   ).0r
  r   s      r8   	<genexpr>z _create_davit.<locals>.<genexpr>O  s     \da\s   r   r6  out_indicespretrained_strictT_flF)flatten_sequentialrZ  )pretrained_filter_fnfeature_cfgr[  )	tupler   getpopendswithr   r   rU  r  )variant
pretrainedkwargsdefault_out_indicesrZ  strictrP  s          r8   _create_davitri  N  s    \i

8\8Z.[\\**],?@KZZ+T2F  2DkJ  E Lr9   c                 2    | dddddt         t        dddd	|S )
NrA  )r?      rk  )rP   rP   gffffff?bicubicz	stem.convzhead.fcz
apache-2.0)urlr   
input_size	pool_sizecrop_pctinterpolationmeanr  
first_conv
classifierlicenser
   )rm  rf  s     r8   _cfgrv  c  s3    =v9%.B!  r9   ztimm/)	hf_hub_idzmicrosoft/Florence-2-base)r?   r:  r:  )rw  r   rn  zmicrosoft/Florence-2-large)zdavit_tiny.msft_in1kzdavit_small.msft_in1kzdavit_base.msft_in1kdavit_large
davit_hugedavit_giantzdavit_base_fl.msft_florence2zdavit_huge_fl.msft_florence2r  c           	      L    t        ddd      }t        dd| it        |fi |S )Nr6  r7  r;  r   r   ri   re  )
davit_tinyr  ri  re  rf  
model_argss      r8   r}  r}    s0    \6IUcdJ[*[Z@ZSY@Z[[r9   c           	      L    t        ddd      }t        dd| it        |fi |S )Nr   r   	   r   r7  r;  r|  re  )davit_smallr~  r  s      r8   r  r    s0    \6IUcdJ\:\jA[TZA[\\r9   c           	      L    t        ddd      }t        dd| it        |fi |S )Nr              rK   r          r|  re  )
davit_baser~  r  s      r8   r  r    s0    \6KWefJ[*[Z@ZSY@Z[[r9   c           	      L    t        ddd      }t        dd| it        |fi |S )Nr  )r8  r9  r:     )r<  r=  r>  0   r|  re  )rx  r~  r  s      r8   rx  rx    s0    \6KWfgJ\:\jA[TZA[\\r9   c           	      L    t        ddd      }t        dd| it        |fi |S )Nr  r  r  r  i   r   r  r  @   r|  re  )ry  r~  r  s      r8   ry  ry    s0    \6LXghJ[*[Z@ZSY@Z[[r9   c           	      L    t        ddd      }t        dd| it        |fi |S )N)r   r   r=  r?   )r9  r:  r  i   )r=  r>  r  rJ   r|  re  )rz  r~  r  s      r8   rz  rz    s0    ]7MYijJ\:\jA[TZA[\\r9   c           	      T    t        ddddddd      }t        d	d| it        |fi |S )
Nr  r  r  r=  r?   Tr   r   ri   r   r   r   r   re  )davit_base_flr~  r  s      r8   r  r    s=    (=DtJ ^Z^4
C]V\C]^^r9   c           	      T    t        ddddddd      }t        d	d| it        |fi |S )
Nr  r  r  r=  r?   Tr  re  )davit_huge_flr~  r  s      r8   r  r    s?     (>/DtJ ^Z^4
C]V\C]^^r9   )zvision_tower.rC  )r.  )Fr^   	functoolsr   typingr   r   r   r   r   r   torch.nnr0   torch.nn.functional
functionalrV   r	   	timm.datar   r   timm.layersr   r   r   r   r   r   r   r   r   r   _builderr   	_featuresr   _features_fxr   _manipulater   r   	_registryr   r   __all__r_   r!   rI   ra   rh   r   r   rD   r   r   r   r   r   r   rS  rU  ri  rv  default_cfgsr}  r  r  rx  ry  rz  r  r  r   r9   r8   <module>r     s  	  5 5      A H  H  H = * + 3 3 <) :&299 &R# #L$ $Pryy D?299 ?D U38_  F sCx S S   2bii 2jd299 dNX XveBII eP84*	 % ! 6&6$(--%1 %).-%1& ( \e \ \
 ]u ] ]
 \e \ \
 ]u ] ]
 \e \ \
 ]u ] ] _ _ _ _ _ _r9   