
    FPh>                     6   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Z	d dl
Z
d dlZd dlmZmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZ dd	lmZmZmZm Z m!Z!m"Z" d
Z# G d de      Z$ G d dejJ                  jL                        Z'd Z(d Z) G d de      Z*y)    N)repeat)
ThreadPool)Path)
LOCAL_RANKNUM_THREADSTQDMcolorstris_dir_writeable   )ComposeFormat	Instances	LetterBoxclassify_albumentationsclassify_transformsv8_transforms)BaseDataset)HELP_URLLOGGERget_hashimg2label_pathsverify_imageverify_image_labelz1.0.3c                   l     e Zd ZdZdddd fd
Z ed      fdZd Zdd	Zd
 Z	d Z
ed        Z xZS )YOLODataseta  
    Dataset class for loading object detection and/or segmentation labels in YOLO format.

    Args:
        data (dict, optional): A dataset YAML dictionary. Defaults to None.
        use_segments (bool, optional): If True, segmentation masks are used as labels. Defaults to False.
        use_keypoints (bool, optional): If True, keypoints are used as labels. Defaults to False.

    Returns:
        (torch.utils.data.Dataset): A PyTorch dataset object that can be used for training an object detection model.
    NF)datause_segmentsuse_keypointsc                    || _         || _        || _        | j                   r| j                  rJ d       t        |   |i | y)zTInitializes the YOLODataset with optional configurations for segments and keypoints.z(Can not use both segments and keypoints.N)r   r   r   super__init__)selfr   r   r   argskwargs	__class__s         cC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/data/dataset.pyr!   zYOLODataset.__init__#   sI    (*	%%$*<*<i?ii=$)&)    z./labels.cachec                 @   dg i}ddddg f\  }}}}}| j                    d|j                  |j                  z   d}t        | j                        }	| j
                  j                  dd      \  }
}| j                  r|
dk  s|dvrt        d      t        t              5 }|j                  t        t        | j                  | j                  t        | j                         t        | j                        t        t        | j
                  d	               t        |
      t        |            
      }t!        |||	      }|D ]  \
  }}}}}}}}}}||z  }||z  }||z  }||z  }|r7|d   j#                  t%        |||ddddf   |ddddf   ||dd             |r|j#                  |       | d| d||z    d| d|_         |j)                          ddd       |r$t+        j,                  dj/                  |             |dk(  r+t+        j0                  | j                    d| dt2                t5        | j                  | j                  z         |d<   ||||t        | j                        f|d<   ||d<   t7        | j                   ||       |S # 1 sw Y   xY w)z
        Cache dataset labels, check images and read shapes.

        Args:
            path (Path): path where to save the cache file (default: Path('./labels.cache')).
        Returns:
            (dict): labels.
        labelsr   	Scanning ...	kpt_shape)r   r   )      z'kpt_shape' in data.yaml missing or incorrect. Should be a list with [number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)], i.e. 'kpt_shape: [17, 3]'namesfunciterabledesctotalNr   Txywh)im_fileshapeclsbboxessegments	keypoints
normalizedbbox_format 	 images,  backgrounds,  corrupt
"   WARNING ⚠️ No labels found in z. hashresultsmsgs)prefixparentstemlenim_filesr   getr   
ValueErrorr   r   imapr   ziplabel_filesr   r   appenddictr4   closer   infojoinwarningr   r   save_dataset_cache_file)r"   pathxnmnfnencrG   r4   r5   nkptndimpoolrF   pbarr7   lbr8   r;   keypointnm_fnf_fne_fnc_fmsgs                            r&   cache_labelszYOLODataset.cache_labels+   s    rN !Q2~BB++idii(?'@DDMM"YY]];7
d419F0B v w w$ii%7),T]]D<L<LfUYU`U`Na-3D4F4F-GPSTXT]T]^eTfPgIhjpqujv-3D\*;   <G d%8DW[SUHhdD$PSd
d
d
d
hK&&$+"' "1ac6
#%ae9%-&.'+(.0	1 KK$#fAbT27)>"XV	% X\& JJL3 %6 KK		$(7NNdkk]*LTFRTU]T^_`T--=>&	2r2s4=='99)&	T15G %$s   D8JJc           	      (   t        | j                        | _        t        | j                  d         j                  j                  d      }	 t        |      d}}|d   t        k(  sJ |d   t        | j                  | j                  z         k(  sJ 	 |j                  d      \  }}}}}|rbt        dv rZd	| d
| d||z    d| d	}	t        d| j                   |	z   ||       |d   r't#        j$                  dj'                  |d                dD 
cg c]  }
|j                  |
       c}
 |d   }|st#        j(                  d| dt*                |D cg c]  }|d   	 c}| _        d |D        }d t-        | D        \  }}}|r-||k7  r(t#        j(                  d| d| d       |D ]  }g |d<   	 |dk(  rt#        j(                  d| dt*                |S # t        t        t        f$ r | j                  |      d}}Y sw xY wc c}
