
    RЦi6                        S r SSKJr  SSKJr  SSKJrJrJr  SSK	r	SSK
Jr  SSKJs  Jr  SSKJrJrJrJr  SSKJrJrJrJrJr  SS	KJr  SS
KJrJr  S/r " S S\R@                  5      r! " S S\R@                  5      r" " S S\R@                  5      r# " S S\R@                  5      r$S%S jr%S&S jr&\" \&" \\S9\&" SS9\&" S\\SSSS9\&" SS9\&" SS9\&" SS9\&" SS9\&" SS9S.5      r'\S%S\$4S jj5       r(\S%S\$4S jj5       r)\S%S\$4S  jj5       r*\S%S\$4S! jj5       r+\S%S\$4S" jj5       r,\S%S\$4S# jj5       r-\S%S\$4S$ jj5       r.g)'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)TupleTypeOptionalN)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                   ^   ^  \ rS rSr\SS4S\S\\R                     4U 4S jjjr	S r
SrU =r$ )CatBnAct   Nin_chs
norm_layerc                 J   > X4S.n[         TU ]  5         U" U4SS0UD6U l        g )NdevicedtypeepsMbP?)super__init__bn)selfr   r   r   r   dd	__class__s         N/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/dpn.pyr"   CatBnAct.__init__   s.     /V55"5    c                 x    [        U[        5      (       a  [        R                  " USS9nU R	                  U5      $ )Nr   dim)
isinstancetupletorchcatr#   r$   xs     r'   forwardCatBnAct.forward%   s-    a		!#Awwqzr)   )r#   __name__
__module____qualname____firstlineno__r   intr   nnModuler"   r3   __static_attributes____classcell__r&   s   @r'   r   r      s<     +9	6	6 RYY	6 	6 r)   r   c                   p   ^  \ rS rSrS\SS4S\S\S\S\S\S	\\R                     4U 4S
 jjjr	S r
SrU =r$ )BnActConv2d+   r   Nr   out_chskernel_sizestridegroupsr   c	                 r   > XxS.n	[         T
U ]  5         U" U4SS0U	D6U l        [        XU4XES.U	D6U l        g )Nr   r   r    )rE   rF   )r!   r"   r#   r   conv)r$   r   rC   rD   rE   rF   r   r   r   r%   r&   s             r'   r"   BnActConv2d.__init__,   sG     /V55"5!&;cvc`bc	r)   c                 B    U R                  U R                  U5      5      $ N)rH   r#   r1   s     r'   r3   BnActConv2d.forward<   s    yy$$r)   )r#   rH   r5   r?   s   @r'   rA   rA   +   so     *8dd d 	d
 d d RYYd d % %r)   rA   c                      ^  \ rS rSr    SS\S\S\S\S\S\S\S	\4U 4S
 jjjrS\\	R                  \	R                  4   4S jrSrU =r$ )DualPathBlock@   r   	num_1x1_a	num_3x3_b	num_1x1_cincrF   
