Ë
    Fêñi7N  ã                  óÒ   — 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mZ d dl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mZmZmZmZ d d
lmZ  G d„ de«      Z y)é    )ÚannotationsN)Údeepcopy)Ú
ThreadPool)ÚPath)ÚAny)ÚDataset)ÚFORMATS_HELP_MSGÚHELP_URLÚIMG_FORMATSÚcheck_file_speeds)ÚDEFAULT_CFGÚ
LOCAL_RANKÚLOGGERÚNUM_THREADSÚTQDM)Úimreadc                  óî   ‡ — e Zd ZdZdddeddddddd	d
df	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zdd„Zddd„Zd d„Z	d!d„Z
d"d#d„Zd"d#d„Zd d„Zd$d„Zd$d„Zd%d„Zd&d„Zd'd(d„Zd)d„Zˆ xZS )*ÚBaseDataseta’
  Base dataset class for loading and processing image data.

    This class provides core functionality for loading images, caching, and preparing data for training and inference in
    object detection tasks.

    Attributes:
        img_path (str | list[str]): Path to the folder containing images.
        imgsz (int): Target image size for resizing.
        augment (bool): Whether to apply data augmentation.
        single_cls (bool): Whether to treat all objects as a single class.
        prefix (str): Prefix to print in log messages.
        fraction (float): Fraction of dataset to utilize.
        channels (int): Number of channels in the images (1 for grayscale, 3 for color). Color images loaded with OpenCV
            are in BGR channel order.
        cv2_flag (int): OpenCV flag for reading images.
        im_files (list[str]): List of image file paths.
        labels (list[dict]): List of label data dictionaries.
        ni (int): Number of images in the dataset.
        rect (bool): Whether to use rectangular training.
        batch_size (int): Size of batches.
        stride (int): Stride used in the model.
        pad (float): Padding value.
        buffer (list): Buffer for mosaic images.
        max_buffer_length (int): Maximum buffer size.
        ims (list): List of loaded images.
        im_hw0 (list): List of original image dimensions (h, w).
        im_hw (list): List of resized image dimensions (h, w).
        npy_files (list[Path]): List of numpy file paths.
        cache (str | None): Cache setting ('ram', 'disk', or None for no caching).
        transforms (callable): Image transformation function.
        batch_shapes (np.ndarray): Batch shapes for rectangular training.
        batch (np.ndarray): Batch index of each image.

    Methods:
        get_img_files: Read image files from the specified path.
        update_labels: Update labels to include only specified classes.
        load_image: Load an image from the dataset.
        cache_images: Cache images to memory or disk.
        cache_images_to_disk: Save an image as an *.npy file for faster loading.
        check_cache_disk: Check image caching requirements vs available disk space.
        check_cache_ram: Check image caching requirements vs available memory.
        set_rectangle: Sort images by aspect ratio and set batch shapes for rectangular training.
        get_image_and_label: Get and return label information from the dataset.
        update_labels_info: Custom label format method to be implemented by subclasses.
        build_transforms: Build transformation pipeline to be implemented by subclasses.
        get_labels: Get labels method to be implemented by subclasses.
    i€  FTÚ é   é    ç      à?Ng      ð?é   c                ó$  •— t         ‰| �  «        || _        || _        || _        || _        || _        || _        || _        |dk(  rt        j                  nt        j                  | _        | j                  | j                  «      | _        | j                  «       | _        | j#                  |¬«       t%        | j                   «      | _        || _        || _        |	| _        |
| _        | j(                  r| j*                  €J ‚| j1                  «        g | _        | j                  r%t5        | j&                  | j*                  dz  df«      nd| _        dg| j&                  z  dg| j&                  z  dg| j&                  z  c| _        | _        | _        | j                  D �cg c]  }t?        |«      jA                  d«      ‘Œ c}| _!        tE        |tF        «      r|jI                  «       n|du rd	nd| _%        | jJ                  d	k(  rB| jM                  «       r2|jN                  rtQ        jR                  d
«       | jU                  «        n/| jJ                  dk(  r | jW                  «       r| jU                  «        | jY                  |¬«      | _-        yc c}w )a@  Initialize BaseDataset with given configuration and options.

        Args:
            img_path (str | list[str]): Path to the folder containing images or list of image paths.
            imgsz (int): Image size for resizing.
            cache (bool | str): Cache images to RAM or disk during training.
            augment (bool): If True, data augmentation is applied.
            hyp (dict[str, Any]): Hyperparameters to apply data augmentation.
            prefix (str): Prefix to print in log messages.
            rect (bool): If True, rectangular training is used.
            batch_size (int): Size of batches.
            stride (int): Stride used in the model.
            pad (float): Padding value.
            single_cls (bool): If True, single class training is used.
            classes (list[int], optional): List of included classes.
            fraction (float): Fraction of dataset to utilize.
            channels (int): Number of channels in the images (1 for grayscale, 3 for color). Color images loaded with
                OpenCV are in BGR channel order.
        é   )Úinclude_classNé   iè  r   z.npyTÚramz‹cache='ram' may produce non-deterministic training results. Consider cache='disk' as a deterministic alternative if your disk space allows.Údisk)Úhyp).ÚsuperÚ__init__Úimg_pathÚimgszÚaugmentÚ
