Ë
    ëÓ^jL  ã                  ó|  — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZ  e«       Zg d¢Z ed	d	¬
«       G d„ d«      «       Z ed	d	¬
«       G d„ d«      «       Zeez  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d*d„Zd+d„Zd,d„Zd-d„Zd.d„Zd/d„Z ddœ	 	 	 	 	 d0d„Z!ddœ	 	 	 	 	 d1d „Z"d2d!„Z#y)3z4Private helpers for COCO keypoint schema extraction.é    )ÚannotationsN)Ú	dataclassÚfield)ÚPath)ÚAny)Ú
get_logger)ÚCocoKeypointSchemaÚKeypointSchemaÚYoloKeypointSchemaÚactive_keypoint_countsÚinfer_coco_keypoint_schemaÚinfer_yolo_keypoint_schemaT)ÚfrozenÚslotsc                  óL   — e Zd ZU dZded<   ded<   ded<    ee¬«      Zded	<   y
)r	   ax  Keypoint schema inferred from COCO category metadata.

    Args:
        class_names: Category names sorted by category id.
        num_keypoints_per_class: Number of keypoints for each sorted category.
        keypoint_oks_sigmas: Default OKS sigmas matching the largest keypoint class.
        keypoint_flip_pairs: Flat horizontal-flip swap pairs inferred from keypoint names.

    Returns:
        Immutable schema value used to configure keypoint training.

    Raises:
        This value object does not raise.

    Example:
        >>> CocoKeypointSchema(["person"], [17], [0.1] * 17).num_keypoints_per_class
        [17]
    ú	list[str]Úclass_namesú	list[int]Únum_keypoints_per_classúlist[float]Úkeypoint_oks_sigmas©Údefault_factoryÚkeypoint_flip_pairsN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   Úlistr   © ó    úk/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/datasets/_keypoint_schema.pyr	   r	      s+   … ñð& ÓØ&Ó&Ø$Ó$Ù%*¸4Ô%@Ð˜Ô@r#   r	   c                  ój   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   d
ed<    ee¬«      Zded<   y)r   a  Keypoint schema inferred from an Ultralytics YOLO pose YAML file.

    Args:
        class_names: Class names ordered by YOLO class id.
        num_keypoints_per_class: Number of keypoints for each YOLO class slot.
        keypoint_oks_sigmas: Default OKS sigmas matching the global keypoint count.
        keypoint_names: Keypoint names ordered by keypoint index.
        flip_idx: Optional Ultralytics horizontal-flip index mapping.
        keypoint_dim: Number of keypoint dimensions in label files, either 2 or 3.

    Returns:
        Immutable schema value used to configure YOLO pose training.

    Raises:
        This value object does not raise.

    Example:
        >>> YoloKeypointSchema(["person"], [1], [0.1], ["nose"], [], 3).keypoint_dim
        3
    r   r   r   r   r   r   Úkeypoint_namesÚflip_idxÚintÚkeypoint_dimr   r   Nr   r"   r#   r$   r   r   9   s=   … ñð* ÓØ&Ó&Ø$Ó$ØÓØÓØÓÙ%*¸4Ô%@Ð˜Ô@r#   r   c                óú   — ddl }| j                  d¬«      5 }|j                  |«      }ddd«       t        t        «      s.t        dt        | «      ›dt        |«      j                  › d�«      ‚|S # 1 sw Y   ŒIxY w)a  Load a YAML file and require a mapping root.

    Args:
        yaml_path: Path to a YAML data file.

    Returns:
        Parsed YAML mapping.

    Raises:
        ValueError: If the YAML root is not a mapping.
        OSError: If the file cannot be read.

    Example:
        >>> import tempfile
        >>> path = Path(tempfile.mkdtemp()) / "data.yaml"
        >>> _ = path.write_text("names: [person]\nkpt_shape: [1, 3]\n", encoding="utf-8")
        >>> sorted(_load_yaml_mapping(path))
        ['kpt_shape', 'names']
    r   Núutf-8©ÚencodingzExpected mapping in data file ú, got ú.)	ÚyamlÚopenÚ	safe_loadÚ
