Ë
    ëÓ^jÚQ  ã                  ó”  — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlZddlmZ ddlmZmZmZmZ dd	lmZ  ej0                  e«      Z ed
¬«       G d„ d«      «       Z e«       Zeeedf   z  ee ef   z  Z!d-d„Z"g d¢Z#ejH                  ejJ                  ejL                  dœZ'	 	 	 	 	 	 	 	 	 	 	 	 d.d„Z(d/d„Z)	 	 	 d0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1d„Z*d2d„Z+	 d3	 	 	 	 	 	 	 	 	 	 	 	 	 d4d„Z,ddddedf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d5d„Z-edk(  r²ddl.Z. e.j^                  d¬ «      Z0e0jc                  d!e d"d#¬$«       e0jc                  d%e2d&d'¬$«       e0jc                  d(e2dd)¬$«       e0jc                  d*e ddgdd+¬,«       e0jg                  «       Z4 e-e4jj                  e4jl                  e4jn                  e4jp                  «       yy)6z2Synthetic dataset generation with COCO formatting.é    )ÚannotationsN)Ú	dataclass)ÚPath)ÚLiteral)ÚImage)ÚColorÚ
DetectionsÚbox_iou_batchÚdraw_filled_polygon)ÚtqdmT)Úfrozenc                  óJ   — e Zd ZU dZdZded<   dZded<   dZded<   d	„ Zdd
„Z	y)ÚDatasetSplitRatiosa,  Dataclass for dataset split ratios.

    Attributes:
        train: Ratio for training set (default: 0.7)
        val: Ratio for validation set (default: 0.2)
        test: Ratio for test set (default: 0.1)

    Raises:
        ValueError: If ratios are negative or sum is not approximately 1.0.
    gffffffæ?ÚfloatÚtraingš™™™™™É?Úvalçš™™™™™¹?Útestc                óP  — | j                   | j                  z   | j                  z   }t        d„ | j                   | j                  | j                  fD «       «      r2t	        d| j                   › d| j                  › d| j                  › �«      ‚d|cxk  rdk  sn t	        d|› �«      ‚y)	zCValidate that ratios sum to approximately 1.0 and are non-negative.c              3  ó&   K  — | ]	  }|d k  –— Œ y­w©r   N© )Ú.0Úrs     úd/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/datasets/synthetic.pyú	<genexpr>z3DatasetSplitRatios.__post_init__.<locals>.<genexpr>0   s   è ø€ Ò@˜ˆq�1�uÑ@ùó   ‚z-Split ratios must be non-negative, got train=z, val=z, test=ç®Gáz®ï?ç)\�Âõ(ð?ú"Split ratios must sum to 1.0, got N)r   r   r   ÚanyÚ
ValueError)ÚselfÚtotals     r   Ú__post_init__z DatasetSplitRatios.__post_init__-   s�   € à—
‘
˜TŸX™XÑ%¨¯	©	Ñ1ˆÜÑ@˜tŸz™z¨4¯8©8°T·Y±YÐ?Ô@Ô@ÜØ?ÀÇ
Á
¸|È6ÐRV×RZÑRZÐQ[Ð[bÐcg×clÑclÐbmÐnóð ð �uÔ$ Ô$ÜÐAÀ%ÀÐIÓJÐJð %ó    c                ó¦   — | j                   | j                  | j                  dœj                  «       D ��ci c]  \  }}|dkD  sŒ||“Œ c}}S c c}}w )z1Convert to dictionary, filtering out zero ratios.©r   r   r   r   )r   r   r   Úitems)r#   ÚkÚvs      r   Úto_dictzDatasetSplitRatios.to_dict7   sF   € à+/¯:©:¸d¿h¹hÐPT×PYÑPYÑ!Z×!`Ñ!`Ó!b×l™˜˜AÐfgÐjkÓfk��1‘ÓlÐlùÓls   ¶AÁAN)Úreturnúdict[str, float])
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r%   r,   r   r&   r   r   r      s3   … ñ	ð €Eˆ5ÓØ€CˆÓØ€Dˆ%ÓòKômr&   r   .c                ó¦  — t        | t        «      r| j                  «       S t        | t        «      r—t	        | «      dk(  r| d   | d   dœ}n5t	        | «      dk(  r| d   | d   | d   dœ}nt        dt	        | «      › �«      ‚t        d„ | D «       «      rt        d	| › �«      ‚t        | «      }d
|cxk  rdk  sn t        d|› �«      ‚|S t        | t        «      rdt        d„ | j                  «       D «       «      rt        d	| › �«      ‚t        | j                  «       «      }d
|cxk  rdk  sn t        d|› �«      ‚| S t        dt        | «      › �«      ‚)a„  Normalize split ratios parameter to a dictionary.

    Args:
        split_ratios: Can be:
            - DatasetSplitRatios dataclass instance
            - Tuple of floats (e.g., (0.7, 0.2, 0.1) for train/val/test)
            - Dictionary (legacy support)

    Returns:
        Dictionary mapping split names to ratios.

    Raises:
        ValueError: If split ratios are invalid.
    é   r   é   )r   r   é   r(   z2Split ratios tuple must have 2 or 3 elements, got c              3  ó&   K  — | ]	  }|d k  –— Œ y­wr   r   )r   Úratios     r   r   z*_normalize_split_ratios.<locals>.<genexpr>_   s   è ø€ Ò3˜Uˆu�q�yÑ3ùr   z'Split ratios must be non-negative, got r   r   r    c              3  ó&   K  — | ]	  }|d k  –— Œ y­wr   r   )r   Úvalues     r   r   z*_normalize_split_ratios.<locals>.<genexpr>h   s   è ø€ Ò<˜Uˆu�q�yÑ<ùr   z=split_ratios must be DatasetSplitRatios, tuple, or dict, got )Ú
