
    ^j#              	           d Z ddlZddlmc mZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ  e       ZdgZ G d	 de      Zdd
edededefdZddZy)zBackbone modules.    N)BackboneBase)DinoV2)MultiScaleProjector)
get_logger)NestedTensorBackbonec            #            e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddededededededed	ed
eeef   dedededededededef" fdZ	d Z
defdZdej                  fdZddefdZ xZS )r   z	backbone.namepretrained_encoderwindow_block_indexesout_feature_indexesprojector_scaleuse_cls_tokenfreeze_encoder
layer_normtarget_shaperms_normbackbone_loragradient_checkpointingload_dinov2_weights
patch_sizenum_windowspositional_encoding_sizedual_projectorc                     t         |           |j                  d      }|d   dk(  sJ d}d|v rd}|j                  d       d}d|v rd}|j                  d       t	        |      dk(  sJ d	       t        |d
   ||||||||||      | _        |	r&| j                  j                         D ]	  }d|_         || _	        t	        | j                        dkD  sJ t        | j                        | j                  k(  sJ d       t        dddd      }| j                  D cg c]  }||   	 }}t        | j                  j                  |||
|      | _        |r$t        | j                  j                  |||
|      nd | _        d| _        y c c}w )N_r   dinov2F	registersTwindowed   zTname should be dinov2, then either registers, windowed, both, or none, then the size)sizer   shapeuse_registersuse_windowed_attnr   r   r   r   r   drop_path_ratez<only support projector scale P3/P4/P5/P6 in ascending order.g       @      ?g      ?g      ?)P3P4P5P6)in_channelsout_channelsscale_factorsr   r   )super__init__splitremovelenr   encoder
parametersrequires_gradr   sorteddictr   _out_feature_channels	projectorcross_attn_projector_export)selfr
   r   r   	drop_pathr-   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
name_partsr$   r%   paramlevel2scalefactorlvlr.   	__class__s                              j/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/models/backbone/backbone.pyr0   zBackbone.__init__"   s   , 	 ZZ_
!}(((*$ Mk*!# $j):!# 	
b	
# B 3'/#9 3!#%=$
 002 ,&+#,  /4''(1,,,d**+t/C/CC 	
J	
C !CCCDA;?;O;OPC*3/PP,::%'!
    LL>>)+%!  	! + Qs   Fc                    d| _         | j                  | _        | j                  | _        t	        | j
                  d      sy 	 ddlm} t        | j
                  |      r5t        j                  d       | j
                  j                         | _        y y # t        $ r t        j                  d       Y y t        $ r}t        j                  d|        d }~ww xY w)NTmerge_and_unloadr   )	PeftModelzBpeft is not installed; skipping LoRA weight merging during export.z6Failed to import PeftModel from peft during export: %sz"Merging and unloading LoRA weights)r<   forward_forward_originforward_exporthasattrr4   peftrG   ModuleNotFoundErrorloggerwarningImportError
isinstanceinforF   )r=   rG   excs      rD   exportzBackbone.export|   s    #||**t||%78	& dllI.KK<=<<88:DL / # 	NN_` 	NNSUXY	s   B C4C<CCtensor_listc                    | j                  |j                        }| j                  |      }g }|D ]  }|j                  }|J t	        j
                  |d   j                         |j                  dd       j                  t        j                        d   }|j                  t        ||              d}| j                  g }| j                  |      }	|	D ]  }|j                  }|J t	        j
                  |d   j                         |j                  dd       j                  t        j                        d   }|j                  t        ||              ||fS ) N)r"   r   )r4   tensorsr:   maskFinterpolatefloatr#   totorchboolappendr   r;   )
r=   rU   	raw_featsfeatsoutfeatmrZ   cross_attn_outcross_attn_featss
             rD   rH   zBackbone.forward   sE    LL!4!45	y) 	1D  A= ===4tzz"#GJJ5::VWXYDJJ|D$/0		1 $$0N#88C( @$$}$}}}QtW]]_4::bc?KNNuzzZ[\]%%l4&>?	@ N""    rY   c                 ~   | j                  |      }| j                  |      }g }g }|D ]f  }|j                  \  }}}	}
|j                  t	        j
                  ||	|
ft        j                  |j                               |j                  |       h d }| j                  t        | j                  |            }|||fS )N)dtypedevice)
r4   r:   r#   ra   r_   zerosr`   rl   r;   list)r=   rY   rb   rc   	out_feats	out_masksre   br   hwrh   s               rD   rJ   zBackbone.forward_export   s    LL)	y)		 	#DJAq!QU[[!Q%**T[[YZT"		#  $$0#D$=$=i$HI)%555ri   prefixc                 B   |j                   d   dz   }d}i }| j                         D ]u  \  }}|dz   |z   }||v s|j                  s |j                  t	        ||j
                  |      z  |j                  dz  z  }|j                  t        |      z  }	|||	d||<   w |S )Nr!      zbackbone.0.encoder.)lr_decay_rate
num_layersr    )paramslrweight_decay)	r   named_parametersr6   
lr_encoderget_dinov2_lr_decay_ratelr_vit_layer_decaylr_component_decayr|   get_dinov2_weight_decay_rate)
r=   argsrt   ry   backbone_keynamed_param_lr_pairsnpr{   wds
             rD   get_named_param_lr_pairsz!Backbone.get_named_param_lr_pairs   s    --b1A5
+!))+ 	DAqq Aq Q__OO.&*&=&=#- --q01  &&)Ea)HH$&+$Q'	$ $#ri   )NN           NNFFF)  r   FFFT      r   F)z
backbone.0)__name__
__module____qualname____doc__strrn   r`   tupleintr0   rT   r   rH   r_   TensorrJ   r   __classcell__)rC   s   @rD   r   r      s3   
 #'%)$( $#$ (2#',$(()$)XX  X #	X "X X X X X CHoX X X !%X  "!X" #X$ %X& #&'X( )Xt;*#< #26ell 6"$S $ri   r
   rx   ry   returnc                     |dz   }| j                  d      rAd| v rd}n:d| v r6d| vr2t        | | j                  d      d j                  d      d	         dz   }||dz   |z
  z  S )
zCalculate lr decay rate for different ViT blocks.

    Args:
        name: Parameter name.
        lr_decay_rate: Base lr decay rate.
        num_layers: Number of ViT blocks.

    Returns:
        Lr decay rate for the given parameter.
    rv   backbone
embeddingsr   z.layer.z
.residual.Nrw   r    )
startswithr   findr1   )r
   rx   ry   layer_ids       rD   r   r      sy     A~Hz"4H$<t#;4		) 4 67==cB1EFJHZ!^h677ri   c                 :    d| v sd| v sd| v sd| v sd| v sd| v rd}|S )Ngamma	pos_embedrel_posbiasnormr   r    )r
   weight_decay_rates     rD   r   r      s;    	D4dNdND ri   )r'      )r'   )r   r_   torch.nn.functionalnn
functionalr[   rfdetr.models.backbone.baser   rfdetr.models.backbone.dinov2r    rfdetr.models.backbone.projectorr   rfdetr.utilities.loggerr   rfdetr.utilities.tensorsr   rN   __all__r   r   r]   r   r   r   r   ri   rD   <module>r      sg        4 0 @ . 1	,r$| r$j83 8u 8PS 8]b 8(
ri   