Ë
    ¼Ó^jÚ:  ã                  ó  — d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	Z	d dl
Zd dlmZ d dlmZ d dlmZmZ d dlmZ  ej*                  e«      Zdd„Z	 	 	 	 dd	„Z	 	 	 	 	 	 dd
„Zdd„Z	 	 	 	 dd„Zdd„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zy)é    )ÚannotationsN)Úchain)ÚAnyÚUnionÚcast)ÚCLASS_NAME_DATA_FIELD)Úpolygon_to_maskÚrle_to_mask)ÚVectorc                óh  — | j                   sy | j                  }t        | j                   j                  j                  dd  «      }d}||k7  r@t        |d   |d   z  |d   |d   z  «      }|d   |d   |z  z
  dz  |d   |d   |z  z
  dz  f}t        |d   «      t        |d   «      }}t        |d   |d   z
  «      t        |d   |d   z
  «      }}g }	| j                   j                  j                  «       j                  «       }
t        |
j                  d   «      D ]P  }|
|   }|||…||…f   }|j                  |k7  rt        j                  ||d   |d   f«      }|	j                  |«       ŒR t        t        j                  t         j"                     t!        j$                  |	t&        ¬«      «      S )Né   )r   r   r   é   ©Údtype)ÚmasksÚ
orig_shapeÚtupleÚdataÚshapeÚminÚintÚcpuÚnumpyÚrangeÚcv2ÚresizeÚappendr   ÚnptÚNDArrayÚnpÚbool_ÚasarrayÚbool)Úyolov8_resultsr   Úinference_shapeÚpadÚgainÚtopÚleftÚbottomÚrightÚ	mask_mapsr   ÚiÚmasks                úo/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/supervision/detection/utils/internal.pyÚextract_ultralytics_masksr0      sÁ  € Ø×ÒØà×*Ñ*€JÜ˜N×0Ñ0×5Ñ5×;Ñ;¸A¸BÐ?Ó@€Oà
€Cà˜*Ò$ÜØ˜AÑ ¨A¡Ñ.Ø˜AÑ ¨A¡Ñ.ó
ˆð
 ˜QÑ *¨Q¡-°$Ñ"6Ñ6¸!Ñ;Ø˜QÑ *¨Q¡-°$Ñ"6Ñ6¸!Ñ;ð
ˆô
 �C˜‘F“œS  Q¡›[ˆ€CÜ˜¨Ñ*¨S°©VÑ3Ó4´c¸/È!Ñ:LÈsÐSTÉvÑ:UÓ6VˆE€Fà€IØ× Ñ ×%Ñ%×)Ñ)Ó+×1Ñ1Ó3€EÜ�5—;‘;˜q‘>Ó"ò ˆØ�Q‰xˆØ�C˜�J  U 
Ð*Ñ+ˆà�:‰:˜Ò#Ü—:‘:˜d Z°¡]°J¸q±MÐ$BÓCˆDà×Ñ˜Õðô ”—‘œBŸH™HÑ%¤r§z¡z°)Ä4Ô'HÓIÐIó    c           
     óè
  — | d   s�t        j                  dt         j                  ¬«      t        j                  dt         j                  ¬«      t        j                  dt         j                  ¬«      ddt        t        j                  dt
        ¬«      ifS g }g }g }g }g }g }t        | d   d   «      }t        | d   d   «      }| d   D �]Í  }	|	d	   }
|	d
   }|	d   }|	d   }|