single_clsÚprefixÚfractionÚchannelsÚcv2ÚIMREAD_GRAYSCALEÚIMREAD_COLORÚcv2_flagÚget_img_filesÚim_filesÚ
get_labelsÚlabelsÚupdate_labelsÚlenÚniÚrectÚ
batch_sizeÚstrideÚpadÚset_rectangleÚbufferÚminÚmax_buffer_lengthÚimsÚim_hw0Úim_hwr   Úwith_suffixÚ	npy_filesÚ
isinstanceÚstrÚlowerÚcacheÚcheck_cache_ramÚdeterministicr   ÚwarningÚcache_imagesÚcheck_cache_diskÚbuild_transformsÚ
transforms)Úselfr#   r$   rE   r%   r    r'   r5   r6   r7   r8   r&   Úclassesr(   r)   ÚfÚ	__class__s                   €úW/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/data/base.pyr"   zBaseDataset.__init__H   s  ø€ ôH 	‰ÑÔØ ˆŒØˆŒ
ØˆŒØ$ˆŒØˆŒØ ˆŒØ ˆŒØ08¸A²œ×,Ò,Ä3×CSÑCSˆŒØ×*Ñ*¨4¯=©=Ó9ˆŒØ—o‘oÓ'ˆŒØ×Ñ¨ÐÔ1Ü�d—k‘kÓ"ˆŒØˆŒ	Ø$ˆŒØˆŒØˆŒØ�9Š9Ø—?‘?Ð.Ð.Ð.Ø×ÑÔ ð ˆŒØNRÏlÊl¤ d§g¡g¨t¯©ÀÑ/BÀDÐ%IÔ!JÐ`aˆÔð .2¨F°T·W±WÑ,<¸t¸fÀtÇwÁwÑ>NÐQUÐPVÐY]×Y`ÑY`ÑP`Ð)ˆŒ�$”+˜tœzØ?C¿}¹}ÖM¸!œ$˜q›'×-Ñ-¨fÕ5ÒMˆŒÜ&0°¼Ô&<�U—[‘[”]È5ÐTXÉ=Á%Ð^bˆŒ
Ø�:‰:˜Ò 4×#7Ñ#7Ô#9Ø× Ò Ü—‘ðfôð ×ÑÕØ�Z‰Z˜6Ò! d×&;Ñ&;Ô&=Ø×ÑÔð ×/Ñ/°CÐ/Ó8ˆ�ùò Ns   Æ!Jc                ó  — 	 g }t        |t        «      r|n|gD �],  }t        |«      }|j                  «       rF|t	        j                  t        t        t	        j                  |«      «      dz  dz  «      d¬«      z  }Œe|j                  «       r t        |d¬«      5 }|j                  «       j                  «       j                  «       }t        |j                  «      t        j                  z   }||D �cg c]'  }|j                  d«      r|j!                  d|«      n|‘Œ) c}z  }ddd«       �Œt#        | j$                  › |› d	�«      ‚ t'        d
„ |D «       «      }|sJ | j$                  › d|› dt(        › �«       ‚	 | j.                  dk  r$|dt1        t3        |«      | j.                  z  «       }t5        || j$                  ¬«       |S c c}w # 1 sw Y   �Œ½xY w# t*        $ r'}t#        | j$                  › d|› dt,        › �«      |‚d}~ww xY w)aE  Read image files from the specified path.

        Args:
            img_path (str | list[str]): Path or list of paths to image directories or files.

        Returns:
            (list[str]): List of image file paths.

        Raises:
            FileNotFoundError: If no images are found or the path doesn't exist.
        z**z*.*T)Ú	recursivezutf-8)Úencodingz./Nz does not existc              3  ó®   K  — | ]M  }|j                  d «      d   j                  «       t        v sŒ,|j                  dt        j
                  «      –— ŒO y­w)ú.éÿÿÿÿú/N)Ú
