
    h"              	           S SK r S SKrS SKrS SKJrJ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\	S	\S
\S\4S jjrS\	S	\S
\S\4S jrg)    N)SAM2ImageEncoderrandom_sam2_input_image)SAM2PromptEncoder)SAM2Base)nnc                     ^  \ rS rSr SS\S\S\SS4U 4S jjjr\R                  " 5       S\R                  S	\R                  S
\R                  S\R                  S\R                  S\R                  4S j5       r
SrU =r$ )SAM2MaskDecoder   	sam_modelmultimask_outputdynamic_multimask_via_stabilityreturnNc                    > [         TU ]  5         UR                  U l        UR                  U l        Xl        X l        X0l        g )N)	super__init__sam_mask_decodermask_decodersam_prompt_encoderprompt_encodermodelr   r   )selfr   r   r   	__class__s       k/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/models/sam2/mask_decoder.pyr   SAM2MaskDecoder.__init__   s=     	%66'::
 0/N,    image_features_0image_features_1image_embeddingsimage_pesparse_embeddingsdense_embeddingsc           	      h   U R                   R                  UUUUUR                  S   S:  X/S9u  px  n	U R                  (       a  USS2SS2SS2SS24   nUSS2SS24   nXx4$ U R                  (       a   U R                   R                  Xx5      u  pxXx4$ USS2SS2SS2SS24   nUSS2SS24   nXx4$ )a%  
Decode masks from image and prompt embeddings. Only support H=W=1024.

Args:
    image_features_0 (torch.Tensor): [1, 32, H/4, W/4]. high resolution features of level 0 from image encoder.
    image_features_1 (torch.Tensor): [1, 64, H/8, W/8]. high resolution features of level 1 from image encoder.
    image_embeddings (torch.Tensor): [1, 256, H/16, W/16]. image embedding from image encoder.
    image_pe (torch.Tensor): [1, 256, H/16, W/16]. image positional encoding.
    sparse_embeddings (torch.Tensor): [L, P+1, 256], embedding for points and boxes.
    dense_embeddings (torch.Tensor):  [L, 256, H/16, W/16]. embedding for input masks.

Returns:
    low_res_masks (torch.Tensor, optional): [1, M, H/4, W/4]. low resolution masks.
    iou_predictions (torch.Tensor): [1, M]. scores for M masks.
r      )r   r   sparse_prompt_embeddingsdense_prompt_embeddingsrepeat_imagehigh_res_featuresN)r   predict_masksshaper   r    _dynamic_multimask_via_stability)
r   r   r   r   r   r    r!   low_res_masksiou_predictions_s
             r   forwardSAM2MaskDecoder.forward   s    2 04/@/@/N/N-%6$4*003a7/B 0O 0
,1   )!QRA+6M-ae4O -- 11 .2->->-_-_.*M -- *!QqS!Q,7M-a1f5O--r   )r   r   r   r   r   )T)__name__
__module____qualname____firstlineno__r   boolr   torchno_gradTensorr.   __static_attributes____classcell__)r   s   @r   r	   r	      s    
 15	OO O *.	O
 
O O ]]_/.,,/.  ,,/.  ,,	/.
 ,,/. !<</.  ,,/. /.r   r	   