isinstancer   r,   ÚtupleÚlenr"   r!   ÚsumÚdictÚvaluesÚ	TypeErrorÚtype)Úsplit_ratiosÚresultr$   s      r   Ú_normalize_split_ratiosrF   D   sd  € ô �,Ô 2Ô3Ø×#Ñ#Ó%Ð%ä�,¤Ô&Üˆ|Ó Ò!Ø+¨A™°|ÀA±ÑG‰FÜ�Ó !Ò#Ø+¨A™°|ÀA±ÐP\Ð]^ÑP_Ñ`‰FäÐQÔRUÐVbÓRcÐQdÐeÓfÐfô Ñ3 lÔ3Ô3ÜÐFÀ|ÀnÐUÓVÐVÜ�LÓ!ˆØ�uÔ$ Ô$ÜÐAÀ%ÀÐIÓJÐJØˆä�,¤Ô%äÑ< l×&9Ñ&9Ó&;Ô<Ô<ÜÐFÀ|ÀnÐUÓVÐVÜ�L×'Ñ'Ó)Ó*ˆØ�uÔ$ Ô$ÜÐAÀ%ÀÐIÓJÐJØÐä
ÐSÔTXÐYeÓTfÐSgÐhÓ
iÐir&   )ÚsquareÚtriangleÚcircle)ÚredÚgreenÚblueÚshapeÚcolorc                óÐ  — |\  }}|dz  }|dk(  r#||z
  ||z
  }	}||z   ||z   }}
||	g|
|	g|
|g||gg}nÔ|dk(  r5t        |dz  «      }||d|z  dz  z
  g||z
  ||dz  z   g||z   ||dz  z   gg}nš|dk(  r‘|}d}t        |«      D �cg c]x  }t        ||t        j                  dt        j                  z  |z  |z  «      z  z   «      t        ||t        j
                  dt        j                  z  |z  |z  «      z  z   «      g‘Œz }}n| g fS t        | t        j                  |t        j                  ¬«      |¬	«      } |D ��cg c]  }|D ]  }t        |«      ‘Œ Œ }}}| |fS c c}w c c}}w )