isinstanceÚdictÚ
ValueErrorÚstrÚtyper   )Ú	yaml_pathr0   ÚfileÚdatas       r$   Ú_load_yaml_mappingr;   ]   sx   € ó( à	�‰ ˆÓ	)ð $¨TØ�~‰~˜dÓ#ˆ÷$ä�dœDÔ!ÜÐ9¼#¸i».Ð9KÈ6ÔRVÐW[ÓR\×ReÑReÐQfÐfgÐhÓiÐiØ€K÷	$ð $ús   —A1Á1A:c                óž  — | j                  d«      }t        |t        «      rÌg }g }|j                  «       D ]I  }t	        |«      }|j                  «       r|j                  t        |«      «       Œ9|j                  |«       ŒK t        t        |«      «      }|r"|t        t        t        |«      «      «      k7  s|rt        dt	        |«      ›d�«      ‚|D �cg c]  }t	        ||   «      ‘Œ c}S t        |t        «      r|D �	cg c]  }	t	        |	«      ‘Œ c}	S t        dt	        |«      ›dt        |«      j                  › d�«      ‚c c}w c c}	w )z:Extract contiguous YOLO class names from parsed YAML data.Únamesz)Unsupported 'names' mapping in data file z,: expected integer keys 0..N-1 with no gaps.z)Expected 'names' to be a list or dict in r.   r/   )Úgetr3   r4   Úkeysr6   ÚisdigitÚappendr(   ÚsortedÚsetr!   ÚrangeÚlenr5   r7   r   )
r:   Ú	data_filer=   Únumeric_keysÚnon_numeric_keysÚkeyÚkey_strÚunique_sorted_keysÚidxÚnames
             r$   Ú#_extract_yolo_class_names_from_datarN   z   s2  € à�H‰H�WÓ€EÜ�%œÔØ"$ˆØ&(ÐØ—:‘:“<ò 	-ˆCÜ˜#“hˆGØ�‰Ô Ø×#Ñ#¤C¨£LÕ1à ×'Ñ'¨Õ,ð	-ô $¤C¨Ó$5Ó6ÐÙ!Ð%7¼4ÄÄcÐJ\ÓF]Ó@^Ó;_Ò%_ÑcsÜØ;Ü�y“>Ð$Ð$PðRóð ð ,>Ö> C”�E˜#‘J•Ò>Ð>Ü�%œÔØ&+Ö,˜d”�D•	Ò,Ð,Ü
Ð@ÄÀYÃÐ@RÐRXÔY]Ð^cÓYd×YmÑYmÐXnÐnoÐpÓ
qÐqùò ?ùâ,s   ÃEÄE
c                ój  — t        | t        t        f«      rt        | «      dk7  rt	        dt        |«      ›d�«      ‚	 t        | d   «      }t        | d   «      }|dk  s|d	vrt	        dt        |«      ›d| ›d
�«      ‚||fS # t        t        f$ r!}t	        dt        |«      ›d| ›d�«      |‚d}~ww xY w)z7Validate and normalize a YOLO pose ``kpt_shape`` entry.é   úYOLO pose data file z2 must define kpt_shape as [num_keypoints, 2_or_3].r   é   z has invalid kpt_shape=z; expected integer values.N)rP   é   z,; expected [positive_num_keypoints, 2_or_3].)r3   r!   ÚtuplerE   r5   r6   r(   Ú	TypeError)Úraw_kpt_shaperF   Únum_keypointsr)   Úexcs        r$   Ú_validate_yolo_kpt_shaperY   “   så   € ä�m¤d¬E ]Ô3´s¸=Ó7IÈQÒ7NÜÐ/´°I³Ð/AÐAsÐtÓuÐuðÜ˜M¨!Ñ,Ó-ˆÜ˜=¨Ñ+Ó,ˆð
 ˜Ò˜\°Ñ7ÜØ"¤3 y£>Ð"4Ð4KÈMÐK\ð ]9ð 9ó
