a
    yfZY                     @   sb  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Zd dlmZ d dlmZ d dlmZmZmZmZ d d	lmZ d d
lmZ ddlmZ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,m-Z-m.Z. dZ/G dd de%Z0G dd de0Z1G dd de0Z2G dd deZ3G dd de%Z4G dd dZ5dS )    N)defaultdict)repeat)
ThreadPool)Path)Image)ConcatDataset)
LOCAL_RANKNUM_THREADSTQDMcolorstr)resample_segments)TORCHVISION_0_18   )ComposeFormat	Instances	LetterBoxRandomLoadTextclassify_augmentationsclassify_transformsv8_transforms)BaseDataset)HELP_URLLOGGERget_hashimg2label_pathsload_dataset_cache_filesave_dataset_cache_fileverify_imageverify_image_labelz1.0.3c                       sf   e Zd ZdZddd fdd
Zedfdd	Zd
d ZdddZdd Z	dd Z
edd Z  ZS )YOLODataset  
    Dataset class for loading object detection and/or segmentation labels in YOLO format.

    Args:
        data (dict, optional): A dataset YAML dictionary. Defaults to None.
        task (str): An explicit arg to point current task, Defaults to 'detect'.

    Returns:
        (torch.utils.data.Dataset): A PyTorch dataset object that can be used for training an object detection model.
    Ndetectdatataskc                   sN   |dk| _ |dk| _|dk| _|| _| j r8| jr8J dt j|i | dS )zTInitializes the YOLODataset with optional configurations for segments and keypoints.segmentZposeobbz(Can not use both segments and keypoints.N)use_segmentsuse_keypointsuse_obbr$   super__init__selfr$   r%   argskwargs	__class__ T/var/www/html/django/DPS/env/lib/python3.9/site-packages/ultralytics/data/dataset.pyr,   :   s    


zYOLODataset.__init__z./labels.cachec                 C   s4  dg i}ddddg f\}}}}}| j  d|j|j  d}t| j}	| jdd\}
}| jrt|
dksl|dvrttdt	t
 }|jtt| j| jt| j t| jtt| jd	 t|
t|d
}t|||	d}|D ]\
}}}}}}}}}}||7 }||7 }||7 }||7 }|rT|d |||ddddf |ddddf ||ddd |rd|| | d| d||  d| d|_q|  W d   n1 s0    Y  |rtd| |dkrt| j  d| dt  t| j| j |d< ||||t| jf|d< ||d< t| j ||t |S )z
        Cache dataset labels, check images and read shapes.

        Args:
            path (Path): Path where to save the cache file. Default is Path('./labels.cache').

        Returns:
            (dict): labels.
        labelsr   	Scanning ...Z	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
   appendr?   closer   infojoinwarningr   r   r   DATASET_CACHE_VERSION)r.   pathxnmnfnencrR   r?   r@   ZnkptndimpoolrQ   pbarrB   lbrC   rF   ZkeypointZnm_fnf_fZne_fnc_fmsgr3   r3   r4   cache_labelsC   sj    


$(
zYOLODataset.cache_labelsc              
      s  t | j| _t| jd jd}z>t|d  } d tksBJ  d t| j| j ks^J W n( t	t
tfy   | |d  }Y n0  d\}}}}}|rtdv rd	| d
| d||  d| d	}td| j| ||d  d rtd d   fdddD   d }	|	s:td| dt  dd |	D | _dd |	D }
dd t|
 D \}}}|r||krtd| d| d |	D ]}g |d< q|dkrtd | dt  |	S )!z/Returns dictionary of labels for YOLO training.r   .cacheTversionrP   FrQ      r   r6   z... rK   rL   rM   Nr?   r@   initialrR   rN   c                    s   g | ]}  |qS r3   )pop).0kcacher3   r4   