uš  Draw a geometric shape on an image and return its COCO polygon.

    The polygon is computed first, then used for both rendering and annotation, so the two are always identical.

    Args:
        img: Input image array to draw on.
        shape: Shape to draw (``"square"``, ``"triangle"``, or ``"circle"``).
        color: supervision Color object.
        center: Center position ``(cx, cy)``.
        size: Size of the shape.

    Returns:
        Tuple of ``(image_with_shape, polygon)`` where ``polygon`` is a flat list ``[x1, y1, x2, y2, â€¦]`` suitable for
        the COCO ``segmentation`` field.  Returns an empty polygon list for unknown shape names.
    r5   rG   rH   g      è?r7   rI   é    ©Údtype)ÚsceneÚpolygonrN   )ÚintÚrangeÚmathÚcosÚpiÚsinr   ÚnpÚarrayÚint32r   )ÚimgrM   rN   ÚcenterÚsizeÚcxÚcyÚ	half_sizeÚx1Úy1Úx2Úy2ÚptsÚheightr   Ún_ptsÚiÚptr+   rT   s                       r   Údraw_synthetic_shaperm   x   s°  € ð$ �F€BˆØ˜‘	€Ià�ÒØ�i‘  i¡ˆBˆØ�i‘  i¡ˆBˆØ�Bˆx˜"˜b˜ B¨ 8¨b°"¨XÐ6‰Ø	�*Ò	ä�T˜D‘[Ó!ˆà��a˜&‘j A‘oÑ%Ð&Ø�)‰^˜R &¨A¡+Ñ-Ð.Ø�)‰^˜R &¨A¡+Ñ-Ð.ð
‰ð
 
�(Ò	ØˆØˆô ˜5“\ö
àô ��aœ$Ÿ(™( 1¤t§w¡w¡;°¡?°UÑ#:Ó;Ñ;Ñ;Ó<¼cÀ"ÀqÌ4Ï8É8ÐTUÔX\×X_ÑX_ÑT_ÐbcÑTcÐfkÑTkÓKlÑGlÑBlÓ>mÒnð
ˆñ 
ð
 �Bˆwˆä
 C´·±¸#ÄRÇXÁXÔ1NÐV[Ô
\€CØ"%×2˜B¨rÒ2¨!Œu�Q�xÐ2ˆxÐ2€GÑ2Ø�ˆ<Ðùò
ùó 3s   ÂA=EÄ=E"c                óÔ   — | \  }}}}t        |d«      }t        |d«      }t        ||«      }t        ||«      }	||kD  r|	|kD  r||z
  |	|z
  z  }
nd}
||z
  ||z
  z  }|dkD  rd|
|z  z
  S dS )aO  Calculate how much of a bounding box is outside the image boundaries.

    Args:
        bbox: Bounding box in [x_min, y_min, x_max, y_max] format.
        img_size: Size of the image.

    Returns:
        Overlap fraction in ``[0, 1]``: ``0.0`` means the box is fully inside the image; ``1.0`` means it is fully
        outside.
    r   ç        g      ð?)ÚmaxÚmin)ÚbboxÚimg_sizeÚx_minÚy_minÚx_maxÚy_maxÚinside_x_minÚinside_y_minÚinside_x_maxÚinside_y_maxÚinside_areaÚ
total_areas               r   Úcalculate_boundary_overlapr~   ¨   s•   € ð "&Ñ€Eˆ5�%˜ä�u˜a“=€LÜ�u˜a“=€LÜ�u˜hÓ'€LÜ�u˜hÓ'€Là�lÒ" |°lÒ'BØ# lÑ2°|ÀlÑ7RÑS‰àˆà˜%‘- E¨E¡MÑ2€JØ/9¸Aª~ˆ3�+ 
Ñ*Ñ+ÐFÀ3ÐFr&   c                ó:  — t        j                  | | dft         j                  ¬«      dz  }t        t        j                  «       «      }t        j                  ||«      }	g }
g }g }d}d}t        |	«      D �]û  }t        j                  t        «      }t        j                  |«      }t        |   }|dk(  rt        j                  |«      }n|j                  |«      }t        dt        | |z  «      «      }t        |dz   t        | |z  «      «      }d}t        d	«      D �]A  }t        j                  ||«      }t        j                  |d
z  | |d
z  z
  «      }t        j                  |d
z  | |d
z  z
  «      }t        j                  t        ||d
z  z
  «      t        ||d
z  z
  «      t        ||d