|dz  z
  }||dz  z
  }||z   }||z   }|	j                  d«      xs |	j                  d«      }t        |t        «      rddhj                  |«      sd}|�{	 |d   \  }}t        |d   ||f«      }||f||fk7  rXt        j                  |j                  t         j                  «      ||ft        j                   ¬«      j                  t"        «      }|�~|j1                  ||||g«       |j1                  |	d   «       |j1                  |	d   «       |j1                  |	d   «       |j1                  «       d|	v s�Œb|j1                  |	d   «       �Œxd|	vrm|j1                  ||||g«       |j1                  |	d   «       |j1                  |	d   «       |j1                  |	d   «       d|	v s�ŒÓ|j1                  |	d   «       �Œét3        |	d   «      dk\  s�Œüt        j4                  |	d   D �cg c]  }|d	   |d
   g‘Œ c}t        ¬«      }t7        |||f¬«      j                  t"        «      }|j1                  ||||g«       |j1                  |	d   «       |j1                  |	d   «       |j1                  |	d   «       |j1                  |«       d|	v s�Œº|j1                  |	d   «       �ŒÐ t3        |«      dkD  r%t        j4                  |t         j                  ¬«      nt        j                  d«      }t3        |«      dkD  r%t        j4                  |t         j                  ¬«      nt        j                  d«      }t3        |«      dkD  r%t        j4                  |t         j                  ¬«      n$t        j                  dt         j                  ¬«      }t3        |«      dkD  rt        j4                  |«      nt        j                  dt
        ¬«      }t3        |«      dkD  rt        j4                  |t"        ¬«      nd}t3        |«      dkD  r%t        j4                  |t         j                  ¬«      nd}t        |i}||||||fS # t$        t&        t(        t*        f$ r#}t,        j/                  d|«       d}Y d}~�Œ¦d}~ww xY wc c}w )a  Parse a Roboflow API or Inference package result into detection arrays.

    The returned ``data`` dict always contains ``CLASS_NAME_DATA_FIELD`` as a
    string-dtype NumPy array. When ``predictions`` is empty, the array has
    shape ``(0,)`` with ``dtype=str``, preserving dtype contracts for callers
    that mix empty and non-empty results.

    Args:
        roboflow_result: Raw dict from the Roboflow REST API or the Inference
            package (after ``.dict()`` serialisation).

    Returns:
        A 6-tuple of ``(xyxy, confidence, class_id, masks, tracker_ids, data)``
        where each array is aligned with the others. ``masks`` and
        ``tracker_ids`` are ``None`` when absent from the predictions.

    Examples:
        >>> from supervision.detection.utils.internal import process_roboflow_result
        >>> result = {"predictions": [], "image": {"width": 100, "height": 100}}
        >>> _, _, _, _, _, data = process_roboflow_result(result)
        >>> data["class_name"].dtype.kind
        'U'
    Úpredictions)r   é   r   r   NÚimageÚwidthÚheightÚxÚyr   ÚrleÚrle_maskÚsizeÚcounts)ÚinterpolationzQFailed to decode RLE mask payload; falling back to box-only detection. Reason: %sÚclass_idÚclassÚ
confidenceÚ
tracker_idÚpointsé   )Úresolution_wh)r    ÚemptyÚfloat64Úint64r   Ústrr   ÚgetÚ
isinstanceÚdictÚissubsetr
   r   r   ÚastypeÚuint8ÚINTER_NEARESTr#   Ú
