U b%c5C@sdZddlZddlZddlmZddlmmZddlm Z m Z ddl m Z ddl mZddlmZdgZd@d d Zed d edd edd edd edd edd edd edd edd edd edd edd d ZGdddejZGdddejZGdddejZGd d!d!ejZGd"d#d#ejZGd$ddejZdAd&d'ZedBd(d)ZedCd*d+ZedDd,d-ZedEd.d/ZedFd0d1Z edGd2d3Z!edHd4d5Z"edId6d7Z#edJd8d9Z$edKd:d;Z%edLdd?Z'dS)NaF Deep Layer Aggregation and DLA w/ Res2Net DLA original adapted from Official Pytorch impl at: DLA Paper: `Deep Layer Aggregation` - https://arxiv.org/abs/1707.06484 Res2Net additions from: https://github.com/gasvn/Res2Net/ Res2Net Paper: `Res2Net: A New Multi-scale Backbone Architecture` - https://arxiv.org/abs/1904.01169 NIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)build_model_with_cfg)create_classifier)register_modelDLAc Ks|dddddttddd |S) N)r )rg?bilinearz base_layer.0fc) url num_classes input_size pool_sizecrop_pct interpolationmeanstd first_conv classifierr)rkwargsrr?xshortcutoutrrrforwardAs      zDlaBasic.forward)rr)N)__name__ __module__ __qualname____doc__r5rJ __classcell__rrrCrr+3s r+cs0eZdZdZdZd fdd Zd dd ZZS) DlaBottleneckzDLA/DLA-X Bottleneckr@c stt|||_tt||d|}||j}tj ||ddd|_ t ||_ tj ||d||d||d|_ t ||_tj ||ddd|_t ||_tjdd|_dS) NrRrFr-r0r )r-r.r/r0r1groupsTr2)r4rPr5r.intmathfloor expansionr6r7r8r9r:r=r>conv3bn3r;r<)r?r@ outplanesr.r1 cardinality base_width mid_planesrCrrr5Vs(    zDlaBottleneck.__init__NcCsr|dkr |}||}||}||}||}||}||}||}||}||7}||}|SrE)r8r:r<r=r>rYrZrFrrrrJfs         zDlaBottleneck.forward)rrrrR)NrKrLrMrNrXr5rJrOrrrCrrPRsrPcs0eZdZdZdZd fdd Zd d d ZZS) DlaBottle2neckzj Res2Net/Res2NeXT DLA Bottleneck Adapted from https://github.com/gasvn/Res2Net/blob/master/dla.py rQrc s*tt||dk|_||_tt||d|}||j}||_ t j |||ddd|_ t |||_td|d} g} g} t| D]4} | t j ||d||||dd| t |qt | |_t | |_|jrt jd|dd|_t j |||ddd|_t ||_t jdd |_dS) NrrRFrSr )r-r.r/r1rTr0)r-r.r/Tr2)r4r`r5is_firstscalerUrVrWrXwidthr6r7r8r9r:maxrangeappend ModuleListconvsbns AvgPool2dpoolrYrZr;r<) r?r@r[r.r1rdr\r]r^Znum_scale_convsrjrkrBrCrrr5s<      zDlaBottle2neck.__init__Nc Cs|dkr |}||}||}||}t||jd}g}tt|j|j D]R\}\}}|dksj|j rr||n | ||} || } || } || } | | qP|j dkr| |j r| |dn|dt|d}||}||}||7}||}|S)Nrr)r8r:r<torchsplitre enumerateziprjrkrcrhrdrmcatrYrZ) r?rGrHrIZspxZspoiconvbnsprrrrJs*   "   "    zDlaBottle2neck.forward)rrrarbra)Nr_rrrCrr`{sr`cs$eZdZfddZddZZS)DlaRootcsRtt|tj||ddd|ddd|_t||_tjdd|_ ||_ dS)NrFrQ)r.r0r/Tr2) r4rxr5r6r7rur9rvr;r<rH)r? in_channels out_channelsr-rHrCrrr5s  zDlaRoot.__init__cGs@|}|t|d}||}|jr2||d7}||}|S)Nrr)rurorsrvrHr<)r?rGchildrenrrrrJs   zDlaRoot.forwardrKrLrMr5rJrOrrrCrrxs rxcs(eZdZd fdd Zd dd ZZS) DlaTreerrRFrc  sDtt|| dkrd|} | r*| |7} |dkr@tj||dnt|_t|_t|||d} |dkr||||f| |_ |||df| |_ ||krt tj ||ddddt ||_nX| t| | dt|d||||fd di| |_ t|d|||fd | |i| |_ |dkr.t| || | |_| |_| |_||_dS) NrrQrr.)r1r\r]F)r-r.r0)root_kernel_size root_shortcutroot_dim)r4r}r5r6 MaxPool2dIdentity downsampleprojectdicttree1tree2 Sequentialr7r9updaterxroot level_rootrlevels)r?rblockryrzr.r1r\r]rrrrcargsrCrrr5sV   zDlaTree.__init__NcCs|dkr gn|}||}||}|jr4|||||}|jdkrh||}|j||f|}n|||j||d}|S)Nr)r{)rrrrhrrrr)r?rGrHr{bottomx1x2rrrrJs       zDlaTree.forward)rrrrRFrrF)NNr|rrrCrr}s!r}c s\eZdZdddddedddf fd d Zdd d Zd dZdddZddZddZ Z S)r r r rrRFavgc  stt|||_||_||_||_| |_|dks8tt t j ||ddddddt |dt j dd |_||d|d|d|_|j|d|d|dd d |_t||| d } t|d ||d|d d fd di| |_t|d||d |dd fd di| |_t|d||d|dd fd di| |_t|d||d|dd fd di| |_t|ddddt|dd ddt|d dddt|ddddt|ddddt|ddddg|_|d|_t|j|j| dd\|_|_| rt dnt |_| D]r} t!| t j rX| j"d| j"d| j#}| j$j%&dt'(d|n(t!| t j r| j$j%)d| j*j%+qdS)Nrrrrr F)r-r.r/r0Tr2rQr~)r\r]rrralevel0)num_chs reductionmodulelevel1level2rblevel3level4level5rn pool_typeuse_convg@),r4r r5channelsrr\r] drop_rateAssertionErrorr6rr7r9r; base_layer_make_conv_levelrrrr}rrrr feature_info num_featuresr global_poolrFlattenrflattenmodules isinstancer-rzweightdatanormal_rVsqrtfill_r0zero_)r?rr output_striderin_chansr\r]r shortcut_rootrrrmnrCrrr5sR    ****  z DLA.__init__c Cs^g}t|D]F}|tj||d|dkr*|nd|d|dt|tjddg|}q tj|S)Nr rrFr,Tr2)rgextendr6r7r9r;r)r?r@rArjr.r1rrtrrrr-s  zDLA._make_conv_levelcCs|jSrE)r)r?rrrget_classifier8szDLA.get_classifiercCs>||_t|j|j|dd\|_|_|r0tdnt|_dS)NTrr) rrrrrr6rrr)r?rrrrrreset_classifier;szDLA.reset_classifiercCsJ||}||}||}||}||}||}||}|SrE)rrrrrrrr?rGrrrforward_featuresAs       zDLA.forward_featurescCsJ||}||}|jdkr2tj||j|jd}||}||}|S)Nr)ptraining)rrrFdropoutrrrrrrrrJKs     z DLA.forward)rr)r) rKrLrMr`r5rrrrrJrOrrrCrr s,   FcKs&tt||ft|dtddd|S)NF)rrQr rar) out_indices) default_cfgpretrained_strict feature_cfg)rr default_cfgsr)variant pretrainedrrrr _create_dlaUsrcKs(tfddtddd|}td|f|S)NrrrrQr rrrrrrrr\r]r)rr`rrr model_kwargsrrrr)^sr)cKs(tfddtddd|}td|f|S)Nrrrbrarr*rrrrrr*fsr*c Ks<tfddddddgddddddgtd |}td |f|S) NrrQrrrRrrrrrrr)rr+rrrrrrnsrc Ks<tfddddddgddddddgtd|}td |f|S) NrrQrrrRrrrr rrPrrrrrr vsr c Ks@tfddddddgddddddgtddd |}td |f|S) NrrQrrrRrrrarr!rrrrrr!~sr!c Ks@tfddddddgddddddgtdd d |}td |f|S) NrrQr rrrRrrrarr"rrrrrr"sr"c Ks<tfddddddgdddddd gtd |}td |f|S) NrrQr rrrrrrrr#rrrrrr#sr#c Ks@tfddddddgdddddd gtdd d |}td |f|S) NrrQr rrrrrrrarr$rrrrrr$sr$c Ks>tfddddddgdddddd gtd d |}td |f|S) Nrr rarrrrrrTrrrrr%rrrrrr%sr%c KsBtfddddddgdddddd gtddd d |}td |f|S) Nrr rarrrrrrTrrrr\r]rr&rrrrrr&sr&c KsBtfddddddgdddddd gtd dd d |}td |f|S)Nrr rarrrrrrrRTrr'rrrrrr'sr'c Ks>tfddddddgddddd d gtd d |}td |f|S)NrrQr rrrrrrrTrr(rrrrrr(sr()r )F)F)F)F)F)F)F)F)F)F)F)F)F)(rNrVrotorch.nnr6torch.nn.functional functionalr timm.datarrhelpersrlayersrregistryr__all__rrModuler+rPr`rxr}r rr)r*rr r!r"r#r$r%r&r'r(rrrrst     )?2U