z  z   «      t        ||d
z  z   «      g«      }t!        || «      dkD  rŒ½t#        |
«      dkD  rPt%        t        j                  |g«      t        j                  |
«      «      d   }t        j&                  ||kD  «      r�Œt)        |||||f|«      \  }}t        j*                  |t        ¬«      j-                  dd
«      }t        t        j.                  |dd…df   «      «      }t        t        j.                  |dd…df   «      «      }t        t        j                  |dd…df   «      «      } t        t        j                  |dd…df   «      «      }!t        j                  ||| |!gt        ¬«      }"|
j1                  |"«       |j1                  |«       |j1                  |«       d} n |r�Œð|dz  }||k\  s�Œü n t        j2                  t#        |«      t4        ¬«      }#t7        |«      D ]
  \  }$}%|%|#|$<   Œ t9        |
rt        j                  |
«      nt        j2                  d«      |rt        j                  |«      nt        j2                  dt        ¬«      d|#i¬«      }&||&fS )uð  Generate a single synthetic image and its detections.

    Args:
        img_size: Side length of the square output image.
        min_objects: Minimum number of objects to attempt placing.
        max_objects: Maximum number of objects to attempt placing.
        class_mode: ``"shape"`` assigns class IDs by shape type;
            ``"color"`` assigns class IDs by colour.
        min_size_ratio: Minimum object size as a fraction of ``img_size``.
        max_size_ratio: Maximum object size as a fraction of ``img_size``.
        overlap_threshold: Maximum allowed IoU between any two objects before
            a placement attempt is rejected.

    Returns:
        Tuple of ``(image, detections)`` where ``image`` is an ``(img_size, img_size, 3)`` uint8 array and
        ``detections`` is an :class:`Detections` instance whose ``data["polygons"]`` field contains one flat ``[x1,
        y1, x2, y2, â€¦]`` polygon list per detection, matching the geometry returned by :func:`draw_synthetic_shape`.
    r7   rQ   é€   r   rM   é
   r6   Féd   r5   gš™™™™™©?éÿÿÿÿNT)r   é   )r   Úpolygons)ÚxyxyÚclass_idÚdata)r[   ÚonesÚuint8ÚlistÚSYNTHETIC_COLORSÚkeysÚrandomÚrandintrV   ÚchoiceÚSYNTHETIC_SHAPESÚindexrp   rU   r\   r   r~   r>   r
   r!   rm   ÚasarrayÚreshaperq   ÚappendÚemptyÚobjectÚ	enumerater	   )'rs   Úmin_objectsÚmax_objectsÚ
