Ë
    cQêjE*  ã            	       óú   — d dl Z d dlZd dlZd dlmc mZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZ  e j$                  e«      Z G d„ d	ej*                  «      Z	 	 dd
edededefd„Z	 dd
edefd„Zy)é    N)ÚSAM2ImageEncoderÚrandom_sam2_input_image)ÚSAM2MaskDecoder)ÚSAM2PromptEncoder)ÚSAM2Base)Úcompare_tensors_with_tolerance)Únnc                   ó8  ‡ — e Zd Z	 	 	 ddedededededdfˆ fd„Z ej                  «       	 dd	ej                  d
ej                  dej                  dej                  dej                  dej                  dej                  dej                  defd„«       Z
ˆ xZS )ÚSAM2ImageDecoderÚ	sam_modelÚmultimask_outputÚdynamic_multimask_via_stabilityÚreturn_logitsÚmask_thresholdÚreturnNc                 ó‚   •— t         ‰| �  «        t        |«      | _        t	        |||«      | _        || _        || _        y )N)ÚsuperÚ__init__r   Úprompt_encoderr   Úmask_decoderr   r   )Úselfr   r   r   r   r   Ú	__class__s         €úw/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/models/sam2/image_decoder.pyr   zSAM2ImageDecoder.__init__   s@   ø€ ô 	‰ÑÔÜ/°	Ó:ˆÔÜ+¨IÐ7GÐIhÓiˆÔØ*ˆÔØ,ˆÕó    Úimage_features_0Úimage_features_1Úimage_embeddingsÚpoint_coordsÚpoint_labelsÚinput_masksÚhas_input_masksÚoriginal_image_sizeÚenable_nvtx_profilec
                 óD  — d}
|	rddl m}  |g d¢«      }
|
�|
j                  dd¬«       | j                  ||||«      \  }}}|
�$|
j	                  d«       |
j                  dd	¬«       | j                  ||||||«      \  }}|
�$|
j	                  d«       |
j                  d
d¬«       t        j                  ||d   |d   fdd¬«      }t        j                  |dd«      }| j                  s|| j                  kD  }|
�!|
j	                  d
«       |
j                  «        |||fS )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#   r/   r%   Úsparse_embeddingsÚdense_embeddingsÚimage_peÚlow_res_masksÚiou_predictionsÚmaskss                     r   ÚforwardzSAM2ImageDecoder.forward#   sV  € ðH ˆÙÝ.á$Ò%WÓXˆKàÐ"Ø×%Ñ%Ð&6¸fÐ%ÔEà8<×8KÑ8KØ˜,¨°_ó9
Ñ5ÐÐ+¨Xð Ð"Ø×$Ñ$Ð%5Ô6Ø×%Ñ% n¸EÐ%ÔBà)-×):Ñ):ØÐ.Ð0@À(ÐL]Ð_oó*
Ñ&ˆ�ð Ð"Ø×$Ñ$ ^Ô4Ø×%Ñ% n¸GÐ%ÔDô —‘ØØ  Ñ#Ð%8¸Ñ%;Ð<ØØô	
ˆô Ÿ™ M°5¸$Ó?ˆØ×!Ò!Ø˜D×/Ñ/Ñ/ˆEàÐ"Ø×$Ñ$ ^Ô4Ø×%Ñ%Ô'à�o }Ð4Ð4r   )TFg        ©F)Ú__name__Ú
__module__Ú__qualname__r   ÚboolÚfloatr   r4   Úno_gradÚTensorr=   Ú__classcell__)r   s   @r   r   r      sñ   ø„ ð
 15Ø#Ø #ñ-àð-ð ð-ð *.ð	-ð
 ð-ð ð-ð 
õ-ð €U‡]�]ƒ_ð %*ñL5àŸ,™,ðL5ð  Ÿ,™,ðL5ð  Ÿ,™,ð	L5ð
 —l‘lðL5ð —l‘lðL5ð —\‘\ðL5ð Ÿ™ðL5ð #Ÿ\™\ðL5ð "òL5ó ôL5r   r   Ú
sam2_modelÚonnx_model_pathr   Úverbosec                 óÎ  — d}t        |«      }t        | «      j                  «       } ||«      \  }}}	t        j	                  d|j
                  «       t        j	                  d|j
                  «       t        j	                  d|	j
                  «       t        | |d¬«      j                  «       }