block_typebc           	        > XS.n[         TU ]  5         X@l        XPl        Xl        US:X  a  SU l        SU l        O+US:X  a  SU l        SU l        OUS:X  d   eSU l        SU l        S U l        S U l        U R                  (       aE  U R
                  S:X  a  [        SXSU-  -   SSS	.UD6U l        O[        SXSU-  -   SSS	.UD6U l        [        SXSSS	.UD6U l
        [        SX#S
U R
                  US.UD6U l        U(       a9  [        SSU0UD6U l        [        X44SS0UD6U l        [        X54SS0UD6U l        g [        SX4U-   SSS	.UD6U l        S U l        S U l        g )Nr   projr   Tdown   normalF)r   rC   rD   rE      )r   rC   rD   rE   rF   r   rD    )r!   r"   rR   rS   rU   
key_stridehas_proj	c1x1_w_s1	c1x1_w_s2rA   c1x1_ac3x3_br   c1x1_cr   c1x1_c1c1x1_c2)r$   r   rP   rQ   rR   rS   rF   rT   rU   r   r   r%   r&   s               r'   r"   DualPathBlock.__init__A   s    /"DO DM6!DO DM)))DO!DM==!#!, "_!q3w+>AVW"_[]"_ "- "_!q3w+>AVW"_[]"_ "bPQZ[b_ab! mQt_emikm":):r:DK(S1SPRSDL(MQM"MDL%oYC]^gholnoDKDLDLr)   returnc                    [        U[        5      (       a  [        R                  " USS9nOUnU R                  c  U R
                  c  US   nUS   nOfU R                  b  U R	                  U5      nOU R                  U5      nUS S 2S U R                  2S S 2S S 24   nUS S 2U R                  S 2S S 2S S 24   nU R                  U5      nU R                  U5      nU R                  U5      nU R                  b#  U R                  U5      nU R                  U5      nO6US S 2S U R                  2S S 2S S 24   nUS S 2U R                  S 2S S 2S S 24   nX6-   n[        R                  " XG/SS9n	X4$ )Nr   r+   r   )r-   r.   r/   r0   r_   r`   rR   ra   rb   rc   rd   re   )
r$   r2   x_inx_s1x_s2x_sout1out2residdenses
             r'   r3   DualPathBlock.forwardu   sL   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		4,A.|r)   )rU   ra   rc   rd   re   r_   r`   rb   r^   rS   r]   rR   )rZ   FNN)r6   r7   r8   r9   r:   strboolr"   r   r/   Tensorr3   r=   r>   r?   s   @r'   rN   rN   @   s     '2 2  2  	2 
 2  2  2  2  2  2 hE%,,"<=  r)   rN   c                     ^  \ rS rSr                 SS\\S4   S\\S4   S\S\S\S\S	\S
\S\S\S\S\S\S\S\4U 4S jjjr	\
R                  R                  SS j5       r\
R                  R                  SS j5       r\
R                  R                  S\R                   4S j5       rS S\S
\4S jjrS rSS\4S jjrS rSrU =r$ )!r      k_sec.inc_seck_rrF   num_classesin_chansoutput_strideglobal_poolsmallnum_init_featuresrU   	drop_rater   	act_layerfc_act_layerc                 z  > [         TU ]  5         UUS.nXPl        X`l        Xl        Xl        US:X  d   e[        [        XS9SS9n[        [        XS9SSS9nU	(       a  SOS	n[        5       n[        UU
4U	(       a  S
OSSUS.UD6US'   [        R                  " S
SSS9US'   [        U
SSS9/U l        SU-  nUS   nUU-  SU-  -  n[        U
UUUUUSU40 UD6US'   US
U-  -   n[        SUS   S-   5       H*  n[        UUUUUUSU40 UD6US[!        U5      -   '   UU-  nM,     U =R                  [        US	SUS    3S9/-  sl        SU-  nUS   nUU-  SU-  -  n[        UUUUUUSU40 UD6US'   US
U-  -   n[        SUS   S-   5       H*  n[        UUUUUUSU40 UD6US[!        U5      -   '   UU-  nM,     U =R                  [        USSUS    3S9/-  sl        S U-  nUS   nUU-  SU-  -  n[        UUUUUUSU40 UD6US!'   US
U-  -   n[        SUS   S-   5       H*  n[        UUUUUUSU40 UD6US"[!        U5      -   '   UU-  nM,     U =R                  [        US#S$US    3S9/-  sl        S%U-  nUS
   nUU-  SU-  -  n[        UUUUUUSU40 UD6US&'   US
U-  -   n[        SUS
   S-   5       H*  n[        UUUUUUSU40 UD6US'[!        U5      -   '   UU-  nM,     U =R                  [        USS(US
    3S9/-  sl        [#        U4S)U0UD6US*'   U=U l        U l        [        R(                  " U5      U l        [-        U R$                  U R                  4US+S,.UD6u  U l        U l        U(       a  [        R2                  " S5      U l        g [        R4                  " 5       U l        g )-Nr       )r   r    )r   F)r   inplacer      r[      rY   )rD   rE   r   conv1_1)rD   rE   padding
conv1_poolzfeatures.conv1_1)num_chs	reductionmodulerO   r   rW   conv2_1rZ   conv2_zfeatures.conv2_   rX   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"   rz   r{   r   rU   r   r   r   r   r;   	MaxPool2ddictfeature_inforN   rangerr   r   num_featureshead_hidden_size
Sequentialfeaturesr   r}   
classifierFlattenIdentityflatten)r$   rw   rx   ry   rF   rz   r{   r|   r}   r~   r   rU   r   r   r   r   r   r   r%   fc_norm_layer	bw_factorblocksbwrS   rr   ir&   s                              r'   r"   DPN.__init__   s   ( 	/& """"/
PVZ[
 2: V\`jopAA	 (
 #!
 
y  "||!QO|!*;qQcde )^aj2X2	>*)*;Q2sFTZ\]dacdya#gq%(Q,'A(5faBVU]_`(gdf(gF8c!f$%cMF ( 	d6QY^_`YaXbGcdee 9_aj2X2	>*)&!QCQRYVXYya#gq%(Q,'A(5faBVU]_`(gdf(gF8c!f$%cMF ( 	d6QY^_`YaXbGcdee 9_aj2X2	>*)&!QCQRYVXYya#gq%(Q,'A(5faBVU]_`(gdf(gF8c!f$%cMF ( 	d6R/Z_`aZbYcHdeff 9_aj2X2	>*)&!QCQRYVXYya#gq%(Q,'A(5faBVU]_`(gdf(gF8c!f$%cMF ( 	d6R/Z_`aZbYcHdeff ( PM PR P}4::D1f- ->-
 "	-

 -
)$/ )4rzz!}r)   c                 4    [        SU(       a  SOSS 4S/S9nU$ )Nz^features\.conv1z^features\.conv(\d+)z^features\.conv(\d+)_(\d+))z^features\.conv5_bn_ac)i )stemr   )r   )r$   coarsematchers      r'   group_matcherDPN.group_matcher   s-    $,2(8UW[\5
 r)   c                      U(       a   S5       eg )Nz$gradient checkpointing not supportedr\   )r$   enables     r'   set_grad_checkpointingDPN.set_grad_checkpointing  s    AAAz6r)   rg   c                     U R                   $ rK   )r   )r$   s    r'   get_classifierDPN.get_classifier  s    r)   c                     Xl         [        U R                  U R                   USS9u  U l        U l        U(       a  [
        R                  " S5      U l        g [
        R                  " 5       U l        g )NTr   r   )	rz   r   r   r}   r   r;   r   r   r   )r$   rz   r}   s      r'   reset_classifierDPN.reset_classifier  sP    &,=t//;QU-W)$/(3rzz!}r)   c                 $    U R                  U5      $ rK   )r   r1   s     r'   forward_featuresDPN.forward_features  s    }}Qr)   
pre_logitsc                 
   U R                  U5      nU R                  S:  a)  [        R                  " XR                  U R                  S9nU(       a  U R                  U5      $ U R                  U5      nU R                  U5      $ )N        )ptraining)r}   r   Fdropoutr   r   r   )r$   r2   r   s      r'   forward_headDPN.forward_head  sc    Q>>B		!~~FA<<?"OOA||Ar)   c                 J    U R                  U5      nU R                  U5      nU$ rK   )r   r   r1   s     r'   r3   DPN.forward%  s'    !!!$a r)   )rU   r   r   r   r   r   r}   r   r{   rz   r   )r[   r      r[   r   r      r   `   r     r[   r   avgFrO   Fr   batchnorm2drelueluNNF)T)r   )r6   r7   r8   r9   r   r:   rr   rs   floatr"   r/   jitignorer   r   r;   r<   r   r   r   r   r3   r=   r>   r?   s   @r'   r   r      s    &3'8#!#$%'!+# %%fGc?fG 38_fG 	fG
 fG fG fG fG fG fG  #fG fG fG fG fG  !fG fGP YY  YYB B YY		  GC Gc G $  r)   c           	      :    [        [        U U4S[        SSS90UD6$ )Nfeature_cfgT)feature_concatflatten_sequential)r   r   r   )variant
pretrainedkwargss      r'   _create_dpnr   +  s3     F	
  r)   c                 2    U SSSSS[         [        SSSS	.UE$ )
Nr   )r[      r   )r   r   g      ?bicubiczfeatures.conv1_1.convr   z
apache-2.0)urlrz   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_convr   license)r   r	   )r   r   s     r'   _cfgr   5  s3    4}SYI!*:-\Vb	
  r)   )r   r   ztimm/)	hf_hub_idgffffff?)r[      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_in1krg   c                 P    [        SSSSSSSSS9n[        S
S	U 0[        U40 UD6D6$ )NT
   r   r   )r[   r      r[   r   r   r   rO   silu)r~   r   ry   rF   rU   rw   rx   r   r   )dpn48br   r   r   r   
model_argss      r'   r   r   N  s?    bc"
l,<PJ UJU$z:TV:TUUr)   c           	      L    [        SSSSSSS9n[        S	SU 0[        U40 UD6D6$ )
NTr   r   r   r[   r      r[   r   )r~   r   ry   rF   rw   rx   r   )dpn68r   r   s      r'   r  r  V  s:    bc"%57J T:Tj9SF9STTr)   c           
      N    [        SSSSSSSS9n[        S	SU 0[        U40 UD6D6$ )
NTr   r   r   r   r   )r~   r   ry   rF   rU   rw   rx   r   )dpn68br   r   s      r'   r  r  ^  s<    bc"
m-=?J UJU$z:TV:TUUr)   c           	      J    [        SSSSSS9n[        SSU 0[        U40 UD6D6$ )	NrO   r   r   r   r   r   ry   rF   rw   rx   r   )dpn92r   r   s      r'   r  r  f  s8    "R%68J T:Tj9SF9STTr)   c           	      J    [        SSSSSS9n[        SSU 0[        U40 UD6D6$ )	Nr      (   )r[   r   r   r[   r   r   r   r   r  r   )dpn98r   r   s      r'   r  r  n  s8    #b%68J T:Tj9SF9STTr)   c           	      J    [        SSSSSS9n[        SSU 0[        U40 UD6D6$ )	Nr   r	  r
  )r   r      r[   r  r  r   )dpn131r   r   s      r'   r  r  v  8    3r%68J UJU$z:TV:TUUr)   c           	      J    [        SSSSSS9n[        SSU 0[        U40 UD6D6$ )	Nr      2   )r   r   r   r[   )r   rO   rO   r   r  r   )dpn107r   r   s      r'   r  r  ~  r  r)   r   ) )/__doc__collectionsr   	functoolsr   typingr   r   r   r/   torch.nnr;   torch.nn.functional
functionalr   	timm.datar   r	   r
   r   timm.layersr   r   r   r   r   _builderr   	_registryr   r   __all__r<   r   rA   rN   r   r   r   default_cfgsr   r  r  r  r  r  r  r\   r)   r'   <module>r#     s   $  ( (     f f i i * <'ryy $%")) %*TBII TnQ")) Qh %"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)   