ð 	
ð ˜,Ð&Ð&øô ”zÐ"ò ÜØ"¤3 y£>Ð"4Ð4KÈMÐK\Ð\vÐwó
àð	ûðús   ¾B ÂB2ÂB-Â-B2c                ó–  — | j                  d«      }d}t        |t        «      r$|r"|j                  d|j                  d«      «      }nt        |t        «      r|}|€t	        |«      D �cg c]  }d|› �‘Œ	 c}S t        |t        «      rt        |«      |k7  rt        d|› d|›d�«      ‚|D �cg c]  }t        |«      ‘Œ c}S c c}w c c}w )	z>Extract YOLO keypoint names or synthesize stable placeholders.Ú	kpt_namesNr   Ú0Ú	keypoint_z?YOLO pose kpt_names length must match kpt_shape keypoint count r.   r/   )r>   r3   r4   r!   rD   rE   r5   r6   )r:   rW   Úraw_kpt_namesr&   rL   rM   s         r$   Ú_extract_yolo_keypoint_namesr_   ¦   sË   € à—H‘H˜[Ó)€MØ€NÜ�-¤Ô&©=Ø&×*Ñ*¨1¨m×.?Ñ.?ÀÓ.DÓE‰Ü	�M¤4Ô	(Ø&ˆàÐÜ-2°=Ó-AÖB c�)˜C˜5Ò!ÒBÐBÜ�n¤dÔ+¬s°>Ó/BÀmÒ/SÜØMÈmÈ_Ð\bÐcqÐbtÐtuÐvó
ð 	
ð #1Ö1˜$ŒC��IÒ1Ð1ùò Cùò
 2s   Á)CÂ,Cc                óp  — | j                  d«      }|€g S t        |t        «      rt        |«      |k7  rt	        d|› d�«      ‚	 |D �cg c]  }t        |«      ‘Œ }}t        |«      t        t        |«      «      k7  rt	        d|dz
  › d�«      ‚|S c c}w # t        t        f$ r}t	        d«      |‚d}~ww xY w)	z9Extract and validate optional YOLO ``flip_idx`` metadata.r'   Nz YOLO pose flip_idx must contain z integer indexes.z0YOLO pose flip_idx must contain integer indexes.z/YOLO pose flip_idx must be a permutation of 0..rR   r/   )	r>   r3   r!   rE   r5   r(   rU   rB   rD   )r:   rW   Úraw_flip_idxrL   r'   rX   s         r$   Ú_extract_yolo_flip_idxrb   ¸   sÊ   € à—8‘8˜JÓ'€LØÐØˆ	Ü�l¤DÔ)¬S°Ó->À-Ò-OÜÐ;¸M¸?ÐJ[Ð\Ó]Ð]ðVØ(4Ö5 ”C˜•HÐ5ˆÐ5ô ˆhÓœ4¤ mÓ 4Ó5Ò5ÜÐJÈ=Ð[\ÑK\ÐJ]Ð]^Ð_Ó`Ð`Ø€Oùò 6øÜ”zÐ"ò VÜÐKÓLÐRUÐUûðVús*   ÁB ÁBÁB ÂB ÂB5Â$B0Â0B5c                óþ   — g }t        «       }t        | «      D ]b  \  }}||v s	||v s||k(  r|j                  |«       Œ%|t        | «      k  sŒ4| |   |k(  sŒ=|j	                  ||g«       |j                  ||h«       Œd |S )aK  Convert a YOLO flip_idx permutation to flat swap pairs.

    Args:
        flip_idx: Full permutation where ``flip_idx[i]`` is the horizontal mirror of joint ``i``.

    Returns:
        Flat list ``[a0, b0, a1, b1, ...]`` of left/right joint index pairs.

    Example:
        >>> _flip_idx_to_pairs([0, 2, 1])
        [1, 2]
    )rC   Ú	enumerateÚaddrE   ÚextendÚupdate)r'   ÚpairsÚseenrL   Ú