<listcomp>       z*YOLODataset.get_labels.<locals>.<listcomp>)rP   rr   rR   r5   u"   WARNING ⚠️ No images found in z#, training may not work correctly. c                 S   s   g | ]}|d  qS )rB   r3   rx   rl   r3   r3   r4   r|      r}   c                 s   s0   | ](}t |d  t |d t |d fV  qdS )rD   rE   rF   N)rV   r~   r3   r3   r4   	<genexpr>   r}   z)YOLODataset.get_labels.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S )N)sumrx   rd   r3   r3   r4   r      r}   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.rF   rO   )r   rW   r\   r   rT   with_suffixr   rb   r   FileNotFoundErrorAssertionErrorAttributeErrorrp   rw   r   r
   rS   r   r_   r`   ra   r   r[   )r.   
cache_pathexistsrf   re   rg   rh   ndr5   lengthsZlen_clsZ	len_boxesZlen_segmentsrl   r3   rz   r4   
get_labels   s@     "

zYOLODataset.get_labelsc                 C   s   | j rF| j r| js|jnd|_| j r0| js0|jnd|_t| | j|}ntt| j| jfddg}|t	dd| j
| j| jd|j|j| j r|jndd	 |S )z*Builds and appends transforms to the list.        F)Z	new_shapeZscaleuprA   T)	rI   	normalizeZreturn_maskZreturn_keypointZ
return_obb	batch_idx
mask_ratioZmask_overlapbgr)augmentrectmosaicmixupr   imgszr   r   r]   r   r(   r)   r*   r   Zoverlap_maskr   r.   hyp
transformsr3   r3   r4   build_transforms   s&    zYOLODataset.build_transformsc                 C   s"   d|_ d|_d|_| || _dS )zLSets mosaic, copy_paste and mixup options to 0.0 and builds transformations.r   N)r   Z
copy_paster   r   r   )r.   r   r3   r3   r4   close_mosaic   s    zYOLODataset.close_mosaicc                 C   s   | d}| dg }| dd}| d}| d}| jr@dnd}t|d	krhtjt||d
d	d}ntjd	|dftjd}t|||||d|d< |S )a  
        Custom your label format here.

        Note:
            cls is not with bboxes now, classification and semantic segmentation need an independent cls label
            Can also support classification and semantic segmentation by adding or removing dict keys there.
        rE   rF   rG   NrI   rH   d   i  r   )r   )Zaxisr8   Zdtype)rI   rH   Z	instances)	rw   r*   rV   npstackr   zerosfloat32r   )r.   labelrE   rF   rG   rI   rH   Zsegment_resamplesr3   r3   r4   update_labels_info   s    


zYOLODataset.update_labels_infoc                 C   s   i }| d   }ttdd | D  }t|D ]@\}}|| }|dkrRt|d}|dv rft|d}|||< q.t|d |d< tt|d D ]}|d |  |7  < qt|d d|d< |S )#Collates data samples into batches.r   c                 S   s   g | ]}t | qS r3   )listvalues)rx   br3   r3   r4   r|      r}   z*YOLODataset.collate_fn.<locals>.<listcomp>img>   r'   rG   rF   rE   rD   masksr   )	keysr   r[   	enumeratetorchr   catrangerV   )batchZ	new_batchr   r   iry   valuer3   r3   r4   
collate_fn   s    
zYOLODataset.collate_fn)N)__name__
__module____qualname____doc__r,   r   rp   r   r   r   r   staticmethodr   __classcell__r3   r3   r1   r4   r    .   s   	C)
r    c                       sB   e Zd ZdZddd fdd
Z fddZd fd	d
	Z  ZS )YOLOMultiModalDatasetr!   Nr"   r#   c                   s   t  j|||d| dS )zUInitializes a dataset object for object detection tasks with optional specifications.r#   Nr+   r,   r-   r1   r3   r4   r,     s    zYOLOMultiModalDataset.__init__c                    s,   t  |}dd | jd  D |d< |S )z5Add texts information for multi-modal model training.c                 S   s   g | ]\}}| d qS )/)split)rx   _vr3   r3   r4   r|     r}   z<YOLOMultiModalDataset.update_labels_info.<locals>.<listcomp>r:   texts)r+   r   r$   items)r.   r   r5   r1   r3   r4   r   
  s    z(YOLOMultiModalDataset.update_labels_infoc                    s6   t  |}| jr2|dtt| jd ddd |S )zWEnhances data transformations with optional text augmentation for multi-modal training.rt   rh   P   TZmax_samplespadding)r+   r   r   insertr   minr$   r   r1   r3   r4   r     s     z&YOLOMultiModalDataset.build_transforms)N)r   r   r   r   r,   r   r   r   r3   r3   r1   r4   r      s   r   c                       sD   e Zd ZdZdd fdd
Zdd Zdd	 Zd fdd	Z  ZS )GroundingDatasetziHandles object detection tasks by loading annotations from a specified JSON file, supporting YOLO format.r"   )r%   c                   s2   |dksJ d|| _ t j||i d| dS )zdInitializes a GroundingDataset for object detection, loading annotations from a specified JSON file.r"   z6`GroundingDataset` only support `detect` task for now!)r%   r$   N)	json_filer+   r,   )r.   r%   r   r/   r0   r1   r3   r4   r,     s    zGroundingDataset.__init__c                 C   s   g S )zOThe image files would be read in `get_labels` function, return empty list here.r3   )r.   img_pathr3   r3   r4   get_img_files#  s    zGroundingDataset.get_img_filesc                    sd  g }t d t| j}t|}W d   n1 s80    Y  dd |d D }tt}|d D ]}||d  | qdt	|
 d| j d	D ]\}}||d
   d  d  d   }	}
}t| j| }| sq| jt| g }i }g }|D ]}|d rqtj|d tjd}|dd  |dd d 7  < |ddg  t|
  < |ddg  t|	  < |d dks|d dkrqd fdd|d D }||vrt|||< ||g || }|g|  }||vr|| qt|rtj|tjdntjdtjd}|||	|
f|ddddf |ddddf dd|d q|S )zZLoads annotations from a JSON file, filters, and normalizes bounding boxes for each image.zLoading annotation file...Nc                 S   s   i | ]}|d  d|qS )idr   r3   r   r3   r3   r4   
<dictcomp>-  r}   z/GroundingDataset.get_labels.<locals>.<dictcomp>imagesannotationsZimage_idzReading annotations )r?   r   heightwidth	file_nameZiscrowdZbboxr   r8   r   r   r9   rJ   c                    s$   g | ]} d  |d |d  qS )captionr   r   r3   )rx   tr   r3   r4   r|   E  r}   z/GroundingDataset.get_labels.<locals>.<listcomp>Ztokens_positive)r      TrA   )rB   rC   rD   rE   rH   rI   r   )r   r_   openr   jsonloadr   r   r]   r
   r   r   r   r   rW   strr   arrayr   floatr`   rV   tolistr   )r.   r5   fr   r   Zimg_to_annsannZimg_idannshwrB   rE   Zcat2idr   boxZcat_namerD   rl   r3   r   r4   r   '  s^    
