
    NgJ5                        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,dS ))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                 z    t          t          |                                             ||d          | _        d S )NMbP?eps)superr   __init__bn)selfin_chs
norm_layer	__class__s      K/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/dpn.pyr   zCatBnAct.__init__   s9    h&&(((*V///    c                     d S N r   xs     r!   forwardzCatBnAct.forward   	     	r"   c                     d S r$   r%   r&   s     r!   r(   zCatBnAct.forward#   r)   r"   c                     t          |t                    rt          j        |d          }|                     |          S )Nr   dim)
isinstancetupletorchcatr   r&   s     r!   r(   zCatBnAct.forward(   s8    a 	$	!###Awwqzzr"   )
__name__
__module____qualname__r
   r   r0   jit_overload_methodr(   __classcell__r    s   @r!   r   r      s        *8 0 0 0 0 0 0 Y    Y         r"   r   c                   *     e Zd Zdef fd	Zd Z xZS )BnActConv2dr   c                     t          t          |                                             ||d          | _        t	          |||||          | _        d S )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__/   sT    k4  ))+++*V///!&';vV\]]]			r"   c                 R    |                      |                     |                    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:   .   sX        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 )	DualPathBlocknormalFc	                    t          t          |                                            || _        || _        || _        |dk    rd| _        d| _        n+|dk    rd| _        d| _        n|dk    sJ d| _        d| _        d | _        d | _	        | j        rH| j        dk    rt          ||d|z  z   dd          | _	        nt          ||d|z  z   dd          | _        t          ||dd          | _        t          ||d	| j        |
          | _        |rEt          |          | _        t          ||d          | _        t          ||d          | _        d S t          |||z   dd          | _        d | _        d | _        d S )Nprojr   Tdown   rD   F)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   s    	mT""++---"DO DMM6!!DO DMM))))DO!DM= 	Y!##!,!9q3w+>AVW"Y "Y "Y "-!9q3w+>AVW"Y "Y "Y "PQZ[\\\!iQt_eg g g 	 ")444DK(I1MMMDL(CQGGGDLLL%Y	C]^ghiiiDKDLDLLLr"   c                     d S r$   r%   r&   s     r!   r(   zDualPathBlock.forwardj   r)   r"   c                     d S r$   r%   r&   s     r!   r(   zDualPathBlock.forwardo   r)   r"   returnc                    t          |t                    rt          j        |d          }n|}| j        | j        |d         }|d         }nd| j        |                     |          }n|                     |          }|d d d | j        d d d d f         }|d d | j        d d d d d f         }|                     |          }|                     |          }| 	                    |          }| j
        +| 
                    |          }|                     |          }n2|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   s   a 	9QA&&&DDD>!dn&<Q4DQ4DD ~)nnT** nnT**qqq/4>/111aaa/0Dqqq$.//111aaa/0D{{4  {{4  {{4  <#<<%%D<<%%DD?DN?AAAqqq01D4>??AAAqqq01Dt	4,A...e|r"   )rD   F)r2   r3   r4   r   r0   r5   r6   r(   r   Tensorr7   r8   s   @r!   rC   rC   8   s          /  /  /  /  /  / b Y    Y   E%,"<=        r"   rC   c                        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   rI         rI                `   rl     rI   avgF@           batchnorm2drelueluc                 b   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 ]0}t          ||||||d|          |dt!          |          z   <   ||z  }1| 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 ]0}t          ||||||d|          |dt!          |          z   <   ||z  }1| 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 ]0}t          ||||||d|          |d!t!          |          z   <   ||z  }1| 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 ]0}t          ||||||d|          |d&t!          |          z   <   ||z  }1| xj        t          |dd'|d	                    gz  c_        t#          ||(          |d)<   |x| _        | _        t          j        |          | _        t-          | j        | j        |d*+          \  | _        | _        |rt          j        d          nt          j                    | _        d S ),Nrl   )	act_layerr   r   F)r   inplacer   rh   rI      rH   )r@   r<   r   conv1_1)r@   r<   padding