mirror_idxs        r$   Ú_flip_idx_to_pairsrk   È   sŒ   € ð €EÜ“U€DÜ$ XÓ.ò +‰ˆˆZØ�$‰;˜*¨Ñ,°°zÒ0AØ�H‰H�SŒMØØœ˜H›Ó%¨(°:Ñ*>À#Ó*EØ�L‰L˜#˜zÐ*Ô+Ø�K‰K˜˜jÐ)Õ*ð+ð €Lr#   c                ó˜   — t        j                  ddt        | «      j                  «       j	                  «       «      j                  d«      S )z0Normalize a keypoint name for symmetry matching.z
[^a-z0-9]+Ú_)ÚreÚsubr6   ÚstripÚlower)rM   s    r$   Ú_normalize_keypoint_namerr   á   s4   € ä�6‰6�- ¤c¨$£i§o¡oÓ&7×&=Ñ&=Ó&?Ó@×FÑFÀsÓKÐKr#   c                óà   — | j                  d«      }|j                  d«      }|j                  d«      }||z   dk7  ry|D �cg c]  }|dk(  rdn|dk(  rdn|‘Œ }}dj                  |«      S c c}w )zAReturn the left/right counterpart for a normalized keypoint name.rm   ÚleftÚrightrR   N)ÚsplitÚcountÚjoin)Únormalized_nameÚtokensÚ
left_countÚright_countÚtokenÚmirror_tokenss         r$   Ú_mirror_keypoint_namer   æ   s|   € à×"Ñ" 3Ó'€FØ—‘˜fÓ%€JØ—,‘,˜wÓ'€KØ�KÑ 1Ò$ØàhnÖoÐ_d ¨¢‘W¸uÈÒ?O±VÐUZÑZÐo€MÐoØ�8‰8�MÓ"Ð"ùò ps   ÁA+c                ó(  — | D �cg c]  }t        |«      ‘Œ }}t        t        |«      «      t        |«      k7  rg S t        |«      D ��ci c]  \  }}||“Œ
 }}}g }t        «       }t        |«      D ]m  \  }}||v rŒt	        |«      }|€Œ|j                  |«      }	|	�	|	|k(  s|	|v rŒ6t	        ||	   «      |k7  rŒH|j                  ||	g«       |j                  ||	h«       Œo |s%| r#t        j                  dt        | «      | dd «       |S c c}w c c}}w )z@Infer horizontal-flip swap pairs from left/right keypoint names.NzÊInferred 0 flip pairs from %d keypoint names %s. Automatic horizontal-flip slot swapping is disabled for this category. Provide keypoint_flip_pairs explicitly if your keypoints have left/right symmetry.é   )
rr   rE   rC   rd   r   r>   rf   rg   ÚloggerÚinfo)
r&   rM   Únormalized_namesrL   Úindex_by_namerh   ri   ry   Úmirror_namerj   s
             r$   Ú%_infer_keypoint_flip_pairs_from_namesr‡   ò   s=  € àCQÖR¸4Ô0°Õ6ÐRÐÐRÜ
Œ3ÐÓ Ó!¤SÐ)9Ó%:Ò:Øˆ	ä09Ð:JÓ0K×L¡9 3¨�T˜3‘YÐL€MÑLØ€EÜ“U€DÜ )Ð*:Ó ;ò 'Ñˆˆ_Ø�$‰;ØÜ+¨OÓ<ˆØÐØØ"×&Ñ& {Ó3ˆ
ØÐ ¨sÒ!2°jÀDÑ6HØÜ Ð!1°*Ñ!=Ó>À/ÒQØØ�‰�c˜:Ð&Ô'Ø�‰�S˜*Ð%Õ&ð'ñ ‘^Ü�‰ðaô �ÓØ˜2˜AÐô	
ð €Lùò9 Sùó Ms   …D	Á	Dc                ó–   ‡— | sg S t        | «      dk(  rt        | d   «      S | d   Št        ˆfd„| dd D «       «      rt        ‰«      S g S )zDReturn one global flip-pair list when all keypoint categories agree.rR   r   c              3  ó(   •K  — | ]	  }|‰k(  –— Œ y ­w)Nr"   )Ú.0rh   Úfirsts     €r$   ú	<genexpr>z6_merge_category_keypoint_flip_pairs.<locals>.<genexpr>  s   øè ø€ Ò
:˜eˆ5�E�>Ñ
:ùs   ƒN)rE   r!   Úall)Úcategory_pairsr‹   s    @r$   Ú#_merge_category_keypoint_flip_pairsr�     sV   ø€ áØˆ	Ü
ˆ>Ó˜aÒÜ�N 1Ñ%Ó&Ð&à˜1Ñ€EÜ
Ó
: ~°a°bÐ'9Ô
:Ô:Ü�E‹{ÐØ€Ir#   c                óâ   — | j                  d¬«      5 }t        j                  |«      }ddd«       t        t        «      s"t        dt        |«      j                  › d�«      ‚|S # 1 sw Y   Œ=xY w)aJ  Load a COCO annotation JSON file.

    Args:
        annotation_path: Path to a COCO annotation JSON file.

    Returns:
        Parsed COCO annotation mapping.

    Raises:
        ValueError: If the JSON root is not an object.
        OSError: If the file cannot be read.

    Example:
        >>> import tempfile
        >>> path = Path(tempfile.mkdtemp()) / "annotations.json"
        >>> _ = path.write_text('{"images": [], "annotations": [], "categories": []}', encoding="utf-8")
        >>> sorted(_load_coco_annotation(path))
        ['annotations', 'categories', 'images']
    r+   r,   Nz3Expected COCO annotation root to be an object, got r/   )r1   ÚjsonÚloadr3   r4   r5   r7   r   )Úannotation_pathr9   r:   s      r$   Ú_load_coco_annotationr”      sj   € ð( 
×	Ñ	 wÐ	Ó	/ð °4Ü�y‰y˜‹ˆ÷ä�dœDÔ!ÜÐNÌtÐTXËz×ObÑObÐNcÐcdÐeÓfÐfØ€K÷	ð ús   “A%Á%A.c                ó:  — t        | t        «      r| st        d«      ‚g }| D ]j  }t        |t        «      s"t        dt	        |«      j
                  › d�«      ‚d|vrt        d«      ‚d|vrt        d|d   ›d�«      ‚|j                  |«       Œl t        |d	„ ¬