class_modeÚmin_size_ratioÚmax_size_ratioÚoverlap_thresholdr^   Úcolor_namesÚnum_objectsÚxyxysÚ	class_idsr…   Úfailed_attemptsÚmax_failed_attemptsÚ_rM   Ú
color_namerN   Úcategory_idÚmin_sizeÚmax_sizeÚplacedÚobj_sizera   rb   rr   ÚiousrT   Úpolygon_arrayÚ
poly_x_minÚ
poly_y_minÚ
poly_x_maxÚ
poly_y_maxÚbbox_from_polygonÚpolygon_datark   ÚpolyÚ
detectionss'                                          r   Úgenerate_synthetic_sampler¶   Ã   s§  € ô6 �'‰'�8˜X qÐ)´·±Ô
:¸SÑ
@€CÜÔ'×,Ñ,Ó.Ó/€KÜ—.‘. ¨kÓ:€Kà€EØ€IØ"$€HØ€OØÐä�;Óó 4ˆÜ—‘Ô.Ó/ˆÜ—]‘] ;Ó/ˆ
Ü  Ñ,ˆà˜Ò Ü*×0Ñ0°Ó7‰Kà%×+Ñ+¨JÓ7ˆKä�rœ3˜x¨.Ñ8Ó9Ó:ˆÜ�x !‘|¤S¨°NÑ)BÓ%CÓDˆàˆÜ�s“ó  	ˆAÜ—~‘~ h°Ó9ˆHÜ—‘ ¨A¡¨x¸(Àa¹-Ñ/GÓHˆBÜ—‘ ¨A¡¨x¸(Àa¹-Ñ/GÓHˆBô —8‘8Ü�r˜H q™LÑ(Ó)¬5°°hÀ±lÑ1BÓ+CÄUÈ2ÐPXÐ[\ÑP\ÑK\ÓE]Ô_dÐegÐjrÐuvÑjvÑevÓ_wÐxóˆDô *¨$°Ó9¸DÒ@Øä�5‹z˜AŠ~Ü$¤R§X¡X¨t¨fÓ%5´r·x±xÀ³ÓGÈÑJ�Ü—6‘6˜$Ð!2Ñ2Ô3Ùä/°°U¸EÀBÈÀ8ÈXÓV‰LˆC�ô ŸJ™J w´eÔ<×DÑDÀRÈÓKˆMÜœrŸv™v m²A°q°DÑ&9Ó:Ó;ˆJÜœrŸv™v m²A°q°DÑ&9Ó:Ó;ˆJÜœrŸv™v m²A°q°DÑ&9Ó:Ó;ˆJÜœrŸv™v m²A°q°DÑ&9Ó:Ó;ˆJÜ "§¡¨*°jÀ*ÈjÐ)YÔafÔ gÐà�L‰LÐ*Ô+Ø×Ñ˜[Ô)Ø�O‰O˜GÔ$ØˆFÙðA 	óF Ø˜qÑ ˆOØÐ"5Ô5Ùði4ôl —8‘8œC 	›N´&Ô9€LÜ˜XÓ&ò ‰ˆˆ4Øˆ�QŠðô Ù %ŒR�X‰X�eŒ_¬2¯8©8°FÓ+;Ù(1”—‘˜)Ô$´r·x±xÀÌCÔ7PØ˜,Ð'ô€Jð
 �
ˆ?Ðr&   c                ó�  — t        | «      dk  st        | «      dz  dk7  ryt        j                  | t        ¬«      j	                  dd«      }|dd…df   }|dd…df   }t        d	t        t        j                  |t        j                  |d«      «      t        j                  |t        j                  |d«      «      z
  «      z  «      S )
z8Calculate polygon area from COCO-style flat coordinates.é   r5   r   ro   rQ   rƒ   Nr6   g      à?)r>   r[   r“   r   r”   ÚabsÚdotÚroll)rT   ÚpointsÚx_coordsÚy_coordss       r   Ú_calculate_polygon_arear¿   *  s£   € ä
ˆ7ƒ|�aÒœ3˜w›<¨!Ñ+¨qÒ0Øä�Z‰Z˜¤uÔ-×5Ñ5°b¸!Ó<€FØ’a˜�d‰|€HØ’a˜�d‰|€HÜ�”sœ2Ÿ6™6 (¬B¯G©G°H¸bÓ,AÓBÄRÇVÁVÈHÔVX×V]ÑV]Ð^fÐhjÓVkÓElÑlÓmÑmÓnÐnr&   Fc                ób  — t        |«      t        |«      k7  r#t        dt        |«      › dt        |«      › �«      ‚t        |«      D ��cg c]  \  }}|dz  dz   |ddœ‘Œ }}}g }	g }
d}t        t        ||«      d¬«      D �]ç  \  }\  }}|	j	                  |t        |«      j                  ||dœ«       |rp|j                  j                  d	«      }|€t        d|› d|› d�«      ‚t        |«      t        |«      k  rEt        dt        |«      › dt        |«      › d|› d|› d�	«      ‚t        j                  dt        ¬«      }t        t        |«      «      D �]  }d„ |j                  |   D «       \  }}}}||z
  ||z
  }}t        |j                  |   «      }|dk  s|t        |«      k\  r(t        dj!                  ||||t        |«      ¬«      «      ‚|dz  dz   }||z  }|rb|t        |«      k  r||   nd
}|�Ht#        |d«      r<t        |«      dkD  r.|D �cg c]  }t%        |«      ‘Œ }}|g}t'        |«      }|dkD  r|}ng }ng }|
j	                  |||||||g|d|dœ«       |dz  }�Œ �Œê t)        | d«      5 }t+        j,                  |	|
|dœ|«       d
d
d
«       y
c c}}w c c}w # 1 sw Y   y
xY w)u*  Write a synthetic COCO JSON file.

    Category IDs use sparse 1-based encoding (index * 2 + 1 â†’ 1, 3, 5, â€¦) so synthetic data exercises the same
    ``cat2label`` remapping path that real COCO datasets use.

    Args:
        annotations_path: Destination path for the JSON file.
        classes: Ordered list of class names.
        file_paths: Ordered list of absolute image file paths (one per image).
        detections_list: Detections for each image in the same order.
        img_size: Side length of the square images (width = height = img_size).
        with_segmentation: When ``True`` each annotation includes a
            ``segmentation`` polygon taken from ``detections.data["polygons"]`` (populated by
            :func:`generate_synthetic_sample`).  When ``False`` the field is an empty list.

    Raises:
        ValueError: If ``file_paths`` and ``detections_list`` have different
            lengths.
        ValueError: If ``with_segmentation=True`` and a detections entry has
            no ``"polygons"`` key in its ``data`` dict.
        ValueError: If ``with_segmentation=True`` and the ``"polygons"`` array
            has fewer entries than there are detections for that image.
        ValueError: If any detection has a ``class_id`` outside the range
            ``[0, len(classes))``.
    zBfile_paths and detections_list must have the same length, but got z and r5   r6   Ú	synthetic)ÚidÚnameÚsupercategory)Ústart)rÂ   Ú	file_nameÚwidthri   r…   NzRwith_segmentation=True but no 'polygons' found in detections.data for image index z (file: ú)zlwith_segmentation=True requires a polygon entry for every detection (one per detection index), but got only z polygon entries for z detections in image index r   rQ   c              3  ó2   K  — | ]  }t        |«      –— Œ y ­w)N)r   )r   r+   s     r   r   z#_write_coco_json.<locals>.<genexpr>z  s   è ø€ ÒI¨1œe AŸhÑIùs   ‚z�Invalid class_id {class_id} for detection index {det_idx} in image index {img_id} (file: {file_path}); expected 0 <= class_id < {num_classes})r‡   Údet_idxÚimg_idÚ	file_pathÚnum_classesÚ__len__ro   )rÂ   Úimage_idr§   rr   ÚareaÚiscrowdÚsegmentationÚw)Úimagesr   Ú