ValueErrorÚAssertionErrorÚKeyErrorÚ	TypeErrorÚloggerÚwarningr   ÚlenÚarrayr	   ) Úroboflow_resultÚxyxyrA   r?   Ú
class_namer   Útracker_idsÚimage_widthÚimage_heightÚ
predictionr8   r9   r6   r7   Úx_minÚy_minÚx_maxÚy_maxÚrle_dataÚhÚwr.   ÚexcÚpointÚpolygonÚxyxy_arrÚconfidence_arrÚclass_id_arrÚclass_name_arrÚ	masks_arrÚtracker_id_arrr   s                                    r/   Úprocess_roboflow_resultrp   6   s  € ðB ˜=Ò)ä�H‰H�V¤2§:¡:Ô.Ü�H‰H�QœbŸj™jÔ)Ü�H‰H�QœbŸh™hÔ'ØØÜ"¤B§H¡H¨Q´cÔ$:Ð;ð
ð 	
ð !€DØ €JØ€HØ€JØ)+€EØ€Kä�o gÑ.¨wÑ7Ó8€KÜ� wÑ/°Ñ9Ó:€Là% mÑ4ó ==ˆ
Ø�s‰OˆØ�s‰OˆØ˜7Ñ#ˆØ˜HÑ%ˆØ�E˜A‘I‘ˆØ�F˜Q‘J‘ˆØ˜‘ˆØ˜‘ˆà—>‘> %Ó(ÒF¨J¯N©N¸:Ó,FˆÜ˜(¤DÔ)ØØð2
÷ ‰(�8Ó
ð2ð ˆHØÐð Ø Ñ'‘��1Ü" 8¨HÑ#5¸¸1°vÓ>�Ø�q�6˜l¨KÐ8Ò8ÜŸ:™:ØŸ™¤B§H¡HÓ-Ø$ lÐ3Ü&)×&7Ñ&7ô÷ ‘fœT“lð	 ð ÐØ�K‰K˜  u¨eÐ4Ô5Ø�O‰O˜J zÑ2Ô3Ø×Ñ˜j¨Ñ1Ô2Ø×Ñ˜j¨Ñ6Ô7Ø�L‰L˜ÔØ˜zÓ)Ø×"Ñ" :¨lÑ#;Ö<Ø˜ZÑ'Ø�K‰K˜  u¨eÐ4Ô5Ø�O‰O˜J zÑ2Ô3Ø×Ñ˜j¨Ñ1Ô2Ø×Ñ˜j¨Ñ6Ô7Ø˜zÓ)Ø×"Ñ" :¨lÑ#;Ö<Ü�˜HÑ%Ó&¨!Ô+Ü—h‘hØ7AÀ(Ñ7KÖL¨e�%˜‘*˜e C™jÒ)ÒLÔTWôˆGô #Ø¨°\Ð'Bôç‰f”T‹lð ð �K‰K˜  u¨eÐ4Ô5Ø�O‰O˜J zÑ2Ô3Ø×Ñ˜j¨Ñ1Ô2Ø×Ñ˜j¨Ñ6Ô7Ø�L‰L˜ÔØ˜zÓ)Ø×"Ñ" :¨lÑ#;Ö<ð{==ô@ -0°«I¸ªMŒ�‰�œRŸZ™ZÕ(¼r¿x¹xÈÓ?Oð ô 36°j³/ÀAÒ2EŒ�‰�¤2§:¡:Õ.Ì2Ï8É8ÐTUË;ð ô
 ˆx‹=˜1Òô 	�‰�¤§¡Õ*ä�X‰X�aœrŸx™xÔ(ð ô !$ J£°!Ò 3Œ�‰�Ô¼¿¹À!Ì3Ô9Oð ô (+¨5£z°A¢~Œ�‰�œdÕ#¸4ð ô 25°[Ó1AÀAÒ1EŒ�‰�¤B§H¡HÕ-È4ð ô 1FÀ~Ð/V€Dð 	ØØØØØðð øôw ¤´¼)ÐDò  Ü—‘ð,àôð
  –ûð üò0 Ms   ÅA:T0ËU/
Ô0U,Õ	U'Õ'U,c                óš   ‡ ‡— t        ‰ j                  «       «      t        ‰j                  «       «      k(  xr t        ˆ ˆfd„‰ D «       «      S )zÔ
    Compares the data payloads of two Detections instances.

    Args:
        data_a, data_b: The data payloads of the instances.

    Returns:
        True if the data payloads are equal, False otherwise.
    c              3  óV   •K  — | ]   }t        j                  ‰|   ‰|   «      –— Œ" y ­w©N)r    Úarray_equal)Ú.0ÚkeyÚdata_aÚdata_bs     €€r/   ú	<genexpr>z is_data_equal.<locals>.<genexpr>×   s)   øè ø€ ò <Ø58Œ�‰�v˜c‘{ F¨3¡K×0ñ<ùs   ƒ&)©ÚsetÚkeysÚall)rw   rx   s   ``r/   Úis_data_equalr~   Ê   sA   ù€ ô ˆv�{‰{‹}Ó¤ V§[¡[£]Ó!3Ñ3ò ¼ô <Ø<Bô<ó 9ð r1   c                óš   ‡ ‡— t        ‰ j                  «       «      t        ‰j                  «       «      k(  xr t        ˆ ˆfd„‰ D «       «      S )zè
    Compares the metadata payloads of two Detections instances.

    Args:
        metadata_a, metadata_b: The metadata payloads of the instances.

    Returns:
        True if the metadata payloads are equal, False otherwise.
    c              3  óà   •K  — | ]e  }t        ‰|   t        j                  «      r9t        ‰|   t        j                  «      rt        j                  ‰|   ‰|   «      n