«      S )a¬  Validate and sort COCO categories by category id.

    Args:
        categories: Raw ``categories`` value from a COCO annotation file.

    Returns:
        Category dictionaries sorted by ``id``.

    Raises:
        ValueError: If categories are missing or malformed.

    Example:
        >>> _validate_categories([{"id": 2, "name": "b"}, {"id": 1, "name": "a"}])
        [{'id': 1, 'name': 'a'}, {'id': 2, 'name': 'b'}]
    zCExpected COCO annotations to contain a non-empty 'categories' list.z1Expected each COCO category to be an object, got r/   Úidz5Expected each COCO category to contain an 'id' field.rM   zExpected COCO category_id z to contain a 'name' field.c                ó   — t        | d   «      S )Nr–   )r(   )Úitems    r$   ú<lambda>z&_validate_categories.<locals>.<lambda>W  s   € ¬c°$°t±*«o€ r#   )rI   )r3   r!   r5   r4   r7   r   rA   rB   )Ú
categoriesÚ	validatedÚcategorys      r$   Ú_validate_categoriesr�   ;  s³   € ô  �j¤$Ô'©zÜÐ^Ó_Ð_à&(€IØò #ˆÜ˜(¤DÔ)ÜÐPÔQUÐV^ÓQ_×QhÑQhÐPiÐijÐkÓlÐlØ�xÑÜÐTÓUÐUØ˜Ñ!ÜÐ9¸(À4¹.Ð9KÐKfÐgÓhÐhØ×Ñ˜Õ"ð#ô �)Ñ!=Ô>Ð>r#   c                ó®   — t        | t        «      st        d«      ‚| D ]4  }t        |t        «      rŒt        dt	        |«      j
                  › d�«      ‚ | S )ag  Validate COCO annotations container type.

    Args:
        annotations: Raw ``annotations`` value from a COCO annotation file.

    Returns:
        COCO annotation dictionaries.

    Raises:
        ValueError: If annotations are not a list of objects.

    Example:
        >>> _validate_annotations([{"category_id": 1}])
        [{'category_id': 1}]
    z;Expected COCO annotations to contain an 'annotations' list.z3Expected each COCO annotation to be an object, got r/   )r3   r!   r5   r4   r7   r   )r   Ú
