o gFF@sdZddlZddlmZddlmmZddlmZm Z ddl m Z ddl m Z mZmZmZmZddlmZdgZdVd d Zed d ed d ed d eddddded d edd ed d ed d dZeeedddddeddddddd d!d"eegd#d$dddeddddddd d!d"eegd#d$ddded%dddd&dd d!d"eeddddded%ddd'dddd d(d"eed)d$dd ded*d+d,d-d.d/d d0d"eed)d$dd ded*d+d,d1d2d3d"d4Z dWd5d6ZGd7d8d8ejZGd9d:d:ejZGd;d<dd>ejZdXd@dAZGdBddejZ dYdDdEZ!edYdFdGZ"edYdHdIZ#edYdJdKZ$edYdLdMZ%edYdNdOZ&edYdPdQZ'edYdRdSZ(edYdTdUZ)dS)ZaPyTorch CspNet A PyTorch implementation of Cross Stage Partial Networks including: * CSPResNet50 * CSPResNeXt50 * CSPDarkNet53 * and DarkNet53 for good measure Based on paper `CSPNet: A New Backbone that can Enhance Learning Capability of CNN` - https://arxiv.org/abs/1911.11929 Reference impl via darknet cfg files at https://github.com/WongKinYiu/CrossStagePartialNetworks Hacked together by / Copyright 2020 Ross Wightman NIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)build_model_with_cfg)ClassifierHead ConvBnActDropPath create_attnget_norm_act_layer)register_modelCspNetc Ks|dddddttddd |S) N)r)rgMb?bilinearzstem.conv1.convzhead.fc) url num_classes input_size pool_sizecrop_pct interpolationmeanstd first_conv classifierr)rkwargsr+/home/terry/ogs_model/timm/models/cspnet.py_cfgsr!zlhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspresnet50_ra-d3e8d487.pth)rzqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspresnext50_ra_224-648b4713.pth)rr")r#g?)rrrrzqhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/cspdarknet53_ra_256-d05c7c21.pth) cspresnet50 cspresnet50d cspresnet50w cspresnext50cspresnext50_iabn cspdarknet53cspdarknet53_iabn darknet53@r#max)out_chs kernel_sizestridepool)r)rrr-)rr-r-r-)@r7r7r7)?r8r8r8)?r9r9r9T)r/depthr1 exp_ratio bottle_ratio block_ratio cross_linear)stemstage) rAr,r)rr4r5i)?rBrBrB)rArArArA)r/r:r1groupsr;r<r=r>rA)r,r3rr4r5)rr-rr)r-r-r-r-r-)r7r9r9r9r9)r8r9r9r9r9)r9r8r8r8r8)r/r:r1r;r<r= down_growth)r8r8r8r8r8)r9r9r9r9r9)r/r:r1r<r=)r$r%r&r'r)r+c Cst}t|ttfs|g}t|sJ|} t|D]#\} } d| d} || t| | || dkr2|nd||d| } | } q|rg|dur[|dtj dddd|d|| d d n |dtj dd dd|t | |d d | gd fS)Nconvrr)r1 act_layer norm_layerr2r)r0r1paddingaar-)channelsr1.r?num_chs reductionmodule) nn Sequential isinstancetuplelistlen enumerate add_moduler MaxPool2ddictjoin)in_chansr/r0r1r2rGrHaa_layerr?in_ciout_c conv_name last_convrrr create_stems& rcc sJeZdZdZdddejejdddddf fdd Zdd Zd d Z Z S) ResBottleneckz ResNe(X)t Bottleneck Block rrBFNc stt|tt||} t||| | d}t|| fddi||_t| | fd||d||_|s9t | | dnd|_ t| |fddd||_ |rQt | |dnd|_ | |_ |d d |_dS) NrGrHr] drop_blockr0rrr0dilationrCrKFr0 apply_actT)inplace)superrd__init__introundrZrconv1conv2r attn2conv3attn3 drop_pathact3)selfin_chsr/rhr<rCrGrH attn_last attn_layerr]rfrvmid_chsckwargs __class__rr rnszResBottleneck.__init__cCtj|jjjdSN)rQinitzeros_rtbnweightrxrrr zero_init_last_bnzResBottleneck.zero_init_last_bncCst|}||}||}|jdur||}||}|jdur%||}|jdur/||}||}||}|Sr)rqrrrsrtrurvrwrxxshortcutrrr forwards          zResBottleneck.forward __name__ __module__ __qualname____doc__rQReLU BatchNorm2drnrr __classcell__rrr~r rds rdc sHeZdZdZdddejejddddf fdd ZddZd d Z Z S) DarkBlockz DarkNet Block rr8Nc sztt|tt||} t||| | d} t|| fddi| |_t| |fd||d| |_t ||d|_ | |_ dS)Nrer0rrrgri) rmrrnrorprZrrqrrr attnrv)rxryr/rhr<rCrGrHr{r]rfrvr|r}r~rr rns zDarkBlock.__init__cCrr)rQrrrrrrrrrr rrzDarkBlock.zero_init_last_bncCsL|}||}||}|jdur||}|jdur ||}||}|Sr)rqrrrrvrrrr rs      zDarkBlock.forwardrrrr~r rs  rc s<eZdZdZddddddddef fdd Zdd ZZS) CrossStagez Cross Stage.r9rNFc s`tt|| p |} | r|n|}tt||}tt||}t|d|dd}|dks5| |krLt||fd|| | |ddd||_|}nd|_|}t||fd| d||_ |d }t |_ t |D]'}| rz| |rzt| |nd}|j t||||||| fd |i||}qlt||d fd di||_t||fd di||_dS) NrGrH)rGrHrrr])r0r1rhrCr]rjr-rvr0)rmrrnrorprZgetr conv_downconv_exprQrRblocksranger rXstrconv_transition_bconv_transition)rxryr/r1rhr:r=r<r;rCfirst_dilationrEr> block_dprblock_fn block_kwargsdown_chsexp_chs block_out_chs conv_kwargsprev_chsr_rvr~rr rnsB     zCrossStage.__init__cCs|jdur ||}||}|jdd}|ddd|f|dd|df}}||}||}|tj||gdd}|S)Nrr-)dim) rrshaperr contiguousrtorchcat)rxrsplitxsxboutrrr rs   * zCrossStage.forwardrrrrrdrnrrrrr~r rs $rcs6eZdZdZddddedffdd ZddZZS) DarkStagezDarkNet stage.r9rNc  stt|| p |} t||d|| || d| d| ddd |_|} tt||}t |_ t |D]'}| rD| |rDt | |nd}|j t|| | ||||fd|i| |} q6dS)NrrGrHr])r0r1rhrCrGrHr]rv)rmrrnrrrrorprQrRrrr rXr)rxryr/r1rhr:r=r<rCrrrrrrr_rvr~rr rns*     zDarkStage.__init__cC||}||}|Sr)rrrxrrrr r)  zDarkStage.forwardrrrr~r rs rc sHtd}dvrd|d<dvr&tdttfs&df|d<dvrcSsg|]}|qSr)tolist).0rrrr 9sz&_cfg_to_stage_args..rrrr1rhrcsg|] }tt|qSr)rZzipkeys)rvaluescfgrr rKs) rVrSrUrTrlinspacesumrappendrr) r curr_stride output_stridedrop_path_rate num_stages stage_stridesstage_dilationsstage_first_dilationsrh cfg_strider1 stage_argsrrr _cfg_to_stage_args/s8  (    rc s`eZdZdZdddddejejdddeef fd d Z d d Z dd dZ ddZ ddZ ZS)r aCross Stage Partial base model. Paper: `CSPNet: A New Backbone that can Enhance Learning Capability of CNN` - https://arxiv.org/abs/1911.11929 Ref Impl: https://github.com/WongKinYiu/CrossStagePartialNetworks NOTE: There are differences in the way I handle the 1x1 'expansion' conv in this impl vs the darknet impl. I did it this way for simplicity and less special cases. rrrAavgrNTc st||_||_|dvsJt||| d}t|fi|d|\|_}|g|_|d}|d}|ddr=|d9}t|d||| d }t |_ t |D]3\}}|j t|| |fi||d | i|d }||d 9}|jt||d |dg7_qP||_t||||d|_|D]?}t|t jrt jj|jdddqt|t jrt j|jt j|jqt|t jrt jj|jdddt j|jq| r|D] }t|dr|qdSdS)N)rrA)rGrHr]r?rNrOr2r-r@)rrrrr/r1zstages.rM)ryr pool_type drop_ratefan_outrelu)mode nonlinearityrg{Gz?)rrr) rmrnrrrZrcr? feature_inforrQrRstagesrWrXr num_featuresrheadmodulesrSConv2drkaiming_normal_rrones_rbiasLinearnormal_hasattrr)rxrr\rr global_poolrrGrHr]rrstage_fnr layer_argsstem_feat_inforrper_stage_argsr_samr~rr rnYsV       "      zCspNet.__init__cCs|jjSr)rfcrrrr get_classifierszCspNet.get_classifiercCst|j|||jd|_dS)N)rr)rrrr)rxrrrrr reset_classifierszCspNet.reset_classifiercCrr)r?rrrrr forward_featuresrzCspNet.forward_featurescCrr)rrrrrr rrzCspNet.forward)r)rrrrrQ LeakyReLUrrrdrnrrrrrrrr~r r Os / FcKs8|dd}tt||ft|tddt|d|S)N_rT)flatten_sequential) default_cfg feature_cfg model_cfg)rrr default_cfgsrZ model_cfgs)variant pretrainedr cfg_variantrrr _create_cspnetsrcKtdd|i|S)Nr$r)r$rrrrrr r$r$cKr)Nr%r)r%rrrrr r%rr%cKr)Nr&r)r&rrrrr r&rr&cKr)Nr'r)r'rrrrr r'rr'cKstd}td||d|S)Niabnr()rrH)r()r rrrrHrrr r(sr(cKstd|td|S)Nr))rr)r))rrrrrr r)sr)cKstd}td|t|d|S)Nrr*)rrrH)r*)r rrrrrr r*sr*cKstd|ttd|S)Nr+)rrr)r+)rrrrrrr r+sr+)r)rrArr-rNNN)r-rAr)F)*rrtorch.nnrQtorch.nn.functional functionalF timm.datarrhelpersrlayersrrr r r registryr __all__r!rrZrrcModulerdrrrrr rr$r%r&r'r(r)r*r+rrrr s          L (2  J