U
    ¯Ê¹j—<  ã                )   @   s0  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&d'd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$eeef ee*ee*e*f ee*e*e*f f e*e+e+e,e-e*e+ee- eee,e,f  eee,e,f  e,e,e,ee, e,e,ee- e*e*e-ee,df ee,df e*e+ee, ee- ee* ee
 e+e+ej.ej)e+e+e+e-e+d œ'd!d"„Z/G d#d$„ d$ej0j1j2ƒZ3G d%d&„ d&e4ƒZ5dS )(a   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t‚t| ƒ}t | d d tƒröt| d d ƒ}|| }tj|tjd�}tj|f| d d d j˜tjd�}t	|ƒD ]l}t| | d ƒ|ksœt‚t	|ƒD ]F}| | d ||||  < ||||    t 
| | d | ¡7  < q¤q€||fS t | d d tjƒ�rŽtjdd„ | D ƒtjd�}t|ƒ|k�s8t‚tj|f| d d j˜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Ðt‚tj|f| d d j˜tjd�}t	|ƒD ]}||  | | d ¡ �qø||fS d�s(t‚dS )	zd A fast collation function optimized for uint8 images (np array or torch) and int64 targets (labels)r   )Údtyper	   c                 S   s   g | ]}|d  ‘qS ©r	   © ©Ú.0Úbr   r   úO/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/data/loader.pyÚ
<listcomp>/   s     z fast_collate.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS r   r   r   r   r   r   r   6   s     FN)Ú
isinstanceÚtupleÚAssertionErrorÚlenÚtorchZzerosZint64ÚshapeZuint8ÚrangeZ
from_numpyÚnpZndarrayÚtensorZTensorZcopy_)ÚbatchÚ
batch_sizeZinner_tuple_sizeZflattened_batch_sizeÚtargetsr#   ÚiÚjr   r   r   Úfast_collate   s8    $. " r)   c                 C   sn   t | ttfƒstt| |ƒƒ} nLt| ƒ|krVt | ¡ ¡ }|f| } t 	d| › d�¡ nt| ƒ|ksjt
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Úwarningr   )ÚxÚnZx_meanr   r   r   Úadapt_to_chs@   s    
r2   c                
   @   st   e Zd Zeede d¡ejddddd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é   ÚcudaFç        Úconstr	   r   c                 C   s¾   t ||ƒ}t ||ƒ}d|ddf}|| _|| _|r6tj}|| _tjdd„ |D ƒ||d� |¡| _tjdd„ |D ƒ||d� |¡| _	|dkržt
||	|
||d�| _nd | _tj ¡ o¶|jdk| _d S )	Nr	   c                 S   s   g | ]}|d  ‘qS ©éÿ   r   ©r   r0   r   r   r   r   g   s     z+PrefetchLoader.__init__.<locals>.<listcomp>)Údevicer   c                 S   s   g | ]}|d  ‘qS r8   r   r:   r   r   r   r   i   s     r6   )ZprobabilityÚmodeÚ	max_countZ
num_splitsr;   r5   )r2   Úloaderr;   r   Zfloat16Ú	img_dtyper#   Úviewr,   Ústdr   Úrandom_erasingr5   Zis_availableÚtypeÚis_cuda)Úselfr>   r,   rA   Úchannelsr;   r?   Úfp16Úre_probÚre_modeÚre_countÚre_num_splitsZnormalization_shaper   r   r   Ú__init__N   s@    

  ÿÿ  ÿÿû
zPrefetchLoader.__init__c              
   c   sâ   d}| j r&tj ¡ }ttjj|d�}nd }t}| jD ]ž\}}|ƒ �V |j| j	dd�}|j| j	dd�}| | j
¡ | j¡ | j¡}| jd k	r”|  |¡}W 5 Q R X |s®||fV  nd}|d k	rÊtj ¡  |¡ |}|}q4||fV  d S )NT)Ústream)r;   Znon_blockingF)rD   r   r5   ZStreamr   rM   r   r>   Útor;   r?   Zsub_r,   Zdiv_rA   rB   Zcurrent_streamZwait_stream)rE   ÚfirstrM   Zstream_contextZ
next_inputZnext_targetÚinputÚtargetr   r   r   Ú__iter__v   s*    

zPrefetchLoader.__iter__c                 C   s
   t | jƒS ©N)r   r>   ©rE   r   r   r   Ú__len__•   s    zPrefetchLoader.__len__c                 C   s   | j jS rS   )r>   ÚsamplerrT   r   r   r   rV   ˜   s    zPrefetchLoader.samplerc                 C   s   | j jS rS   )r>   ÚdatasetrT   r   r   r   rW   œ   s    zPrefetchLoader.datasetc                 C   s    t | jjtƒr| jjjS dS d S )NF©r   r>   Ú
