
    h                          S SK r S SKrS SKJr  S SKJr  S SKJr  \ R                  " \5      r	 " S S\R                  5      rS\S\4S	 jrS\S\4S
 jrg)    N)SAM2Base)compare_tensors_with_tolerance)nnc            	       f  ^  \ rS rSrS\4U 4S jjr\R                  " 5       S\R                  S\R                  S\R                  S\R                  4S j5       r	S\R                  S\R                  S	\R                  4S
 jr
S\R                  S\R                  S	\R                  4S jrSrU =r$ )SAM2PromptEncoder   	sam_modelc                 P   > [         TU ]  5         UR                  U l        Xl        g )N)super__init__sam_prompt_encoderprompt_encodermodel)selfr	   	__class__s     m/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/models/sam2/prompt_encoder.pyr   SAM2PromptEncoder.__init__   s!    '::
    point_coordspoint_labelsinput_maskshas_input_masksc                     U R                  X5      nU R                  X45      nU R                  R                  5       nXVU4$ )a  Encode prompts.

   Args:
    point_coords (torch.Tensor): [L, P, 2] shape and float32 dtype and contains the absolute pixel
                                 coordinate in (x, y) format of the P input points in image of size 1024x1024.
    point_labels (torch.Tensor): shape [L, P] and int32 dtype, where 1 means
                                 positive (foreground), 0 means negative (background), -1 means padding,
                                 2 (box left upper corner), 3 (box right bottom corner).
    input_masks (torch.Tensor): [L, 1, H/4, W/4]. Low resolution mask input to the model.
                                Typically coming from a previous iteration.
    has_input_masks (torch.Tensor): [L]. 1.0 if input_masks is used, 0.0 otherwise.
