
    ^j6                        d Z ddlmZ ddlmZ ddl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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)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                   P     e Zd Zeddfdedeej                     f fdZd Z	 xZ
S )CatBnActNin_chs
norm_layerc                 L    ||d}t         |            ||fddi|| _        y )NdevicedtypeepsMbP?)super__init__bn)selfr   r   r   r   dd	__class__s         Z/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/dpn.pyr!   zCatBnAct.__init__   s0     /V55"5    c                 r    t        |t              rt        j                  |d      }| j	                  |      S )Nr   dim)
isinstancetupletorchcatr"   r#   xs     r&   forwardzCatBnAct.forward%   s*    a		!#Awwqzr'   __name__
__module____qualname__r   intr   nnModuler!   r1   __classcell__r%   s   @r&   r   r      s2     +9	6	6 RYY	6r'   r   c                   b     e Zd Zdeddfdedededededeej                     f fd	Zd
 Z	 xZ
S )BnActConv2dr   Nr   out_chskernel_sizestridegroupsr   c	                 x    ||d}	t         
|            ||fddi|	| _        t        |||f||d|	| _        y )Nr   r   r   )r?   r@   )r    r!   r"   r   conv)r#   r   r=   r>   r?   r@   r   r   r   r$   r%   s             r&   r!   zBnActConv2d.__init__,   sN     /V55"5!&';cvV\c`bc	r'   c                 B    | j                  | j                  |            S N)rB   r"   r/   s     r&   r1   zBnActConv2d.forward<   s    yy$$r'   r2   r:   s   @r&   r<   r<   +   sd     *8dd d 	d
 d d RYYd %r'   r<   c                        e Zd Z	 	 	 	 ddedededededededef fd	Zd
eej                  ej                  f   fdZ
 xZS )DualPathBlockr   	num_1x1_a	num_3x3_b	num_1x1_cincr@   
block_typebc           	         |	|
d}t         |           || _        || _        || _        |dk(  rd| _        d| _        n)|dk(  rd| _        d| _        n|dk(  sJ d| _        d| _        d | _        d | _        | j                  rF| j
                  dk(  rt        d||d|z  z   ddd	|| _        nt        d||d|z  z   ddd	|| _        t        d||ddd	|| _
        t        d||d
| j
                  |d|| _        |r;t        dd|i|| _        t        ||fddi|| _        t        ||fddi|| _        y t        d|||z   ddd	|| _        d | _        d | _        y )Nr   projr   Tdown   normalF)r   r=   r>   r?      )r   r=   r>   r?   r@   r   r>    )r    r!   rI   rJ   rL   
key_stridehas_proj	c1x1_w_s1	c1x1_w_s2r<   c1x1_ac3x3_br   c1x1_cr   c1x1_c1c1x1_c2)r#   r   rG   rH   rI   rJ   r@   rK   rL   r   r   r$   r%   s               r&   r!   zDualPathBlock.__init__A   s    /"DO DM6!DO DM)))DO!DM==!#!, "_!9q3w+>AVW"_[]"_ "- "_!9q3w+>AVW"_[]"_ "bPQZ[b_ab! miQt_emikm":):r:DK(IS1SPRSDL(CMQM"MDL%oY	C]^gholnoDKDLDLr'   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,   r-   r.   rV   rW   rI   rX   rY   rZ   r[   r\   )
r#   r0   x_inx_s1x_s2x_sout1out2residdenses
             r&   r1   zDualPathBlock.forwardu   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'   )rQ   FNN)r3   r4   r5   r6   strboolr!   r   r-   Tensorr1   r9   r:   s   @r&   rF   rF   @   s     '2 2  2  	2 
 2  2  2  2  2 hE%,,"<= r'   rF   c                       e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddeedf   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dededef 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   k_sec.inc_seck_rr@   num_classesin_chansoutput_strideglobal_poolsmallnum_init_featuresrL   	drop_rater   	act_layerfc_act_layerc                    t         |           ||d}|| _        || _        || _        || _        |dk(  sJ t        t        ||      d      }t        t        ||      dd      }|	rdnd	}t               }t        ||