collate_fnr   Úmixup_enabledrT   r   r   r   rZ       s    
zPrefetchLoader.mixup_enabledc                 C   s   t | jjtƒr|| jj_d S rS   rX   )rE   r0   r   r   r   rZ   §   s    N)Ú__name__Ú
__module__Ú__qualname__r
   r   r   r;   Úfloat32rL   rR   rU   ÚpropertyrV   rW   rZ   Úsetterr   r   r   r   r3   L   s*   ô
(


r3   Úallc                 C   s|   t jj ¡ }|j| kst‚t|tƒrR||ƒ}t 	|¡ t  
|¡ tj 	|d ¡ n&|dks^t‚|dkrxtj 	|j	d ¡ d S )Nl   ÿÿ )ra   Úpartra   )r   ÚutilsÚdataZget_worker_infoÚidr   r   r   ÚrandomÚseedZmanual_seedr"   )Z	worker_idÚworker_seedingZworker_inforg   r   r   r   Ú_worker_init­   s    


ri   Fr6   r7   g      à?gš™™™™™Ù?Zbilinearr5   T.)'rW   Ú
input_sizer%   Úis_trainingÚno_augrH   rI   rJ   Ú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Úinterpolationr,   rA   Únum_workersÚdistributedÚcrop_pctÚ	crop_modeÚcrop_border_pixelsrY   Ú
pin_memoryrG   r?   r;   Úuse_prefetcherÚuse_multi_epochs_loaderÚpersistent_workersrh   Útf_preprocessingc'           .      C   s¼  d}'|r|pd}'t ||||	|
||||||||||||||||||'|&|"|dkd�| _t| tƒrh| j|d� d}(|r²t| tjjjƒs²|r¨|r–t	| |d�}(q°tjjj
 | ¡}(qÂt| ƒ}(n|dksÂtdƒ‚|dkrÞ|"rÒtn
tjjjj}tjjj})|#rðt})t|t| tjjjƒ �o|(dk�o|||(|||tt|%d�|$d	�	}*z|)| f|*Ž}+W n: tk
�rz }, z|* d
¡ |)| f|*Ž}+W 5 d},~,X Y nX |"�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   é   )rk   rl   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rz   r,   rA   r}   r~   r   rH   rI   rJ   rK   r„   r�   Zseparate)r{   N)Znum_repeatszORepeatAugment not currently supported in non-distributed or IterableDataset use)rh   )	r%   Úshuffler{   rV   rY   r€   Z	drop_lastZworker_init_fnrƒ   rƒ   r6   )
r,   rA   rF   r;   rG   r?   rH   rI   rJ   rK   )r   Z	transformr   r   Zset_loader_cfgr   rc   rd   ZIterableDatasetr   r|   ZDistributedSamplerr   r   r)   Z
dataloaderZdefault_collateÚ
DataLoaderÚMultiEpochsDataLoaderÚdictr   ri   Ú	TypeErrorÚpopr3   ).rW   rj   r%   rk   rl   rH   rI   rJ   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r,   rA   r{   r|   r}   r~   r   rY   r€   rG   r?   r;   r�   r‚   rƒ   rh   r„   rK   rV   Úloader_classZloader_argsr>   ÚeZ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                    sN   t ƒ j||Ž d| _| jd kr,t| jƒ| _nt| jƒ| _d| _t ƒ  ¡ | _d S )NFT)ÚsuperrL   Z_DataLoader__initializedÚbatch_samplerÚ_RepeatSamplerrV   rR   Úiterator)rE   ÚargsÚkwargs©Ú	__class__r   r   rL   t  s    
zMultiEpochsDataLoader.__init__c                 C   s    | j d krt| jƒS t| j jƒS rS   )r�   r   rV   rT   r   r   r   rU   ~  s    zMultiEpochsDataLoader.__len__c                 c   s"   t t| ƒƒD ]}t| jƒV  qd S rS   )r!   r   Únextr’   )rE   r'   r   r   r   rR   �  s    zMultiEpochsDataLoader.__iter__)r[   r\   r]   rL   rU   rR   Ú__classcell__r   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 rS   )rV   )rE   rV   r   r   r   rL   �  s    z_RepeatSampler.__init__c                 c   s   t | jƒE d H  q d S rS   )ÚiterrV   rT   r   r   r   rR   �  s    z_RepeatSampler.__iter__N)r[   r\   r]   Ú__doc__rL   rR   r   r   r   r   r‘   †  s   r‘   )ra   )6rš   Úloggingrf   Ú
contextlibr   Ú	functoolsr   Ú	itertoolsr   Útypingr   r   r   r   r   Ztorch.utils.dataÚnumpyr"   Ú	constantsr
   r   rW   r   r   Zdistributed_samplerr   r   rB   r   Zmixupr   Ztransforms_factoryr   Ú	getLoggerr[   r.   r)   r2   r3   ri   r^   r;   ÚintÚboolÚfloatÚstrr   rŽ   rc   rd   r‡   rˆ   Úobjectr‘   r   r   r   r   Ú<module>   sÈ   
#a
Ù


Ù 6