w c c}w )z/Returns dictionary of labels for YOLO training.r   .cacheTversionrE   FrF   r   r*   z... r@   rA   rB   Nr4   r5   initialrG   rC   )rE   rm   rG   r)   u"   WARNING ⚠️ No images found in z#, training may not work correctly. r7   c              3   n   K   | ]-  }t        |d          t        |d         t        |d         f / yw)r9   r:   r;   N)rK   ).0rc   s     r&   	<genexpr>z)YOLODataset.get_labels.<locals>.<genexpr>|   s5     ]V\PRC5	NC8$5s2j>7JKV\s   35c              3   2   K   | ]  }t        |        y wN)sum)rs   rZ   s     r&   rt   z)YOLODataset.get_labels.<locals>.<genexpr>}   s     +JMqCFMs   uO   WARNING ⚠️ Box and segment counts should be equal, but got len(segments) = z, len(boxes) = z. To resolve this only boxes will be used and all segments will be removed. To avoid this please supply either a detect or segment dataset, not a detect-segment mixed dataset.r;   rD   )r   rL   rQ   r   rI   with_suffixload_dataset_cache_fileDATASET_CACHE_VERSIONr   FileNotFoundErrorAssertionErrorAttributeErrorrj   popr   r   rH   r   rU   rV   rW   r   rP   )r"   
cache_pathcacheexistsr\   r[   r]   r^   ndkr)   rc   lengthslen_cls	len_boxeslen_segmentss                    r&   
get_labelszYOLODataset.get_labelsa   s8   *4==9$**1-.55AA(K
	A3J?6E#'<<<<=HT-=-=-M$NNNN
 "IIi0BBjG+J<tB4yb	PRtS[\ADKK!O1a@V}DIIeFm45  ;;:!1:;xNN?
|Knownxyz1782I8 ^V\]+JCM+J(LI5NNabnao p  ){ +vvw !#: a<NN?
|Knownxyz= ">>B 	A --j956E	A 	< 9s   AG H
H'HHc                    | j                   rn| j                   r| j                  s|j                  nd|_        | j                   r| j                  s|j                  nd|_        t	        | | j
                  |      }n-t        t        | j
                  | j
                  fd      g      }|j                  t        dd| j                  | j                  d|j                  |j                               |S )z*Builds and appends transforms to the list.        F)	new_shapescaleupr6   T)r>   	normalizereturn_maskreturn_keypoint	batch_idx
mask_ratiomask_overlap)augmentrectmosaicmixupr   imgszr   r   rR   r   r   r   r   overlap_mask)r"   hyp
transformss      r&   build_transformszYOLODataset.build_transforms   s    <<'+||DII3CJ%)\\$))		CI&tTZZ=J )tzz4::6NX]"^!_`Jv!#00#'#5#5!!nn # 0 02	3 r'   c                 Z    d|_         d|_        d|_        | j                  |      | _        y)zLSets mosaic, copy_paste and mixup options to 0.0 and builds transformations.r   N)r   
copy_paster   r   r   )r"   r   s     r&   close_mosaiczYOLODataset.close_mosaic   s)    
	//4r'   c                     |j                  d      }|j                  d      }|j                  dd      }|j                  d      }|j                  d      }t        |||||      |d<   |S )	zCustom your label format here.r:   r;   r<   Nr>   r=   )r>   r=   	instances)r~   r   )r"   labelr:   r;   r<   r>   r=   s          r&   update_labels_infozYOLODataset.update_labels_info   sj     8$99Z(IIk40	ii.YY|,