rpartitionrD   r   ÚreplaceÚosÚsep)Ú.0Úxs     rQ   ú	<genexpr>z,BaseDataset.get_img_files.<locals>.<genexpr>±   s@   è ø€ Òp¸À1Ç<Á<ÐPSÓCTÐUWÑCX×C^ÑC^ÓC`ÔdoÒCo˜aŸi™i¨¬R¯V©V×4Ñpùs
   ‚-A°%AzNo images found in z. zError loading data from ú
r   )r'   )rB   Úlistr   Úis_dirÚglobrC   ÚescapeÚis_fileÚopenÚreadÚstripÚ
splitlinesÚparentr[   r\   Ú
startswithrZ   ÚFileNotFoundErrorr'   Úsortedr	   Ú	Exceptionr
   r(   Úroundr3   r   )	rM   r#   rO   ÚpÚtrj   r^   r/   Úes	            rQ   r.   zBaseDataset.get_img_files–   sÚ  € ð	kØˆAÜ!+¨H´dÔ!;‘XÀ(Àó P�Ü˜“G�Ø—8‘8”:ØœŸ™¤3¤t¬D¯K©K¸«NÓ';¸dÑ'BÀUÑ'JÓ#KÐW[Ô\Ñ\‘Aà—Y‘Y”[Ü˜a¨'Ô2ð _°aØŸF™F›HŸN™NÓ,×7Ñ7Ó9˜Ü!$ Q§X¡X£´·±Ñ!7˜ØÐ\]Ö^ÐWX¸¿¹ÀdÔ9K˜aŸi™i¨¨fÔ5ÐQRÑRÒ^Ñ^˜÷_ñ _ô ,¨t¯{©{¨m¸A¸3¸oÐ,NÓOÐOðPô Ñp¸aÔpÓpˆHáÐ^ §¡˜}Ð,?À¸zÈÔL\ÐK]Ð^Ó^‘8ð �=‰=˜1ÒØÐ F¤%¬¨H«¸¿¹Ñ(EÓ"FÐGˆHÜ˜(¨4¯;©;Õ7Øˆùò _÷_ñ _ûô ò 	kÜ# t§{¡{ mÐ3KÈHÈ:ÐUWÔX`ÐWaÐ$bÓcÐijÐjûð	kúsD   ‚BG ÂAGÃ3,G
ÄGÄ$AG ÇGÇG	ÇG Ç	H	Ç""HÈH	c                ó–  — t        j                  |«      j                  dd«      }t        t	        | j
                  «      «      D ]ý  }|�Ó| j
                  |   d   }| j
                  |   d   }| j
                  |   d   }| j
                  |   d   }||k(  j                  d«      }||   | j
                  |   d<   ||   | j
                  |   d<   |r4t        |«      D �	�
cg c]  \  }	}
|
sŒ	||	   ‘Œ c}
}	| j
                  |   d<   |�||   | j
                  |   d<   | j                  sŒåd| j
                  |   d   dd…df<   Œÿ yc c}
}	w )	z¸Update labels to include only specified classes.

        Args:
            include_class (list[int], optional): List of classes to include. If None, all classes are included.
        r   rW   NÚclsÚbboxesÚsegmentsÚ	keypointsr   )	ÚnpÚarrayÚreshapeÚranger3   r1   ÚanyÚ	enumerater&   )rM   r   Úinclude_class_arrayÚirt   ru   rv   rw   ÚjÚsiÚidxs              rQ   r2   zBaseDataset.update_labels»   sA  € ô !Ÿh™h }Ó5×=Ñ=¸aÀÓDÐÜ”s˜4Ÿ;™;Ó'Ó(ò 	0ˆAØÐ(Ø—k‘k !‘n UÑ+�ØŸ™ Q™¨Ñ1�ØŸ;™; q™>¨*Ñ5�Ø ŸK™K¨™N¨;Ñ7�	ØÐ/Ñ/×4Ñ4°QÓ7�Ø(+¨A©�—‘˜A‘˜uÑ%Ø+1°!©9�—‘˜A‘˜xÑ(ÙÜNWÐXYËl×1bÁ7À2ÀsÒ^a°(¸2³,Ó1b�D—K‘K ‘N :Ñ.ØÐ(Ø2;¸A±,�D—K‘K ‘N ;Ñ/Ø�‹Ø./�—‘˜A‘˜uÑ%¢a¨ dÒ+ñ	0ùó 2cs   Ã
EÃ*Ec                ó^  — | j                   |   | j                  |   | j                  |   }}}|�€b|j                  «       r	 t	        j
                  |«      }nt        || j                  ¬«      }|€t        d|› �«      ‚|j                  dd \  }}|rŸ| j                   t#        ||«      z  }	|	d	k7  rÔt%        t'        j(                  ||	z  «      | j                   «      t%        t'        j(                  ||	z  «      | j                   «      }}
t+        j,                  ||
|ft*        j.                  ¬
«      }nS||cxk(  r| j                   k(  s>n t+        j,                  || j                   | j                   ft*        j.                  ¬
«      }|j0                  dk(  r|d   }| j2                  rÚ|||f|j                  dd c| j                   |<   | j4                  |<   | j6                  |<   | j8                  j;                  |«       d	t=        | j8                  «      cxk  r| j>                  k\  rZn nW| j8                  jA                  d«      }| jB                  dk7  r-d\  | j                   |<   | j4                  |<   | j6                  |<   |||f|j                  dd fS | j                   |   | j4                  |   | j6                  |   fS # t        $ rd}t        j                  | j                  › d|› d|› �«       t        |«      j                  d¬«       t        || j                  ¬«      }Y d}~�Œ¸d}~ww xY w)a  Load an image from dataset index 'i'.

        Args:
            i (int): Index of the image to load.
            rect_mode (bool): Whether to use rectangular resizing.

        Returns:
            im (np.ndarray): Loaded image as a NumPy array.
            hw_original (tuple[int, int]): Original image dimensions in (height, width) format.
            hw_resized (tuple[int, int]): Resized image dimensions in (height, width) format.

        Raises:
            FileNotFoundError: If the image file is not found.
        Nz"Removing corrupt *.npy image file z	 due to: T©Ú
