
    ^j                         d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmc mZ	 d dl
mZ d dlmZmZ d dlmZ  e       Zddddd	Zd
dddZddddZd Z G d dej,                        Zedk(  rl e       Zej5                           ej6                  dddd      Zej;                   ee              ee      D ]  Zej;                  ej>                          yy)    N)AutoBackbone)#WindowedDinov2WithRegistersBackbone!WindowedDinov2WithRegistersConfig)
get_logger   i  i   i   )tinysmallbaselargezdinov2_small.jsonzdinov2_base.jsonzdinov2_large.json)r	   r
   r   z dinov2_with_registers_small.jsonzdinov2_with_registers_base.jsonz dinov2_with_registers_large.jsonc                    |rt         nt        }t        j                  j	                  t        j                  j                  t                    }t        j                  j                  |d      }t        j                  j                  |||          }t        |d      5 }t        j                  |      }d d d        |S # 1 sw Y   S xY w)Ndinov2_configsr)size_to_config_with_registerssize_to_configospathdirnameabspath__file__joinopenjsonload)sizeuse_registersconfig_dictcurrent_dirconfigs_dirconfig_pathfdino_configs           h/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/models/backbone/dinov2.py
get_configr#   -   s    3@/nK''//"''//(";<K'',,{,<=K'',,{K,=>K	k3	 #1iil##s   B>>Cc                   F     e Zd Zdg dddddddddd	f fd
	Zd Zd Z xZS )DinoV2)  r&   )         	   r
   TF   r(   %           c           	      t   t         |           |rd| nd| }|| _        || _        |	| _        |s[|rJ d       |sJ d       |dkD  rt
        j                  d       t        j                  ||D cg c]  }d| 	 c}d	      | _	        nt        t        |d
   dz               }|j                  |       t        |      }t        ||      }d|d<   |D cg c]  }d| 	 c}|d<   ||d<   |
|z  }||d   k7  rt
        j                  d       ||d<   d}|dk7  r t
        j                  d| d       ||d<   d}|rt        di ||	||d}nt        di ||	|d|d}|rt!        j                  ||      n
t!        |      | _	        t"        |   gt%        |      z  | _        d| _        y c c}w c c}w )Nzfacebook/dinov2-with-registers-zfacebook/dinov2-zBGradient checkpointing is not supported for non-windowed attentionzEUsing non-windowed attention requires loading dinov2 weights from hubr-   zcdrop_path_rate > 0.0 is not supported for non-windowed DinoV2 backbones. drop_path will be ignored.stageF)out_featuresreturn_dict   r1   r0   drop_path_rate
image_sizezUsing a different number of positional encodings than DINOv2, which means we're not loading DINOv2 backbone weights. This is not a problem if finetuning a pretrained RF-DETR model.r+   zUsing patch size z instead of 14, which means we're not loading DINOv2 backbone weights. This is not a problem if finetuning a pretrained RF-DETR model.
patch_size)num_windowswindow_block_indexesgradient_checkpointingr   )r7   r8   num_register_tokensr9   )config )super__init__shaper6   r7   loggerwarningr   from_pretrainedencodersetrangedifference_updatelistr#   r   r   size_to_widthlen_out_feature_channels_export)selfr?   out_feature_indexesr   r   use_windowed_attnr9   load_dinov2_weightsr6   r7   positional_encoding_sizer4   nameir8   r!   implied_resolutionwindowed_dino_config	__class__s                     r"   r>   zDinoV2.__init__8   s:    	;H07P`ae`fNg
$& !-s/ss-&o(oo&#2 (773FGaaSkG!DL $'u-@-Dq-H'I#J  223FG#'(<#= $T=9K).K&@S*T1U1#;*TK',:K()!9J!F![%>>>
 -?L)&+#R'
| 4& &
 -7L)&+#'H (!( +)=+A	($ (I (!( +)=()+A($ '	 4CC/
 99MN L '4D&9%:SAT=U%U"w H +Us   3F0
F5c                 d   | j                   ry d| _         | j                  }d }t        j                         5   || j                  j
                  j                  | j                  j                  j                  |d   |d         }d d d        | j                  j
                  j                  fd}t        j                        | j                  j
                  _        t        j                  || j                  j
                        | j                  j
                  _	        y # 1 sw Y   xY w)NTc           	      @   | j                   d   dz
  }| j                   d   }||z  }||z  }| d d df   }| d d dd f   }|j                  dt        t        j                  |            t        t        j                  |            |      }|j                  dddd      }t        j                  |||fdd|j                  j                  dk7  	      }|j                  dddd      j                  dd|      }t        j                  |j                  d      |fd
      S )Nr3   r2   r      r'   bicubicFmps)r   modealign_corners	antialias)dim)r?   reshapeintmathsqrtpermuteFinterpolatedevicetypetorchcat	unsqueeze)position_embeddingsr6   heightwidthnum_positionsr^   class_pos_embedpatch_pos_embeds           r"   "make_new_interpolated_pos_encodingz9DinoV2.export.<locals>.make_new_interpolated_pos_encoding   s'   /55a81<M%++B/Cz)FZ'E1!Q$7O1!QR%8O .553tyy/0#dii6N2OQTO .55aAqAO  mme_#)0055>O .55aAqAII!RQTUO99o77:OLRSTT    r   r3   c                     |j                   d   dz
  }| j                  j                   d   dz
  }||k(  r||k(  r| j                  S  |||      S )Nr3   )r?   rk   )self_mod
embeddingsrl   rm   num_patchesrn   old_interpolate_pos_encodings         r"   new_interpolate_pos_encodingz3DinoV2.export.<locals>.new_interpolate_pos_encoding   s\    $**1-1K$88>>qAAEMm+%333/
FEJJrr   )rK   r?   rh   no_gradrC   ru   rk   r;   r6   interpolate_pos_encodingnn	Parametertypes
MethodType)rL   r?   rq   new_positionsrx   rw   s        @r"   exportzDinoV2.export   s    <<

	U> ]]_ 	>'';;##..aa	M	 (,||'>'>'W'W$	K 79ll=6Q3;@;K;K($,,*A*A<
8%	 	s   AD&&D/c                     | j                   | j                  z  }|j                  d   |z  dk(  r|j                  d   |z  dk(  sJ d| d|j                          | j                  |      }t	        |d         S )Nr'   r   rX   z1Backbone requires input shape to be divisible by z
, but got )r6   r7   r?   rC   rG   )rL   x
block_sizes      r"   forwardzDinoV2.forward   s    __t'7'77
wwqzJ&!+
Z0G10L 	
?
|:VWV]V]U^_	
L LLOAaDzrr   )__name__
__module____qualname__r>   r   r   __classcell__)rU   s   @r"   r%   r%   7   s8     ($ !#]~9
vrr   r%   __main__r3   rX   r&   ) r   ra   r   r}   rh   torch.nnr{   torch.nn.functional
functionalrd   transformersr   0rfdetr.models.backbone.dinov2_with_windowed_attnr   r   rfdetr.utilities.loggerr   r@   rH   r   r   r#   Moduler%   r   modelr   randnr   infojr?   r<   rr   r"   <module>r      s      	      % /	 	 !  0-/! aRYY aH zHE	LLNAq#s#A
KKa1X AGG rr   