&vxP[hrskr'   c                    i }| d   j                         }t        t        | D cg c]  }t        |j                                c}       }t	        |      D ]D  \  }}||   }|dk(  rt        j                  |d      }|dv rt        j                  |d      }|||<   F t        |d         |d<   t        t        |d               D ]  }|d   |xx   |z  cc<    t        j                  |d   d      |d<   |S c c}w )z#Collates data samples into batches.r   img)masksr<   r:   r9   r   )
keyslistrP   values	enumeratetorchstackcatrangerK   )batch	new_batchr   br   ir   values           r&   
collate_fnzYOLODataset.collate_fn   s     	Qx}}ce<eD,e<=>dODAq1IEEzE1-;;		%+ IaL $ "&i&<!=	+s9[123Ak"1%*% 4!&9[+A1!E	+ =s    C9rv   )__name__
__module____qualname____doc__r!   r   rj   r   r   r   r   staticmethodr   __classcell__r%   s   @r&   r   r      sP    
 $(e5 * !%%5 6 4l&P$5
  r'   r   c                   <     e Zd ZdZd fd	Zd ZdefdZd Z xZ	S )ClassificationDataseta!  
    YOLO Classification Dataset.

    Args:
        root (str): Dataset path.

    Attributes:
        cache_ram (bool): True if images should be cached in RAM, False otherwise.
        cache_disk (bool): True if images should be cached on disk, False otherwise.
        samples (list): List of samples containing file, index, npy, and im.
        torch_transforms (callable): torchvision transforms applied to the dataset.
        album_transforms (callable, optional): Albumentations transforms applied to the dataset if augment is True.
    c                    t         |   |       |rL|j                  dk  r=| j                  dt	        t        | j                        |j                  z         | _        |rt        | d      nd| _        |du xs |dk(  | _        |dk(  | _	        | j                         | _        | j                  D cg c]-  }t        |      t        |d	         j                  d
      dgz   / c}| _        t        |j                  |j                         | _        |rgt%        ||j                  d|j&                  z
  df|j(                  |j*                  |j,                  |j.                  |j0                  ddd      | _        yd| _        yc c}w )a  
        Initialize YOLO object with root, image size, augmentations, and cache settings.

        Args:
            root (str): Dataset path.
            args (Namespace): Argument parser containing dataset related settings.
            augment (bool, optional): True if dataset should be augmented, False otherwise. Defaults to False.
            cache (bool | str | optional): Cache setting, can be True, False, 'ram' or 'disk'. Defaults to False.
        )root      ?Nz:  Tramdiskr   z.npy)r   )r   r   r   )r   r   r   F)r   sizescalehflipvfliphsv_hhsv_shsv_vmeanstdauto_aug)r    r!   fractionsamplesroundrK   r	   rH   	cache_ram
cache_diskverify_imagesr   r   rx   r   r   r   torch_transformsr   r   fliplrflipudr   r   r   album_transforms)r"   r   r#   r   r   rH   rZ   r%   s          r&   r!   zClassificationDataset.__init__   sV    	d#t}}s*<<(Qs4<</@4==/P)QRDL17h&}-R$8%5.6/))+RVR^R^_R^QQ4!:#9#9&#A4"HHR^_ 3DJJTYY O  ' !8#S)++++****** ! -1 	 `s   42Fc                 J   | j                   |   \  }}}}| j                  r*|(t        j                  |      x}| j                   |   d<   n| j                  r_|j                         s9t        j                  |j                         t        j                  |      d       t        j                  |      }nt        j                  |      }| j                  r8| j                  t        j                  |t        j                              d   }n| j                  |      }||dS )zBReturns subset of data and targets corresponding to given indices.r.   Fallow_pickle)imager   )r   r9   )r   r   cv2imreadr   r   npsaveas_posixloadr   cvtColorCOLOR_BGR2RGBr   )r"   r   fjfnimsamples          r&   __getitem__z!ClassificationDataset.__getitem__   s    ||A1b">>bj&)jjm3Ba#__99;szz!}5IBAB  **b#BSBS1T*UV]^F**2.Fa((r'   returnc                 ,    t        | j                        S )z2Return the total number of samples in the dataset.)rK   r   )r"   s    r&   __len__zClassificationDataset.__len__  s    4<<  r'   c           
      <   | j                    d| j                   d}t        | j                        j                  d      }t	        j
                  t        t        t              5  t        |      }|d   t        k(  sJ |d   t        | j                  D cg c]  }|d   	 c}      k(  sJ |j                  d      \  }}}}t        dv rF| d	| d