missing_ok©ÚflagszImage Not Found é   r   )Úinterpolation).Nr   r   )NNN)"r=   r/   rA   Úexistsrx   Úloadrn   r   rH   r'   r   Úunlinkr   r-   rl   Úshaper$   Úmaxr;   ÚmathÚceilr*   ÚresizeÚINTER_LINEARÚndimr%   r>   r?   r:   Úappendr3   r<   ÚpoprE   )rM   r   Ú	rect_modeÚimrO   Úfnrr   Úh0Úw0ÚrÚwÚhr€   s                rQ   Ú
load_imagezBaseDataset.load_imageÒ   s•  € ð —H‘H˜Q‘K §¡¨qÑ!1°4·>±>À!Ñ3DˆrˆAˆØ‰:Ø�y‰yŒ{ð8ÜŸ™ ›‘Bô ˜A T§]¡]Ô3�ØˆzÜ'Ð*:¸1¸#Ð(>Ó?Ð?à—X‘X˜b˜q�\‰FˆB�ÙØ—J‘J¤ R¨£Ñ,�Ø˜’6Ü¤§	¡	¨"¨q©&Ó 1°4·:±:Ó>ÄÄDÇIÁIÈbÐSTÉfÓDUÐW[×WaÑWaÓ@b�q�AÜŸ™ B¨¨A¨¼c×>NÑ>NÔO‘BØ˜BÔ, $§*¡*Ô,Ü—Z‘Z  T§Z¡Z°·±Ð$<ÌC×L\ÑL\Ô]�Ø�w‰w˜!Š|Ø˜	‘]�ð �|Š|Ø=?À"ÀbÀÈ2Ï8É8ÐTVÐUVÈ<Ð:�—‘˜‘˜TŸ[™[¨™^¨T¯Z©Z¸©]Ø—‘×"Ñ" 1Ô%Ø”s˜4Ÿ;™;Ó'ÔA¨4×+AÑ+AÕAØŸ™Ÿ™¨Ó*�AØ—z‘z UÒ*ØEUÑB˜Ÿ™ ™ T§[¡[°¡^°T·Z±ZÀ±]à˜˜B�x §¡¨"¨1 Ð-Ð-à�x‰x˜‰{˜DŸK™K¨™N¨D¯J©J°q©MÐ9Ð9øô? !ò 8Ü—N‘N d§k¡k ]Ð2TÐUWÐTXÐXaÐbcÐadÐ#eÔfÜ˜“H—O‘O¨t�OÔ4Ü ¨¯©Ô7–Bûð8ús   ÁJ? Ê?	L,ËAL'Ì'L,c                óÂ  — d\  }}| j                   dk(  r| j                  dfn| j                  df\  }}t        t        «      5 }|j                  |t        | j                  «      «      }t        t        |«      | j                  t        dkD  ¬«      }|D ]¦  \  }}	| j                   dk(  r+|| j                  |   j                  «       j                  z  }nI|	\  | j                  |<   | j                  |<   | j                   |<   || j                  |   j"                  z  }| j$                  › d||z  d›d	|› d
�|_        Œ¨ |j)                  «        ddd«       y# 1 sw Y   yxY w)z3Cache images to memory or disk for faster training.©r   i   @r   ÚDiskÚRAMr   )ÚtotalÚdisablezCaching images (ú.1fzGB ú)N)rE   Úcache_images_to_diskrž   r   r   Úimapr{   r4   r   r}   r   rA   ÚstatÚst_sizer=   r>   r?   Únbytesr'   ÚdescÚclose)
rM   ÚbÚgbÚfcnÚstorageÚpoolÚresultsÚpbarr   r^   s
             rQ   rI   zBaseDataset.cache_images  s<  € à‰ˆˆ2Ø>B¿j¹jÈFÒ>R˜×1Ñ1°6Ñ:ÐY]×YhÑYhÐjoÐXp‰ˆˆWÜœÓ$ð 
	¨Ø—i‘i ¤U¨4¯7©7£^Ó4ˆGÜœ	 'Ó*°$·'±'Ä:ÐPQÁ>ÔRˆDØò V‘��1Ø—:‘: Ò'Ø˜Ÿ™¨Ñ*×/Ñ/Ó1×9Ñ9Ñ9‘AàABÑ>�D—H‘H˜Q‘K §¡¨Q¡°·±¸A±Ø˜Ÿ™ !™×+Ñ+Ñ+�AØ#Ÿ{™{˜mÐ+;¸AÀ¹FÀ3¸<ÀsÈ7È)ÐSTÐU�•	ðVð �J‰JŒL÷
	÷ 
	ñ 
	ús   ÁD	EÅEc                ót  — | j                   |   }|j                  «       sJ	 t        j                  |j	                  «       t        | j                  |   | j                  ¬«      d¬«       yy# t        $ rC}|j                  d¬«       t        j                  | j                  › d|› d|› �«       Y d}~yd}~ww xY w)	z2Save an image as an *.npy file for faster loading.r†   F)Úallow_pickleTr„   u%   WARNING âš ï¸� Failed to cache image z: N)rA   rŠ   rx   ÚsaveÚas_posixr   r/   r-   rn   rŒ   r   rH   r'   )rM   r   rO   rr   s       rQ   r§   z BaseDataset.cache_images_to_disk  s›   € à�N‰N˜1ÑˆØ�x‰xŒzð^Ü—‘˜Ÿ
