
    kh?              O       H   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jB                  e"      Z#d Z$d Z% G d d      Z&dId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jP                   ejR                  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,d-e,d.ee-   d/e*d0e*d1e-d2ee,d3f   d4ee,d3f   d5e*d6e+d7ee,   d8ee-   d9ee*   d:ee
   d;e+d<e+d=ej\                  d>ejR                  d?e+d@e+dAe+dBe-dCe+fNdDZ/ G dE dFej`                  jb                  jd                        Z3 G dG dHe4      Z5y)Ja   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           	      4   t        | d   t              sJ t        |       }t        | d   d   t              r0t        | d   d   t        j                        }t        | d   d         }||z  }t        j                  |t
        j                        }t        j                  |g| d   d   d   j                  t
        j                        }t        |      D ]  }t        | |   d         |k(  sJ t        |      D ]a  }| |   d   ||||z  z   <   |r0||||z  z   xx   t        j                  | |   d   |         z  cc<   F||||z  z   xx   | |   d   |   z  cc<   c  ||fS t        | d   d   t        j                        rt        j                  | D 	cg c]  }	|	d   	 c}	t
        j                        }t        |      |k(  sJ t        j                  |g| d   d   j                  t
        j                        }t        |      D ](  }||xx   t        j                  | |   d         z  cc<   * ||fS t        | d   d   t
        j                        rt        j                  | D 	cg c]  }	|	d   	 c}	t
        j                        }t        |      |k(  sJ t        j                  |g| d   d   j                  t
        j                        }t        |      D ]  }||   j                  | |   d           ||fS J c c}	w c c}	w )zd A fast collation function optimized for uint8 images (np array or torch) and int64 targets (labels)r   )dtyper
   )
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jbs
             L/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/data/loader.pyfast_collater/      s   eAh&&&UJ%(1+u% 58A;

3uQx{+),<<++2%++F2JU1Xa[^5I5IJRWR]R]^z" 	AAuQx{#'7777+, A.3AhqkA
N*+1q:~-.%2B2B58A;q>2RR.1q:~-.%(1+a.@.A	A w	E!HQK	,,,e4!4EKKH7|z)))j=58A;+<+<=U[[Qz" 	7A1I))%(1+66I	7w	E!HQK	.,,e4!4EKKH7|z)))j=58A;+<+<=U[[Qz" 	)A1IOOE!HQK(	)wu  5  5s   L4Lc                 .   t        | t        t        f      st        t        | |            } | S t	        |       |k7  rDt        j                  |       j                         }|f|z  } t        j                  d|  d       | S t	        |       |k(  sJ 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_means      r.   adapt_to_chsr:   D   s    a%'&A, H 
Q1"IMZ[\Z]]^_` H 1v{KKK{H    c                   T   e Zd Zeed ej                  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Zd Zd Zed        Zed        Zed        Zej0                  d        Zy)PrefetchLoader   cudaNF        constr
   r   loaderr3   .stdchannelsdevice	img_dtypefp16re_probre_modere_countre_num_splitsc                    t        ||      }t        ||      }d|ddf}|| _        || _        |rt        j                  }|xs t        j
                  | _        t        j                  |D cg c]  }|dz  	 c}||      j                  |      | _	        t        j                  |D cg c]  }|dz  	 c}||      j                  |      | _
        |dkD  rt        ||	|
||      | _        nd | _        |j                  dk(  xr t        j                  j                         | _        |j                  dk(  xr t        j"                  j                         | _        y c c}w c c}w )Nr
      )rE   r   r@   )probabilitymode	max_count
