
    hE*              	          S SK r S SKrS SKrS SKJs  Jr  S SKJrJ	r	  S SK
Jr  S SK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\4S jjrg)    N)SAM2ImageEncoderrandom_sam2_input_image)SAM2MaskDecoder)SAM2PromptEncoder)SAM2Base)compare_tensors_with_tolerance)nnc                   J  ^  \ rS rSr   SS\S\S\S\S\SS4U 4S	 jjjr\R                  " 5        SS
\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\4S jj5       rSrU =r$ )SAM2ImageDecoder   	sam_modelmultimask_outputdynamic_multimask_via_stabilityreturn_logitsmask_thresholdreturnNc                 |   > [         TU ]  5         [        U5      U l        [	        XU5      U l        X@l        XPl        g )N)super__init__r   prompt_encoderr   mask_decoderr   r   )selfr   r   r   r   r   	__class__s         l/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/models/sam2/image_decoder.pyr   SAM2ImageDecoder.__init__   s9     	/	:+IIhi*,    image_features_0image_features_1image_embeddingspoint_coordspoint_labelsinput_maskshas_input_masksoriginal_image_sizeenable_nvtx_profilec
                 @   Sn
U	(       a  SSK Jn  U" / SQ5      n
U
b  U
R                  SSS9  U R                  XEXg5      u  pnU
b!  U
R	                  S5        U
R                  SS	S9  U R                  XX>X5      u  nnU
b!  U
R	                  S5        U
R                  S
SS9  [        R                  " UUS   US   4SSS9n[        R                  " USS5      nU R                  (       d  UU R                  :  nU
b!  U
R	                  S
5        U
R                  5         UUU4$ )a  
Decode masks from image features and prompts. Batched images are not supported. 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.
    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.
    original_image_size(torch.Tensor): [2]. original image size H_o, W_o.
    enable_nvtx_profile (bool): enable NVTX profiling.

Returns:
    masks (torch.Tensor): [1, M, H_o, W_o] where M=3 or 1. Masks of original image size.
    iou_predictions (torch.Tensor): [1, M]. scores for M masks.
    low_res_masks (torch.Tensor, optional): [1, M, H/4, W/4]. low resolution masks.
Nr   )
NvtxHelper)r   r   post_processr   blue)colorr   redr(   green   bilinearF)modealign_cornersg      @g      @@)nvtx_helperr'   start_profiler   stop_profiler   Finterpolatetorchclampr   r   print_latency)r   r   r   r   r    r!   r"   r#   r$   r%   r1   r'   sparse_embeddingsdense_embeddingsimage_pelow_res_masksiou_predictionsmaskss                     r   forwardSAM2ImageDecoder.forward#   sG   H .$%WXK"%%&6f%E8<8K8K9
5X "$$%56%%nE%B)-):):0@L]*
& "$$^4%%nG%D  #%8%;<	
 M5$?!!D///E"$$^4%%'o}44r   )r   r   r   r   )TFg        F)__name__
__module____qualname____firstlineno__r   boolfloatr   r6   no_gradTensorr?   __static_attributes____classcell__)r   s   @r   r   r      s    
 15# #-- - *.	-
 - - 
- - ]]_ %*L5,,L5  ,,L5  ,,	L5
 llL5 llL5 \\L5 L5 #\\L5 "L5 L5r   r   