™
›¤f¨T¯]©]¸1Ñ-=ÀTÇ]Á]Ô&SÐbgÖhð øô ò ^Ø—‘ D�Ô)Ü—‘ $§+¡+ Ð.SÐTUÐSVÐVXÐYZÐX[Ð\×]Ñ]ûð^ús   ¡AA+ Á+	B7Á49B2Â2B7c                óÜ  — ddl }d\  }}t        | j                  d«      }t        |«      D ]   }t	        j
                  | j                  «      }t        |«      }|€Œ0||j                  z  }t        j                  t        |«      j                  t        j                  «      rŒwd| _        t        j                   | j"                  › d�«        y || j                  z  |z  d|z   z  }	|j%                  t        | j                  d   «      j                  «      \  }
}}|	|kD  rMd| _        t        j                   | j"                  › |	|z  d›d	t'        |d
z  «      › d||z  d›d|
|z  d›d�	«       yy)züCheck if there's enough disk space for caching images.

        Args:
            safety_margin (float): Safety margin factor for disk space calculation.

        Returns:
            (bool): True if there's enough disk space, False otherwise.
        r   Nr    é   z7Skipping caching images to disk, directory not writableFr   r¥   zGB disk space required, with éd   ú% safety margin but only rX   z#GB free, not caching images to diskT)Úshutilr;   r4   r{   ÚrandomÚchoicer/   r   r«   r[   Úaccessr   rj   ÚW_OKrE   r   rH   r'   Ú
disk_usageÚint)rM   Úsafety_marginr½   r®   r¯   ÚnÚ_Úim_filer—   Údisk_requiredr£   Ú_usedÚfrees                rQ   rJ   zBaseDataset.check_cache_disk!  sZ  € ó 	à‰ˆˆ2Ü�—‘˜ÓˆÜ�q“ò 		ˆAÜ—m‘m D§M¡MÓ2ˆGÜ˜“ˆBØˆzØØ�—‘‰NˆAÜ—9‘9œT '›]×1Ñ1´2·7±7Õ;Ø!�”
Ü—‘ $§+¡+ Ð.eÐfÔgÙð		ð ˜DŸG™G™ a™¨1¨}Ñ+<Ñ=ˆØ#×.Ñ.¬t°D·M±MÀ!Ñ4DÓ/E×/LÑ/LÓMÑˆˆu�dØ˜4ÒØˆDŒJÜ�N‰NØ—;‘;�- °Ñ 2°3Ð7ð 8Ü˜M¨CÑ/Ó0Ð1Ð1JØ˜"‘9˜S�/  5¨2¡:¨cÐ"2Ð2UðWôð
 Øó    c                ó‚  — d\  }}t        | j                  d«      }t        |«      D ]u  }t        t	        j
                  | j                  «      «      }|€Œ.| j                  t        |j                  d   |j                  d   «      z  }||j                  |dz  z  z  }Œw || j                  z  |z  d|z   z  }t        d«      j                  «       }	||	j                  kD  rad| _        t        j                   | j"                  › ||z  d›d	t%        |d
