o
    {iRC                  =   @   s  d dl Z d dlmZ d dlmZmZmZ d dlmZ d dl	m
Z
 d dlZddlmZ G dd	 d	eZd
edefddZd
edefddZddddedefddZdddejdddededee deeef dee f
ddZdddddddd dddd!d"d#d#d$d%d&dd'd(d%d%d d)d%dejdd)d*d+eded,eded-ed.edB d/edB d0ed1edB d2edB d3edB d4ed5ed6ed7ed8ed9ed:ed;edB d<ed=ed>ed?ed@edAedBedee deeef dee dCef<dDdEZdFejddGdedeeef dee fdHdIZdg dJg dKdFd&dLd%ejdf	d,edMee dNee ded:edOedBedeeef dee fdPdQZd%ejd)dRdBedeeef dCefdSdTZd%ejd)dRdBedeeef dCefdUdVZd%ejd)dRdBedeeef dCefdWdXZd%ejd)dRdBedeeef dCefdYdZZd%ejd)dRdBedeeef dCefd[d\Zd%ejd)dRdBedeeef dCefd]d^Z d%ejd)dRdBedeeef dCefd_d`Z!d%ejdadBedeeef fdbdcZ"d%ejdadBedeeef fdddeZ#d%ejdadBedeeef fdfdgZ$d%ejdadBedeeef fdhdiZ%dS )j    N)Enum)ListOptionalUnion)urlparse)Path   )DINOV3_BASE_URLc                   @   s   e Zd ZdZdZdS )WeightsLVD1689MSAT493MN)__name__
__module____qualname__r   r    r   r   @/data/cameron/keygrip/volume_dino_tracks/dinov3/hub/backbones.pyr
      s    r
   pathreturnc                 C   s   t | }|jdv S )N)httpsfile)r   scheme)r   parsedr   r   r   is_url   s   
r   c                 C   s    t | r| S t|    S )N)r   r   
expanduserresolveas_uri)r   r   r   r   convert_path_or_url_to_url   s   r      vitb
patch_sizecompact_arch_namer    r!   c                 C   s.   d|v r| d|  d}|S | |  }|S )Nplus)replace)r    r!   
model_archr   r   r   _make_dinov3_vit_model_arch!   s
   r%   r    r!   versionweightshashr'   r(   r)   c                 C   sz   d}t | |d}|rd| nd}|j }|rd| nd}	| d| }
| d| d| | |	 d}tjt|
|S )Ndinov3r   _ -
_pretrain_.pth)r%   valuelowerosr   joinr	   )r    r!   r'   r(   r)   
model_namer$   Zversion_suffixweights_namehash_suffix	model_dirmodel_filenamer   r   r   _make_dinov3_vit_model_url-   s   
r9         g      Y@separatefp32      g      @T        Z	layernormmlpF)img_sizer    in_chansr!   pos_embed_rope_basepos_embed_rope_min_periodpos_embed_rope_max_periodpos_embed_rope_normalize_coordspos_embed_rope_shift_coordspos_embed_rope_jitter_coordspos_embed_rope_rescale_coordspos_embed_rope_dtype	embed_dimdepth	num_heads	ffn_ratioqkv_biasdrop_path_ratelayerscale_init
norm_layer	ffn_layerffn_bias	proj_biasn_storage_tokensmask_k_bias
pretrainedr'   r(   r)   
check_hashrB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   c           $      K   sJ  ddl m} td!i d| d|d|d|d|d|d	|d
|d|	d|
d|d|d|d|d|d|d|d|d|d|d|d|d|d|} | jd!i | |d!i | }!|rt|tu ry|tjtjhvrytd| t|tu rt	|||||d}"nt
|}"tjj|"d|d}#|!j|#dd  |!S |!  |!S )"N   )DinoVisionTransformerrB   r    rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   &Unsupported weights for the backbone: r&   cpu)map_locationrZ   Tstrictr   )Zmodels.vision_transformerr\   dictupdatetyper
   r   r   
ValueErrorr9   r   torchhubload_state_dict_from_urlload_state_dictinit_weights)$rB   r    rC   r!   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r'   r(   r)   rZ   kwargsr\   Z
vit_kwargsmodelurl
state_dictr   r   r   _make_dinov3_vit?   s   "	
ro   convnext_baser!   r(   r)   c                 C   sX   d}|j  }|rd| nd}| d|  }| d|  d| | d}tjt||S )Nr*   r-   r,   r+   r.   r/   )r0   r1   r2   r   r3   r	   )r!   r(   r)   r4   r5   r6   r7   r8   r   r   r   _make_dinov3_convnext_model_url   s   
rr   )r;   r;      r;   )      i      ư>depthsdimslayer_scale_init_valuec	                 K   s   ddl m}
 t| ||||d}|jd