sam2_modelonnx_model_pathr   verbosec                    Sn[        U5      n[        U 5      R                  5       nU" U5      u  pxn	[        R	                  SUR
                  5        [        R	                  SUR
                  5        [        R	                  SU	R
                  5        [        U USS9R                  5       n
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[        R                  " SS/[        R                  S9nUUU	UUUUU4n[        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        U(       ai  U
" U6 u  nnn[        R	                  SUR
                  5        [        R	                  SUR
                  5        [        R	                  SUR
                  5        / SQn/ SQnSSS.SSS.S	S0S	S0SSSS.S	S0S	S0S .n[        R                  " 5          U(       dF  [        R                   " S![        R"                  R$                  S"9  [        R                   " S![&        S"9  [        R(                  R+                  U
UUSS#SUUUS$9	  S S S 5        [        R	                  S%U5        g ! , (       d  f       N%= f)&Nr-   zimage_features_0.shape: %szimage_features_1.shape: %szimage_embeddings.shape: %sTr   r         r      lowhighsizedtype   rX   i  i  zpoint_coords.shape: %szpoint_labels.shape: %szinput_masks.shape: %szhas_input_masks.shape: %szoriginal_image_size.shape: %szmasks.shape: %sziou_predictions.shape: %szlow_res_masks.shape: %s)r   r   r   r    r!   r"   r#   r$   )r>   r=   r<   
num_labels
num_points)r   r-   original_image_heightoriginal_image_width)r   rQ   rR   )r    r!   r"   r#   r>   r<   r=   ignore)category   )export_paramsopset_versiondo_constant_foldinginput_namesoutput_namesdynamic_axeszdecoder onnx model saved to %s)r   r   cpuloggerinfoshaper   r6   randintrG   int32zerosonestensorwarningscatch_warningsfilterwarningsjitTracerWarningUserWarningonnxexport)rL   rM   r   rN   
batch_sizeimagesam2_encoderr   r   r   sam2_decoderr[   r\   r    r!   r"   r#   r$   example_inputsr>   r=   r<   re   rf   rg   s                            r   export_decoder_onnxr~   s   s    J#J/E#J/335L;G;N8(8
KK,.>.D.DE
KK,.>.D.DE
KK,.>.D.DE#)(, 
ce	  JJ==QTQR8S[`[f[fgL==QQj5MUZU`U`aL++j!S#U[[IKjj%++6O,,d|5;;G 		N KK(,*<*<=
KK(,*<*<=
KK'):):;
KK+_-B-BC
KK/1D1J1JK0<n0M-%u{{3/1F1FG-}/B/BC	K AL )\:(\:<(|,!&=BXY\*|,L 
	 	 	"##Huyy7N7NO##H{C

 $#%% 	 
	
 
#" KK0/B# 
#	"s   =A3M
Mc                 Z   Sn[        U5      n[        U 5      R                  5       nU" U5      u  pgn[        U USS9R                  5       n	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[        R                  " SS/[        R                  S
9nUUUUUUUU4nU	" U6 u  n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5      5       Vs0 s H$  nUU   R                  UU   R'                  5       _M&     nnUR)                  UU5      n[+        U5       H,  u  nn[         R#                  U S3UU   R,                  5        M.     Uu  nn n![/        SUR                  5       [        R                  " U5      R                  5       5      (       aY  [/        SU[        R                  " U 5      5      (       a3  [/        SU[        R                  " U!5      5      (       a  [1        SU5        g [1        SU5        g s  snf s  snf s  snf )Nr-   TrP      r   rS   rQ   rT   rY   rZ   i  CPUExecutionProvider)	providerszinput_names: %szoutput_names: %sz
.shape: %sr>   r=   r<   zonnx model has been verified:zonnx model verification failed:)r   r   rh   r   r6   rl   rG   rm   rn   rp   onnxruntimeInferenceSession
get_inputsrangelennameri   rj   get_outputsnumpyrun	enumeraterk   r   print)"rL   rM   r   ry   rz   r{   r   r   r   sam2_image_decoderr[   r\   r    r!   r"   r#   r$   r}   r>   r=   r<   r   ort_sessionmodel_inputsire   model_outputsrf   inputsoutputsoutput_name	ort_masksort_iou_predictionsort_low_res_maskss"                                     r   test_decoder_onnxr      s   
 J#J/E#J/335L;G;N8(8))(, 
ce	  JJ==QTQR8S[`[f[fgL==QQj5MUZU`U`aL++j!S#U[[IKkk!5;;7O,,d|5;;G 		N -?,O)E?M..KaJb.cK))+L16s<7H1IJ1IA<?''1IKJ
KK!;/++-M38]9K3LM3LaM!$))3LLM
KK"L1GLSQ]M^G_`G_!l1o""N1$5$;$;$==G_F`oolF3G#L1;{m:.
0@0@A 2 9@5I"$5&wu||I?V?\?\?^__*+<ou||\oOpqq*?M5<<XiKjkk-?/A) K N`s   L/L#6+L()FFrA   )loggingrq   r6   torch.nn.functionalr	   
functionalr4   image_encoderr   r   r   r   r   r   sam2.modeling.sam2_baser   
sam2_utilsr   	getLoggerrB   ri   Moduler   strrF   r~   r    r   r   <module>r      s   
      C ( , , 5 			8	$\5ryy \5D #	\C\C\C \C 	\CD >B>B>Br   