z  «      › d|	j                  |z  d›d|	j&                  |z  d›d�	«       yy)zçCheck if there's enough RAM for caching images.

        Args:
            safety_margin (float): Safety margin factor for RAM calculation.

        Returns:
            (bool): True if there's enough RAM, False otherwise.
        r    rº   Nr   r   rˆ   Úpsutilr¥   z%GB RAM required to cache images with r»   r¼   rX   z GB available, not caching imagesFT)r;   r4   r{   r   r¾   r¿   r/   r$   rŽ   r�   r«   Ú
__import__Úvirtual_memoryÚ	availablerE   r   rH   r'   rÃ   r£   )
rM   rÄ   r®   r¯   rÅ   rÆ   r—   ÚratioÚmem_requiredÚmems
             rQ   rF   zBaseDataset.check_cache_ramD  s:  € ð ‰ˆˆ2Ü�—‘˜ÓˆÜ�q“ò 	&ˆAÜœŸ™ d§m¡mÓ4Ó5ˆBØˆzØØ—J‘J¤ R§X¡X¨a¡[°"·(±(¸1±+Ó!>Ñ>ˆEØ�—‘˜U A™XÑ%Ñ%‰Að	&ð ˜4Ÿ7™7‘{ Q‘¨!¨mÑ*;Ñ<ˆÜ˜Ó"×1Ñ1Ó3ˆØ˜#Ÿ-™-Ò'ØˆDŒJÜ�N‰NØ—;‘;�- ¨rÑ 1°#Ð6ð 7Ü˜M¨CÑ/Ó0Ð1Ð1JØ—=‘= 2Ñ% cÐ*¨!¨C¯I©I¸©N¸3Ð+?Ð?_ðaôð
 ØrË   c                óÖ  — t        j                  t        j                  | j                  «      | j                  z  «      j                  t        «      }|d   dz   }t        j                  | j                  D �cg c]  }|j                  d«      ‘Œ c}«      }|dd…df   |dd…df   z  }|j                  «       }|D �cg c]  }| j                  |   ‘Œ c}| _        |D �cg c]  }| j                  |   ‘Œ c}| _        ||   }ddgg|z  }t        |«      D ]G  }|||k(     }	|	j                  «       |	j                  «       }}
|dk  r|dg||<   Œ8|
dkD  sŒ>dd|
z  g||<   ŒI t        j                  t        j                  |«      | j                   z  | j"                  z  | j$                  z   «      j                  t        «      | j"                  z  | _        || _        yc c}w c c}w c c}w )zJSort images by aspect ratio and set batch shapes for rectangular training.rW   r   r�   Nr   )rx   ÚfloorÚaranger4   r6   ÚastyperÃ   ry   r1   r•   Úargsortr/   r{   r;   rŽ   r�   r$   r7   r8   Úbatch_shapesÚbatch)rM   ÚbiÚnbr^   ÚsÚarÚirectr   ÚshapesÚariÚminiÚmaxis               rQ   r9   zBaseDataset.set_rectanglea  sž  € ä�X‰X”b—i‘i §¡Ó(¨4¯?©?Ñ:Ó;×BÑBÄ3ÓGˆØ�‰V�a‰Zˆä�H‰H¨d¯k©kÖ:¨�a—e‘e˜G•nÒ:Ó;ˆØŠq�!ˆt‰W�qš˜A˜‘wÑˆØ—
‘
“ˆØ38Ö9¨a˜Ÿ™ qÓ)Ò9ˆŒØ/4Ö5¨!�t—{‘{ 1“~Ò5ˆŒØ�‰Yˆð �a�&�˜B‘ˆÜ�r“ò 	*ˆAØ�R˜1‘W‘+ˆCØŸ™› C§G¡G£I�$ˆDØ�aŠxØ! 1˜I��q’	Ø˜“Ø  D¡˜M��q’	ð	*ô ŸG™G¤B§H¡H¨VÓ$4°t·z±zÑ$AÀDÇKÁKÑ$OÐRV×RZÑRZÑ$ZÓ[×bÑbÔcfÓgÐjn×juÑjuÑuˆÔØˆ�
ùò% ;ùò :ùÚ5s   Á8GÂ>G!Ã G&c                óB   — | j                  | j                  |«      «      S )z5Return transformed label information for given index.)rL   Úget_image_and_label)rM   Úindexs     rQ   Ú__getitem__zBaseDataset.__getitem__z  s   € à�‰˜t×7Ñ7¸Ó>Ó?Ð?rË   c                óT  — t        | j                  |   «      }|j                  dd«       | j                  |«      \  |d<   |d<   |d<   |d   d   |d   d   z  |d   d   |d   d   z  f|d<   | j                  r| j
                  | j                  |      |d	<   | j                  |«      S )
zÝGet and return label information from the dataset.

        Args:
            index (int): Index of the image to retrieve.

        Returns:
            (dict[str, Any]): Label dictionary with image and metadata.
        r�   NÚimgÚ	ori_shapeÚresized_shaper   r   Ú	ratio_padÚ
