§
    r>Ëj¸  ã                  óÈ   — d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
 ddlZddlmZ  ej        e¦  «        Zedz  Ze                     d	d	¬
¦  «          G d„ d¦  «        ZdS )u•   
V-JEPA 2 Visual Feature Extractor Module.
TrÃ­ch xuáº¥t spatio-temporal embeddings báº¥t biáº¿n vá»›i crop, flip, watermark vÃ  biáº¿n Ä‘á»•i mÃ u.
é    )ÚannotationsN)ÚPath)ÚListÚOptionalÚTupleÚUnioné   )Ú
MODELS_DIRÚvjepa2T)ÚparentsÚexist_okc                  óD   — e Zd ZdZ	 	 	 	 ddd„Zdd„Zdd„Zdd„Zdd„ZdS )ÚVJEPAExtractoruµ   
    TrÃ­ch xuáº¥t Ä‘áº·c trÆ°ng thá»‹ giÃ¡c sá»­ dá»¥ng kiáº¿n trÃºc V-JEPA 2 (Meta AI).
    Há»— trá»£ CUDA FP16/BF16, tá»‘i Æ°u hÃ³a cho RTX 5060 16GB vÃ  fallback an toÃ n.
    Úvjepa2_vitlÚautoÚfp16é   Ú
model_nameÚstrÚdeviceÚ	precisionÚembedding_dimÚintÚreturnÚNonec                óš   — || _         || _        |                      |¦  «        | _        || _        d | _        |                      ¦   «          d S )N)r   r   Ú_resolve_devicer   r   ÚmodelÚ_load_model)Úselfr   r   r   r   s        ú8C:\Projects\VideoDetection\src\visual\vjepa_extractor.pyÚ__init__zVJEPAExtractor.__init__   sN   € ð %ˆŒØ*ˆÔØ×*Ò*¨6Ñ2Ô2ˆŒØ"ˆŒØˆŒ
Ø×ÒÑÔÐÐÐó    Ú	requestedc                óx   — |dk    rdS 	 dd l }|j                             ¦   «         rdS n# t          $ r Y nw xY wdS )NÚcpur   Úcuda)Útorchr'   Úis_availableÚImportError)r    r$   r(   s      r!   r   zVJEPAExtractor._resolve_device*   se   € Ø˜ÒÐØ�5ð	ØˆLˆLˆLØŒz×&Ò&Ñ(Ô(ð Ø�vðøåð 	ð 	ð 	ØˆDð	øøøàˆus   Š* ª
7¶7c                ó  ‡— t           | j        › d�z  }	 ddl}ddlmŠ  G ˆfd„d‰j        ¦  «        } || j        ¬¦  «        }|                     ¦   «         r`t           	                    d|› �¦  «         | 
                    |d¬	¦  «        }|                     |                     d
|¦  «        d¬¦  «         nt           	                    d|› d�¦  «         |                     ¦   «          | j        dk    rS|                     ¦   «         }| j        dk    r|                     ¦   «         }n| j        dk    r|                     ¦   «         }|| _        dS # t(          $ r% t                               d¦  «         d| _        Y dS w xY w)uQ   Náº¡p trá»�ng sá»‘ V-JEPA 2 tá»« models/vjepa2/ hoáº·c khá»Ÿi táº¡o kiáº¿n trÃºc.z.ptr   Nc                  ó.   •‡ — e Zd Zd	d
ˆ ˆfd„Zdd„Zˆ xZS )ú9VJEPAExtractor._load_model.<locals>.SpatioTemporalEncoderr   Úout_dimr   c                ó"  •— t          ¦   «                              ¦   «          ‰                     dddd¬¦  «        | _        ‰                     d¦  «        | _        ‰                     d|¦  «        | _        ‰                     |¦  «        | _        d S )Né   i€  )r	   é   r1   )Úin_channelsÚout_channelsÚkernel_sizeÚstride)	Úsuperr"   ÚConv3dÚtubelet_embedÚ	LayerNormÚnorm1ÚLinearÚprojÚout_norm)r    r.   Ú	__class__Únns     €€r!   r"   zBVJEPAExtractor._load_model.<locals>.SpatioTemporalEncoder.__init__>   s�   ø€ Ý‘G”G×$Ò$Ñ&Ô&Ð&à)+¯ªØ$%Ø%(Ø$/Ø*ð	 *3ñ *ô *�DÔ&ð "$§¢¨cÑ!2Ô!2�D”JØ "§	¢	¨#¨wÑ 7Ô 7�D”IØ$&§L¢L°Ñ$9Ô$9�D”M�M�Mr#   Úxútorch.Tensorr   c                ód  — |                       |¦  «        }|                     d¦  «                             dd¦  «        }|                      |¦  «        }|                      |¦  «        }|                     d¬¦  «        }|                      |¦  «        }||                     ddd¬¦  «        dz   z  S )Nr	   é   ©ÚdiméÿÿÿÿT)ÚprE   ÚkeepdimgH¯¼šò×z>)r8   ÚflattenÚ	transposer:   r<   Úmeanr=   Únorm)r    r@   ÚfeatÚpooledÚnormeds        r!   ÚforwardzAVJEPAExtractor._load_model.<locals>.SpatioTemporalEncoder.forwardK   sš   € à×-Ò-¨aÑ0Ô0�DØŸ<š<¨™?œ?×4Ò4°Q¸Ñ:Ô:�DØŸ:š: dÑ+Ô+�DØŸ9š9 T™?œ?�DØ!ŸYšY¨1˜YÑ-Ô-�FØ!Ÿ]š]¨6Ñ2Ô2�Fà! V§[¢[°1¸"Àd [Ñ%KÔ%KÈdÑ%RÑSÐSr#   )r   )r.   r   )r@   rA   r   rA   )Ú__name__Ú
__module__Ú__qualname__r"   rP   Ú__classcell__)r>   r?   s   @€r!   ÚSpatioTemporalEncoderr-   =   sd   øø€ € € € € ð:ð :ð :ð :ð :ð :ð :ð :ð	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tr#   rU   )r.   u    Náº¡p checkpoint V-JEPA 2 tá»«: r&   )Úmap_locationr   F)Ústrictu    ChÆ°a cÃ³ file checkpoint táº¡i u.   . Khá»Ÿi táº¡o mÃ´ hÃ¬nh kiáº¿n trÃºc chuáº©n.r'   r   Úbf16uY   ChÆ°a cÃ³ PyTorch trong runtime. Extractor sáº½ hoáº¡t Ä‘á»™ng á»Ÿ cháº¿ Ä‘á»™ CPU Numpy.)ÚVJEPA2_MODELS_DIRr   r(   Útorch.nnr?   ÚModuler   ÚexistsÚloggerÚinfoÚloadÚload_state_dictÚgetÚevalr   r'   r   ÚhalfÚbfloat16r   r*   Úwarning)r    Úcheckpoint_pathr(   rU   r   Ústater?   s         @r!   r   zVJEPAExtractor._load_model5   sÂ  ø€ å+°´Ð.EÐ.EÐ.EÑEˆð2	ØˆLˆLˆLØ!Ð!Ð!Ð!Ð!Ð!ðTð Tð Tð Tð Tð Tð T¨¬	ñ Tô Tð Tð2 *Ð)°$Ô2DÐEÑEÔEˆEà×%Ò%Ñ'Ô'ð @Ý—’ÐP¸ÐPÐPÑQÔQÐQØŸ
š
 ?À˜
ÑGÔG�Ø×%Ò% e§i¢i°¸Ñ&?Ô&?ÈÐ%ÑNÔNÐNÐNå—’Ð~¸Ð~Ð~Ð~ÑÔÐà�JŠJ‰LŒLˆLØŒ{˜fÒ$Ð$ØŸ
š
™œ�Ø”> VÒ+Ð+Ø!ŸJšJ™LœL�E�EØ”^ vÒ-Ð-Ø!ŸNšNÑ,Ô,�EàˆDŒJˆJˆJøåð 	ð 	ð 	Ý�NŠNÐvÑwÔwÐwØˆDŒJˆJˆJˆJð	øøøs   •D;E Å+FÆ FÚ
clip_arrayú
np.ndarrayc                ó6  — | j         ��Äddl}|                     |¦  «                             dddd¦  «                             d¦  «                             ¦   «         dz  }|                     g d¢¦  «                             ddddd¦  «        }|                     g d¢¦  «                             ddddd¦  «        }||z
  |z  }| j        d	k    rS| 	                    ¦   «         }| j
        d
k    r|                     ¦   «         }n| j
        dk    r|                     ¦   «         }|                     ¦   «         5  |                       |¦  «        }|                     d¦  «                             ¦   «                              ¦   «                              ¦   «         }|                     t$          j        ¦  «        cddd¦  «         S # 1 swxY w Y   d|                     t$          j        ¦  «        |dd…dd…ddd…dd…f                              t$          j        ¦  «        z   z  }t%          j        |dd¬¦  «        }	g }
|	D ]Î}|                     d¬¦  «        }||                     dd¬¦  «        z
  }t%          j        |dd¬¦  «        }g }|D ]G}t%          j        |dd¬¦  «        }|D ]+}|                     |                     d¬¦  «        ¦  «         Œ,ŒH|
                     t%          j        |¦  «                             ¦   «         ¦  «         ŒÏt%          j        |
¦  «        }t5          |¦  «        | j        k     r/t%          j        |d| j        t5          |¦  «        z
  fd¬¦  «        }n|d| j        …         }t          t$          j                             |¦  «        ¦  «        }|dk     rQt%          j        | j        t$          j        ¬¦  «        }t          t$          j                             |¦  «        ¦  «        }||z                       t$          j        ¦  «        S )u™   
        TrÃ­ch xuáº¥t vector embedding L2-normalized tá»« video clip [T, H, W, 3].
        Tráº£ vá»� vector 1D shape (embedding_dim,) float32.
        Nr   r0   rC   r	   ç     ào@©g
×£p=
ß?gÉv¾Ÿ/Ý?g–C‹lçûÙ?©gZd;ßOÍ?gyé&1¬Ì?gÍÌÌÌÌÌÌ?r'   r   rX   g      à?rF   é   ©Úaxis)r   rC   T)rp   Úkeepdimsé   Úwrap)Úmodeg�íµ ÷Æ°>©Údtype) r   r(   Ú
from_numpyÚpermuteÚ	unsqueezeÚfloatÚtensorÚviewr   r'   r   rc   rd   Úno_gradÚsqueezer&   ÚnumpyÚastypeÚnpÚfloat32Úarray_splitrK   ÚappendÚarrayrI   ÚconcatenateÚlenr   ÚpadÚlinalgrL   Úones)r    rh   r(   r{   rK   ÚstdrM   ÚembÚclip_symÚt_poolÚfeaturesÚt_sliceÚimgÚimg_contrastÚh_chunksÚblocksÚhcÚw_chunksÚwcÚvecrˆ   rL   s                         r!   ÚextractzVJEPAExtractor.extractm   s÷  € ð
 Œ:Ñ!ØˆLˆLˆLà×%Ò% jÑ1Ô1×9Ò9¸!¸QÀÀ1ÑEÔE×OÒOÐPQÑRÔR×XÒXÑZÔZÐ]bÑbˆFà—<’<Ð 5Ð 5Ð 5Ñ6Ô6×;Ò;¸A¸qÀ!ÀQÈÑJÔJˆDØ—,’,Ð4Ð4Ð4Ñ5Ô5×:Ò:¸1¸aÀÀAÀqÑIÔIˆCØ˜t‘m sÑ*ˆFàŒ{˜fÒ$Ð$ØŸš™œ�Ø”> VÒ+Ð+Ø#Ÿ[š[™]œ]�F�FØ”^ vÒ-Ð-Ø#Ÿ_š_Ñ.Ô.�Fà—’‘”ð .ð .Ø—z’z &Ñ)Ô)�Ø—l’l 1‘o”o×+Ò+Ñ-Ô-×1Ò1Ñ3Ô3×9Ò9Ñ;Ô;�Ø—z’z¥"¤*Ñ-Ô-ð.ð .ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð ˜*×+Ò+­B¬JÑ7Ô7¸*ÀQÀQÀQÈÈÈÈ4È4ÈRÈ4ÐQRÐQRÐQRÀ]Ô:S×:ZÒ:ZÕ[]Ô[eÑ:fÔ:fÑfÑgˆÝ” ¨!°!Ð4Ñ4Ô4ˆØˆØð 		8ð 		8ˆGØ—,’, A�,Ñ&Ô&ˆCØ §¢¨vÀ Ñ!EÔ!EÑEˆLÝ”~ l°A¸AÐ>Ñ>Ô>ˆHØˆFØð 8ð 8�Ýœ>¨"¨a°aÐ8Ñ8Ô8�Ø"ð 8ð 8�BØ—M’M "§'¢'¨v 'Ñ"6Ô"6Ñ7Ô7Ð7Ð7ð8à�OŠO�BœH VÑ,Ô,×4Ò4Ñ6Ô6Ñ7Ô7Ð7Ð7ÝŒn˜XÑ&Ô&ˆÝˆs‰8Œ8�dÔ(Ò(Ð(Ý”&˜˜q $Ô"4µs¸3±x´xÑ"?Ð@ÀvÐNÑNÔNˆCˆCàÐ*˜Ô*Ð*Ô+ˆCÝ•R”Y—^’^ CÑ(Ô(Ñ)Ô)ˆØ�$Š;ˆ;Ý”'˜$Ô,µB´JÐ?Ñ?Ô?ˆCÝ�œŸš¨Ñ,Ô,Ñ-Ô-ˆDØ�d‘
×"Ò"¥2¤:Ñ.Ô.Ð.s   Ä6A?GÇGÇ	GÚclipsúList[np.ndarray]c                ó²  ‡ ‡— |s't          j        d‰ j        ft           j        ¬¦  «        S ‰ j        ��ƒddlŠˆfd„|D ¦   «         }‰                     |d¬¦  «        }‰                     g d¢¦  «                             ddddd¦  «        }‰                     g d	¢¦  «                             ddddd¦  «        }||z
  |z  }‰ j	        d
k    rS| 
                    ¦   «         }‰ j        dk    r|                     ¦   «         }n‰ j        dk    r|                     ¦   «         }‰                     ¦   «         5  ‰                      |¦  «        }|                     ¦   «                              ¦   «                              ¦   «         }|                     t           j        ¦  «        cddd¦  «         S # 1 swxY w Y   t          j        ˆ fd„|D ¦   «         d¬¦  «        S )u”   
        TrÃ­ch xuáº¥t Ä‘áº·c trÆ°ng cho danh sÃ¡ch clips [Batch, T, H, W, 3].
        Tráº£ vá»� ma tráº­n (Batch, embedding_dim) float32.
        r   ru   Nc                ó�   •— g | ]B}‰                      |¦  «                             d ddd¦  «                             ¦   «         dz  ‘ŒCS )r0   r   rC   r	   rk   )rw   rx   rz   )Ú.0Úcr(   s     €r!   ú
<listcomp>z0VJEPAExtractor.extract_batch.<locals>.<listcomp>«   s\   ø€ ð ð ð àð × Ò  Ñ#Ô#×+Ò+¨A¨q°!°QÑ7Ô7×=Ò=Ñ?Ô?À%ÑGðð ð r#   rD   rl   rC   r0   rm   r'   r   rX   c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS © )r™   )rž   rŸ   r    s     €r!   r    z0VJEPAExtractor.extract_batch.<locals>.<listcomp>À   s#   ø€ Ð8Ð8Ð8¨Q˜Ÿš a™œÐ8Ð8Ð8r#   ro   )r�   Úemptyr   r‚   r   r(   Ústackr{   r|   r   r'   r   rc   rd   r}   rz   r&   r   r€   )	r    rš   Úbatch_tensorsr{   rK   r‹   rM   rŒ   r(   s	   `       @r!   Úextract_batchzVJEPAExtractor.extract_batch¡   s  øø€ ð
 ð 	GÝ”8˜Q Ô 2Ð3½2¼:ÐFÑFÔFÐFàŒ:Ñ!ØˆLˆLˆLðð ð ð àðñ ô ˆMð —[’[ °A�[Ñ6Ô6ˆFØ—<’<Ð 5Ð 5Ð 5Ñ6Ô6×;Ò;¸A¸qÀ!ÀQÈÑJÔJˆDØ—,’,Ð4Ð4Ð4Ñ5Ô5×:Ò:¸1¸aÀÀAÀqÑIÔIˆCØ˜t‘m sÑ*ˆFàŒ{˜fÒ$Ð$ØŸš™œ�Ø”> VÒ+Ð+Ø#Ÿ[š[™]œ]�F�FØ”^ vÒ-Ð-Ø#Ÿ_š_Ñ.Ô.�Fà—’‘”ð .ð .Ø—z’z &Ñ)Ô)�Ø—j’j‘l”l×&Ò&Ñ(Ô(×.Ò.Ñ0Ô0�Ø—z’z¥"¤*Ñ-Ô-ð.ð .ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .õ
 ŒxÐ8Ð8Ð8Ð8°%Ð8Ñ8Ô8¸qÐAÑAÔAÐAs   Ä3A,F,Æ,F0Æ3F0N)r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )r$   r   r   r   )r   r   )rh   ri   r   ri   )rš   r›   r   ri   )	rQ   rR   rS   Ú__doc__r"   r   r   r™   r¦   r¢   r#   r!   r   r      s�   € € € € € ðð ð (ØØØ!ðð ð ð ð ð	ð 	ð 	ð 	ð6ð 6ð 6ð 6ðp2/ð 2/ð 2/ð 2/ðhBð Bð Bð Bð Bð Br#   r   )r§   Ú
__future__r   ÚloggingÚpathlibr   Útypingr   r   r   r   r   r�   Ú
core.pathsr
   Ú	getLoggerrQ   r]   rY   Úmkdirr   r¢   r#   r!   ú<module>r¯      sþ   ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à Ð Ð Ð à #Ð #Ð #Ð #Ð #Ð #à	ˆÔ	˜8Ñ	$Ô	$€ð  Ñ)Ð Ø × Ò  ¨tÐ Ñ 4Ô 4Ð 4ðjBð jBð jBð jBð jBñ jBô jBð jBð jBð jBr#   