o
    پi?                  O   @   s|  d 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
mZmZmZ ddlZddlZddlZddlmZmZ dd	lmZmZ dd
lmZmZ ddlmZ ddlmZ ddlm Z  e!e"Z#dd Z$dd Z%G dd dZ&dMddZ'dddddddddddddddddddeeddddddddej(e)ddddddf$deeef d ee*ee*e*f ee*e*e*f f d!e*d"e+d#e+d$e,d%e-d&e*d'e+d(ee- d)eee,e,f  d*eee,e,f  d+e,d,e,d-e,d.ee, d/e,d0e,d1ee- d2e*d3e*d4e-d5ee,d6f d7ee,d6f d8e*d9e+d:ee, d;ee- d<ee* d=ee
 d>e+d?e+d@ej.dAej)dBe+dCe+dDe+dEe-dFe+fNdGdHZ/G dIdJ dJej0j1j2Z3G dKdL dLe4Z5dS )Na   Loader Factory, Fast Collate, CUDA Prefetcher

Prefetcher and Fast Collate inspired by NVIDIA APEX example at
https://github.com/NVIDIA/apex/commit/d5e2bb4bdeedd27b1dfaf5bb2b24d6c000dee9be#diff-cf86c282ff7fba81fad27a559379d5bf

Hacked together by / Copyright 2019, Ross Wightman
    N)suppress)partial)repeat)CallableOptionalTupleUnion   )IMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)IterableImageDatasetImageDataset)OrderedDistributedSamplerRepeatAugSampler)RandomErasing)FastCollateMixup)create_transformc           	   	   C   s`  t | d ts	J t| }t | d d trt | d d tj}t| d d }|| }tj|tjd}tj|g| d d d jR tj	d}t
|D ]K}t| | d |ksYJ t
|D ]8}| | d ||||  < |r||||    t| | d | 7  < q]||||    | | d | 7  < q]qK||fS t | d d tjrtjdd | D tjd}t||ksJ tj|g| d d jR tj	d}t
|D ]}||  t| | d 7  < q||fS t | d d tjr.tjdd | D tjd}t||ksJ tj|g| d d jR tj	d}t
|D ]}|| | | d  q||fS J )zd A fast collation function optimized for uint8 images (np array or torch) and int64 targets (labels)r   )dtyper	   c                 S      g | ]}|d  qS r	    .0br   r   D/home/ubuntu/.local/lib/python3.10/site-packages/timm/data/loader.py
<listcomp>3       z fast_collate.<locals>.<listcomp>c                 S   r   r   r   r   r   r   r   r   :   r   )
isinstancetuplelennpndarraytorchzerosint64shapeuint8range
from_numpytensorTensorcopy_)	batch
batch_sizeis_npinner_tuple_sizeflattened_batch_sizetargetsr)   ijr   r   r   fast_collate   s@   &,&" "r4   c                 C   sr   t | ttfstt| |} | S t| |kr-t|  }|f| } t	d|  d | S t| |ks7J d| S )Nz@Pretrained mean/std different shape than model, using avg value .z-normalization stats must match image channels)
r   r   listr   r   r    meanitem_loggerwarning)xnx_meanr   r   r   adapt_to_chsD   s   
r>   c                   @   s   e Zd Zeededddddddf
d	ejjj	d
e
edf de
edf dedejdeej dededededefddZdd Zdd Zedd Zedd Zedd  Zejd!d  ZdS )"PrefetchLoader   cudaNF        constr	   r   loaderr7   .stdchannelsdevice	img_dtypefp16re_probre_modere_countre_num_splitsc                 C   s   t ||}t ||}d|ddf}|| _|| _|rtj}|ptj| _tjdd |D ||d|| _	tjdd |D ||d|| _
|dkrRt||	|
||d| _nd | _|jdko^tj | _|jd	koitj | _d S )
Nr	   c                 S      g | ]}|d  qS    r   r   r;   r   r   r   r   k   r   z+PrefetchLoader.__init__.<locals>.<listcomp>)rG   r   c                 S   rN   rO   r   rQ   r   r   r   r   m   r   rB   )probabilitymode	max_count
num_splitsrG   rA   npu)r>   rD   rG   r"   float16float32rH   r)   viewr7   rE   r   random_erasingtyperA   is_availableis_cudarV   is_npu)selfrD   r7   rE   rF   rG   rH   rI   rJ   rK   rL   rM   normalization_shaper   r   r   __init__R   s:   


zPrefetchLoader.__init__c              	   c   sP   d}| j rtjj| jd}ttjj|d}n| jr+tjj| jd}ttjj|d}nd }t	}| j
D ]n\}}| 0 |j| jdd}|j| jdd}|| j| j| j}| jd urb| |}W d    n1 slw   Y  |sy||fV  nd}|d ur| j rtjj| jd| n| jrtjj| jd| |}|}q2||fV  d S )NT)rG   )stream)rG   non_blockingF)r]   r"   rA   StreamrG   r   rb   r^   rV   r   rD   torH   sub_r7   div_rE   rZ   current_streamwait_stream)r_   firstrb   stream_context
next_inputnext_targetinputtargetr   r   r   __iter__{   s<   

zPrefetchLoader.__iter__c                 C   s
   t | jS N)r   rD   r_   r   r   r   __len__      
zPrefetchLoader.__len__c                 C      | j jS rq   )rD   samplerrr   r   r   r   rv         zPrefetchLoader.samplerc                 C   ru   rq   )rD   datasetrr   r   r   r   rx      rw   zPrefetchLoader.datasetc                 C   s   t | jjtr| jjjS dS )NFr   rD   
collate_fnr   mixup_enabledrr   r   r   r   r{      s   
zPrefetchLoader.mixup_enabledc                 C   s    t | jjtr|| jj_d S d S rq   ry   )r_   r;   r   r   r   r{      s   )__name__
__module____qualname__r
   r   r"   rG   utilsdata
DataLoaderr   floatintr   r   boolstrra   rp   rs   propertyrv   rx   r{   setterr   r   r   r   r?   P   sX    

	

)%


r?   allc                 C   s   t jj }|j| ksJ t|tr*||}t| t 	| t
j|d  d S |dv s0J |dkr?t
j|jd  d S d S )Nl    )r   partr   )r"   r   r   get_worker_infoidr   r   randomseedmanual_seedr    )	worker_idworker_seedingworker_infor   r   r   r   _worker_init   s   


r   FrB   rC   g      ?g?bilinearrA   Trx   
input_sizer-   is_trainingno_augrJ   rK   rL   re_splittrain_crop_modescaleratiohflipvflipcolor_jittercolor_jitter_probgrayscale_probgaussian_blur_probauto_augmentnum_aug_repeatsnum_aug_splitsinterpolationr7   .rE   num_workersdistributedcrop_pct	crop_modecrop_border_pixelsrz   
pin_memoryrI   rH   rG   use_prefetcheruse_multi_epochs_loaderpersistent_workersr   tf_preprocessingc'           .      C   s"  d}'|r|pd}'t |fi d|d|d|	d|
d|d|d	|d
|d|d|d|d|d|d|d|d|d|d|d|d|d|d|'d|&d|"d|dk| _t| trg| j|d d}(|rt| tjjjs|r|r~t	| |d}(ntjjj
| }(nt| }(n|dksJ d|du r|"rtntjjjj}tjjj})|#rt})t|t| tjjj o|(du o|||(|||tt|%d |$d!	}*z
|)| fi |*}+W n ty }, z|*d" |)| fi |*}+W Y d},~,nd},~,ww |"r|r|s|nd#}-t|+|||d |!|| |-|||'d$}+|+S )%a
  

    Args:
        dataset: The image dataset to load.
        input_size: Target input size (channels, height, width) tuple or size scalar.
        batch_size: Number of samples in a batch.
        is_training: Return training (random) transforms.
        no_aug: Disable augmentation for training (useful for debug).
        re_prob: Random erasing probability.
        re_mode: Random erasing fill mode.
        re_count: Number of random erasing regions.
        re_split: Control split of random erasing across batch size.
        scale: Random resize scale range (crop area, < 1.0 => zoom in).
        ratio: Random aspect ratio range (crop ratio for RRC, ratio adjustment factor for RKR).
        hflip: Horizontal flip probability.
        vflip: Vertical flip probability.
        color_jitter: Random color jitter component factors (brightness, contrast, saturation, hue).
            Scalar is applied as (scalar,) * 3 (no hue).
        color_jitter_prob: Apply color jitter with this probability if not None (for SimlCLR-like aug
        grayscale_prob: Probability of converting image to grayscale (for SimCLR-like aug).
        gaussian_blur_prob: Probability of applying gaussian blur (for SimCLR-like aug).
        auto_augment: Auto augment configuration string (see auto_augment.py).
        num_aug_repeats: Enable special sampler to repeat same augmentation across distributed GPUs.
        num_aug_splits: Enable mode where augmentations can be split across the batch.
        interpolation: Image interpolation mode.
        mean: Image normalization mean.
        std: Image normalization standard deviation.
        num_workers: Num worker processes per DataLoader.
        distributed: Enable dataloading for distributed training.
        crop_pct: Inference crop percentage (output size / resize size).
        crop_mode: Inference crop mode. One of ['squash', 'border', 'center']. Defaults to 'center' when None.
        crop_border_pixels: Inference crop border of specified # pixels around edge of original image.
        collate_fn: Override default collate_fn.
        pin_memory: Pin memory for device transfer.
        fp16: Deprecated argument for half-precision input dtype. Use img_dtype.
        img_dtype: Data type for input image.
        device: Device to transfer inputs and targets to.
        use_prefetcher: Use efficient pre-fetcher to load samples onto device.
        use_multi_epochs_loader:
        persistent_workers: Enable persistent worker processes.
        worker_seeding: Control worker random seeding at init.
        tf_preprocessing: Use TF 1.0 inference preprocessing for testing model ports.

    Returns:
        DataLoader
    r      r   r   r   r   r   r   r   r   r   r   r   r   r   r7   rE   r   r   r   rJ   rK   rL   rM   r   r   separate)r   N)num_repeatszORepeatAugment not currently supported in non-distributed or IterableDataset use)r   )	r-   shuffler   rv   rz   r   	drop_lastworker_init_fnr   r   rB   )
r7   rE   rF   rG   rI   rH   rJ   rK   rL   rM   )r   	transformr   r   set_loader_cfgr"   r   r   IterableDatasetr   r   DistributedSamplerr   r4   
dataloaderdefault_collater   MultiEpochsDataLoaderdictr   r   	TypeErrorpopr?   ).rx   r   r-   r   r   rJ   rK   rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   rE   r   r   r   r   r   rz   r   rI   rH   rG   r   r   r   r   r   rM   rv   loader_classloader_argsrD   eprefetch_re_probr   r   r   create_loader   s   W	





r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )r   c                    sR   t  j|i | d| _| jd u rt| j| _nt| j| _d| _t   | _d S )NFT)superra   _DataLoader__initializedbatch_sampler_RepeatSamplerrv   rp   iterator)r_   argskwargs	__class__r   r   ra     s   
zMultiEpochsDataLoader.__init__c                 C   s    | j d u r
t| jS t| j jS rq   )r   r   rv   rr   r   r   r   rs     s    zMultiEpochsDataLoader.__len__c                 c   s$    t t| D ]}t| jV  qd S rq   )r'   r   nextr   )r_   r2   r   r   r   rp     s   zMultiEpochsDataLoader.__iter__)r|   r}   r~   ra   rs   rp   __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   zH Sampler that repeats forever.

    Args:
        sampler (Sampler)
    c                 C   s
   || _ d S rq   )rv   )r_   rv   r   r   r   ra     rt   z_RepeatSampler.__init__c                 c   s    	 t | jE d H  qrq   )iterrv   rr   r   r   r   rp     s   z_RepeatSampler.__iter__N)r|   r}   r~   __doc__ra   rp   r   r   r   r   r     s    r   )r   )6r   loggingr   
contextlibr   	functoolsr   	itertoolsr   typingr   r   r   r   r"   torch.utils.datanumpyr    	constantsr
   r   rx   r   r   distributed_samplerr   r   rZ   r   mixupr   transforms_factoryr   	getLoggerr|   r9   r4   r>   r?   r   rX   rG   r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r   <module>   s   
'
h
	


 !"#$%&'
 6