categories)r>   r"   r˜   Úzipr•   r   rÃ   rˆ   Úgetr[   r–   r—   rV   r†   rU   r‡   ÚformatÚhasattrr   r¿   ÚopenÚjsonÚdump) Úannotations_pathÚclassesÚ
file_pathsÚdetections_listrs   Úwith_segmentationÚidxrÃ   rÕ   Úimages_listÚannotations_listÚann_idrË   rÌ   rµ   r³   rÊ   rd   re   rf   rg   rÓ   Úh_boxr‡   r§   Úannotation_arear´   r;   Ú	poly_listrÒ   Úpolygon_areaÚfhs                                    r   Ú_write_coco_jsonrë   5  sF  € ôB ˆ:ƒœ#˜oÓ.Ò.ÜðÜ˜:“Ð' u¬S°Ó-AÐ,BðDó
ð 	
ô
 dmÐmtÓcu×vÑV_ÐVYÐ[_˜˜q™ 1™¨dÀ[ÓQÐv€JÑvØ€KØÐØ€Fä+4´S¸À_Ó5UÐ]^Ô+_ó AÑ'ˆÑ'�˜JØ×ÑàÜ! )›_×1Ñ1Ø!Ø"ñ	ô	
ñ Ø%Ÿ?™?×.Ñ.¨zÓ:ˆLØÐ#Ü ð'Ø'- h¨h°y°kÀðDóð ô �<Ó ¤3 z£?Ò2Ü ð$Ü$'¨Ó$5Ð#6Ð6KÌCÐPZËOÐK\ð ]&Ø&, X¨X°i°[ÀðCóð ô Ÿ8™8 A¬VÔ4ˆLÜœS ›_Ó-ó )	ˆGÙI°
·±ÀÑ0HÔI‰NˆB��B˜Ø˜B‘w  R¡ˆuˆAÜ˜:×.Ñ.¨wÑ7Ó8ˆHØ˜!Š|˜x¬3¨w«<Ò7Ü ð=ç=C¹VØ!)Ø 'Ø%Ø"+Ü$'¨£Lð >Dó >ó
ð 
ð # Q™,¨Ñ*ˆKØ %™iˆOÙ Ø07¼#¸lÓ:KÒ0K�| GÒ,ÐQU�ØÐ#¬°°iÔ(@ÄSÈÃYÐQRÂ]Ø;?Ö @°%¤ u¥Ð @�IÐ @Ø$- ;�LÜ#:¸9Ó#E�LØ# cÒ)Ø*6™à#%‘Là!�Ø×#Ñ#à Ø &Ø#.Ø  Q¨Ð.Ø+Ø Ø$0ñô
ð �a‰KŠFòS)	ð1AôF 
Ð Ó	$ð j¨Ü�	‰	˜[Ð9IÐYcÑdÐfhÔi÷jð jùóQ wùòd !A÷,jð jús   Á	JÈJ É6J%Ê%J.i€  r6   r�   c           	     ó²  — t        |«      }t        | «      }	|	j                  dd¬«       |dk(  rt        }
nt	        t
        j                  «       «      }
