o g0@sdZddlmZddlmZddlmZddlZddlm Z ddl m m Z ddl mZmZmZmZddlmZdd lmZmZmZmZdd lmZd gZd.d dZeddedeededdeddeddedddZGddde jZGddde jZ Gddde jZ!Gdd d e jZ"d/d d!Z#ed/d"d#Z$ed/d$d%Z%ed/d&d'Z&ed/d(d)Z'ed/d*d+Z(ed/d,d-Z)dS)0a^ 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_MEANIMAGENET_DPN_STDIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)build_model_with_cfg)BatchNormAct2d ConvBnAct create_conv2dcreate_classifier)register_modelDPNc Ks|dddddttddd |S) N)r)rg?bicubiczfeatures.conv1_1.conv classifier) url num_classes input_size pool_sizecrop_pct interpolationmeanstd first_convr)rr)rkwargsr"(/home/terry/ogs_model/timm/models/dpn.py_cfgsr$z^https://github.com/rwightman/pytorch-dpn-pretrained/releases/download/v0.1/dpn68-66bebafa7.pth)rzghttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/dpn68b_ra-a31ca160.pth)rrrzdhttps://github.com/rwightman/pytorch-dpn-pretrained/releases/download/v0.1/dpn92_extra-b040e4a9b.pthz^https://github.com/rwightman/pytorch-dpn-pretrained/releases/download/v0.1/dpn98-5b90dec4d.pthz_https://github.com/rwightman/pytorch-dpn-pretrained/releases/download/v0.1/dpn131-71dfe43e0.pthzehttps://github.com/rwightman/pytorch-dpn-pretrained/releases/download/v0.1/dpn107_extra-1ac7121e2.pth)dpn68dpn68bdpn92dpn98dpn131dpn107csHeZdZeffdd ZejjddZejjddZddZZ S)CatBnActcs tt|||dd|_dS)NMbP?eps)superr+__init__bn)selfin_chs norm_layer __class__r"r#r05szCatBnAct.__init__cCdSNr"r2xr"r"r#forward9zCatBnAct.forwardcCr7r8r"r9r"r"r#r;>r<cCs"t|tr tj|dd}||S)Nr dim) isinstancetupletorchcatr1r9r"r"r#r;Cs  ) __name__ __module__ __qualname__r r0rAjit_overload_methodr; __classcell__r"r"r5r#r+4s  r+cs*eZdZdeffdd ZddZZS) BnActConv2dr cs4tt|||dd|_t|||||d|_dS)Nr,r-)stridegroups)r/rIr0r1r conv)r2r3out_chs kernel_sizerJrKr4r5r"r#r0JszBnActConv2d.__init__cCs|||Sr8)rLr1r9r"r"r#r;OszBnActConv2d.forward)rCrDrEr r0r;rHr"r"r5r#rIIsrIcsZeZdZ d fdd ZejjddZejjddZdeej ej ffd dZZ S) DualPathBlocknormalFc s8tt|||_||_||_|dkrd|_d|_n|dkr&d|_d|_n |dks,Jd|_d|_d|_d|_ |jr[|jdkrNt ||d|ddd|_ n t ||d|ddd|_t ||ddd|_ t ||d |j|d |_ |rt |d |_t||dd |_t||dd |_dSt |||ddd|_d|_d|_dS) Nprojr TdownrPF)r3rMrNrJr)r3rMrNrJrK)r3)rN)r/rOr0 num_1x1_cincb key_stridehas_proj c1x1_w_s1 c1x1_w_s2rIc1x1_ac3x3_br+c1x1_cr c1x1_c1c1x1_c2) r2r3 num_1x1_a num_3x3_brTrUrK block_typerVr5r"r#r0TsD      zDualPathBlock.__init__cCr7r8r"r9r"r"r#r;|r<zDualPathBlock.forwardcCr7r8r"r9r"r"r#r;r<returnc CsLt|tr tj|dd}n|}|jdur"|jdur"|d}|d}n2|jdur-||}n||}|ddd|jddddf}|dd|jdddddf}||}||}| |}|j durs| |}| |}n"|ddd|jddddf}|dd|jdddddf}||}tj||gdd} || fS)Nr r=r) r?r@rArBrYrZrTr[r\r]r^r_) r2r:x_inx_s1x_s2x_sout1out2residdenser"r"r#r;s,     ""      "")rPF) rCrDrEr0rArFrGr;rTensorrHr"r"r5r#rOSs(  "rOc s\eZdZddddddddddd d ejf fd d Zd dZdddZddZddZ Z S)rF@` rrrorravgc stt|| |_| |_||_|dksJttdd}ttd| dd}|r(dnd}t}t | ||r4dnd d |d |d <t j dd dd |d<t |d ddg|_ d|}|d}||d|}t||||||d||d<|d|}td |ddD]}t||||||d||dt|<||7}q{|j t |dd|ddg7_ d|}|d}||d|}t||||||d||d<|d|}td |ddD]}t||||||d||dt|<||7}q|j t |dd|ddg7_ d|}|d }||d|}t||||||d||d<|d|}td |d dD]}t||||||d||d t|<||7}q'|j t |d!d"|d dg7_ d#|}|d}||d|}t||||||d||d$<|d|}td |ddD]}t||||||d||d%t|<||7}q~|j t |dd&|ddg7_ t||d'|d(<||_t ||_t|j|j| d)d*\|_|_| rt d|_dSt |_dS)+Nror,r-F)r. act_layerinplacer rqrrrS)rNrJr4conv1_1)rNrJpadding conv1_poolzfeatures.conv1_1)num_chs reductionmodulermrrQconv2_1rPconv2_zfeatures.conv2_rvrRconv3_1conv3_zfeatures.conv3_conv4_1conv4_rtzfeatures.conv4_iconv5_1conv5_zfeatures.conv5_)r4 conv5_bn_acT pool_typeuse_conv)r/rr0r drop_raterVrr rr nn MaxPool2ddict feature_inforOrangestrr+ num_features Sequentialfeaturesr global_poolrFlattenIdentityflatten)r2smallnum_init_featuresk_rrKrVk_secinc_sec output_striderin_chansrrfc_actr4 fc_norm_layer bw_factorblocksbwrUrr3ir5r"r#r0sr     " $ " $ " $ " $  $z DPN.__init__cCs|jSr8)r)r2r"r"r#get_classifierszDPN.get_classifiercCsD||_t|j|j|dd\|_|_|rtd|_dSt|_dS)NTrr ) rrrrrrrrr)r2rrr"r"r#reset_classifiers  "zDPN.reset_classifiercCs ||Sr8)rr9r"r"r#forward_featuress zDPN.forward_featurescCsJ||}||}|jdkrtj||j|jd}||}||}|S)Nrw)ptraining)rrrFdropoutrrrr9r"r"r#r;s     z DPN.forward)rx) rCrDrErELUr0rrrr;rHr"r"r5r#rs I FcKs&tt||ft|tdddd|S)NT)feature_concatflatten_sequential) default_cfg feature_cfg)r r default_cfgsr)variant pretrainedr!r"r"r# _create_dpns rc Ks.td ddddddd|}td d |i|S) NT rvrorrq rrtrororm)rrrrKrrr%rr")r%rrrr! model_kwargsr"r"r#r%sr%c Ks0td dddddddd|}td d |i|S) NTrrvrorr)rrrrKrVrrr&rr")r&rrr"r"r#r&sr&cK,td dddddd|}td d|i|S) NrmrnrorprsrrrKrrr'rr")r'rrr"r"r#r' r'cKr) Nrn()rrrrrtrororvrr(rr")r(rrr"r"r#r((rr(cKr) Nrvrr)rqrrrrr)rr")r)rrr"r"r#r)0rr)cKr) Nrv2)rqrrrr)rrrmrmrvrr*rr")r*rrr"r"r#r*8rr*)r)F)*__doc__ collectionsr functoolsrtypingrrAtorch.nnrtorch.nn.functional functionalr timm.datarrrrhelpersr layersr r r rregistryr__all__r$rModuler+rIrOrrr%r&r'r(r)r*r"r"r"r#sd         U `