num_splitsrE   r?   npu)r:   rB   rE   r   float16float32rF   r"   viewr3   rC   r   random_erasingtyper?   is_availableis_cudarR   is_npu)selfrB   r3   rC   rD   rE   rF   rG   rH   rI   rJ   rK   normalization_shaper7   s                 r.   __init__zPrefetchLoader.__init__R   s8    D(+3) (Aq1I"3emmLL"#QW#F)EEITJ]E^ 		<<!"QW"6DDHDI\D] 	R<"/#"(#D #'D{{f,J1H1H1JkkU*Guyy/E/E/G $"s   +E(E"c              #     K   d}| j                   rPt        j                  j                  | j                        }t        t        j                  j                  |      }nd| j                  rPt        j                  j                  | j                        }t        t        j                  j                  |      }nd }t        }| j                  D ]V  \  }} |       5  |j                  | j                  d      }|j                  | j                  d      }|j                  | j                        j                  | j                        j                  | j                         }| j"                  | j#                  |      }d d d        |sf nd}|| j                   r:t        j                  j%                  | j                        j'                  |       nE| j                  r9t        j                  j%                  | j                        j'                  |       |}|}Y f y # 1 sw Y   xY ww)NT)rE   )stream)rE   non_blockingF)rY   r   r?   StreamrE   r   r_   rZ   rR   r   rB   torF   sub_r3   div_rC   rV   current_streamwait_stream)r[   firstr_   stream_context
next_inputnext_targetinputtargets           r.   __iter__zPrefetchLoader.__iter__{   s    <<ZZ&&dkk&:F$UZZ%6%6vFN[[YY%%T[[%9F$UYY%5%5fENF%N'+{{ 	!#J! A']]$++D]Q
)nnDKKdnS']]4>>:??		JOOPTPXPXY
&&2!%!4!4Z!@JA Vm#!<<JJ--T[[-AMMfU[[II,,DKK,@LLVTE F+	!. Vm+A As    CH>B%H2B.H>2H;	7H>c                 ,    t        | j                        S N)r   rB   r[   s    r.   __len__zPrefetchLoader.__len__   s    4;;r;   c                 .    | j                   j                  S ro   )rB   samplerrp   s    r.   rs   zPrefetchLoader.sampler       {{"""r;   c                 .    | j                   j                  S ro   )rB   datasetrp   s    r.   rv   zPrefetchLoader.dataset   rt   r;   c                     t        | j                  j                  t              r | j                  j                  j                  S y)NFr   rB   
collate_fnr   mixup_enabledrp   s    r.   rz   zPrefetchLoader.mixup_enabled   s0    dkk,,.>?;;))777r;   c                     t        | j                  j                  t              r|| j                  j                  _        y y ro   rx   )r[   r7   s     r.   rz   zPrefetchLoader.mixup_enabled   s/    dkk,,.>?34DKK""0 @r;   )__name__
__module____qualname__r   r   r   rE   utilsdata
DataLoaderr   floatintr   r   boolstrr]   rm   rq   propertyrs   rv   rz   setter r;   r.   r=   r=   P   s;   
 '<%9#/5<<#7/3"!"'HKK$$//'H s