t	        t        |«      «      }t        j                  |«       d}t	        |j                  «       «      }t        |«      D �]2  \  }\  }}|t        |«      dz
  k(  rt        |«      |z
  }nt        ||z  «      }|dk(  r|dkD  rd}||||z    }||z  }|sŒT|	|z  }|j                  dd¬«       |dz  }g }g }t        j                  d|› dt        |«      › d	�«       t!        |d|› d
�¬«      D ]u  }t#        ||||«      \  }}|d›d�}t%        ||z  «      }t'        j(                  |dddd…f   «      j+                  |«       |j-                  |«       |j-                  |«       Œw t/        ||
||||«       �Œ5 y)a
  Generate a full synthetic dataset in COCO format.

    Args:
        output_dir: Directory where the dataset will be saved.
        num_images: Total number of images to generate.
        img_size: Size of the square images.
        class_mode: Classification mode - "shape" or "color" (default: "shape").
        min_objects: Minimum objects per image.
        max_objects: Maximum objects per image.
        split_ratios: Dataset split ratios. Can be:
            - SplitRatios dataclass instance (default: 70/20/10 split)
            - Tuple of 2 floats for train/val (e.g., (0.8, 0.2))
            - Tuple of 3 floats for train/val/test (e.g., (0.7, 0.2, 0.1))
            - Dictionary (legacy support, e.g., {"train": 0.7, "val": 0.2, "test": 0.1})
        with_segmentation: If ``True``, include COCO polygon ``segmentation``
            fields derived from the exact geometry of each drawn shape. Requires the COCO dataset reader to be loaded
            with ``include_masks=True`` (i.e. ``args.segmentation_head=True``).
    T)ÚparentsÚexist_okrM   r   r6   z_annotations.coco.jsonzGenerating z split with z
 images...z split)ÚdescÚ06dz.jpg.Nrƒ   )rF   r   Úmkdirr‘   r‹   rŒ   r�   rV   rŽ   Úshuffler)   r˜   r>   rU   ÚloggerÚinfor   r¶   Ústrr   Ú	fromarrayÚsaver•   rë   )Ú