annotations     r$   Ú_validate_annotationsr    Z  sa   € ô  �k¤4Ô(ÜÐVÓWÐWØ!ò qˆ
Ü˜*¤dÕ+ÜÐRÔSWÐXbÓSc×SlÑSlÐRmÐmnÐoÓpÐpðqð Ðr#   c           	     ó2  — d}| D ]�  }t        |j                  dd«      «      |k7  rŒ"|j                  d«      }|�|g k(  rŒ;t        |t        «      sŒLt	        |«      dz  dk7  rt        d|›dt	        |«      › d�«      ‚t        |t	        |«      dz  «      }Œ‘ |S )	a  Infer keypoint count for one category from annotation vectors.

    Args:
        annotations: COCO annotation dictionaries.
        category_id: Category id whose annotations should be inspected.

    Returns:
        Maximum keypoint vector length found for the category.

    Raises:
        ValueError: If keypoint annotation length is not divisible by three.

    Example:
        >>> anns = [{"category_id": 1, "keypoints": [1, 2, 2, 3, 4, 2]}]
        >>> _keypoint_count_from_annotations(anns, 1)
        2
    r   Úcategory_idéÿÿÿÿÚ	keypointsrS   z COCO annotation for category_id z has zL keypoint values; expected a flat [x, y, v] list with length divisible by 3.)r(   r>   r3   r!   rE   r5   Úmax)r   r¢   Úkeypoint_countrŸ   Úraw_keypointss        r$   Ú _keypoint_count_from_annotationsr¨   r  s¿   € ð$ €NØ!ò Fˆ
Üˆz�~‰~˜m¨RÓ0Ó1°[Ò@ØØ"Ÿ™ {Ó3ˆØÐ  M°RÒ$7ØÜ˜-¬Ô.ØÜˆ}Ó Ñ! QÒ&ÜØ2°;°/ÀÄsÈ=ÓGYÐFZð [Mð Móð ô ˜^¬S°Ó-?À1Ñ-DÓE‰ðFð Ðr#   gš™™™™™¹?)Úkeypoint_oks_sigmac               óœ  — t        | «      }t        |«      }t        |d   «      }t        |j	                  dg «      «      }g }g }g }|D ]¹  }	t        |	d   «      }
|j                  t        |	d   «      «       |	j	                  d«      }t        |t        «      r7|r5|j                  t        |«      «       |j                  t        |«      «       Œ†t        ||
«      }|j                  |«       |dkD  sŒ©|j                  g «       Œ» t        d„ |D «       «      st        d|› d	�«      ‚t        |d¬
«      }t!        |||g|z  t#        |«      ¬«      S )aZ  Infer a keypoint schema from a COCO annotation JSON file.

    Args:
        annotation_path: Path to a COCO annotation JSON file.
        keypoint_oks_sigma: Default OKS sigma to repeat for the largest keypoint class.

    Returns:
        Category-aligned class names, ``num_keypoints_per_class``, and OKS sigmas.

    Raises:
        FileNotFoundError: If the annotation file does not exist.
        ValueError: If the annotation file has no categories, no keypoint metadata,
            malformed COCO fields, or malformed keypoint vectors.
        KeyError: If required COCO keys are missing.
    rš   r   r–   rM   r¤   r   c              3  ó&   K  — | ]	  }|d kD  –— Œ y­w)r   Nr"   )rŠ   rw   s     r$   rŒ   z-infer_coco_keypoint_schema.<locals>.<genexpr>¿  s   è ø€ Ò>˜Uˆu�q�yÑ>ùs   ‚zCOCO annotation file 'za' has no keypoint metadata. Expected category 'keypoints' entries or annotation keypoint vectors.)Údefault)r   r   r   r   )r   r”   r�   r    r>   r(   rA   r6   r3   r!   rE   r‡   r¨   Úanyr5   r¥   r	   r�   )r“   r©   Úpathr:   rš   r   r   r   Úcategory_flip_pairsrœ   r¢   Úcategory_keypointsÚinferred_countÚmax_keypointss                 r$   r   r   –  s_  € ô( �Ó €DÜ  Ó&€DÜ% d¨<Ñ&8Ó9€JÜ'¨¯©°ÀÓ(CÓD€Kà€KØ)+ÐØ+-ÐØò /ˆÜ˜( 4™.Ó)ˆØ×Ñœ3˜x¨Ñ/Ó0Ô1Ø%Ÿ\™\¨+Ó6ÐÜÐ(¬$Ô/Ñ4FØ#×*Ñ*¬3Ð/AÓ+BÔCØ×&Ñ&Ô'LÐM_Ó'`Õaä=¸kÈ;ÓWˆNØ#×*Ñ*¨>Ô:Ø Ó!Ø#×*Ñ*¨2Õ.ð/ô Ñ>Ð&=Ô>Ô>ÜØ$ T Fð +Tð Tó