f|	rd
ndd|d||d<   t        j                  d
dd      |d<   t        |
dd      g| _        d|z  }|d   }||z  d|z  z  }t        |
|||||d|fi ||d<   |d
|z  z   }t        d|d   dz         D ])  }t        ||||||d|fi ||dt!        |      z   <   ||z  }+ | xj                  t        |d	d|d          gz  c_        d|z  }|d   }||z  d|z  z  }t        ||||||d|fi ||d<   |d
|z  z   }t        d|d   dz         D ])  }t        ||||||d|fi ||dt!        |      z   <   ||z  }+ | xj                  t        |dd|d          gz  c_        d |z  }|d   }||z  d|z  z  }t        ||||||d|fi ||d!<   |d
|z  z   }t        d|d   dz         D ])  }t        ||||||d|fi ||d"t!        |      z   <   ||z  }+ | xj                  t        |d#d$|d          gz  c_        d%|z  }|d
   }||z  d|z  z  }t        ||||||d|fi ||d&<   |d
|z  z   }t        d|d
   dz         D ])  }t        ||||||d|fi ||d't!        |      z   <   ||z  }+ | xj                  t        |dd(|d
          gz  c_        t#        |fd)|i||d*<   |x| _        | _        t        j(                  |      | _        t-        | j$                  | j                  f|d+d,|\  | _        | _        |rt        j2                  d      | _        y t        j4                         | _        y )-Nr       )ru   r   )r   F)r   inplacer      rR      rP   )r>   r?   r   conv1_1)r>   r?   padding
conv1_poolzfeatures.conv1_1)num_chs	reductionmodule@   r   rN   conv2_1rQ   conv2_zfeatures.conv2_   rO   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!   rn   ro   rt   rL   r   r   r   r   r7   	MaxPool2ddictfeature_inforF   rangerg   r   num_featureshead_hidden_size
Sequentialfeaturesr   rq   
classifierFlattenIdentityflatten)r#   rk   rl   rm   r@   rn   ro   rp   rq   rr   rs   rL   rt   r   ru   rv   r   r   r$   fc_norm_layer	bw_factorblocksbwrJ   rr   ir%   s                              r&   r!   zDPN.__init__   s   ( 	/& """"/
i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                 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 supportedrS   )r#   enables     r&   set_grad_checkpointingzDPN.set_grad_checkpointing  s    AAAz6r'   r]   c                     | j                   S rD   )r   )r#   s    r&   get_classifierzDPN.get_classifier  s    r'   c                     || _         t        | j                  | j                   |d      \  | _        | _        |rt        j                  d      | _        y t        j                         | _        y )NTr   r   )	rn   r   r   rq   r   r7   r   r   r   )r#   rn   rq   s      r&   reset_classifierzDPN.reset_classifier  sR    &,=t//;QU-W)$/(3rzz!}r'   c                 $    | j                  |      S rD   )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)rq   rt   Fdropoutr   r   r   )r#   r0   r   s      r&   forward_headzDPN.forward_head  se    Q>>B		!t~~FA<<?"OOA||Ar'   c                 J    | j                  |      }| j                  |      }|S rD   )r   r   r/   s     r&   r1   zDPN.forward%  s'    !!!$a r'   )rR   rz      rR   r   rx      r   `   rx     rR   rx   avgFr   Fr   batchnorm2drelueluNNF)T)r   )r3   r4   r5   r   r6   rg   rh   floatr!   r-   jitignorer   r   r7   r8   r   r   r   r   r1   r9   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P 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                 2    | dddddt         t        dddd	|S )
Nr   )rR      r   )r{   r{   g      ?bicubiczfeatures.conv1_1.convr   z
apache-2.0)urlrn   
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?)rR      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
   r   rx   )rR   rz      rR   r   rx   rx   r   silu)rr   rs   rm   r@   rL   rk   rl   ru   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           	      R    t        dddddd      }t        d	d| it        |fi |S )
NTr   r   rx   rR   rz      rR   r   )rr   rs   rm   r@   rk   rl   r   )dpn68r   r   s      r&   r   r   V  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   r   rx   r   r   )rr   rs   rm   r@   rL   rk   rl   r   )dpn68br   r   s      r&   r   r   ^  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 )	Nr   r   rx   r   r   rs   rm   r@   rk   rl   r   )dpn92r   r   s      r&   r   r   f  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      (   )rR   r   r   rR   r   rx   rx   r   r   r   )dpn98r   r   s      r&   r   r   n  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 )	Nr   r   r   )rz   r      rR   r   r   r   )dpn131r   r   s      r&   r   r   v  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 )	Nr      2   )rz   r   r   rR   )r   r   r   r   r   r   )dpn107r   r   s      r&   r  r  ~  r   r'   r   ) )/__doc__collectionsr   	functoolsr   typingr   r   r   r-   torch.nnr7   torch.nn.functional
functionalr   	timm.datar   r	   r
   r   timm.layersr   r   r   r   r   _builderr   	_registryr   r   __all__r8   r   r<   rF   r   r   r   default_cfgsr   r   r   r   r   r   r  rS   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'   