Returns:
    sparse_embeddings (torch.Tensor): [L, P+1, 256], embedding for points and boxes.
    dense_embeddings (torch.Tensor):  [L, 256, 64, 64]. embedding for input masks.
    image_pe (torch.Tensor, optional): [1, 256, 64, 64]. image positional encoding.
)_embed_points_embed_masksr   get_dense_pe)r   r   r   r   r   sparse_embeddingsdense_embeddingsimage_pes           r   forwardSAM2PromptEncoder.forward   sE    0 !..|J,,[J&&335 H<<r   returnc                 `   US-   n[         R                  " UR                  S   SS4UR                  S9n[         R                  " UR                  S   S4UR                  S9* n[         R
                  " X/SS9n[         R
                  " X$/SS9nUS S 2S S 2S4   U R                  R                  -  US S 2S S 2S4'   US S 2S S 2S4   U R                  R                  -  US S 2S S 2S4'   U R                  R                  R                  U5      nUR                  S5      R                  U5      nXRS:g  -  nXPR                  R                  R                  US:H  -  -   n[        U R                  R                   5       H-  nXPR                  R"                  U   R                  X&:H  -  -   nM/     U$ )Ng      ?r         )device)dim)torchzerosshaper&   onescatr   
image_sizer   pe_layer_pe_encoding	unsqueeze	expand_asnot_a_point_embedweightrangenum_point_embeddingspoint_embeddings)r   r   r   padding_pointpadding_labelpoint_embeddingis          r   r   SAM2PromptEncoder._embed_points3   s   #c)\%7%7%:Aq$A,J]J]^\%7%7%:A$>|GZGZ[[yy,!>AFyy,!>AF !-Q1W 5

8M8M MQ1W ,Q1W 5

8M8M MQ1W--66CCLQ#--b1;;OL)R-?@),?,?,Q,Q,X,X\hln\n,oot**??@A-0C0C0T0TUV0W0^0^bnbs0ttO A r   c                 :   U R                   R                  U5      nU R                   R                  R                  R	                  SSSS5      n[
        R                  SUR                  5        X#-  SU-
  U-  -   n[
        R                  SUR                  5        U$ )Nr$   r(   zno_mask_embedding.shape: %sg      ?zmask_embedding.shape: %s)r   mask_downscalingno_mask_embedr4   reshapeloggerinfor+   )r   r   r   mask_embeddingno_mask_embeddings        r   r   SAM2PromptEncoder._embed_masksJ   s    ,,==kJ //==DDLLQPRTUWXY13D3J3JK(9S?=RVg<gg.0D0DEr   )r   r   )__name__
__module____qualname____firstlineno__r   r   r)   no_gradTensorr    r   r   __static_attributes____classcell__)r   s   @r   r   r      s    ( 
 ]]_=ll= ll= \\	=
 = =:%,, ell W\WcWc . u|| X]XdXd  r   r   
sam2_modelonnx_model_pathc                    [        U 5      R                  5       nSnSn[        R                  " SSX4S4[        R                  S9n[        R                  " SSX44[        R
                  S9n[        R                  " USSS[        R                  S9n[        R                  " S[        R                  S9nU" XVXx5      u  pn[        R                  S	UR                  5        [        R                  S
UR                  5        [        R                  SUR                  5        [        R                  SUR                  5        [        R                  SU	R                  5        [        R                  SU
R                  5        [        R                  SUR                  5        [        R                  R                  UXVXx4USSS/ SQ/ SQSSS.SSS.SS0SSS.SS0S.S9	  [        SU5        g )Nr%      r      lowhighsizedtyper$      rW   zpoint_coords.shape: %szpoint_labels.shape: %szinput_masks.shape: %szhas_input_masks.shape: %szsparse_embeddings.shape: %szdense_embeddings.shape: %szimage_pe.shape: %sT   r   r   r   r   )r   r   r   
num_labels
num_points)r   r$   znum_points+1)r   r   r   r   r   )export_paramsopset_versiondo_constant_foldinginput_namesoutput_namesdynamic_axesz#prompt encoder onnx model saved to )r   cpur)   randintfloatint32r*   r,   rA   rB   r+   onnxexportprint)rN   rO   sam2_prompt_encoderr\   r]   r   r   r   r   r   r   r   s               r   export_prompt_encoder_onnxrl   S   s    ,J7;;=JJ==QTQR8S[`[f[fgL==QQj5MUZU`U`aL++j!S#U[[IKjj%++6O4GK51 KK(,*<*<=
KK(,*<*<=
KK'):):;
KK+_-B-BC
KK-/@/F/FG
KK,.>.D.DE
KK$hnn5	JJ	[B VJ ,> ,>|,%1n!E!"L 1
  $ 

/Ar   c                 N   [        U 5      R                  5       nSnSn[        R                  " SSX4S4[        R                  S9n[        R                  " SSX44[        R
                  S9n[        R                  " USSS[        R                  S9n[        R                  " S[        R                  S9nU" XVXx5      u  pnSS KnUR                  US	/S
9nUR                  5       n[        [        U5      5       Vs/ s H  oU   R                  PM     nn[        R                  SU5        UR!                  5       n[        [        U5      5       Vs/ s H  nUU   R                  PM     nn[        R                  SU5        UR#                  UUR%                  5       UR%                  5       UR%                  5       UR%                  5       S.5      n['        U5       H*  u  nn[        R                  SUUU   R(                  5        M,     Uu  nnn[+        SU	[        R,                  " U5      SS9(       aY  [+        SU
[        R,                  " U5      SS9(       a4  [+        SU[        R,                  " U5      SS9(       a  [/        SU 35        g [/        SU 35        g s  snf s  snf )Nr$      r   rR   r%   rS   rX   rY   CPUExecutionProvider)	providerszinput_names: %szoutput_names: %sr[   zoutput %s shape: %sr   g?)mismatch_percentage_tolerancer   r   zonnx model has been verified: z onnx model verification failed: )r   rd   r)   re   rf   rg   randr,   onnxruntimeInferenceSession
get_inputsr5   lennamerA   rB   get_outputsrunnumpy	enumerater+   r   tensorrj   )rN   rO   rk   r\   r]   r   r   r   r   r   r   r   rs   ort_sessionmodel_inputsr;   ra   model_outputsrb   outputsoutput_nameort_sparse_embeddingsort_dense_embeddingsort_image_pes                           r   test_prompt_encoder_onnxr      sb    ,J7;;=JJ==QTQR8S[`[f[fgL==QQj5MUZU`U`aL**ZCEKKHKjj%++6O4GK51 ..KaJb.cK))+L16s<7H1IJ1IA?''1IKJ
KK!;/++-M38]9K3LM3LaM!$))3LLM
KK"L1oo(..0(..0&,,..446		
G $L1;);
8H8HI 2 AH=/&LL./*-		
 + 0%,,?S2Ttw
 +%,,|"<\_
 	..?@A00ABCK K Ns   ;JJ")loggingr)   sam2.modeling.sam2_baser   
sam2_utilsr   r   	getLoggerrF   rA   Moduler   strrl   r    r   r   <module>r      sj   
   , 5 			8	$A		 AH,B,B,B^;D;D;Dr   