Ë
    cQêj•   ã                   ó¦   — d dl Z d dl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edefd	„Zdedefd
„Zy)é    N)ÚSAM2Base)Úcompare_tensors_with_tolerance)Únnc            	       óT  ‡ — e Zd Zdefˆ fd„Z ej                  «       dej                  dej                  dej                  dej                  fd„«       Zdej                  dej                  dej                  fd	„Z	dej                  dej                  dej                  fd
„Z
ˆ xZS )ÚSAM2PromptEncoderÚ	sam_modelc                 óR   •— t         ‰| �  «        |j                  | _        || _        y )N)ÚsuperÚ__init__Úsam_prompt_encoderÚprompt_encoderÚmodel)Úselfr   Ú	__class__s     €úx/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/models/sam2/prompt_encoder.pyr   zSAM2PromptEncoder.__init__   s#   ø€ Ü‰ÑÔØ'×:Ñ:ˆÔØˆ�
ó    Úpoint_coordsÚpoint_labelsÚinput_masksÚhas_input_masksc                 óˆ   — | j                  ||«      }| j                  ||«      }| j                  j                  «       }|||fS )aj  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   ÚforwardzSAM2PromptEncoder.forward   sL   € ð0 !×.Ñ.¨|¸\ÓJÐØ×,Ñ,¨[¸/ÓJÐØ×&Ñ&×3Ñ3Ó5ˆà Ð"2°HÐ<Ð<r   Úreturnc                 óx  — |dz   }t        j                  |j                  d   ddf|j                  ¬«      }t        j                  |j                  d   df|j                  ¬«       }t        j
                  ||gd¬«      }t        j
                  ||gd¬«      }|d d …d d …df   | j                  j                  z  |d d …d d …df<   |d d …d d …df   | j                  j                  z  |d d …d d …df<   | j                  j                  j                  |«      }|j                  d«      j                  |«      }||dk7  z  }|| j                  j                  j                  |dk(  z  z   }t        | j                  j                   «      D ].  }|| j                  j"                  |   j                  ||k(  z  z   }Œ0 |S )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   zSAM2PromptEncoder._embed_points3   s£  € Ø# cÑ)ˆäŸ™ \×%7Ñ%7¸Ñ%:¸A¸qÐ$AÈ,×J]ÑJ]Ô^ˆÜŸ™ \×%7Ñ%7¸Ñ%:¸AÐ$>À|×GZÑGZÔ[Ð[ˆÜ—y‘y ,°Ð!>ÀAÔFˆÜ—y‘y ,°Ð!>ÀAÔFˆð !-ªQ²°1¨WÑ 5¸¿
¹
×8MÑ8MÑ Mˆ’Qš˜1�WÑØ ,ªQ²°1¨WÑ 5¸¿
¹
×8MÑ8MÑ Mˆ’Qš˜1�WÑà×-Ñ-×6Ñ6×CÑCÀLÓQˆØ#×-Ñ-¨bÓ1×;Ñ;¸OÓLˆà)¨\¸RÑ-?Ñ@ˆØ)¨D×,?Ñ,?×,QÑ,Q×,XÑ,XÐ\hÐlnÑ\nÑ,oÑoˆä�t×*Ñ*×?Ñ?Ó@ò 	uˆAØ-°×0CÑ0C×0TÑ0TÐUVÑ0W×0^Ñ0^ÐbnÐrsÑbsÑ0tÑt‰Oð	uð Ðr   c                 ó<  — | j                   j                  |«      }| j                   j                  j                  j	                  dddd«      }t
        j                  d|j                  «       ||z  d|z
  |z  z   }t
        j                  d|j                  «       |S )Nr!   r%   zno_mask_embedding.shape: %sg      ð?zmask_embedding.shape: %s)r   Úmask_downscalingÚno_mask_embedr1   ÚreshapeÚloggerÚinfor(   )r   r   r   Úmask_embeddingÚno_mask_embeddings        r   r   zSAM2PromptEncoder._embed_masksJ   s�   € Ø×,Ñ,×=Ñ=¸kÓJˆØ ×/Ñ/×=Ñ=×DÑD×LÑLÈQÐPRÐTUÐWXÓYÐÜ�‰Ð1Ð3D×3JÑ3JÔKØ(¨>Ñ9¸SÀ?Ñ=RÐVgÑ<gÑgˆÜ�‰Ð.°×0DÑ0DÔEØÐr   )Ú__name__Ú
__module__Ú__qualname__r   r   r&   Úno_gradÚTensorr   r   r   Ú__classcell__)r   s   @r   r   r      s³   ø„ ð (õ ð
 €U‡]�]ƒ_ð=à—l‘lð=ð —l‘lð=ð —\‘\ð	=ð
 Ÿ™ò=ó ð=ð:¨%¯,©,ð ÀeÇlÁlð ÐW\×WcÑWcó ð.¨¯©ð ÀuÇ|Á|ð ÐX]×XdÑXd÷ r   r   Ú
