
    khH                     j   d Z ddlZddlmZmZ ddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZ d	gZ G d
 dej&                        Z G d dej&                        Z G d dej&                        Z G d dej&                        Z G d dej&                        Z G d d	ej&                        Zd'dZd(dZ e ed       ed       ed       ed       ed       ed       ed       ed       ed       ed       ed       ed      d      Zed'defd       Zed'd       Zed'defd       Zed'defd       Z ed'defd       Z!ed'defd        Z"ed'defd!       Z#ed'defd"       Z$ed'defd#       Z%ed'defd$       Z&ed'defd%       Z'ed'defd&       Z(y))af   Deep Layer Aggregation and DLA w/ Res2Net
DLA original adapted from Official Pytorch impl at: https://github.com/ucbdrive/dla
DLA Paper: `Deep Layer Aggregation` - https://arxiv.org/abs/1707.06484

Res2Net additions from: https://github.com/gasvn/Res2Net/
Res2Net Paper: `Res2Net: A New Multi-scale Backbone Architecture` - https://arxiv.org/abs/1904.01169
    N)ListOptionalIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)create_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsDLAc                   p     e Zd ZdZd fd	Zddeej                     deeej                        fdZ	 xZ
S )DlaBasicz	DLA Basicc           	      Z   t         t        |           t        j                  ||d||d|      | _        t        j                  |      | _        t        j                  d      | _	        t        j                  ||dd|d|      | _
        t        j                  |      | _        || _        y )N   Fkernel_sizestridepaddingbiasdilationTinplacer	   )superr   __init__nnConv2dconv1BatchNorm2dbn1ReLUreluconv2bn2r   )selfinplanesplanesr   r   _	__class__s         K/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/dla.pyr   zDlaBasic.__init__   s    h&(YYf!8%(L
 >>&)GGD)	YYFhUXG
 >>&)    shortcutchildrenc                     ||}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }||z  }| j                  |      }|S N)r   r    r"   r#   r$   r%   xr,   r-   outs        r*   forwardzDlaBasic.forward&   si    Hjjmhhsmiinjjohhsmxiin
r+   r	   r	   NN)__name__
__module____qualname____doc__r   r   torchTensorr   r3   __classcell__r)   s   @r*   r   r      s9    8ELL#9 HUYZ_ZfZfUgLh r+   r   c                   t     e Zd ZdZdZd fd	Zddeej                     dee	ej                        fdZ
 xZS )	DlaBottleneckzDLA/DLA-X Bottleneck   c           
      2   t         t        |           || _        t	        t        j                  ||dz  z        |z        }|| j                  z  }t        j                  ||dd      | _
        t        j                  |      | _        t        j                  ||d||d||      | _        t        j                  |      | _        t        j                  ||dd      | _        t        j                  |      | _        t        j"                  d      | _        y )	N@   r	   Fr   r   r   )r   r   r   r   r   groupsTr   )r   r?   r   r   intmathfloor	expansionr   r   r   r   r    r#   r$   conv3bn3r!   r"   )	r%   r&   	outplanesr   r   cardinality
base_width
mid_planesr)   s	           r*   r   zDlaBottleneck.__init__;   s    mT+-Ib$AB[PQ
4>>1
YYxO
>>*-YY
8%(S^`
 >>*-YYz9!%P
>>),GGD)	r+   r,   r-   c                 J   ||}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }| j                  |      }||z  }| j                  |      }|S r/   )r   r    r"   r#   r$   rI   rJ   r0   s        r*   r3   zDlaBottleneck.forwardK   s    Hjjmhhsmiinjjohhsmiinjjohhsmxiin
r+   )r	   r	   r	   rB   r5   r6   r7   r8   r9   rH   r   r   r:   r;   r   r3   r<   r=   s   @r*   r?   r?   7   s>    I* 8ELL#9 HUYZ_ZfZfUgLh r+   r?   c                   t     e Zd ZdZdZd fd	Zddeej                     dee	ej                        fdZ
 xZS )	DlaBottle2neckzj Res2Net/Res2NeXT DLA Bottleneck
    Adapted from https://github.com/gasvn/Res2Net/blob/master/dla.py
    r@   c                    t         t        |           |dkD  | _        || _        t        t        j                  ||dz  z        |z        }|| j                  z  }|| _	        t        j                  |||z  dd      | _        t        j                  ||z        | _        t        d|dz
        }	g }
g }t!        |	      D ]R  }|
j#                  t        j                  ||d||||d             |j#                  t        j                  |             T t        j$                  |
      | _        t        j$                  |      | _        | j                  rt        j*                  d|d      nd | _        t        j                  ||z  |dd      | _        t        j                  |      | _        t        j2                  d	      | _        y )
Nr	   rB   FrC   r   )r   r   r   r   rD   r   )r   r   r   Tr   )r   rR   r   is_firstscalerE   rF   rG   rH   widthr   r   r   r   r    maxrangeappend
ModuleListconvsbns	AvgPool2dpoolrI   rJ   r!   r"   )r%   r&   rK   r   r   rU   rL   rM   rN   num_scale_convsr[   r\   r(   r)   s                r*   r   zDlaBottle2neck.__init__f   su   nd,.

Ib$AB[PQ
4>>1

YYxe);QVW
>>*u"45a+' 	3ALLJAx(;]bd e JJr~~j12		3
 ]]5)
==%MQ]]BLLQvqI`d	YYzE19!RWX
>>),GGD)	r+   r,   r-   c                    ||}| j                  |      }| j                  |      }| j                  |      }t        j                  || j
                  d      }g }|d   }t        t        | j                  | j                              D ]Y  \  }\  }	}