| d}	t        d|	||       |d   r't!        j"                  dj%                  |d                |cddd       S c c}w # 1 sw Y   nxY wddg g i f\  }}}
}}t'        t(              5 }|j+                  t,        t/        | j                  t1        | j                                     }t        ||t3        | j                              }|D ]G  \  }}}}|r|j5                  |       |r|
j5                  |       ||z  }||z  }| d	| d
| d|_        I |j9                          ddd       n# 1 sw Y   nxY w|
r$t!        j"                  dj%                  |
             t        | j                  D cg c]  }|d   	 nc c}w c}      d<   ||t3        |      |f|d<   |
|d<   t;        | j                   ||       |S )zVerify all images in dataset.r*   r+   rl   rm   rE   r   rF   rn   r?   r@   rB   Nrp   rG   rC   r0   r3   )rH   r   r   rx   
contextlibsuppressr{   r|   r}   ry   rz   r   r   r~   r   r   r   rU   rV   r   r   rO   r   rP   r   rK   rR   r4   rT   rX   )r"   r4   rY   r   rZ   r\   r^   r   r   r   rG   ra   rF   rb   r   rf   rh   ri   s                     r&   r   z#ClassificationDataset.verify_images  sa   ++i		{#6DII**84  !2NNS+D1E#'<<<<=HDLL-ILqadL-I$JJJJ!&9!5BAwW$fAbT2$h7TA6=KK		%- 89 TS .J TS $%aR#3 Bgq$ii\CfUYU`U`Na<bicGd#dll2CDD+/'dCNN6*KK$d
d
#fAbT2$h?	 ,0 JJL %$$ KK		$(DLL9LqadL9:&	2s7|W4)&	T15s2   $1D D!A0D D  D)B<HHI)FFr   )
r   r   r   r   r!   r   intr   r   r   r   s   @r&   r   r      s$    1@)"! !%r'   r   c                     ddl }|j                          t        j                  t	        |       d      j                         }|j                          |S )z1Load an Ultralytics *.cache dictionary from path.r   NTr   )gcdisabler   r   stritemenable)rY   r   r   s      r&   ry   ry   /  s9    JJLGGCID1668EIIKLr'   c                 ~   t         |d<   t        |j                        rz|j                         r|j	                          t        j                  t        |      |       |j                  d      j                  |       t        j                  |  d|        yt        j                  |  d|j                   d       y)z9Save an Ultralytics dataset *.cache dictionary x to path.rm   z
.cache.npyzNew cache created: u   WARNING ⚠️ Cache directory z# is not writeable, cache not saved.N)rz   r
   rI   r   unlinkr   r   r   rx   renamer   rU   rW   )rH   rY   rZ   s      r&   rX   rX   8  s    (AiL$;;=KKM
D	1&--d3vh1$89&!@Mpqrr'   c                   "     e Zd ZdZ fdZ xZS )SemanticDatasetab  
    Semantic Segmentation Dataset.

    This class is responsible for handling datasets used for semantic segmentation tasks. It inherits functionalities
    from the BaseDataset class.

    Note:
        This class is currently a placeholder and needs to be populated with methods and attributes for supporting
        semantic segmentation tasks.
    c                 "    t         |           y)z$Initialize a SemanticDataset object.N)r    r!   )r"   r%   s    r&   r!   zSemanticDataset.__init__R  s    r'   )r   r   r   r   r!   r   r   s   @r&   r   r   F  s    	 r'   r   )+r   	itertoolsr   multiprocessing.poolr   pathlibr   r   numpyr   r   torchvisionultralytics.utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   baser   utilsr   r   r   r   r   r   rz   r   datasetsImageFolderr   ry   rX   r    r'   r&   <module>r     s~      +  
    W W w w w  ` `   i+ iZiK00<< iX
sk r'   