a
    yf]                     @   s  d dl Z d dl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 d dlmZmZ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mZmZ d dlmZmZ d d	l m!Z! G d
d de
j"Z#G dd dZ$dd Z%d ddZ&d!ddZ'd"ddZ(dd Z)d#ddZ*dS )$    N)Path)Image)
dataloaderdistributed)GroundingDatasetYOLODatasetYOLOMultiModalDataset)LOADERSLoadImagesAndVideosLoadPilAndNumpyLoadScreenshotsLoadStreams
LoadTensorSourceTypesautocast_list)IMG_FORMATS
PIN_MEMORYVID_FORMATS)RANKcolorstr)
check_filec                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
InfiniteDataLoaderzV
    Dataloader that reuses workers.

    Uses same syntax as vanilla DataLoader.
    c                    s6   t  j|i | t| dt| j t   | _dS )zFDataloader that infinitely recycles workers, inherits from DataLoader.batch_samplerN)super__init__object__setattr___RepeatSamplerr   __iter__iterator)selfargskwargs	__class__ R/var/www/html/django/DPS/env/lib/python3.9/site-packages/ultralytics/data/build.pyr   #   s    zInfiniteDataLoader.__init__c                 C   s   t | jjS )z2Returns the length of the batch sampler's sampler.)lenr   samplerr    r%   r%   r&   __len__)   s    zInfiniteDataLoader.__len__c                 c   s"   t t| D ]}t| jV  qdS )z,Creates a sampler that repeats indefinitely.N)ranger'   nextr   )r    _r%   r%   r&   r   -   s    zInfiniteDataLoader.__iter__c                 C   s   |   | _dS )zt
        Reset iterator.

        This is useful when we want to modify settings of dataset while training.
        N)Z_get_iteratorr   r)   r%   r%   r&   reset2   s    zInfiniteDataLoader.reset)	__name__
__module____qualname____doc__r   r*   r   r.   __classcell__r%   r%   r#   r&   r      s
   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   zl
    Sampler that repeats forever.

    Args:
        sampler (Dataset.sampler): The sampler to repeat.
    c                 C   s
   || _ dS )z@Initializes an object that repeats a given sampler indefinitely.N)r(   )r    r(   r%   r%   r&   r   C   s    z_RepeatSampler.__init__c                 c   s   t | jE dH  q dS )z4Iterates over the 'sampler' and yields its contents.N)iterr(   r)   r%   r%   r&   r   G   s    z_RepeatSampler.__iter__N)r/   r0   r1   r2   r   r   r%   r%   r%   r&   r   ;   s   r   c                 C   s&   t  d }tj| t| dS )z\Set dataloader worker seed https://pytorch.org/docs/stable/notes/randomness.html#dataloader.l        N)torchZinitial_seednprandomseed)Z	worker_idZworker_seedr%   r%   r&   seed_workerM   s    r9   trainF    c           	      C   sv   |rt nt}||| j||dk| | jp&|| jp.d| jp6dt||dkrHdndt| d| j| j	||dkrn| j
nddS )	Build YOLO Dataset.r:   NF              ?:       ?)img_pathimgsz
batch_sizeaugmenthyprectcache
single_clsstridepadprefixtaskclassesdatafraction)r   r   rB   rF   rG   rH   intr   rL   rM   rO   )	cfgrA   batchrN   moderF   rI   Zmulti_modaldatasetr%   r%   r&   build_yolo_datasetT   s$    rU   c                 C   sj   t ||| j||dk| | jp|| jp$d| jp,dt||dkr>dndt| d| j| j|dkrb| j	nddS )	r<   r:   NFr=   r>   r?   r@   )rA   	json_filerB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rO   )
r   rB   rF   rG   rH   rP   r   rL   rM   rO   )rQ   rA   rV   rR   rS   rF   rI   r%   r%   r&   build_groundingj   s"    rW   Tc           	      C   s   t |t| }tj }t t t|d |}|dkr<dntj	| |d}t
 }|dt  t| ||op|du ||tt| ddt|d	S )zJReturn an InfiniteDataLoader or DataLoader for training or validation set.   rX   N)shufflel   UU*UU* 
collate_fn)	rT   rC   rZ   Znum_workersr(   Z
pin_memoryr[   Zworker_init_fn	generator)minr'   r5   cudaZdevice_countos	cpu_countmaxr   ZDistributedSampler	GeneratorZmanual_seedr   r   r   getattrr9   )	rT   rR   workersrZ   Zrankndnwr(   r\   r%   r%   r&   build_dataloader   s"    


rg   c                 C   s   d\}}}}}t | tttfrt| } t| jdd ttB v }|  d}| 	 ph| 
dph|oh| }|  dk}|r|rt| } n^t | trd}nNt | ttfrt| } d}n2t | tjtjfrd}nt | tjrd}ntd| |||||fS )	z7Check source type and return corresponding flag values.)FFFFFrY   N)zhttps://zhttp://zrtsp://zrtmp://ztcp://z.streamsscreenTzZUnsupported image type. For supported types see https://docs.ultralytics.com/modes/predict)
isinstancestrrP   r   suffixr   r   lower
startswith	isnumericendswithr   r	   listtupler   r   r6   Zndarrayr5   ZTensor	TypeError)sourceZwebcam
screenshotfrom_img	in_memorytensoris_fileis_urlr%   r%   r&   check_source   s(    

rz   rY   c                 C   s   t | \} }}}}}|r| jnt||||}	|r:t| }
nH|rD| }
n>|rXt| ||d}
n*|rft| }
n|rtt| }
nt| ||d}
t|
d|	 |
S )a&  
    Loads an inference source for object detection and applies necessary transformations.

    Args:
        source (str, Path, Tensor, PIL.Image, np.ndarray): The input source for inference.
        batch (int, optional): Batch size for dataloaders. Default is 1.
        vid_stride (int, optional): The frame interval for video sources. Default is 1.
        buffer (bool, optional): Determined whether stream frames will be buffered. Default is False.

    Returns:
        dataset (Dataset): A dataset object for the specified input source.
    )
vid_stridebuffer)rR   r{   source_type)	rz   r}   r   r   r   r   r   r
   setattr)rs   rR   r{   r|   streamrt   ru   rv   rw   r}   rT   r%   r%   r&   load_inference_source   s    


r   )r:   Fr;   F)r:   Fr;   )TrX   )NrY   rY   F)+r_   r7   pathlibr   numpyr6   r5   ZPILr   Ztorch.utils.datar   r   Zultralytics.data.datasetr   r   r   Zultralytics.data.loadersr	   r
   r   r   r   r   r   r   Zultralytics.data.utilsr   r   r   Zultralytics.utilsr   r   Zultralytics.utils.checksr   Z
DataLoaderr   r   r9   rU   rW   rg   rz   r   r%   r%   r%   r&   <module>   s&   (