sam2_modelonnx_model_pathr   r   c                    [        U 5      R                  5       n[        5       n[        U 5      R                  5       nU" U5      u  pn
[        R                  SUR                  5        [        R                  SU	R                  5        [        R                  SU
R                  5        SnSn[        R                  " SSXS4[        R                  S9n[        R                  " SS	X4[        R                  S9n[        R                  " US	S
S
[        R                  S9n[        R                  " S	[        R                  S9nU" XUU5      u  nnn[        R                  SUR                  5        [        R                  SUR                  5        [        R                  SUR                  5        [        XU5      nXU
UUU4nU" U6 u  nn[        R                  SUR                  5        [        R                  SUR                  5        [        R                  " 5          U(       dF  [        R                  " S[        R                   R"                  S9  [        R                  " S[$        S9  [        R&                  R)                  UUUSSS/ SQSS/SSS.SS0SS0SS0S.S9	  S S S 5        [+        SU5        g ! , (       d  f       N= f)Nzimage_features_0.shape: %szimage_features_1.shape: %szimage_embeddings.shape: %s      r      lowhighsizedtyper#      rD   zsparse_embeddings.shape: %szdense_embeddings.shape: %szimage_pe.shape: %szlow_res_masks.shape: %sziou_predictions.shape: %signore)categoryT   r   r   r   r   r    r!   r+   r,   
num_labelsznum_points+1)r   r#   )r    r!   r+   r,   )export_paramsopset_versiondo_constant_foldinginput_namesoutput_namesdynamic_axesz mask decoder onnx model saved to)r   cpur   r   loggerinfor)   r5   randintfloatzerosonesr	   warningscatch_warningsfilterwarningsjitTracerWarningUserWarningonnxexportprint)r:   r;   r   r   verbosesam2_prompt_encoderimagesam2_encoderr   r   r   rK   
num_pointspoint_coordspoint_labelsinput_maskshas_input_masksr    r!   r   sam2_mask_decoderinputsr+   r,   s                           r   export_mask_decoder_onnxrm   R   sf    ,J7;;=#%E#J/335L;G;N8(8
KK,.>.D.DE
KK,.>.D.DE
KK,.>.D.DE JJ==QTQR8S[`[f[fgL==QQj5MUZU`U`aL++j!S#U[[IKjj%++6O4GK51' KK-/@/F/FG
KK,.>.D.DE
KK$hnn5'
Fef2BHN_aqrF%6%?"M?
KK)=+>+>?
KK+_-B-BC		 	 	"##Huyy7N7NO##H{C

 $ *+<=)5.%I%&$5"#\!2$%|#4	! 	 	
	 
#8 

,o>9 
#	"s    BJ::
Kc           
         [        U 5      R                  5       n[        5       n[        U 5      R                  5       nU" U5      u  pxn	Sn
Sn[        R
                  " SSXS4[        R                  S9n[        R
                  " SSX4[        R                  S9n[        R                  " U
SSS[        R                  S9n[        R                  " S[        R                  S9nU" XX5      u  nnn[        XU5      nXxU	UUU4nU" U6 u  nnSS K
nUR                  US	/S
9n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%                  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       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![        R.                  R1                  U[        R2                  " U 5      SSS9  [        R.                  R1                  U[        R2                  " U!5      SSS9  [5        SU 35        g s  snf s  snf )Nr#      r   r?   r=   r@   rE   rF   CPUExecutionProvider)	providerszinput_names: %szoutput_names: %srJ   zoutput %s shape: %sg{Gzt?g-C6?)atolrtolzonnx model has been verified: )r   rR   r   r   r5   rU   rV   randrX   r	   onnxruntimeInferenceSession
get_inputsrangelennamerS   rT   get_outputsrunnumpy	enumerater)   testingassert_closetensorra   )"r:   r;   r   r   rc   rd   re   r   r   r   rK   rf   rg   rh   ri   rj   r    r!   r   rk   rl   r+   r,   ru   ort_sessionmodel_inputsirO   model_outputsrP   outputsoutput_nameort_low_res_masksort_iou_predictionss"                                     r   test_mask_decoder_onnxr      s    ,J7;;=#%E#J/335L;G;N8(8JJ==QTQR8S[`[f[fgL==QQj5MUZU`U`aL**ZCEKKHKjj%++6O4GK51' (
Fef2BHN_aqrF%6%?"M?..KaJb.cK))+L16s<7H1IJ1IA<?''1IKJ
KK!;/++-M38]9K3LM3LaM!$))3LLM
KK"L1oo 0 6 6 8 0 6 6 8 0 6 6 8 (!2!8!8!: 0 6 6 8	

G $L1;);
8H8HI 2 .5**	MM}ell;L.MTX_cd	MM=P0QX\cgh	*?*;
<=3 K Ns   K/K4)TF)loggingrY   r5   image_encoderr   r   r   r   sam2.modeling.sam2_baser   r   	getLoggerr0   rS   Moduler	   strr4   rm   r    r   r   <module>r      s   
    C , , 			8	$>.bii >.J -1B?B?B? B? &*	B?J9>9>9> 9> &*	9>r   