|dk(  s| j                  r||   }n|||   z   } |	|      } |
|      }| j                  |      }|j                  |       [ | j                  dkD  rD| j                  $|j                  | j                  |d                n|j                  |d          t        j                  |d      }| j                  |      }| j!                  |      }||z  }| j                  |      }|S )Nr	   r   )r   r    r"   r:   splitrV   	enumeratezipr[   r\   rT   rY   rU   r^   catrI   rJ   )r%   r1   r,   r-   r2   spxspospiconvbns              r*   r3   zDlaBottle2neck.forward   sU   Hjjmhhsmiinkk#tzz1-V&s4::txx'@A 	MAzbAvV#a&[bBBB2BJJrN	 ::>yy$

499SW-.

3r7#iiQjjohhsmxiin
r+   )r	   r	         rl   r5   rP   r=   s   @r*   rR   rR   `   sB     I*6!8ELL#9 !HUYZ_ZfZfUgLh !r+   rR   c                   D     e Zd Z fdZdeej                     fdZ xZS )DlaRootc           	          t         t        |           t        j                  ||ddd|dz
  dz        | _        t        j                  |      | _        t        j                  d      | _	        || _
        y )Nr	   Fr@   )r   r   r   Tr   )r   ro   r   r   r   rj   r   rk   r!   r"   r,   )r%   in_channelsout_channelsr   r,   r)   s        r*   r   zDlaRoot.__init__   s`    gt%'IIqWX]^H^`	...GGD)	 r+   
x_childrenc                     | j                  t        j                  |d            }| j                  |      }| j                  r||d   z  }| j                  |      }|S )Nr	   r   )rj   r:   re   rk   r,   r"   )r%   rs   r1   s      r*   r3   zDlaRoot.forward   sO    IIeii
A./GGAJ==AAIIaLr+   )	r6   r7   r8   r   r   r:   r;   r3   r<   r=   s   @r*   ro   ro      s    !$u||"4 r+   ro   c                   |     e Zd Z	 	 	 	 	 	 	 	 d fd	Zddeej                     deeej                        fdZ xZ	S )DlaTreec           	         t         t        |           |
dk(  rd|z  }
|	r|
|z  }
|dkD  rt        j                  ||      nt        j
                         | _        t        j
                         | _        t        |||      }|dk(  r ||||fi || _	         |||dfi || _
        ||k7  rFt        j                  t        j                  ||ddd      t        j                  |            | _        t        |
|||      | _        nY|j!                  t        ||             t        |dz
  ||||fd	di|| _	        t        |dz
  |||fd	|
|z   i|| _
        d | _        |	| _        |
| _        || _        y )
Nr   r@   r	   r   )r   rL   rM   F)r   r   r   )root_kernel_sizeroot_shortcutroot_dim)r   rv   r   r   	MaxPool2dIdentity
downsampleprojectdicttree1tree2
Sequentialr   r   ro   rootupdate
level_rootr{   levels)r%   r   blockrq   rr   r   r   rL   rM   r   r{   ry   rz   cargsr)   s                 r*   r   zDlaTree.__init__   s    	gt%'q=<'H#HAG!",,vf=QSQ\Q\Q^{{}hKJWQ;{L&JEJDJ|\1FFDJl*  "}}IIk<QqW\]NN<0 2  ,8H-XDILL/?}]^ 
  DJ !
	
 "L0 DJ DI$ r+   r,   r-   c                 b   |g }| j                  |      }| j                  |      }| j                  r|j                  |       | j	                  ||      }| j
                  )| j                  |      }| j                  ||g|z         }|S |j                  |       | j                  |d |      }|S r/   )r~   r   r   rY   r   r   r   )r%   r1   r,   r-   bottomx1x2s          r*   r3   zDlaTree.forward   s    H#<<'??OOF#ZZ8$99 BB		2r(X-.A  OOB