ð 	
ô
 Ð/¸Ô;€MÜØØ 7Ø/Ð0°=Ñ@Ü?Ð@SÓTô	ð r#   c               ó*  — t        | «      }t        |«      }t        ||«      }d|vrt        dt	        |«      ›d�«      ‚t        |d   |«      \  }}t        ||«      }t        ||«      }t        ||gt        |«      z  |g|z  |||t        |«      ¬«      S )aø  Infer a keypoint schema from an Ultralytics YOLO pose YAML file.

    Args:
        data_file: Path to a YOLO ``data.yaml`` or ``data.yml`` file.
        keypoint_oks_sigma: Default OKS sigma to repeat for the global keypoint count.

    Returns:
        Class-aligned keypoint counts plus optional YOLO keypoint names and flip indexes.

    Raises:
        FileNotFoundError: If the YAML file does not exist.
        ValueError: If required YOLO pose fields are missing or malformed.

    Example:
        >>> import tempfile
        >>> path = Path(tempfile.mkdtemp()) / "data.yaml"
        >>> _ = path.write_text("names: [person]\nkpt_shape: [1, 3]\n", encoding="utf-8")
        >>> infer_yolo_keypoint_schema(path).num_keypoints_per_class
        [1]
    Ú	kpt_shaperQ   z( is missing required kpt_shape metadata.)r   r   r   r&   r'   r)   r   )r   r;   rN   r5   r6   rY   r_   rb   r   rE   rk   )	rF   r©   r®   r:   r   rW   r)   r&   r'   s	            r$   r   r   Î  s®   € ô2 �	‹?€DÜ˜dÓ#€DÜ5°d¸DÓA€KØ˜$ÑÜÐ/´°D³	¨}Ð<dÐeÓfÐfÜ":¸4ÀÑ;LÈdÓ"SÑ€M�<Ü1°$¸ÓF€NÜ% d¨MÓ:€HÜØØ!. ´#°kÓ2BÑ BØ/Ð0°=Ñ@Ø%ØØ!Ü.¨xÓ8ôð r#   c                ó8   — | D �cg c]
  }|dkD  sŒ	|‘Œ c}S c c}w )a<  Return non-zero keypoint counts from a model schema.

    Args:
        num_keypoints_per_class: Model keypoint schema.

    Returns:
        Positive keypoint counts in schema order.

    Raises:
        This helper does not raise.

    Example:
        >>> active_keypoint_counts([0, 17, 25])
        [17, 25]
    r   r"   )r   rw   s     r$   r   r   ú  s   € ð   7ÖD�e¸%À!»)ŠEÒDÐDùÒDs   …
�)r8   r   Úreturnúdict[str, Any])r:   r·   rF   r   r¶   r   )rV   r   rF   r   r¶   ztuple[int, int])r:   r·   rW   r(   r¶   r   )r:   r·   rW   r(   r¶   r   )r'   r   r¶   r   )rM   r   r¶   r6   )ry   r6   r¶   z
str | None)r&   z	list[Any]r¶   r   )rŽ   zlist[list[int]]r¶   r   )r“   r   r¶   r·   )rš   r   r¶   úlist[dict[str, Any]])r   r   r¶   r¸   )r   r¸   r¢   r(   r¶   r(   )r“   ú
str | Pathr©   Úfloatr¶   r	   )rF   r¹   r©   rº   r¶   r   )r   r   r¶   r   )$r   Ú
__future__r   r‘   rn   Údataclassesr   r   Úpathlibr   Útypingr   Úrfdetr.utilities.loggerr   r‚   Ú__all__r	   r   r
   r;   rN   rY   r_   rb   rk   rr   r   r‡   r�   r”   r�   r    r¨   r   r   r   r"   r#   r$   ú<module>rÁ      s  ðñ ;å "ã Û 	ß (Ý Ý å .á	‹€ò€ñ �$˜dÔ#÷Að Aó $ðAñ4 �$˜dÔ#÷Að Aó $ðAð@ $Ð&8Ñ8€óó:ró2'ó&2ó$ó ó2Ló
	#óóB
óó6?ó>ó0!ðN !$ñ5Øð5ð ð5ð ó	5ðv !$ñ)Øð)ð ð)ð ó	)ôXEr#   