
    FPh3                         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Zd dlmZ d dlmZmZmZmZmZ dd	lmZmZ  G d
 de      Zy)    N)deepcopy)
ThreadPool)Path)Optional)Dataset)DEFAULT_CFG
LOCAL_RANKLOGGERNUM_THREADSTQDM   )HELP_URLIMG_FORMATSc                        e Zd ZdZdddeddddddd	d
f fd	Zd Zdee   fdZ	ddZ
d Zd ZddZd Zd Zd Zd Zd ZddZd Z xZS )BaseDataseta  
    Base dataset class for loading and processing image data.

    Args:
        img_path (str): Path to the folder containing images.
        imgsz (int, optional): Image size. Defaults to 640.
        cache (bool, optional): Cache images to RAM or disk during training. Defaults to False.
        augment (bool, optional): If True, data augmentation is applied. Defaults to True.
        hyp (dict, optional): Hyperparameters to apply data augmentation. Defaults to None.
        prefix (str, optional): Prefix to print in log messages. Defaults to ''.
        rect (bool, optional): If True, rectangular training is used. Defaults to False.
        batch_size (int, optional): Size of batches. Defaults to None.
        stride (int, optional): Stride. Defaults to 32.
        pad (float, optional): Padding. Defaults to 0.0.
        single_cls (bool, optional): If True, single class training is used. Defaults to False.
        classes (list): List of included classes. Default is None.
        fraction (float): Fraction of dataset to utilize. Default is 1.0 (use all data).

    Attributes:
        im_files (list): List of image file paths.
        labels (list): List of label data dictionaries.
        ni (int): Number of images in the dataset.
        ims (list): List of loaded images.
        npy_files (list): List of numpy file paths.
        transforms (callable): Image transformation function.
    i  FT              ?Ng      ?c                    t         |           || _        || _        || _        || _        || _        || _        | j                  | j                        | _	        | j                         | _        | j                  |       t        | j                        | _        || _        || _        |	| _        |
| _        | j                  r| j                   J | j'                          g | _        | j                  r%t+        | j                  | j                   dz  df      nd| _        |dk(  r| j/                         sd}dg| j                  z  dg| j                  z  dg| j                  z  c| _        | _        | _        | j                  D cg c]  }t7        |      j9                  d       c}| _        |r| j=                  |       | j?                  |	      | _         yc c}w )
z<Initialize BaseDataset with given configuration and options.)include_classN   i  r   ramFz.npy)hyp)!super__init__img_pathimgszaugment
single_clsprefixfractionget_img_filesim_files
get_labelslabelsupdate_labelslennirect
batch_sizestridepadset_rectanglebufferminmax_buffer_lengthcheck_cache_ramimsim_hw0im_hwr   with_suffix	npy_filescache_imagesbuild_transforms
transforms)selfr   r   cacher   r   r!   r*   r+   r,   r-   r    classesr"   f	__class__s                  `C:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/data/base.pyr   zBaseDataset.__init__2   s    	 
$ **4==9oo'1dkk"	$99??...  NRlldggt/BD%I!J`a E>$"6"6"8E-1FTWW,<tftww>NQUPVY]Y`Y`P`)$+tz?C}}M}!$q'--f5}Me$ //C/8 Ns   !Gc           
         	 g }t        |t              r|n|gD ]  }t        |      }|j                         r*|t	        j                  t        |dz  dz        d      z  }I|j                         rt        |      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	|        	 | j*                  dk  r$|dt-        t/        |      | j*                  z         }|S c c}w # 1 sw Y   xY w# t&        $ r'}t!        | j"                   d