("
 
*zGroundingDataset.get_labelsNc                    s*   t  |}| jr&|dtddd |S )zgConfigures augmentations for training with optional text loading; `hyp` adjusts augmentation intensity.rt   r   Tr   )r+   r   r   r   r   r   r1   r3   r4   r   [  s    z!GroundingDataset.build_transforms)N)	r   r   r   r   r,   r   r   r   r   r3   r3   r1   r4   r     s
   4r   c                   @   s   e Zd ZdZedd ZdS )YOLOConcatDatasetz}
    Dataset as a concatenation of multiple datasets.

    This class is useful to assemble different existing datasets.
    c                 C   s
   t | S )r   )r    r   )r   r3   r3   r4   r   k  s    zYOLOConcatDataset.collate_fnN)r   r   r   r   r   r   r3   r3   r3   r4   r   d  s   r   c                       s    e Zd ZdZ fddZ  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                    s   t    dS )z$Initialize a SemanticDataset object.Nr   r.   r1   r3   r4   r,   ~  s    zSemanticDataset.__init__)r   r   r   r   r,   r   r3   r3   r1   r4   r   r  s   r   c                   @   s8   e Zd ZdZdddZdd Zedd	d
Zdd ZdS )ClassificationDataseta<  
    Extends torchvision ImageFolder to support YOLO classification tasks, offering functionalities like image
    augmentation, caching, and verification. It's designed to efficiently handle large datasets for training deep
    learning models, with optional image transformations and caching mechanisms to speed up training.

    This class allows for augmentations using both torchvision and Albumentations libraries, and supports caching images
    in RAM or on disk to reduce IO overhead during training. Additionally, it implements a robust verification process
    to ensure data integrity and consistency.

    Attributes:
        cache_ram (bool): Indicates if caching in RAM is enabled.
        cache_disk (bool): Indicates if caching on disk is enabled.
        samples (list): A list of tuples, each containing the path to an image, its class index, path to its .npy cache
                        file (if caching on disk), and optionally the loaded image array (if caching in RAM).
        torch_transforms (callable): PyTorch transforms to be applied to the images.
    F c                 C   sB  ddl }tr |jj|dd| _n|jj|d| _| jj| _| jj| _|rr|jdk rr| jdtt	| j|j  | _|rt