2tX.Ar+   )r	   r	   r	   rB   Fr   r	   Fr5   )
r6   r7   r8   r   r   r:   r;   r   r3   r<   r=   s   @r*   rv   rv      sQ     8t8ELL#9 HUYZ_ZfZfUgLh r+   rv   c            	       ,    e Zd Zddddddeddf	 fd		Zdd
Zej                  j                  dd       Z	ej                  j                  dd       Z
ej                  j                  dej                  fd       ZddedefdZd ZddefdZd Z xZS )r         r   avgr	   rB   Fg        c           
         t         t        |           || _        || _        || _        || _        |dk(  sJ t        j                  t        j                  ||d   dddd      t        j                  |d         t        j                  d	            | _        | j                  |d   |d   |d         | _        | j                  |d   |d   |d   d
      | _        t!        |||
      }t#        |d
   |	|d   |d
   d
fddi|| _        t#        |d   |	|d
   |d   d
fddi|| _        t#        |d   |	|d   |d   d
fddi|| _        t#        |d   |	|d   |d   d
fddi|| _        t!        |d   dd      t!        |d   d
d      t!        |d
   dd      t!        |d   dd      t!        |d   dd      t!        |d   dd      g| _        |d   x| _        | _        t3        | j.                  | j                  |d|      \  | _        | _        | _        |rt        j:                  d      nt        j<                         | _        | jA                         D ]  }tC        |t        j                        ri|jD                  d   |jD                  d   z  |jF                  z  }|jH                  jJ                  jM                  dtO        jP                  d|z               tC        |t        j                        s|jH                  jJ                  jS                  d       |jT                  jJ                  jW                           y )Nr   r      r	   r   F)r   r   r   r   Tr   r@   rx   )rL   rM   rz   r   rl      level0)num_chs	reductionmodulelevel1level2rm   level3   level4level5ra   )	pool_typeuse_conv	drop_rateg       @),r   r   r   channelsnum_classesrL   rM   r   r   r   r   r!   
base_layer_make_conv_levelr   r   r   rv   r   r   r   r   feature_infonum_featureshead_hidden_sizer   global_pool	head_dropfcFlattenr}   flattenmodules
isinstancer   rr   weightdatanormal_rF   sqrtfill_r   zero_)r%   r   r   output_strider   in_chansr   rL   rM   r   shortcut_rootr   r   mnr)   s                  r*   r   zDLA.__init__  s    	c4!# &&$"""--IIh1aV[\NN8A;'GGD!

 ++HQK!fQiP++HQK!fQiXY+ZS`afQiXa[!gX]gafgfQiXa[!fX\f`effQiXa[!fX\f`effQiXa[!fX\f`ef!(C!(C!(C!(C!8D!8D
 5=RL@D14E!5
1$.$' )4rzz!} 	$A!RYY'MM!$q}}Q'77!..H%%a26):;Ar~~.##A&!!#	$r+   c                    g }t        |      D ]`  }|j                  t        j                  ||d|dk(  r|nd|d|      t        j                  |      t        j
                  d      g       |}b t        j                  | S )Nr   r   r	   Fr   Tr   )rX   extendr   r   r   r!   r   )r%   r&   r'   r[   r   r   r   ri   s           r*   r   zDLA._make_conv_levelA  s    u 	ANN		f!%&!V6$58E v&%' ( H	 }}g&&r+   c                 ,    t        d|rdng d      }|S )Nz^base_layer^level(\d+)))z^level(\d+)\.tree(\d+)N)z^level(\d+)\.root)r@   )r   )r	   )stemblocks)r   )r%   coarsematchers      r*   group_matcherzDLA.group_matcherN  s     %+> 2
 r+   c                     |rJ d       y )Nz$gradient checkpointing not supported )r%   enables     r*   set_grad_checkpointingzDLA.set_grad_checkpointing[  s    AAAz6r+   returnc                     | j                   S r/   )r   )r%   s    r*   get_classifierzDLA.get_classifier_  s    wwr+   r   r   c                     || _         t        | j                  | j                   |d      \  | _        | _        |rt        j                  d      | _        y t        j                         | _        y )NT)r   r   r	   )	r   r   r   r   r   r   r   r}   r   )r%   r   r   s      r*   reset_classifierzDLA.reset_classifierc  sR    &$5t//;QU%W!$'(3rzz!}r+   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }|S r/   )r   r   r   r   r   r   r   r%   r1   s     r*   forward_featureszDLA.forward_featuresi  sc    OOAKKNKKNKKNKKNKKNKKNr+   