| dt(               |d}~ww xY w)zRead image files.z**z*.*T)	recursivez./Nz does not existc              3      K   | ]M  }|j                  d       d   j                         t        v s,|j                  dt        j
                         O yw)./N)splitlowerr   replaceossep).0xs     r@   	<genexpr>z,BaseDataset.get_img_files.<locals>.<genexpr>t   s?     ka1773<PRCSCYCYC[_jCjaiiRVV4as
   -A%AzNo images found in zError loading data from 
r   )
isinstancelistr   is_dirglobstris_fileopenreadstrip
splitlinesparentrJ   rK   
startswithrI   FileNotFoundErrorr!   sorted	Exceptionr   r"   roundr(   )	r;   r   r>   ptrZ   rM   r$   es	            r@   r#   zBaseDataset.get_img_filesc   s   	kA!+Hd!;X(KG88:3q4x%'7#8DIIAYY[aAFFHNN,779!$QXX!7\]^\]WXd9Kaiif5QRR\]^^ ! ,t{{mA3o,NOO L kakkHJ},?zJJ8 ==1 Es8}t}}'D!EFH _ !  	k#t{{m3KH:UWX`Wa$bcijj	ksD   A;F =AF,F

FAF 
FF	F 	G%"GGr   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 )	z7Update labels to include only these classes (optional).r   rE   Nclsbboxessegments	keypointsr   )	nparrayreshaperanger(   r&   any	enumerater    )r;   r   include_class_arrayird   re   rf   rg   jsiidxs              r@   r'   zBaseDataset.update_labels}   s>    hh}5==aDs4;;'(A(kk!nU+Q1;;q>*5 KKN;7	//44Q7(+AAu%+1!9Ax(NWXYl1bl72s^a(2,l1bDKKN:.(2;A,DKKN;/./Au%ad+ ) 2cs   
E*Ec                    | j                   |   | j                  |   | j                  |   }}}|4|j                         r	 t	        j
                  |      }nt        j                  |      }|t        d|       |j                  dd \  }}|r| j                   t#        ||      z  }	|	dk7  rt%        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,                  	      }| j.                  r|||f|j                  dd c| j                   |<   | j0                  |<   | j2                  |<   | j4                  j7                  |       t9        | j4                        | j:                  k\  rH| j4                  j=                  d
      }d\  | j                   |<   | j0                  |<   | j2                  |<   |||f|j                  dd fS | j                   |   | j0                  |   | j2                  |   fS # t        $ rb}t        j                  | j                   d| d|        t        |      j                  d       t        j                  |      }Y d}~d}~ww xY w)z?Loads 1 image from dataset index 'i', returns (im, resized hw).Nu1   WARNING ⚠️ Removing corrupt *.npy image file z	 due to: T)
missing_okzImage Not Found    r   )interpolationr   )NNN)r3   r$   r7   existsrh   loadr^   r
   warningr!   r   unlinkcv2imreadr\   shaper   maxr0   mathceilresizeINTER_LINEARr   r4   r5   r/   appendr(   r1   pop)r;   ro   	rect_modeimr>   fnrb   h0w0rwhrp   s                r@   
load_imagezBaseDataset.load_image   sh   HHQKq!14>>!3DrA:yy{'B ZZ]z'*:1#(>??XXbq\FBJJR,6		"q& 14::>DIIbSTfDUW[WaWa@bqABAc>N>NOBB,$**,ZZTZZ$<CL\L\] ||=?"b288TVUV<:T[[^TZZ]""1%t{{#t'='==*AAQ>DHHQKQABx"1--xx{DKKNDJJqM999 ! 'NNdkk]2cdfcggpqrps#tuHOOtO4AB's   J 	K<AK77K<c                    d\  }}|dk(  r| j                   n| j                  }t        t              5 }|j	                  |t        | j                              }t        t        |      | j                  t        dkD        }|D ]  \  }}	|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)
zCache images to memory or disk.r   i   @diskr   )totaldisablezCaching images (.1fzGB )N)cache_images_to_diskr   r   r   imaprk   r)   r   rm   r	   r7   statst_sizer3   r4   r5   nbytesr!   descclose)
r;   r<   bgbfcnpoolresultspbarro   rM   s
             r@   r8   zBaseDataset.cache_images   s   2+0F?d''$iiU477^4G	'*$'':PQ>RD1F?*//1999AAB>DHHQKQA!+++A#{{m+;AF3<s5'QRS	  JJL %$$s   C?D::Ec                     | j                   |   }|j                         sGt        j                  |j	                         t        j                  | j                  |         d       yy)z3Saves an image as an *.npy file for faster loading.F)allow_pickleN)r7   rw   rh   saveas_posixr{   r|   r$   )r;   ro   r>   s      r@   r   z BaseDataset.cache_images_to_disk   sF    NN1xxzGGAJJL#**T]]1-=">US     c                    d\  }}t        | j                  d      }t        |      D ]|  }t        j                  t        j                  | j                              }| j                  t        |j                  d   |j                  d         z  }||j                  |dz  z  z  }~ || j                  z  |z  d|z   z  }t        j                         }	||	j                  k  }
