a *fE@sddlmZmZmZddlZddlmZddlmZddl m Z ddl m Z dZ eeZddgZdd d ZGd d d ejZGdddejZGdddejZeedZGddde Ze edddZdS))absolute_importdivisionprint_functionN) ShapeSpec)BACKBONE_REGISTRY)Backboneg?build_pose_hrnet_backbonePoseHigherResolutionNetcCstj||d|dddS)z3x3 convolution with paddingr F kernel_sizestridepaddingbias)nnConv2d) in_planes out_planesrrE/data1/chongzheng_p23/Projects/CatVTON-hf/densepose/modeling/hrnet.pyconv3x3srcs*eZdZdZdfdd ZddZZS) BasicBlockr Ncsftt|t||||_tj|td|_tj dd|_ t|||_ tj|td|_ ||_ ||_dS)NmomentumTinplace)superr__init__rconv1r BatchNorm2d BN_MOMENTUMbn1ReLUreluconv2bn2 downsamplerselfinplanesplanesrr' __class__rrr"s zBasicBlock.__init__cCs`|}||}||}||}||}||}|jdurJ||}||7}||}|SN)rr"r$r%r&r'r)xresidualoutrrrforward,s        zBasicBlock.forward)r N__name__ __module__ __qualname__ expansionrr3 __classcell__rrr,rrs rcs*eZdZdZdfdd ZddZZS) Bottleneckr Ncstt|tj||ddd|_tj|td|_tj||d|ddd|_ tj|td|_ tj|||j ddd|_ tj||j td|_ tjdd|_||_||_dS) Nr F)r rrr r Tr)rr:rrrrr r!r"r%r&r8conv3bn3r#r$r'rr(r,rrrBszBottleneck.__init__cCs~|}||}||}||}||}||}||}||}||}|jdurh||}||7}||}|Sr.)rr"r$r%r&r<r=r'r/rrrr3Ns           zBottleneck.forward)r Nr4rrr,rr:?s r:csTeZdZdZdfdd ZddZddd Zd d Zd d ZddZ ddZ Z S)HighResolutionModuleaHighResolutionModule Building block of the PoseHigherResolutionNet (see lower) arXiv: https://arxiv.org/abs/1908.10357 Args: num_branches (int): number of branches of the modyle blocks (str): type of block of the module num_blocks (int): number of blocks of the module num_inchannels (int): number of input channels of the module num_channels (list): number of channels of each branch multi_scale_output (bool): only used by the last module of PoseHigherResolutionNet Tcs^tt|||||||||_||_||_||||||_| |_ t d|_ dS)NT)rr>r_check_branchesnum_inchannels num_branchesmulti_scale_output_make_branchesbranches_make_fuse_layers fuse_layersrr#r$)r)rAblocks num_blocksr@ num_channelsrBr,rrrrs  zHighResolutionModule.__init__cCs|t|kr.d|t|}t|t||t|kr\d|t|}t|t||t|krd|t|}t|t|dS)Nz"NUM_BRANCHES({}) <> NUM_BLOCKS({})z$NUM_BRANCHES({}) <> NUM_CHANNELS({})z&NUM_BRANCHES({}) <> NUM_INCHANNELS({}))lenformatloggererror ValueError)r)rArGrHr@rI error_msgrrrr?s       z$HighResolutionModule._check_branchesr c Csd}|dks$|j||||jkrdttj|j||||jd|ddtj|||jtd}g}|||j||||||||j|j|<td||D]}|||j|||qtj|SNr F)r rrr) r@r8r Sequentialrr r!appendrange) r)Z branch_indexblockrHrIrr'layers_rrr_make_one_branchs.  z%HighResolutionModule._make_one_branchc Cs2g}t|D]}||||||q t|Sr.)rSrRrWr ModuleList)r)rArTrHrIrDirrrrCs z#HighResolutionModule._make_branchesc Cs||jdkrdS|j}|j}g}t|jr*|ndD]>}g}t|D]}||kr|ttj||||dddddt||tj d||ddqB||kr|dqBg}t||D]}|||dkr||} |ttj||| dddddt| q||} |ttj||| dddddt| t d q|tj|qB|t |q0t |S) Nr rFrnearest) scale_factormoder T) rAr@rSrBrRrrQrr Upsampler#rX) r)rAr@rFrYZ fuse_layerjconv3x3skZnum_outchannels_conv3x3rrrrEsj   z&HighResolutionModule._make_fuse_layerscCs|jSr.)r@)r)rrrget_num_inchannelssz'HighResolutionModule.get_num_inchannelsc Cs|jdkr|jd|dgSt|jD]}|j|||||<q(g}tt|jD]}|dkrj|dn|j|d|d}td|jD]`}||kr|||}q|j||||ddddd|jdd|jdf}||}q|||qV|S)Nr rr[r )rArDrSrJrFshaperRr$)r)r0rYZx_fuseyr`zrrrr3s &> zHighResolutionModule.forward)T)r ) r5r6r7__doc__rr?rWrCrErcr3r9rrr,rr>es ;r>)BASICZ BOTTLENECKcsLeZdZdZfddZddZddZdd d Zdd d ZddZ Z S)r zPoseHigherResolutionNet Composed of several HighResolutionModule tied together with ConvNets Adapted from the GitHub version to fit with HRFPN and the Detectron2 infrastructure arXiv: https://arxiv.org/abs/1908.10357 c s"|jjj|_tt|tjddddddd|_ tj dt d|_ tjddddddd|_ tj dt d|_tjdd |_|tdd |_|jjj|_|jjt|jjfd d ttD|d g|_||j\|_}|jjj|_ |j jt|j jfdd ttD|||_!||j \|_"}|jjj#|_$|j$jt|j$jfdd ttD|||_%|j|j$dd\|_&}g|_'i|_(i|_)t|jjj#j*D]R}|j'+d|d|j(,|j'd|jjj#j|i|j),|j'ddiqdS)Nr @r[r Fr rTrr;csg|]}|jqSrr8.0rYrTrIrr +z4PoseHigherResolutionNet.__init__..csg|]}|jqSrrjrkrmrrrn2rocsg|]}|jqSrrjrkrmrrrn9ro)rBzp%d)-MODELHRNET STEM_INPLANESr*rr rrrrr r!r"r%r&r#r$ _make_layerr:layer1STAGE2 stage2_cfg NUM_CHANNELS blocks_dictBLOCKrSrJ_make_transition_layer transition1 _make_stagestage2STAGE3 stage3_cfg transition2stage3STAGE4 stage4_cfg transition3stage4 _out_features_out_feature_channels_out_feature_strides NUM_BRANCHESrRupdate)r)cfgkwargsZpre_stage_channelsrYr,rmrrsJ        z PoseHigherResolutionNet.__init__cCs>|dkrd}d}n"|dkr$d}d}n|dkr4d}d}|||fS)Nr;r rr r[r)r) deconv_kernelroutput_paddingrrr_get_deconv_cfgJsz'PoseHigherResolutionNet._get_deconv_cfgc Cst|}t|}g}t|D]}||kr||||krz|ttj||||dddddt||tjddn |dqg}t|d|D]X}|d} |||kr||n| } |ttj| | dddddt| tjddq|tj|qt|S) Nr r FrZTrrqr[) rJrSrRrrQrr r#rX) r)Znum_channels_pre_layerZnum_channels_cur_layerZnum_branches_curZnum_branches_preZtransition_layersrYrar`Z inchannelsZ outchannelsrrrr|WsF     z.PoseHigherResolutionNet._make_transition_layerr c Csd}|dks|j||jkrPttj|j||jd|ddtj||jtd}g}|||j|||||j|_td|D]}|||j|qtj|SrP) r*r8rrQrr r!rRrS)r)rTr+rGrr'rUrVrrrrus$  z#PoseHigherResolutionNet._make_layerTc Cs|d}|d}|d}|d}t|d}g} t|D]B} |sR| |dkrRd} nd} | t|||||| | d }q8tj| |fS) N NUM_MODULESr NUM_BLOCKSryr{r FTrq)rzrSrRr>rcrrQ) r)Z layer_configr@rBZ num_modulesrArHrIrTmodulesrYZreset_multi_scale_outputrrrr~s,   z#PoseHigherResolutionNet._make_stagecCsj||}||}||}||}||}||}||}g}t|jjD]2}|j |dur~| |j ||qV| |qV| |}g}t|j jD]:}|j |dur| |j ||dq| ||q||}g}t|jjD]<}|j|dur(| |j||dq| ||q||}t|jt|ksZJtt|j|S)Nrq)rr"r$r%r&rvrSrxrr}rRrrrrrrrrJrdictzip)r)r0x_listrYy_listrrrr3s6           zPoseHigherResolutionNet.forward)r )T) r5r6r7rgrrr|rur~r3r9rrr,rr s . *  ) input_shapecCs t|}|Sr.)r )rrmodelrrrrs)r ) __future__rrrloggingtorch.nnrdetectron2.layersrdetectron2.modeling.backboner%detectron2.modeling.backbone.backbonerr! getLoggerr5rL__all__rModulerr:r>rzr registerrrrrr s$       &. E