‰|   ‰|   k(  –— Œg y ­wrs   )rK   r    Úndarrayrt   )ru   rv   Ú
metadata_aÚ
metadata_bs     €€r/   ry   z$is_metadata_equal.<locals>.<genexpr>æ   sm   øè ø€ ò Dð ô	 �z #‘¬¯
©
Ô3Ü˜: c™?¬B¯J©JÔ7ô 	�‰�z #‘¨
°3©Ô8ð
 ˜‰_ 
¨3¡Ñ/ó	0ñDùs   ƒA+A.rz   )r‚   rƒ   s   ``r/   Úis_metadata_equalr„   Ü   sH   ù€ ô ˆz�‰Ó Ó!¤S¨¯©Ó):Ó%;Ñ;ò Äô Dð ôDó Að r1   c                óê  ‡— | si S | D �cg c]  }t        |j                  «       «      ‘Œ c}Št        ˆfd„‰D «       «      st        d«      ‚| D ]J  }|j	                  «       D �cg c]  }t        |«      ‘Œ }}t        t        |«      «      dkD  sŒAt        d«      ‚ ‰d   D �ci c]  }|g “Œ }}| D ]   }|D ]  }||   j                  ||   «       Œ Œ" |D ]Â  }t        d„ ||   D «       «      r%t        t        j                  ||   «      «      ||<   Œ=t        d„ ||   D «       «      rc||   d   j                  }|dk(  rt        j                  ||   «      ||<   Œ…|dkD  rt        j                  ||   «      ||<   Œ¦t        d|› d	�«      ‚t        d
|› d�«      ‚ t        t        t         t"        t$        j&                  t        j(                     t        t*           f   f   |«      S c c}w c c}w c c}w )a°  
    Merges the data payloads of a list of Detections instances.

    Warning: Assumes that empty detections were filtered-out before passing data to
    this function.

    Args:
        data_list: The data payloads of the Detections instances. Each data payload
            is a dictionary with the same keys, and the values are either lists or
            npt.NDArray[np.generic].

    Returns:
        A single data payload containing the merged data, preserving the original data
            types (list or npt.NDArray[np.generic]).

    Raises:
        ValueError: If data values within a single object have different lengths or if
            dictionaries have different keys.
    c              3  ó.   •K  — | ]  }|‰d    k(  –— Œ y­w©r   N© ©ru   Úkeys_setÚall_keys_setss     €r/   ry   zmerge_data.<locals>.<genexpr>  ó   øè ø€ ÒJ°ˆx˜=¨Ñ+Õ+ÑJùó   ƒz7All data dictionaries must have the same keys to merge.r   z>All data values within a single object must have equal length.r   c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wrs   )rK   Úlist©ru   Úitems     r/   ry   zmerge_data.<locals>.<genexpr>  s   è ø€ ÒC¨$Œz˜$¤×%ÑCùs   ‚c              3  óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrs   )rK   r    r�   r�   s     r/   ry   zmerge_data.<locals>.<genexpr>  s   è ø€ ÒK°$”˜D¤"§*¡*×-ÑKùs   ‚$&z$Unexpected array dimension for key 'ú'.z!Inconsistent data types for key 'z.'. Only np.ndarray and list types are allowed.)r{   r|   r}   rQ   ÚvaluesrW   r   r�   r   Úfrom_iterableÚndimr    ÚhstackÚvstackr   rL   rI   r   r   r   Úgenericr   )Ú	data_listr   ÚvalueÚlengthsrv   Úmerged_datar–   r‹   s          @r/   Ú