|
s_t        j                   | j"                   ||z  ddt%        |dz         d	|	j                  |z  dd
|	j&                  |z  dd|
rdnd 
       |
S )z5Check image caching requirements vs available memory.r      r   r   ru   r   z%GB RAM required to cache images with d   z% safety margin but only rF   zGB available, u   caching images ✅u   not caching images ⚠️)r0   r)   rk   r{   r|   randomchoicer$   r   r~   r}   r   psutilvirtual_memory	availabler
   infor!   intr   )r;   safety_marginr   r   n_r   ratiomem_requiredmemr<   s              r@   r2   zBaseDataset.check_cache_ram   s2   2qAFMM$--89BJJRXXa["((1+!>>EUaZ''A  477{Q!m*;<##%s}},KK4;;-r(9#'> ?  #MC$7 899R==2-c2!CIIN33G~38/>YZ\ ] 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 )zCSets the shape of bounding boxes for YOLO detections as rectangles.rE   r   r}   Nr   )rh   flooraranger)   r+   astyper   ri   r&   r   argsortr$   rk   r0   r~   r   r   r,   r-   batch_shapesbatch)r;   binbrM   sarirectro   shapesariminimaxis               r@   r.   zBaseDataset.set_rectangle   s   XXbii(4??:;BB3GVaZHHdkk:kaeeGnk:;q!tWqAw

3895aq)59/45u!t{{1~u5Y a&BrAR1W+CCGGI$Dax!1Iq	DMq	  GGBHHV$4tzz$ADKK$ORVRZRZ$Z[bbcfgjnjujuu
% ; :5s   8G>G! G&c                 B    | j                  | j                  |            S )z6Returns transformed label information for given index.)r:   get_image_and_label)r;   indexs     r@   __getitem__zBaseDataset.__getitem__   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 )
z2Get and return label information from the dataset.r}   Nimg	ori_shaperesized_shaper   r   	ratio_pad
rect_shape)r   r&   r   r   r*   r   r   update_labels_info)r;   r   labels      r@   r   zBaseDataset.get_image_and_label   s    U+,		'4 CG??SXCY@eeK(%*@#O4Q7%:LQ:OO#O4Q7%:LQ:OOQk99"&"3"3DJJu4E"FE,&&u--r   c                 ,    t        | j                        S )z6Returns the length of the labels list for the dataset.)r(   r&   r;   s    r@   __len__zBaseDataset.__len__  s    4;;r   c                     |S )zCustom your label format here. )r;   r   s     r@   r   zBaseDataset.update_labels_info	  s    r   c                     t         )zUsers can custom augmentations here
        like:
            if self.augment:
                # Training transforms
                return Compose([])
            else:
                # Val transforms
                return Compose([])
        NotImplementedError)r;   r   s     r@   r9   zBaseDataset.build_transforms  s
     "!r   c                     t         )a  Users can custom their own format here.
        Make sure your output is a list with each element like below:
            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    r@   r%   zBaseDataset.get_labels  s
     "!r   )T)r   )N)__name__
__module____qualname____doc__r   r   r#   r   rQ   r'   r   r8   r   r2   r.   r   r   r   r   r9   r%   __classcell__)r?   s   @r@   r   r      s    :  !/9b408D> 0&#:J T$2@	. 
""r   r   )rS   r   rJ   r   copyr   multiprocessing.poolr   pathlibr   typingr   r{   numpyrh   r   torch.utils.datar   ultralytics.utilsr   r	   r
   r   r   utilsr   r   r   r   r   r@   <module>r      sB      	   +   
   $ P P (Q"' Q"r   