| dnd| _|jdu pt|j d	k| _| jrtd
 d| _t|j dk| _|  | _dd | jD | _d|j df}|r,t|j||j|j|j|j|j|j|jd	nt|j|jd| _ dS )a  
        Initialize YOLO object with root, image size, augmentations, and cache settings.

        Args:
            root (str): Path to the dataset directory where images are stored in a class-specific folder structure.
            args (Namespace): Configuration containing dataset-related settings such as image size, augmentation
                parameters, and cache settings. It includes attributes like `imgsz` (image size), `fraction` (fraction
                of data to use), `scale`, `fliplr`, `flipud`, `cache` (disk or RAM caching for faster training),
                `auto_augment`, `hsv_h`, `hsv_s`, `hsv_v`, and `crop_fraction`.
            augment (bool, optional): Whether to apply augmentations to the dataset. Default is False.
            prefix (str, optional): Prefix for logging and cache filenames, aiding in dataset identification and
                debugging. Default is an empty string.
        r   NT)rootZallow_empty)r   g      ?z: r   ramu   WARNING ⚠️ Classification `cache_ram` training has known memory leak in https://github.com/ultralytics/ultralytics/issues/9824, setting `cache_ram=False`.FZdiskc                 S   s*   g | ]"}t |t|d  ddg qS )r   z.npyN)r   r   r   r   r3   r3   r4   r|     r}   z2ClassificationDataset.__init__.<locals>.<listcomp>)	sizescaleZhflipZvfliperasingauto_augmenthsv_hhsv_shsv_v)r   crop_fraction)!torchvisionr   ZdatasetsZImageFolderbasesamplesr   fractionroundrV   r   rS   r{   r   lower	cache_ramr   ra   
cache_diskverify_imagesr   r   r   ZfliplrZflipudr   r   r   r   r   r   r   torch_transforms)r.   r   r/   r   rS   r   r   r3   r3   r4   r,     sB    

 
zClassificationDataset.__init__c                 C   s   | j | \}}}}| jr:|du rxt| }| j | d< n>| jrn| sbtj| t|dd t	|}n
t|}t
t|tj}| |}||dS )zBReturns subset of data and targets corresponding to given indices.Nr9   F)Zallow_pickle)r   rD   )r   r   cv2Zimreadr   r   r   saveas_posixr   r   Z	fromarrayZcvtColorZCOLOR_BGR2RGBr   )r.   r   r   jfnZimsampler3   r3   r4   __getitem__  s    

z!ClassificationDataset.__getitem__)returnc                 C   s
   t | jS )z2Return the total number of samples in the dataset.)rV   r   r   r3   r3   r4   __len__  s    zClassificationDataset.__len__c                 C   s  | j  d| j d}t| jd}tttt t	|}|d t
ksLJ |d tdd | jD kslJ |d\}}}}td	v r| d
| d| d}td|||d |d rtd|d  |W  d   S 1 s0    Y  ddg g i f\}}}	}}
tt}|jtt| jt| j d}t||t| jd}|D ]V\}}}}|r\|| |rl|	| ||7 }||7 }| d
| d| d|_q@|  W d   n1 s0    Y  |	rtd|	 tdd | jD |
d< ||t||f|
d< |	|
d< t| j ||
t
 |S )zVerify all images in dataset.r6   r7   rq   rr   rP   c                 S   s   g | ]}|d  qS r   r3   r   r3   r3   r4   r|     r}   z7ClassificationDataset.verify_images.<locals>.<listcomp>rQ   rs   rJ   rK   rM   Nru   rR   rN   r   r;   r>   c                 S   s   g | ]}|d  qS r  r3   r   r3   r3   r4   r|     r}   )rS   r   r   r   
contextlibsuppressr   r   r   r   rb   r   r   rw   r   r
   r   r_   r`   r   r	   rZ   r   r[   r   rV   r]   r?   r^   r   )r.   r?   rc   r{   rf   rh   r   r   r   rR   rd   rj   rQ   rk   r   rm   rn   ro   r3   r3   r4   r     sB     "


(z#ClassificationDataset.verify_imagesN)Fr   )	r   r   r   r   r,   r   intr  r   r3   r3   r3   r4   r     s
   
7r   )6r  r   collectionsr   	itertoolsr   Zmultiprocessing.poolr   pathlibr   r   numpyr   r   ZPILr   Ztorch.utils.datar   Zultralytics.utilsr   r	   r
   r   Zultralytics.utils.opsr   Zultralytics.utils.torch_utilsr   r   r   r   r   r   r   r   r   r   r   r   utilsr   r   r   r   r   r   r   r   rb   r    r   r   r   r   r   r3   r3   r3   r4   <module>   s0   (
( M J