pre_logitsc                     | j                  |      }| j                  |      }|r| j                  |      S | j                  |      }| j                  |      S r/   )r   r   r   r   )r%   r1   r   s      r*   forward_headzDLA.forward_heads  sL    QNN1<<?"GGAJ||Ar+   c                 J    | j                  |      }| j                  |      }|S r/   )r   r   r   s     r*   r3   zDLA.forward{  s'    !!!$a r+   r4   F)T)r   )r6   r7   r8   rR   r   r   r:   jitignorer   r   r   Moduler   rE   strr   r   boolr   r3   r<   r=   s   @r*   r   r     s    
  :$x' YY
 
 YYB B YY		  GC Gc G$ r+   c                 @    t        t        | |fdt        d      d|S )NF)r	   r@   r   rl   r   )out_indices)pretrained_strictfeature_cfg)r
   r   r   )variant
pretrainedkwargss      r*   _create_dlar     s4      _5  r+   c                 0    | dddddt         t        ddd
|S )	Nr   )r      r   )r   r   g      ?bilinearzbase_layer.0r   )
urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )r   r   s     r*   _cfgr     s0    =vJ%.B$D  r+   ztimm/)	hf_hub_id)z
dla34.in1kzdla46_c.in1kzdla46x_c.in1kzdla60x_c.in1kz
dla60.in1kzdla60x.in1kzdla102.in1kzdla102x.in1kzdla102x2.in1kzdla169.in1kzdla60_res2net.in1kzdla60_res2next.in1kr   c           	      X    t        ddt        dd      }t        d| fi t        |fi |S )Nr	   r	   r	   r@   r   r	   r   r            i   r	      r   r   r   rL   rM   dla60_res2netr   rR   r   r   r   
model_argss      r*   r   r     s7    !,I!<J 
Qd:6P6PQQr+   c           	      X    t        ddt        dd      }t        d| fi t        |fi |S )Nr   r   rm   rl   r   dla60_res2nextr   r   s      r*   r   r     s8    !,I!;J 'RtJ7Q&7QRRr+   c           	      \    t        g dg dt              }t        d| fi t        |fi |S )Nr	   r	   r	   r@   r@   r	   )r   r   rB   r   r   r   r   r   r   dla34)r   r   r   r   s      r*   r  r    s1    !,GxYJw
Id:.H.HIIr+   c           	      \    t        g dg dt              }t        d| fi t        |fi |S )Nr   r   r   rB   rB   r   r   r   dla46_cr   r?   r   r   s      r*   r  r    s1    !,Fm]Jy*KZ0J60JKKr+   c           	      `    t        g dg dt        dd      }t        d| fi t        |fi |S )Nr   r  r   rl   r   dla46x_cr  r   s      r*   r  r    7    !,F;J z:Lj1KF1KLLr+   c           	      `    t        g dg dt        dd      }t        d| fi t        |fi |S )Nr   r  r   rl   r   dla60x_cr  r   s      r*   r
  r
    r  r+   c           	      \    t        g dg dt              }t        d| fi t        |fi |S )Nr   r   r   dla60r  r   s      r*   r  r    s3    !,IJ w
Id:.H.HIIr+   c           	      `    t        g dg dt        dd      }t        d| fi t        |fi |S )Nr   r   r   rl   r   dla60xr  r   s      r*   r  r    s7    !,I;J xJtJ/I&/IJJr+   c           	      ^    t        g dg dt        d      }t        d| fi t        |fi |S )Nr	   r	   r	   r   rl   r	   r   Tr   r   r   r   dla102r  r   s      r*   r  r    5    !,I41J xJtJ/I&/IJJr+   c           	      b    t        g dg dt        ddd      }t        d| fi t        |fi |S )Nr  r   r   rl   Tr   r   r   rL   rM   r   dla102xr  r   s      r*   r  r    s:    !,IOJ y*KZ0J60JKKr+   c           	      b    t        g dg dt        ddd      }t        d| fi t        |fi |S )Nr  r   rB   rl   Tr  dla102x2r  r   s      r*   r  r    s:    !,IOJ z:Lj1KF1KLLr+   c           	      ^    t        g dg dt        d      }t        d| fi t        |fi |S )N)r	   r	   r@   r   r   r	   r   Tr  dla169r  r   s      r*   r  r    r  r+   r   ) ))r9   rF   typingr   r   r:   torch.nnr   	timm.datar   r   timm.layersr   _builderr
   	_registryr   r   __all__r   r   r?   rR   ro   rv   r   r   r   default_cfgsr   r   r  r  r  r
  r  r  r  r  r  r  r   r+   r*   <module>r$     sq    !   A ) * <'ryy B&BII &RBRYY BJbii &Ibii IXz")) zz %)7+G,G,)'*'*7+G,'*1'2&   R R R S S J J J L3 L L MC M M MC M M J J J K# K K K# K K L3 L L MC M M K# K Kr+   