
    khJ5                        d Z ddlmZ ddlmZ ddl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mZmZ ddlmZmZmZmZ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"d%dZ#d&dZ$ e e$ee       e$d       e$deeddd       e$d       e$d       e$d       e$d       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,y)'a^   PyTorch implementation of DualPathNetworks
Based on original MXNet implementation https://github.com/cypw/DPNs with
many ideas from another PyTorch implementation https://github.com/oyam/pytorch-DPNs.

This implementation is compatible with the pretrained weights from cypw's MXNet implementation.

Hacked together by / Copyright 2020 Ross Wightman
    )OrderedDict)partial)TupleN)IMAGENET_DPN_MEANIMAGENET_DPN_STDIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)BatchNormAct2dConvNormActcreate_conv2dcreate_classifierget_norm_act_layer   )build_model_with_cfg)register_modelgenerate_default_cfgsDPNc                        e Zd Zef fd	Zej                  j                  d        Zej                  j                  d        Zd Z xZ	S )CatBnActc                 H    t         t        |            ||d      | _        y )NMbP?eps)superr   __init__bn)selfin_chs
norm_layer	__class__s      K/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/dpn.pyr   zCatBnAct.__init__   s    h&(V/    c                      y N r   xs     r!   forwardzCatBnAct.forward        	r"   c                      y r$   r%   r&   s     r!   r(   zCatBnAct.forward#   r)   r"   c                 r    t        |t              rt        j                  |d      }| j	                  |      S )Nr   dim)
isinstancetupletorchcatr   r&   s     r!   r(   zCatBnAct.forward(   s*    a		!#Awwqzr"   )
__name__
__module____qualname__r
   r   r0   jit_overload_methodr(   __classcell__r    s   @r!   r   r      sL    *8 0 YY   YY  r"   r   c                   *     e Zd Zdef fd	Zd Z xZS )BnActConv2dr   c                 r    t         t        |            ||d      | _        t	        |||||      | _        y )Nr   r   )stridegroups)r   r:   r   r   r   conv)r   r   out_chskernel_sizer<   r=   r   r    s          r!   r   zBnActConv2d.__init__/   s3    k4)+V/!&';vV\]	r"   c                 B    | j                  | j                  |            S r$   )r>   r   r&   s     r!   r(   zBnActConv2d.forward4   s    yy$$r"   )r2   r3   r4   r
   r   r(   r7   r8   s   @r!   r:   r:   .   s    DER` ^
%r"   r:   c                        e Zd Z	 	 d fd	Zej
                  j                  d        Zej
                  j                  d        Zdeej                  ej                  f   fdZ xZ
S )DualPathBlockc	                    t         t        |           || _        || _        || _        |dk(  rd| _        d| _        n)|dk(  rd| _        d| _        n|dk(  sJ d| _        d| _        d | _        d | _	        | j                  rD| j                  dk(  rt        ||d|z  z   dd      | _	        nt        ||d|z  z   dd      | _        t        ||dd      | _        t        ||d	| j                  |
      | _        |r8t        |      | _        t        ||d      | _        t        ||d      | _        y t        |||z   dd      | _        d | _        d | _        y )Nprojr   Tdown   normalF)r   r?   r@   r<      )r   r?   r@   r<   r=   )r   )r@   )r   rC   r   	num_1x1_cincb
key_stridehas_proj	c1x1_w_s1	c1x1_w_s2r:   c1x1_ac3x3_br   c1x1_cr   c1x1_c1c1x1_c2)
r   r   	num_1x1_a	num_3x3_brJ   rK   r=   
block_typerL   r    s
            r!   r   zDualPathBlock.__init__9   sZ    	mT+-"DO DM6!DO DM)))DO!DM==!#!,!9q3w+>AVW"Y "-!9q3w+>AVW"Y "PQZ[\!iQt_eg")4DK(I1MDL(CQGDL%Y	C]^ghiDKDLDLr"   c                      y r$   r%   r&   s     r!   r(   zDualPathBlock.forwardj   r)   r"   c                      y r$   r%   r&   s     r!   r(   zDualPathBlock.forwardo   r)   r"   returnc                    t        |t              rt        j                  |d      }n|}| j                  | j
                  |d   }|d   }ne| j                  | j	                  |      }n| j                  |      }|d d d | j                  d d d d f   }|d d | j                  d d d d d f   }| j                  |      }| j                  |      }| j                  |      }| j                  #| j                  |      }| j                  |      }n6|d d d | j                  d d d d f   }|d d | j                  d d d d d f   }||z   }t        j                  ||gd      }	||	fS )Nr   r,   r   )r.   r/   r0   r1   rO   rP   rJ   rQ   rR   rS   rT   rU   )
r   r'   x_inx_s1x_s2x_sout1out2residdenses
             r!   r(   zDualPathBlock.forwardt   sO   a99QA&DD>>!dnn&<Q4DQ4D ~~)nnT* nnT*q/4>>/1a/0Dq$../1a/0D{{4 {{4 {{4 <<#<<%D<<%D?DNN?Aq01D4>>?Aq01Dt		4,A.e|r"   )rH   F)r2   r3   r4   r   r0   r5   r6   r(   r   Tensorr7   r8   s   @r!   rC   rC   8   sk      / b YY   YY  E%,,"<= r"   rC   c                   0    e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d f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   c                 d   t         t        |           || _        || _        || _        |dk(  sJ t        t        ||      d      }t        t        ||      dd      }|	rdnd}t               }t        ||
|	rd	nd
d|      |d<   t        j                  d	dd      |d<   t        |
dd      g| _        d|z  }|d   }||z  d|z  z  }t        |
|||||d|      |d<   |d	|z  z   }t        d|d   dz         D ](  }t        ||||||d|      |dt!        |      z   <   ||z  }* | xj                  t        |dd|d          gz  c_        d|z  }|d   }||z  d|z  z  }t        ||||||d|      |d<   |d	|z  z   }t        d|d   dz         D ](  }t        ||||||d|      |dt!        |      z   <   ||z  }* | xj                  t        |dd|d          gz  c_        d|z  }|d   }||z  d|z  z  }t        ||||||d|      |d <   |d	|z  z   }t        d|d   dz         D ](  }t        ||||||d|      |d!t!        |      z   <   ||z  }* | xj                  t        |d"d#|d          gz  c_        d$|z  }|d	   }||z  d|z  z  }t        ||||||d|      |d%<   |d	|z  z   }t        d|d	   dz         D ](  }t        ||||||d|      |d&t!        |      z   <   ||z  }* | xj                  t        |dd'|d	          gz  c_        t#        ||(      |d)<   |x| _        | _        t        j(                  |      | _        t-        | j$                  | j                  |d*+      \  | _        | _        |rt        j2                  d      | _        y t        j4                         | _        y ),N    )	act_layerr   r   F)r   inplacer      rI      rG   )r@   r<   r   conv1_1)r@   r<   padding
conv1_poolzfeatures.conv1_1)num_chs	reductionmodule@   r   rE   conv2_1rH   conv2_zfeatures.conv2_   rF   conv3_1conv3_   zfeatures.conv3_   conv4_1conv4_   zfeatures.conv4_i   conv5_1conv5_zfeatures.conv5_)r   conv5_bn_acT	pool_typeuse_conv)r   r   r   num_classes	drop_raterL   r   r   r   r   nn	MaxPool2ddictfeature_inforC   rangestrr   num_featureshead_hidden_size
Sequentialfeaturesr   global_pool
classifierFlattenIdentityflatten)r   k_secinc_seck_rr=   r   in_chansoutput_strider   smallnum_init_featuresrL   r   r   ri   fc_act_layerfc_norm_layer	bw_factorblocksbwrK   rr   ir    s                           r!   r   zDPN.__init__   sx   $ 	c4!#&""""/
iPVZ[
 2: V\`jopAA	 ('%QQq]giy!||!QO|!*;qQcde )^aj2X2	>*)*;Q2sFTZ\]^ya#gq%(Q,' 	A(5faBVU]_`(aF8c!f$%cMF	 	d6QY^_`YaXbGcdee 9_aj2X2	>*)&!QCQRSya#gq%(Q,' 	A(5faBVU]_`(aF8c!f$%cMF	 	d6QY^_`YaXbGcdee 9_aj2X2	>*)&!QCQRSya#gq%(Q,' 	A(5faBVU]_`(aF8c!f$%cMF	 	d6R/Z_`aZbYcHdeff 9_aj2X2	>*)&!QCQRSya#gq%(Q,' 	A(5faBVU]_`(aF8c!f$%cMF	 	d6R/Z_`aZbYcHdeff (M J}4::D1f- ->t//;QU-W)$/(3rzz!}r"   c                 0    t        d|rdndd fdg      }|S )Nz^features\.conv1z^features\.conv(\d+)z^features\.conv(\d+)_(\d+))z^features\.conv5_bn_ac)i )stemr   )r   )r   coarsematchers      r!   group_matcherzDPN.group_matcher   s-    $,2(8UW[\5
 r"   c                     |rJ d       y )Nz$gradient checkpointing not supportedr%   )r   enables     r!   set_grad_checkpointingzDPN.set_grad_checkpointing   s    AAAz6r"   r[   c                     | j                   S r$   )r   )r   s    r!   get_classifierzDPN.get_classifier   s    r"   r   r   c                     || _         t        | j                  | j                   |d      \  | _        | _        |rt        j                  d      | _        y t        j                         | _        y )NTr   r   )	r   r   r   r   r   r   r   r   r   )r   r   r   s      r!   reset_classifierzDPN.reset_classifier  sR    &,=t//;QU-W)$/(3rzz!}r"   c                 $    | j                  |      S r$   )r   r&   s     r!   forward_featureszDPN.forward_features	  s    }}Qr"   
pre_logitsc                    | j                  |      }| j                  dkD  r,t        j                  || j                  | j                        }|r| j                  |      S | j                  |      }| j                  |      S )N        )ptraining)r   r   Fdropoutr   r   r   )r   r'   r   s      r!   forward_headzDPN.forward_head  se    Q>>B		!t~~FA<<?"OOA||Ar"   c                 J    | j                  |      }| j                  |      }|S r$   )r   r   r&   s     r!   r(   zDPN.forward  s'    !!!$a r"   )rI   rk      rI   r}   rh      rv   `   rh     rI   rh   avgFrs   Fr   batchnorm2drelueluF)T)r   )r2   r3   r4   r   r0   r5   ignorer   r   r   Moduler   intr   r   r   boolr   r(   r7   r8   s   @r!   r   r      s      % $!WGr YY  YYB B YY		  GC Gc G $ r"   c                 @    t        t        | |fdt        dd      i|S )Nfeature_cfgT)feature_concatflatten_sequential)r   r   r   )variant
pretrainedkwargss      r!   _create_dpnr     s3     F	
  r"   c                 0    | dddddt         t        ddd
|S )	Nr   )rI      r   )rl   rl   g      ?bicubiczfeatures.conv1_1.convr   )
urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_convr   )r   r   )r   r   s     r!   _cfgr   %  s0    4}SYI!*:-\	
  r"   )r   r   ztimm/)	hf_hub_idgffffff?)rI      r   g      ?)r   r   r   r   test_input_sizetest_crop_pct)zdpn48b.untrainedzdpn68.mx_in1kzdpn68b.ra_in1kzdpn68b.mx_in1kzdpn92.mx_in1kzdpn98.mx_in1kzdpn131.mx_in1kzdpn107.mx_in1kr[   c           
      V    t        dddddddd      }t        d