output_dirÚ
num_imagesrs   r›   r™   rš   rD   rá   Úsplit_ratios_dictÚoutput_pathrÞ   Úall_indicesÚ	start_idxÚsplit_itemsÚ	split_idxÚsplitr9   Ú	num_splitÚsplit_indicesÚ	split_dirrÝ   Úfile_paths_orderedÚdetections_orderedrk   r^   rµ   rÆ   rÌ   s                               r   Úgenerate_coco_datasetr  ¨  s  € ô: 0°Ó=Ðä�zÓ"€KØ×Ñ˜d¨TÐÔ2à�WÒÜ"‰äÔ'×,Ñ,Ó.Ó/ˆô ”u˜ZÓ(Ó)€KÜ
‡N�N�;Ôà€IÜÐ(×.Ñ.Ó0Ó1€KÜ%.¨{Ó%;ó (yÑ!ˆ	‘>�E˜5Øœ˜KÓ(¨1Ñ,Ò,ä˜KÓ(¨9Ñ4‰Iä˜J¨Ñ.Ó/ˆIØ˜AŠ~ %¨!¢)Ø�	Ø# I°	¸IÑ0EÐFˆØ�YÑˆ	áØð   %Ñ'ˆ	Ø�‰ ¨tˆÔ4Ø$Ð'?Ñ?Ðà(*ÐØ/1Ðä�‰�k % ¨´S¸Ó5GÐ4HÈ
ÐSÔTÜ�m¨K¸°w¸fÐ*EÔFò 	2ˆAÜ7ØØØØó	‰OˆC�ð ˜S˜' ˜ˆIÜ˜I¨	Ñ1Ó2ˆIô �O‰O˜C ¡T r T 	™NÓ+×0Ñ0°Ô;à×%Ñ% iÔ0Ø×%Ñ% jÕ1ð	2ô" 	Ð)¨7Ð4FÐHZÐ\dÐfwÖxñQ(yr&   Ú__main__zGenerate synthetic COCO dataset)Údescriptionz--outputÚsynthetic_datasetzOutput directory)rC   ÚdefaultÚhelpz--num_imagesr‚   zTotal number of imagesz
--img_sizezImage size (square)z--modezClassification mode)rC   Úchoicesr
  r  )rD   ÚSplitRatiosTyper-   r.   )r^   ú
np.ndarrayrM   rõ   rN   r   r_   ztuple[int, int]r`   rU   r-   ztuple[np.ndarray, list[float]])rr   r  rs   rU   r-   r   )r   g333333Ó?r   )rs   rU   r™   rU   rš   rU   r›   úLiteral['shape', 'color']rœ   r   r�   r   rž   r   r-   ztuple[np.ndarray, Detections])rT   zlist[float]r-   r   )F)rÝ   r   rÞ   ú	list[str]rß   r  rà   zlist[Detections]rs   rU   rá   Úboolr-   ÚNone)rø   rõ   rù   rU   rs   rU   r›   r  r™   rU   rš   rU   rD   r  rá   r  r-   r  )9r2   Ú
__future__r   rÛ   ÚloggingrW   rŽ   Údataclassesr   Úpathlibr   Útypingr   Únumpyr[   ÚPILr   Úsupervisionr   r	   r
   r   Ú	tqdm.autor   Ú	getLoggerr/   ró   r   ÚDEFAULT_SPLIT_RATIOSr=   r   r@   rõ   r  rF   r‘   ÚREDÚGREENÚBLUErŒ   rm   r~   r¶   r¿   rë   r  ÚargparseÚArgumentParserÚparserÚadd_argumentrU   Ú
parse_argsÚargsÚoutputrù   rs   Úmoder   r&   r   ú<module>r)     sÿ  ðñ 9å "ã Û Û Û Ý !Ý Ý ã Ý ß MÓ MÝ à	ˆ×	Ñ	˜8Ó	$€ñ �$Ô÷mð mó ðmñ@ *Ó+Ð ð % u¨U°C¨ZÑ'8Ñ8¸4ÀÀUÀ
Ñ;KÑK€ó+jò^ 4Ð à Ÿ9™9¨u¯{©{ÀEÇJÁJÑOÐ ð-Ø	ð-Øð-Ø(-ð-Ø7Fð-ØNQð-à#ó-ó`Gð@  ØØ"ðdØðdàðdð ðdð *ð	dð
 ðdð ðdð ðdð #ódóNoð" $ðpjØðpjàðpjð ðpjð &ð	pjð
 ðpjð ðpjð 
ópjðl Ø,3ØØØ$8Ø#ðUyØðUyàðUyð ðUyð *ð	Uyð
 ðUyð ðUyð "ðUyð ðUyð 
óUyðp ˆzÒÛà$ˆX×$Ñ$Ð1RÔS€FØ
×Ñ˜
¨Ð6IÐPbÐÔcØ
×Ñ˜¨S¸#ÐD\ÐÔ]Ø
×Ñ˜¨3¸ÐBWÐÔXØ
×Ñ˜ s°W¸gÐ4FÐPWÐ^sÐÔtà×ÑÓ€DÙ˜$Ÿ+™+ t§¡¸¿¹ÀtÇyÁyÕQð r&   