sam2_modelÚonnx_model_pathc                 óú  — t        | «      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	|j                  «       t        j                  d
|j                  «       t        j                  d|j                  «       t        j                  d|j                  «       t        j                  d|	j                  «       t        j                  d|
j                  «       t        j                  d|j                  «       t        j                  j                  |||||f|dddg d¢g d¢dddœdddœddidddœddidœ¬«	       t        d|«       y )Nr"   é   r   é   ©ÚlowÚhighÚsizeÚdtyper!   é   ©rP   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)   r=   r>   r(   ÚonnxÚexportÚprint)rG   rH   Úsam2_prompt_encoderrU   rV   r   r   r   r   r   r   r   s               r   Úexport_prompt_encoder_onnxre   S   s¶  € ô ,¨JÓ7×;Ñ;Ó=Ðà€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á4GØ�l K°ó5Ñ1ÐÐ'¨ô ‡K�KÐ(¨,×*<Ñ*<Ô=Ü
‡K�KÐ(¨,×*<Ñ*<Ô=Ü
‡K�KÐ'¨×):Ñ):Ô;Ü
‡K�KÐ+¨_×-BÑ-BÔCä
‡K�KÐ-Ð/@×/FÑ/FÔGÜ
‡K�KÐ,Ð.>×.DÑ.DÔEÜ
‡K�KÐ$ h§n¡nÔ5ä	‡J�J×ÑØØ	�| [°/ÐBØØØØ ÚVÚJà ,°Ñ>Ø ,°Ñ>Ø˜|Ð,Ø%1°nÑ!EØ!" LÐ 1ñ
ð ô ô$ 
Ð
/°ÕAr   c                 óN  — t        | «      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                  ¬«      } |||||«      \  }	}
}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|«       |j#                  ||j%                  «       |j%                  «       |j%                  «       |j%                  «       dœ«      }t'        |«      D ])  \  }}t        j                  d|||   j(                  «       Œ+ |\  }}}t+        d|	t        j,                  |«      d¬«      rSt+        d|
t        j,                  |«      d¬«      r1t+        d|t        j,                  |«      d¬«      rt/        d|› �«       y t/        d|› �«       y c c}w c c}w )Nr!   é   r   rK   r"   rL   rQ   rR   ÚCPUExecutionProvider)Ú	providerszinput_names: %szoutput_names: %srT   zoutput %s shape: %sr   gš™™™™™É?)Úmismatch_percentage_tolerancer   r   zonnx model has been verified: z onnx model verification failed: )r   r]   r&   r^   r_   r`   Úrandr)   ÚonnxruntimeÚInferenceSessionÚ
get_inputsr2   ÚlenÚnamer=   r>   Úget_outputsÚrunÚnumpyÚ	enumerater(   r   Útensorrc   )rG   rH   rd   rU   rV   r   r   r   r   r   r   r   rl   Úort_sessionÚmodel_inputsr8   rZ   Úmodel_outputsr[   ÚoutputsÚoutput_nameÚort_sparse_embeddingsÚort_dense_embeddingsÚort_image_pes                           r   Útest_prompt_encoder_onnxr~   ‚   sp  € ô ,¨JÓ7×;Ñ;Ó=Ðà€JØ€JÜ—=‘= Q¨T¸ÀZÐQRÐ8SÔ[`×[fÑ[fÔg€LÜ—=‘= Q¨Q°jÀ*Ð5MÔUZ×U`ÑU`Ôa€LÜ—*‘*˜Z¨¨C°¼E¿K¹KÔH€KÜ—j‘j ¬%¯+©+Ô6€Oá4GØ�l K°ó5Ñ1ÐÐ'¨ó à×.Ñ.¨Ð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à�o‰oØà(×.Ñ.Ó0Ø(×.Ñ.Ó0Ø&×,Ñ,Ó.Ø.×4Ñ4Ó6ñ		
ó€Gô $ LÓ1ò J‰ˆˆ;Ü�‰Ð)¨;¸À¹
×8HÑ8HÕIðJð AHÑ=ÐÐ/°ä&ØØÜ�L‰LÐ.Ó/Ø*-õ		
ô +ØÐ 0´%·,±,Ð?SÓ2TÐtwõ
ô +Ø˜¤%§,¡,¨|Ó"<Ð\_õ
ô 	Ð.¨Ð.?Ð@ÕAäÐ0°Ð0AÐBÕCùòK Kùò Ns   ÄJÅJ")Úloggingr&   Úsam2.modeling.sam2_baser   Ú
sam2_utilsr   r   Ú	getLoggerrA   r=   ÚModuler   Ústrre   r~   © r   r   ú<module>r†      sl   ðó
 ã Ý ,Ý 5Ý à	ˆ×	Ñ	˜8Ó	$€ôA˜Ÿ	™	ô AðH,BØð,Bàó,Bð^;DØð;Dàô;Dr   