rect_shape)r   r1   r•   rž   r5   rÙ   rÚ   Úupdate_labels_info)rM   ræ   Úlabels      rQ   rå   zBaseDataset.get_image_and_label~  sÅ   € ô ˜Ÿ™ UÑ+Ó,ˆØ�	‰	�'˜4Ô ØCGÇ?Á?ÐSXÓCYÑ@ˆˆe‰�e˜KÑ(¨%°Ñ*@à�/Ñ" 1Ñ%¨¨kÑ(:¸1Ñ(=Ñ=Ø�/Ñ" 1Ñ%¨¨kÑ(:¸1Ñ(=Ñ=ð
ˆˆkÑð �9Š9Ø"&×"3Ñ"3°D·J±J¸uÑ4EÑ"FˆE�,ÑØ×&Ñ& uÓ-Ð-rË   c                ó,   — t        | j                  «      S )z5Return the length of the labels list for the dataset.)r3   r1   ©rM   s    rQ   Ú__len__zBaseDataset.__len__’  s   € ä�4—;‘;ÓÐrË   c                ó   — |S )z!Customize your label format here.© )rM   rï   s     rQ   rî   zBaseDataset.update_labels_info–  s   € àˆrË   c                ó   — t         ‚)a  Users can customize augmentations here.

        Examples:
            >>> if self.augment:
            ...     # Training transforms
            ...     return Compose([])
            >>> else:
            ...    # Val transforms
            ...    return Compose([])
        ©ÚNotImplementedError)rM   r    s     rQ   rK   zBaseDataset.build_transformsš  s
   € ô "Ð!rË   c                ó   — t         ‚)a   Users can customize their own format here.

        Examples:
            Ensure output is a dictionary with the following keys:
            >>> dict(
            ...     im_file=im_file,
            ...     shape=shape,  # format: (height, width)
            ...     cls=cls,
            ...     bboxes=bboxes,  # xywh
            ...     segments=segments,  # xy
            ...     keypoints=keypoints,  # xy
            ...     normalized=True,  # or False
            ...     bbox_format="xyxy",  # or xywh, ltwh
            ... )
        rö   rñ   s    rQ   r0   zBaseDataset.get_labels§  s
   € ô  "Ð!rË   )r#   ústr | list[str]r$   rÃ   rE   z
bool | strr%   Úboolr    údict[str, Any]r'   rC   r5   rú   r6   rÃ   r7   rÃ   r8   Úfloatr&   rú   rN   úlist[int] | Noner(   rü   r)   rÃ   )r#   rù   Úreturnz	list[str])r   rý   rþ   ÚNone)T)r   rÃ   r–   rú   rþ   z3tuple[np.ndarray, tuple[int, int], tuple[int, int]])rþ   rÿ   )r   rÃ   rþ   rÿ   )r   )rÄ   rü   rþ   rú   )ræ   rÃ   rþ   rû   )rþ   rÃ   )rï   rû   rþ   rû   )N)r    zdict[str, Any] | None)rþ   zlist[dict[str, Any]])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   r.   r2   rž   rI   r§   rJ   rF   r9   rç   rå   rò   rî   rK   r0   Ú__classcell__)rP   s   @rQ   r   r      s  ø„ ñ.ðf Ø!ØØ)ØØØØØØ Ø$(ØØðL9à!ðL9ð ðL9ð ð	L9ð
 ðL9ð ðL9ð ðL9ð ðL9ð ðL9ð ðL9ð ðL9ð ðL9ð "ðL9ð ðL9ð õL9ó\#óJ0ô.3:ójó ^ô!ôFó:ó2@ó.ó( óô"÷"rË   r   )!Ú
__future__r   rc   r�   r[   r¾   Úcopyr   Úmultiprocessing.poolr   Úpathlibr   Útypingr   r*   Únumpyrx   Útorch.utils.datar   Úultralytics.data.utilsr	   r
   r   r   Úultralytics.utilsr   r   r   r   r   Úultralytics.utils.patchesr   r   rô   rË   rQ   ú<module>r     sH   ðõ #ã Û Û 	Û Ý Ý +Ý Ý ã 
Û Ý $ç ]Ó ]ß PÕ PÝ ,ô`"�'õ `"rË   