d	| it        |fi |S )NT
   rv   rh   )rI   rk      rI   r}   rh   rh   rs   silu)r   r   r   r=   rL   r   r   ri   r   )dpn48br   r   r   r   
model_argss      r!   r   r   >  s?    bc"
l,<PJ UJU$z:TV:TUUr"   c           	      R    t        dddddd      }t        d	d| it        |fi |S )
NTr   rv   rh   rI   rk      rI   r   )r   r   r   r=   r   r   r   )dpn68r   r   s      r!   r   r   F  s:    bc"%57J T:Tj9SF9STTr"   c           	      T    t        ddddddd      }t        d	d| it        |fi |S )
NTr   rv   rh   r   r   )r   r   r   r=   rL   r   r   r   )dpn68br   r   s      r!   r   r   N  s<    bc"
m-=?J UJU$z:TV:TUUr"   c           	      P    t        ddddd      }t        dd| it        |fi |S )	Nrs   r   rh   r   r   r   r   r=   r   r   r   )dpn92r   r   s      r!   r   r   V  s8    "R%68J T:Tj9SF9STTr"   c           	      P    t        ddddd      }t        dd| it        |fi |S )	Nr      (   )rI   r   r   rI   r}   rh   rh   rv   r   r   )dpn98r   r   s      r!   r   r   ^  s8    #b%68J T:Tj9SF9STTr"   c           	      P    t        ddddd      }t        dd| it        |fi |S )	Nrv   r   r   )rk   ry      rI   r   r   r   )dpn131r   r   s      r!   r   r   f  8    3r%68J UJU$z:TV:TUUr"   c           	      P    t        ddddd      }t        dd| it        |fi |S )	Nrv      2   )rk   ry   r   rI   )r   rs   rs   rv   r   r   )dpn107r   r   s      r!   r   r   n  r   r"   r   ) )-__doc__collectionsr   	functoolsr   typingr   r0   torch.nnr   torch.nn.functional
functionalr   	timm.datar   r   r   r	   timm.layersr
   r   r   r   r   _builderr   	_registryr   r   __all__r   r   r:   rC   r   r   r   default_cfgsr   r   r   r   r   r   r   r%   r"   r!   <module>r     s   $       f f i i * <'ryy *%")) %[BII [|B")) BJ %"7=QRG,"(<}CI W-G,G,W-W-&  V# V V U U U V# V V U U U U U U V# V V V# V Vr"   