i |	 |
d
i |}|rVt|tu r5|tjtjhvr5td| t|tu rCt	|||d}nt
|}tjj|dd}|j|dd	 |S )Nr[   )ConvNeXt)rC   rx   ry   rQ   rz   r]   rq   r^   )r_   Tr`   r   )models.convnextr{   rb   rc   rd   r
   r   r   re   rr   r   rf   rg   rh   ri   )rC   rx   ry   r!   rQ   rz   rY   r(   r)   rk   r{   Zmodel_kwargsrl   rm   rn   r   r   r   _make_dinov3_convnext   s.   r}   )rY   r(   rZ   c                 K   s   d|vrd|d< d |d< t d-i dddddd	d
dddddddddddddddddddddd d!d"d#d$dd%dd&dd'dd(| d)|d*d+d,||S ).Nr)   Z08c60483r'   rB   r:   r    r   rC   r;   rD   d   rG   r<   rJ   r[   rK   r=   rL     rM   r?   rN      rO      rP   TrQ   r@   rR   h㈵>rS   layernormbf16rT   rA   rU   rV   rW   rX   rY   r(   r!   ZvitsrZ   r   ro   rY   r(   rZ   rk   r   r   r   dinov3_vits16   j   	
r   c                 K   s   d|vrd|d< d |d< t d-i dddddd	d
ddddddddddddddddddddddd d!d"d#dd$dd%d&d'dd(| d)|d*d+d,||S ).Nr)   Z4057cbaar'   rB   r:   r    r   rC   r;   rD   r~   rG   r<   rJ   r[   rK   r=   rL   r   rM   r?   rN   r   rO   rP   TrQ   r@   rR   r   rS   r   rT   swiglurU   rV   rW   r   rX   rY   r(   r!   ZvitsplusrZ   r   r   r   r   r   r   dinov3_vits16plus   r   r   c                 K   s   d|vrd|d< d |d< t d,i dddddd	d
ddddddddddddddddddddddd d!d"d#dd$dd%dd&dd'| d(|d)d*d+||S )-Nr)   Z73cec8ber'   rB   r:   r    r   rC   r;   rD   r~   rG   r<   rJ   r[   rK   r=   rL   r>   rM   r?   rN   rO   r   rP   TrQ   r@   rR   r   rS   r   rT   rA   rU   rV   rW   rX   rY   r(   r!   r   rZ   r   r   r   r   r   r   dinov3_vitb16  r   r   c           	      K   s>  d}|t jkrd|vrd|d< n9|t jkr d|vrd|d< d}n)t|tu rIdd l}d}|||}t|dkr?td	| |d }|dkrId}d |d
< t	d3i ddddddddddddddddddddddd dd!d"d#d$d%d&d'd(d)dd*dd+dd,dd-|d.| d/|d0d1d2||S )4NFr)   Z8aa4cbddZeadcf0ffTr   z-(.{8}).pthr   z9Unexpected weights specification for the ViT-L backbone: r'   rB   r:   r    r   rC   r;   rD   r~   rG   r<   rJ   r[   rK   r=   rL   rv   rM      rN   rO   r   rP   rQ   r@   rR   r   rS   r   rT   rA   rU   rV   rW   rX   untie_global_and_local_cls_normrY   r(   r!   ZvitlrZ   r   )
r
   r   r   rd   strrefindalllenre   ro   )	rY   r(   rZ   rk   r   r   patternmatchesr)   r   r   r   dinov3_vitl16>  s   

	
r   c                 K   s   d|vrd|d< t d,i ddddddd	d
ddddddddddddddddddddddd d!d"dd#dd$d%d&dd'| d(|d)d*d+||S )-Nr)   Z46503df0rB   r:   r    r   rC   r;   rD   r~   rG   r<   rJ   r[   rK   r=   rL   rv   rM   r   rN   rO         @rP   TrQ   r@   rR   r   rS   r   rT   r   rU   rV   rW   r   rX   rY   r(   r!   ZvitlplusrZ   r   r   r   r   r   r   dinov3_vitl16plusv  h   	
r   c                 K   s   d|vrd|d< t d-i ddddddd	d
dddddddddddddddddddddd d!d"d#dd$dd%d&d'dd(| d)|d*d+d,||S ).Nr)   Z7c1da9a5rB   r:   r    r   rC   r;   rD   r~   rG   r<   rJ   r[   rK   r=   rL   i   rM       rN      rO   r   rP   TrQ   r@   rR   r   rS   r   rT   r   rU   rV   rW   r   rX   rY   r(   r!   ZvithplusrZ   r   r   r   r   r   r   dinov3_vith16plus  r   r   c                 K   s   |t jkrd|vrd|d< n|t jkrd|vrd|d< d |d< d}td0i dddd	d
ddddddddddddddddddddddd d!d"d#d$d%dd&dd'd(d)dd*|d+| d,|d-d.d/||S )1Nr)   Za955f4eaZa6675841r'   TrB   r:   r    r   rC   r;   rD   r~   rG   r<   rJ   r[   rK   r=   rL   i   rM   (   rN   r   rO   rP   FrQ   r@   rR   r   rS   r   rT   Zswiglu64rU   rV   rW   r   rX   r   rY   r(   r!   Zvit7brZ   r   )r
   r   r   ro   )rY   r(   rZ   rk   r   r   r   r   dinov3_vit7b16  sz   

	
r   )rY   r(   c                 K   `   d}d|vr
||d< ddl m} |d }tdd|d |d d	d
d| |d|}| s.|  |S )NZ21b726bbr)   r[   convnext_sizestinyr;   rx   ry   Zconvnext_tinyr   rw   rC   rx   ry   r!   rQ   rz   rY   r(   r   r|   r   r}   rj   rY   r(   rk   Z_hash_convnextr   Z	size_dictrl   r   r   r   dinov3_convnext_tiny  (   	r   c                 K   r   )NZ296db49dr)   r[   r   smallr;   rx   ry   Zconvnext_smallr   rw   r   r   r   r   r   r   r   dinov3_convnext_small  r   r   c                 K   r   )NZ801f2ba9r)   r[   r   baser;   rx   ry   rp   r   rw   r   r   r   r   r   r   r   dinov3_convnext_base-  r   r   c                 K   r   )NZ61fa432dr)   r[   r   larger;   rx   ry   Zconvnext_larger   rw   r   r   r   r   r   r   r   dinov3_convnext_largeK  r   r   )&r2   enumr   typingr   r   r   urllib.parser   pathlibr   rf   utilsr	   r
   r   boolr   r   intr%   r   r9   floatro   rr   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s  


	


V


	
)

)

)

)

:

)

)

/

 

 

 