d}d}t        j                  d	d
||dft        j                  ¬«      }t        j                  d	d||ft        j                  ¬«      }t        j                  |dddt        j                  ¬«      }t        j                  dt        j                  ¬«      }t        j                  ddgt        j                  ¬«      }|||	|||||f}t        j	                  d|j
                  «       t        j	                  d|j
                  «       t        j	                  d|j
                  «       t        j	                  d|j
                  «       t        j	                  d|j
                  «       |ri |
|Ž \  }}}t        j	                  d|j
                  «       t        j	                  d|j
                  «       t        j	                  d|j
                  «       g d¢}g d¢}dddœdddœd	did	diddddœd	did	did œ}t        j                  «       5  |sJt        j                   d!t        j"                  j$                  ¬"«       t        j                   d!t&        ¬"«       t        j(                  j+                  |
||dd#d|||¬$«	       d d d «       t        j	                  d%|«       y # 1 sw Y   Œ xY w)&Nr+   zimage_features_0.shape: %szimage_features_1.shape: %szimage_embeddings.shape: %sT©r   r   é   é   r   é   ©ÚlowÚhighÚsizeÚdtypeé   ©rS   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   rL   rM   )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   r4   ÚrandintrC   Úint32ÚzerosÚonesÚtensorÚwarningsÚcatch_warningsÚfilterwarningsÚjitÚTracerWarningÚUserWarningÚonnxÚexport)rG   rH   r   rI   Ú
batch_sizeÚimageÚsam2_encoderr   r   r   Úsam2_decoderrV   rW   r   r   r    r!   r"   Úexample_inputsr<   r;   r:   r`   ra   rb   s                            r   Úexport_decoder_onnxry   s   sö  € ð €JÜ# JÓ/€EÜ# JÓ/×3Ñ3Ó5€LÙ;GÈÓ;NÑ8ÐÐ&Ð(8ä
‡K�KÐ,Ð.>×.DÑ.DÔEÜ
‡K�KÐ,Ð.>×.DÑ.DÔEÜ
‡K�KÐ,Ð.>×.DÑ.DÔEä#ØØ)Ø(,ô÷ 
�cƒeð	 ð €JØ€JÜ—=‘= Q¨T¸ÀZÐQRÐ8SÔ[`×[fÑ[fÔg€LÜ—=‘= Q¨Q°jÀ*Ð5MÔUZ×U`ÑU`Ôa€LÜ—+‘+˜j¨!¨S°#¼U¿[¹[ÔI€KÜ—j‘j ¬%¯+©+Ô6€OÜŸ,™,¨¨d |¼5¿;¹;ÔGÐð 	ØØØØØØØð	€Nô ‡K�KÐ(¨,×*<Ñ*<Ô=Ü
‡K�KÐ(¨,×*<Ñ*<Ô=Ü
‡K�KÐ'¨×):Ñ):Ô;Ü
‡K�KÐ+¨_×-BÑ-BÔCÜ
‡K�KÐ/Ð1D×1JÑ1JÔKáÙ0<¸nÐ0MÑ-ˆˆ Ü�‰Ð% u§{¡{Ô3Ü�‰Ð/°×1FÑ1FÔGÜ�‰Ð-¨}×/BÑ/BÔCò	€Kò A€Lð )¨\Ñ:Ø(¨\Ñ:Ø˜<Ð(Ø˜|Ð,Ø!Ð&=ÐBXÑYØ˜\Ð*Ø˜|Ð,ñ€Lô 
×	 Ñ	 Ó	"ñ 
ÙÜ×#Ñ# H´u·y±y×7NÑ7NÕOÜ×#Ñ# H´{ÕCä�
‰
×ÑØØØØØØ $Ø#Ø%Ø%ð 	ô 
	
÷
ô" ‡K�KÐ0°/ÕB÷#
ð 
ús   ËA5MÍM$c                 óF  — d}t        |«      }t        | «      j                  «       } ||«      \  }}}t        | |d¬«      j                  «       }	d}
d}t	        j
                  dd|
|dft        j                  ¬«      }t	        j
                  dd|
|ft        j                  ¬«      }t	        j                  |
dd	d	t        j                  ¬
«      }t	        j                  dt        j                  ¬
«      }t	        j                  ddgt        j                  ¬
«      }||||||||f} |	|Ž \  }}}dd l
}|j                  |dg¬«      }|j                  «       }t        t        |«      «      D �cg c]  }||   j                  ‘Œ }}t         j#                  d|«       |j%                  «       }t        t        |«      «      D �cg c]  }||   j                  ‘Œ }}t         j#                  d|«       t        t        |«      «      D �ci c]#  }||   j                  ||   j'                  «       “Œ% }}|j)                  ||«      }t+        |«      D ]+  \  }}t         j#                  |› d�||   j,                  «       Œ- |\  }} }!t/        d|j                  «       t	        j                  |«      j                  «       «      rMt/        d|t	        j                  | «      «      r-t/        d|t	        j                  |!«      «      rt1        d|«       y t1        d|«       y c c}w c c}w c c}w )Nr+   TrK   é   r   rN   rL   rO   rT   rU   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   rc   r   r4   rg   rC   rh   ri   rk   ÚonnxruntimeÚInferenceSessionÚ
get_inputsÚrangeÚlenÚnamerd   re   Úget_outputsÚnumpyÚrunÚ	enumeraterf   r   Úprint)"rG   rH   r   rt   ru   rv   r   r   r   Úsam2_image_decoderrV   rW   r   r   r    r!   r"   rx   r<   r;   r:   r~   Úort_sessionÚmodel_inputsÚir`   Úmodel_outputsra   ÚinputsÚoutputsÚoutput_nameÚ	ort_masksÚort_iou_predictionsÚort_low_res_maskss"                                     r   Útest_decoder_onnxr”   Ò   sÓ  € ð
 €JÜ# JÓ/€EÜ# JÓ/×3Ñ3Ó5€LÙ;GÈÓ;NÑ8ÐÐ&Ð(8ä)ØØ)Ø(,ô÷ 
�cƒeð	 ð €JØ€JÜ—=‘= Q¨T¸ÀZÐQRÐ8SÔ[`×[fÑ[fÔg€LÜ—=‘= Q¨Q°jÀ*Ð5MÔUZ×U`ÑU`Ôa€LÜ—+‘+˜j¨!¨S°#¼U¿[¹[ÔI€KÜ—k‘k !¬5¯;©;Ô7€OÜŸ,™,¨¨d |¼5¿;¹;ÔGÐð 	ØØØØØØØð	€Nñ -?ÀÐ,OÑ)€Eˆ?˜Mãà×.Ñ.¨ÐKaÐJbÐ.Óc€Kà×)Ñ)Ó+€LÜ16´s¸<Ó7HÓ1IÖJ¨A�< ‘?×'Ó'ÐJ€KÐJÜ
‡K�KÐ! ;Ô/à×+Ñ+Ó-€MÜ38¼¸]Ó9KÓ3LÖM¨a�M !Ñ$×)Ó)ÐM€LÐMÜ
‡K�KÐ" LÔ1ÜGLÌSÐQ]ÓM^ÓG_Ö`À!ˆl˜1‰o×"Ñ" N°1Ñ$5×$;Ñ$;Ó$=Ñ=Ð`€FÐ`Ø�o‰o˜l¨FÓ3€Gä# LÓ1ò B‰ˆˆ;Ü�‰�{�m :Ð.°¸±
×0@Ñ0@ÕAðBð 9@Ñ5€IÐ"Ð$5ä& w°·±³¼u¿|¹|ÈIÓ?V×?\Ñ?\Ó?^Ô_Ü*Ð+<¸oÌuÏ|É|Ð\oÓOpÔqÜ*¨?¸MÌ5Ï<É<ÐXiÓKjÔkäÐ-¨Õ?äÐ/°ÕAùò) Kùò Nùâ`s   Å+LÆ?LÈ(L)FFr>   )Úloggingrl   r4   Útorch.nn.functionalr	   Ú
functionalr2   Úimage_encoderr   r   r   r   r   r   Úsam2.modeling.sam2_baser   Ú
sam2_utilsr   Ú	getLoggerr?   rd   ÚModuler   ÚstrrB   ry   r”   © r   r   ú<module>rŸ      s¦   ðó
 Û ã ß Ð ß CÝ (Ý ,Ý ,Ý 5Ý à	ˆ×	Ñ	˜8Ó	$€ô\5�r—y‘yô \5ðD #Øñ	\CØð\Càð\Cð ð\Cð ó	\CðD ñ>BØð>Bàô>Br   