U c@sddlZddlZddlZddlZddlmmZddl m Z m Z ddl m Z ddlmZddlmZddZd d Zd d Zd$eejd ddZd%eejd ddZddZddddgddgddddgddddfddZd&ddZd'd d!Zd(d"d#ZdS))N)forward_adapted_unflattenmake_backbone_default)gen_relative_position_index) checkpoint)OptionalcCs t||dS)Nforward_features)r) pretrainedxr u/home/vaishanth/workspace/independent_study_project/ros_mono_depth_ws/src/ros_monocular_depth/midas/backbones/beit.py forward_beitsr cCs0||}|jr"|ddd}||}|S)zr Modification of timm.models.layers.patch_embed.py: PatchEmbed.forward to support arbitrary window sizes. r)projflatten transposenorm)selfr r r r patch_embed_forwards   rcCsfd|jdd}d|jdd}d|dd}d|dd}|j}|j}||d}|d|d} | d||ddddd} tj| ||fdd} | dddd|dd} t| ||ddg} t |dd t |d} | |j kr t ||j | <| |j |  d |d|dd|d|ddd} | ddd} | dS) zm Modification of timm.models.beit.py: Attention._get_rel_pos_bias to support arbitrary window sizes. rrrNbilinear)sizemode,) window_sizerelative_position_bias_tableZnum_relative_distancereshapepermuteF interpolatetorchcatstrrelative_position_indiceskeysrview contiguous unsqueeze)rrZ old_heightZ old_widthZ new_heightZ new_widthZ old_relative_position_bias_tableZold_num_relative_distanceZnew_num_relative_distanceZ old_sub_tableZ new_sub_tableZ new_relative_position_bias_tablekeyZrelative_position_biasr r r _get_rel_pos_biass4 r*shared_rel_pos_biascCs|j\}}}|jdk r,t|j|j|jfnd}tj||jj |d}| ||d|j d ddddd}| d\} } } | |j} | | d d} |jdk rtt|d } | || } |dk r| |} | jdd } || } | | dd ||d}||}||}|S) zc Modification of timm.models.beit.py: Attention.forward to support arbitrary window sizes. N)inputweightbiasrrrrrdim)shapeq_biasr!r"Zk_biasZv_biasrlinearqkvr.r num_headsrunbindscalerrtuplenparrayr*softmaxZ attn_droprZ proj_drop)rr resolutionr,BNCZqkv_biasr8qkvattnrr r r attention_forwardAs$ $"      rHc Cs|jdkrF|||j||||d}|||||}nF|||j|j||||d}|||j|||}|S)z_ Modification of timm.models.beit.py: Block.forward to support arbitrary window sizes. Nr+)Zgamma_1Z drop_pathrGnorm1Zmlpnorm2Zgamma_2)rr r@r,r r r block_forward^s    rKcCs|jdd}||}tj|j|jddd|fdd}|jdk rP||j}||}|jdk rl|nd}|j D]2}|j rtj st |||d}qv||||d}qv||}|S)zg Modification of timm.models.beit.py: Beit.forward_features to support arbitrary window sizes. rNrrrr3r+)r5 patch_embedr!r"Z cls_tokenexpandZ pos_embedZpos_drop rel_pos_biasblocksZgrad_checkpointingjit is_scriptingrr)rr r@rNZblkr r r beit_forward_featuresls $     rR`r0 ignorec Cst||||||||}tt|jj|jj_tt|j|j_|jj D]:} | j } tt | | _ tt | | _i| _ tt| | _qF|S)N)rtypes MethodTypermodelrLforwardrRrrOrGr*rHr$rK) r\featuresrhooks vit_features use_readout start_indexZstart_index_readoutbackboneblockrGr r r _make_beit_backbones  recCsJtjd|d}|dkr"ddddgn|}ddd d g}t||ddg|d |d S) NZbeit_large_patch16_512r rX)r^rr_r`ratimmZ create_modelre)r rar_r\r^r r r _make_pretrained_beitl16_512s rocCs@tjd|d}|dkr"ddddgn|}t|ddd d g|d |d S) NZbeit_large_patch16_384rfrgrXrhrirjrkrl)r^r_r`rarmr rar_r\r r r _make_pretrained_beitl16_384s rqcCs>tjd|d}|dkr"ddddgn|}t|ddd d g||d S) NZbeit_base_patch16_384rfrrgrWrXrSrTrUrV)r^r_rarmrpr r r _make_pretrained_beitb16_384s rr)N)N)rYN)rYN)rYN)rnr!rZnumpyr=Ztorch.nn.functionalnn functionalrutilsrrZtimm.models.beitrZtorch.utils.checkpointrtypingrr rr*TensorrHrKrRrerorqrrr r r r s2    $