conv1_poolzfeatures.conv1_1)num_chs	reductionmodulerr   r   rF   conv2_1rD   conv2_zfeatures.conv2_rn   rG   conv3_1conv3_   zfeatures.conv3_   conv4_1conv4_rk   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   rx   fc_act_layerfc_norm_layer	bw_factorblocksbwrK   rr   ir    s                           r!   r   zDPN.__init__   s*   $ 	c4!!###&"""""/
iPPPVZ[[[
 2: V V V\`joppp%AAA	 ('%5FQQQq]gi i iy!|!QOOO|!*;qQcddde )^aj2X2	>*)*;Q2sFTZ\]^^ya#gq%(Q,'' 	 	A(5faBVU]_`(a(aF8c!ff$%cMFFd6QGcY^_`YaGcGcdddee 9_aj2X2	>*)&!QCQRSSya#gq%(Q,'' 	 	A(5faBVU]_`(a(aF8c!ff$%cMFFd6QGcY^_`YaGcGcdddee 9_aj2X2	>*)&!QCQRSSya#gq%(Q,'' 	 	A(5faBVU]_`(a(aF8c!ff$%cMFFd6RHdZ_`aZbHdHdeeeff 9_aj2X2	>*)&!QCQRSSya#gq%(Q,'' 	 	A(5faBVU]_`(a(aF8c!ff$%cMFFd6RHdZ_`aZbHdHdeeeff (M J J J}4::D1f-- ->t/;QU-W -W -W)$/(3Frz!}}}r"   c                 8    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U((8UW[\5
 
 
 r"   Tc                     |r
J d            d S )Nz$gradient checkpointing not supportedr%   )r   enables     r!   set_grad_checkpointingzDPN.set_grad_checkpointing   s    AAAAAAAAr"   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          nt          j                    | _        d S )NTr   r   )	r   r   r   r   r   r   r   r   r   )r   r   r   s      r!   reset_classifierzDPN.reset_classifier  s]    &,=t/;QU-W -W -W)$/(3Frz!}}}r"   c                 ,    |                      |          S r$   )r   r&   s     r!   forward_featureszDPN.forward_features	  s    }}Qr"   
pre_logitsc                    |                      |          }| j        dk    r!t          j        || j        | j                  }|r|                     |          S |                     |          }|                     |          S )Nrs   )ptraining)r   r   Fdropoutr   r   r   )r   r'   r   s      r!   forward_headzDPN.forward_head  su    Q>B	!t~FFFA 	#<<??"OOA||Ar"   c                 Z    |                      |          }|                     |          }|S r$   )r   r   r&   s     r!   r(   zDPN.forward  s-    !!!$$a  r"   )rg   rj   ro   rl   rp   rI   rl   rq   Frr   Frs   rt   ru   rv   F)T)rq   )r2   r3   r4   r   r0   r5   ignorer   r   r   Moduler   intr   r   r   boolr   r(   r7   r8   s   @r!   r   r      sd         % $!WG WG WG WG WG WGr Y    YB B B B Y	    G GC Gc G G G G      $          r"   Fc                 L    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     sC      FFF	
   r"    c                 4    | dddddt           t          ddd
|S )	Nrp   )rI      r   )rz   rz   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   %  s5    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           
      b    t          dddddddd          }t          dd
| it          |fi |S )NT
   rn   rl   )rI   rh      rI   rk   rl   rl   rr   silu)r   r   r   r=   rL   r   r   rx   dpn48br   )r   r   r   r   r   
model_argss      r!   r   r   >  sW    bc"
l,<P P PJ UUJU$z:T:TV:T:TUUUr"   c           	      ^    t          dddddd          }t          d
d	| it          |fi |S )NTr   rn   rl   rI   rh      rI   r   )r   r   r   r=   r   r   dpn68r   )r   r   r   s      r!   r   r   F  sP    bc"%57 7 7J TT:Tj9S9SF9S9STTTr"   c           	      `    t          ddddddd          }t          d
d	| it          |fi |S )NTr   rn   rl   r   r   )r   r   r   r=   rL   r   r   dpn68br   )r   r   r   s      r!   r   r   N  sR    bc"
m-=? ? ?J UUJU$z:T:TV:T:TUUUr"   c           	      \    t          ddddd          }t          d	d| it          |fi |S )
Nrr   ro   rl   rg   rj   r   r   r=   r   r   dpn92r   )r   r   r   s      r!   r   r   V  sN    "R%68 8 8J TT:Tj9S9SF9S9STTTr"   c           	      \    t          ddddd          }t          d	d| it          |fi |S )
Nro      (   )rI   r   ri   rI   rk   rl   rl   rn   r   dpn98r   )r   r   r   s      r!   r   r   ^  sN    #b%68 8 8J TT:Tj9S9SF9S9STTTr"   c           	      \    t          ddddd          }t          d	d| it          |fi |S )
Nrn   r   r   )rh   r      rI   r   r   dpn131r   )r   r   r   s      r!   r   r   f  N    3r%68 8 8J UUJU$z:T:TV:T:TUUUr"   c           	      \    t          ddddd          }t          d	d| it          |fi |S )
Nrn      2   )rh   r   ri   rI   )ri   rr   rr   rn   r   dpn107r   )r   r   r   s      r!   r   r   n  r   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 f f f f f f f f f f i i i i i i i i i i i i i i * * * * * * < < < < < < < <'    ry   *% % % % %") % % %[ [ [ [ [BI [ [ [|B B B B B") B B BJ       %$"7=QRRRTG,,,d"(<}CI I I dW---TG,,,TG,,,dW---dW---& &   V V# V V V V U U U U U U V V# V V V V U U U U U U U U U U U U V V# V V V V V V# V V V V V Vr"   