merge_datarž   ñ   s  ø€ ñ, Øˆ	à2;Ö<¨$”S˜Ÿ™›Õ%Ò<€MÜÓJ¸MÔJÔJÜÐRÓSÐSàò ˆØ+/¯;©;«=Ö9 %”3�u•:Ð9ˆÐ9ÜŒs�7‹|Ó˜qÓ ÜØPóð ðð 7DÀAÑ6FÖ"G¨s 3¨¡7Ð"G€KÐ"GØò /ˆØò 	/ˆCØ˜Ñ×#Ñ# D¨¡IÕ.ñ	/ð/ð ò ˆÜÑC°+¸cÑ2BÔCÔCÜ#¤E×$7Ñ$7¸ÀCÑ8HÓ$IÓJˆK˜ÒÜÑK¸+ÀcÑ:JÔKÔKØ˜sÑ# AÑ&×+Ñ+ˆDØ�qŠyÜ#%§9¡9¨[¸Ñ-=Ó#>�˜CÒ Ø˜’Ü#%§9¡9¨[¸Ñ-=Ó#>�˜CÒ ä Ð#GÈÀuÈBÐ!OÓPÐPäØ3°C°5ð 9%ð &óð ðô" ””Sœ%¤§¡¬B¯J©JÑ 7¼¼c¹Ð BÑCÐCÑDÀkÓRÐRùòC =ùò
 :ùò #Hs   Š G&Á#G+Â"
G0c                ót  ‡— | si S | D �cg c]  }t        |j                  «       «      ‘Œ c}Št        ˆfd„‰D «       «      st        d«      ‚i }| D ]à  }|j	                  «       D ]Ë  \  }}||vr|||<   Œ||   }t        |t        j                  «      rCt        |t        j                  «      r)t        j                  ||   |«      rŒct        d|› d�«      ‚t        |t        j                  «      st        |t        j                  «      rt        d|› d�«      ‚||   |k7  sŒ¾t        d|› d�«      ‚ Œâ |S c c}w )aS  
    Merge metadata from a list of metadata dictionaries.

    This function combines the metadata dictionaries. If a key appears in more than one
    dictionary, the values must be identical for the merge to succeed.

    Warning: Assumes that empty detections were filtered-out before passing metadata to
    this function.

    Args:
        metadata_list: A list of metadata dictionaries to merge.

    Returns:
        A single merged metadata dictionary.

    Raises:
        ValueError: If there are conflicting values for the same key or if
        dictionaries have different keys.
    c              3  ó.   •K  — | ]  }|‰d    k(  –— Œ y­wr‡   rˆ   r‰   s     €r/   ry   z!merge_metadata.<locals>.<genexpr>F  rŒ   r�   z;All metadata dictionaries must have the same keys to merge.zConflicting metadata for key: 'z&': {type(value)}, {type(other_value)}.r“   )	r{   r|   r}   rQ   ÚitemsrK   r    r�   rt   )Úmetadata_listÚmetadataÚmerged_metadatarv   r›   Úother_valuer‹   s         @r/   Úmerge_metadatar¦   .  sL  ø€ ñ( Øˆ	à:GÖH¨h”S˜Ÿ™›Õ)ÒH€MÜÓJ¸MÔJÔJÜÐVÓWÐWà&(€OØ!ò PˆØ"Ÿ.™.Ó*ò 	P‰JˆC�Ø˜/Ñ)Ø',� Ñ$Øà)¨#Ñ.ˆKÜ˜%¤§¡Ô,´¸KÌÏÉÔ1TÜ—~‘~ o°cÑ&:¸EÕBÜ$Ø9¸#¸ð ?>ð >óð ô ˜E¤2§:¡:Ô.´*¸[Ì"Ï*É*Ô2Uä Ø5°c°Uð ;:ð :óð ð
 # 3Ñ'¨5Ó0Ü$Ð'FÀsÀeÈ2Ð%NÓOÐOñ)	PðPð. Ðùò9 Is   Š D5c           	     ó°  — i }| j                  «       D �]/  \  }}t        |t        j                  «      r	||   ||<   Œ*t        |t        «      rÞt        |t
        «      r	||   ||<   ŒSt        |t        «      r|D �cg c]  }||   ‘Œ	 c}||<   Œzt        |t        j                  «      rR|j                  t        k(  r(t        |«      D ��cg c]  \  }}|sŒ	||   ‘Œ c}}||<   ŒÏ|D �cg c]  }||   ‘Œ	 c}||<   Œæt        |t        «      r||   g||<   �Œt        dt        |«      › �«      ‚t        d|› dt        |«      › �«      ‚ |S c c}w c c}}w c c}w )a6  
    Retrieve a subset of the data dictionary based on the given index.

    Args:
        data: The data dictionary of the Detections object.
        index: The index or indices specifying the subset to retrieve.

    Returns:
        A subset of the data dictionary corresponding to the specified index.
    zUnsupported index type: zUnsupported data type for key 'z': )r¡   rK   r    r�   r�   Úslicer   r#   Ú	enumerater   rT   Útype)r   ÚindexÚsubset_datarv   r›   r-   Úindex_values          r/   Úget_data_itemr®   d  sL  € ð CE€KØ—j‘j“ló U‰