#'H ucz"	'H
 'H LL'H  ,'H 'H 'H 'H 'H 'HR#J  # # # #   5 5r;   r=   allc                    t         j                  j                  j                         }|j                  | k(  sJ t        |t              rU ||      }t        j                  |       t        j                  |       t        j                  j                  |dz         y |dv sJ |dk(  r-t        j                  j                  |j                  dz         y y )Nl    )r   partr   )r   r   r   get_worker_infoidr   r   randomseedmanual_seedr   )	worker_idworker_seedingworker_infor   s       r.   _worker_initr      s    ++""224K>>Y&&&.(+k*D$
		t{+,000 U"IINN;++{;< #r;   Fr@   rA   g      ?g?bilinearr?   Trv   
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interpolationr3   .rC   num_workersdistributedcrop_pct	crop_modecrop_border_pixelsry   
pin_memoryrG   rF   rE   use_prefetcheruse_multi_epochs_loaderpersistent_workersr   tf_preprocessingc'                 n   d}'|r|xs 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kD  | _        t        | t              r| j	                  |       d}(|rt        | t
        j                  j                  j                        sR|rD|rt        | |      }(nLt
        j                  j                  j                  j                  |       }(nt        |       }(n|dk(  sJ d       |6|"rt        n-t
        j                  j                  j                  j                  }t
        j                  j                  j                   })|#rt"        })t%        |t        | t
        j                  j                  j                         xr |(du xr |||(|||t'        t(        |%       |$!	      }*	  |)| fi |*}+|"r!|r|s|nd#}-t/        |+|||d   |!|| |-|||'$      }+|+S # t*        $ r$},|*j-                  d"        |)| fi |*}+Y d},~,Md},~,ww xY w)%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   r3   rC   r   r   r   rH   rI   rJ   rK   r   r   separate)r   N)num_repeatszORepeatAugment not currently supported in non-distributed or IterableDataset use)r   )	r&   shuffler   rs   ry   r   	drop_lastworker_init_fnr   r   r@   )
r3   rC   rD   rE   rG   rF   rH   rI   rJ   rK   )r   	transformr   r   set_loader_cfgr   r   r   IterableDatasetr   r   DistributedSamplerr   r/   
dataloaderdefault_collater   MultiEpochsDataLoaderdictr   r   	TypeErrorpopr=   ).rv   r   r&   r   r   rH   rI   rJ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   rC   r   r   r   r   r   ry   r   rG   rF   rE   r   r   r   r   r   rK   rs   loader_classloader_argsrB   eprefetch_re_probs.                                                 r.   create_loaderr      s   n M&+!(  (	
     " , & . " $   !" #$ %& .'( )* +, -. $/0 *12 &34  !#5G: '/0 	;7G:gu{{/?/?/O/OP*7P++**66II'R 08G!#v%vv#%3\9I9I9T9T9d9d
;;##..L,w(8(8(H(HIImgY]ombm|NK-
K6g55 &1&7b]$'
 M'  6,-g556s   	H 	H4H//H4c                   *     e Zd Z fdZd Zd Z xZS )r   c                     t        |   |i | d| _        | j                  t	        | j
                        | _        nt	        | j                        | _        d| _        t         |          | _        y )NFT)superr]   _DataLoader__initializedbatch_sampler_RepeatSamplerrs   rm   iterator)r[   argskwargs	__class__s      r.   r]   zMultiEpochsDataLoader.__init__  sc    $)&)(-%%)$,,7DL!/0B0B!CD(,%(*r;   c                     | j                   t        | j                        S t        | j                   j                        S ro   )r   r   rs   rp   s    r.   rq   zMultiEpochsDataLoader.__len__  s2    $($6$6$>s4<< cCHZHZHbHbDccr;   c              #   l   K   t        t        |             D ]  }t        | j                          y wro   )r    r   nextr   )r[   r+   s     r.   rm   zMultiEpochsDataLoader.__iter__  s-     s4y! 	&At}}%%	&s   24)r|   r}   r~   r]   rq   rm   __classcell__)r   s   @r.   r   r   }  s    +d&r;   r   c                       e Zd ZdZd Zd Zy)r   zH Sampler that repeats forever.

    Args:
        sampler (Sampler)
    c                     || _         y ro   )rs   )r[   rs   s     r.   r]   z_RepeatSampler.__init__  s	    r;   c              #   L   K   	 t        | j                        E d {    7 wro   )iterrs   rp   s    r.   rm   z_RepeatSampler.__iter__  s#     DLL))) )s   $"$N)r|   r}   r~   __doc__r]   rm   r   r;   r.   r   r     s    *r;   r   )r   )6r   loggingr   
contextlibr   	functoolsr   	itertoolsr   typingr   r   r   r	   r   torch.utils.datanumpyr   	constantsr   r   rv   r   r   distributed_samplerr   r   rV   r   mixupr   transforms_factoryr   	getLoggerr|   r5   r/   r:   r=   r   rT   rE   r   r   r   r   r   r   r   r   r   r   objectr   r   r;   r.   <module>r      sN        3 3    B 7 L ) # 0
'

H
%$N	e5 e5P=( ")-/3/3!-1 "$&&* '"7!5!$(#',0)- !&+u||F3#(-#'#!&Or|%99:r#uS#Xc3m0DDEr r 	r
 r r r r r "#r eUl+,r eUl+,r r r r  $E?!r" #r$ "%r& sm'r( )r* +r, -r. E3J/r0 5#:1r2 3r4 5r6 5/7r8 C=9r: %SM;r< X&=r> ?r@ ArB ;;CrD ErF GrH "&IrJ !KrL MrN Orj&EKK,,77 &(*V *r;   