ˆˆUÜ�eœRŸZ™ZÔ(Ø$ U™|ˆK˜ÒÜ˜œtÔ$Ü˜%¤Ô'Ø#(¨¡<�˜CÒ Ü˜E¤4Ô(Ø6;Ö#<° E¨!£HÒ#<�˜CÒ Ü˜E¤2§:¡:Ô.Ø—;‘;¤$Ò&ä7@ÀÓ7G÷(Ù%3 Q¨Ê;˜˜a›ó(�K Ò$ð ;@Ö'@°Q¨¨a«Ò'@�K Ò$Ü˜E¤3Ô'Ø$)¨%¡L >�˜CÓ äÐ":¼4À»;¸-Ð HÓIÐIäÐ=¸c¸UÀ#ÄdÈ5ÃkÀ]ÐSÓTÐTð)Uð, Ðùò $=ùó(ùò (As   Á:EÃ
EÃEÃ&Ec                óÞ  — t        j                  |j                  j                  |j                  j                  z
  |j                  j
                  |j                  j
                  z
  g«      }t        j                  |j                  j                  |j                  j
                  g«      }t        t        j                  t         j                     t        j                  || |z
  «      «      S )a)  
    Get array of cross products of each anchor with a vector.
    Args:
        anchors: Array of anchors of shape (number of anchors, detections, 2)
        vector: Vector to calculate cross product with

    Returns:
        Array of cross products of shape (number of anchors, detections)
    )r    rX   Úendr8   Ústartr9   r   r   r   ÚnumberÚcross)ÚanchorsÚvectorÚvector_at_zeroÚvector_starts       r/   Úcross_productr¸   Œ  s›   € ô —X‘Xà�J‰J�L‰L˜6Ÿ<™<Ÿ>™>Ñ)Ø�J‰J�L‰L˜6Ÿ<™<Ÿ>™>Ñ)ð	
ó€Nô —8‘8˜VŸ\™\Ÿ^™^¨V¯\©\¯^©^Ð<Ó=€LÜÜ�‰”B—I‘IÑ¤§¡¨¸À<Ñ9OÓ Póð r1   )r$   r   Úreturnznpt.NDArray[np.bool_] | None)rY   údict[str, Any]r¹   z´tuple[npt.NDArray[np.floating], npt.NDArray[np.floating], npt.NDArray[np.integer], npt.NDArray[np.bool_] | None, npt.NDArray[np.integer] | None, dict[str, npt.NDArray[np.generic]]])rw   ú.dict[str, npt.NDArray[np.generic] | list[Any]]rx   r»   r¹   r#   )r‚   rº   rƒ   rº   r¹   r#   )rš   z4list[dict[str, npt.NDArray[np.generic] | list[Any]]]r¹   r»   )r¢   zlist[dict[str, Any]]r¹   rº   )r   r»   r«   z<int | slice | list[int] | npt.NDArray[np.integer | np.bool_]r¹   r»   )r´   únpt.NDArray[np.number]rµ   r   r¹   r¼   ) Ú
__future__r   ÚloggingÚ	itertoolsr   Útypingr   r   r   r   r   r    Únumpy.typingr   Úsupervision.configr   Ú&supervision.detection.utils.convertersr	   r
   Úsupervision.geometry.corer   Ú	getLoggerÚ__name__rU   r0   rp   r~   r„   rž   r¦   r®   r¸   rˆ   r1   r/   ú<module>rÇ      sÚ   ðÝ "ã Ý ß #Ñ #ã 
Û Ý å 4ß OÝ ,à	ˆ×	Ñ	˜8Ó	$€ó!JðHQØ#ðQðóQðhØ:ðà:ðð 
óó$ð*:SØCð:Sà3ó:Sóz3ðl%Ø
8ð%àGð%ð 4ó%ðPØ#ðØ-3ðàôr1   