o
    پi                     @   s  d 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
 ddlmZmZmZmZmZ ddlZddlZedd ejddd	 D Zd
ZdZededZeedrcejjejjfZejjZ n	ejejfZejZ dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd Z(dd  Z)d!d" Z*d#d$ Z+d%d& Z,d'd( Z-dd*d+Z.d,d- Z/d.d/ Z0d0d1 Z1d2d3 Z2d4d5 Z3d6d7 Z4d8d9 Z5d:d; Z6d<d= Z7d>d? Z8d@dA Z9dBdC Z:ddGdHZ;dIdJ Z<dKdL Z=dMdN Z>dOdP Z?dQdR Z@dSdT ZAdUdV ZBdWdX ZCdYdZ ZDi d[dd\dd]dd^e8d_e?d`e@daeAdbeBdceCddeDdee9dfe:dge9dhe:die9dje:dke9e:e<e<e=e=e>e>ee;dldEdmee;dndodme;dp
ZEi d[e*d\e,d]e+d^e)d_e/d`e/dae/dbe-dce-dde.dee1dfe1dge0dhe0die2dje2dke3e3e#e$e'e(e%e&e6e4e5dp
ZFG dqdr drZGdsdt ZHdudv ZIdwdx ZJdydz ZKd{d| ZLdd~dZMG dd dZNddeOde	e fddZPg dZQg dZRg dZSddddd	d	dddddddddZTdd	d	dddddddddddddZUdefddZVddeOfddZW		l		dde
eXeYf deYde	e de	e
eef  fddZZG dd dZ[		ddeOde	e de	e
eOeef  fddZ\g dZ]			dde
eXeYf de	e de	e
eOeef  fddZ^G dd dZ_ddeOde	e fddZ`dS )a   AutoAugment, RandAugment, AugMix, and 3-Augment for PyTorch

This code implements the searched ImageNet policies with various tweaks and improvements and
does not include any of the search code.

AA and RA Implementation adapted from:
    https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/autoaugment.py

AugMix adapted from:
    https://github.com/google-research/augmix

3-Augment based on: https://github.com/facebookresearch/deit/blob/main/README_revenge.md

Papers:
    AutoAugment: Learning Augmentation Policies from Data - https://arxiv.org/abs/1805.09501
    Learning Data Augmentation Strategies for Object Detection - https://arxiv.org/abs/1906.11172
    RandAugment: Practical automated data augmentation... - https://arxiv.org/abs/1909.13719
    AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty - https://arxiv.org/abs/1912.02781
    3-Augment: DeiT III: Revenge of the ViT - https://arxiv.org/abs/2204.07118

Hacked together by / Copyright 2019, Ross Wightman
    N)partial)DictListOptionalUnion)ImageImageOpsImageEnhance
ImageChopsImageFilterc                 C      g | ]}t |qS  )int).0xr   r   J/home/ubuntu/.local/lib/python3.10/site-packages/timm/data/auto_augment.py
<listcomp>"       r   .   )   r   r   g      $@   )translate_constimg_mean
Resamplingc                 C   s(   |  dt}t|ttfrt|S |S )Nresample)pop_DEFAULT_INTERPOLATION
isinstancelisttuplerandomchoice)kwargsinterpolationr   r   r   _interpolation5   s   
r%   c                 C   s*   d| v rt dk r| d t| | d< d S )N	fillcolor   r   r   )_PIL_VERr   r%   )r#   r   r   r   _check_args_tf<   s   
r*   c              	   K   s.   t | | j| jtjd|ddddffi |S N   r   r*   	transformsizer   AFFINEimgfactorr#   r   r   r   shear_xB      &r4   c              	   K   s.   t | | j| jtjddd|ddffi |S r+   r-   r1   r   r   r   shear_yG   r5   r6   c              	   K   s<   || j d  }t| | j| j tjdd|dddffi |S )Nr   r,   r/   r*   r.   r   r0   r2   pctr#   pixelsr   r   r   translate_x_relL      &r;   c              	   K   s<   || j d  }t| | j| j tjddddd|ffi |S r+   r7   r8   r   r   r   translate_y_relR   r<   r=   c              	   K   s.   t | | j| jtjdd|dddffi |S r+   r-   r2   r:   r#   r   r   r   translate_x_absX   r5   r?   c              	   K   s.   t | | j| jtjddddd|ffi |S r+   r-   r>   r   r   r   translate_y_abs]   r5   r@   c           
      K   s&  t | tdkr| j|fi |S tdkr| j\}}d}|d |d f}t| }tt|dtt|ddtt| dtt|ddg}dd }	|	|d	  |d	  |d
  |d
  |\|d< |d< |d  |d	 7  < |d  |d
 7  < | j	| jt
j|fi |S | j||d dS )N)r(   r   r'   )r   r          @           c           	      S   s8   |\}}}}}}||  ||  | ||  ||  | fS Nr   )	r   ymatrixabcdefr   r   r   r.   t   s   (zrotate.<locals>.transformr   r,   r   r(   r   )r   )r*   r)   rotater/   mathradiansroundcossinr.   r   r0   )
r2   degreesr#   wh
post_transrotn_centeranglerF   r.   r   r   r   rM   b   s.   
	"rM   c                 K   
   t | S rD   )r   autocontrastr2   __r   r   r   auto_contrast      
r]   c                 K   rY   rD   )r   invertr[   r   r   r   r_      r^   r_   c                 K   rY   rD   )r   equalizer[   r   r   r   r`      r^   r`   c                 K   s   t | |S rD   )r   solarize)r2   threshr\   r   r   r   ra      s   ra   r   c                 K   st   g }t dD ]}||k r|td||  q|| q| jdv r8| jdkr3t|dkr3|| | }| |S | S )N      )LRGBrf   )rangeappendminmodelenpoint)r2   addrb   r\   lutir   r   r   solarize_add   s   

rp   c                 K   s   |dkr| S t | |S )N   )r   	posterize)r2   bits_to_keepr\   r   r   r   rr      s   rr   c                 K      t | |S rD   )r	   Contrastenhancer2   r3   r\   r   r   r   contrast      rx   c                 K   rt   rD   )r	   Colorrv   rw   r   r   r   color   ry   r{   c                 K   rt   rD   )r	   
Brightnessrv   rw   r   r   r   
brightness   ry   r}   c                 K   rt   rD   )r	   	Sharpnessrv   rw   r   r   r   	sharpness   ry   r   c                 K   s   |  tj|d} | S )Nradius)filterr   GaussianBlurrw   r   r   r   gaussian_blur   s   r   c                 K   s*   d}d}|  tjt||| d} | S )N皙?rA   r   )r   r   r   r!   uniform)r2   r3   r\   
radius_min
radius_maxr   r   r   gaussian_blur_rand   s   r   c                 K   s$   t dtdd| }t| |S )N      ?rC   )ri   maxr	   rz   rv   )r2   r3   _r   r   r   
desaturate   s   r   c                 C   s   t   dkr	|  S | S )zWith 50% prob, negate the value      ?)r!   )vr   r   r   _randomly_negate   s   r   c                 C      | t  d } t| } | fS )Ng      >@_LEVEL_DENOMr   level_hparamsr   r   r   _rotate_level_to_arg      r   c                 C   s   | t  d d fS )Ng?r   )r   r   r   r   r   _enhance_level_to_arg   s   r   c                 C   s$   | t  d } tddt|  } | fS )Ng?r   r   )r   r   r   r   r   r   r    _enhance_increasing_level_to_arg   s   r   rC   r   Tc                 C   s2   | t  } ||| |   } |rt|t|| } | fS rD   )r   r   ri   )r   r   min_valmax_valclampr   r   r   _minmax_level_to_arg   s
   r   c                 C   r   )Ng333333?r   r   r   r   r   _shear_level_to_arg   r   r   c                 C   s&   |d }| t  t| } t| } | fS )Nr   )r   floatr   )r   hparamsr   r   r   r   _translate_abs_level_to_arg   s   r   c                 C   s&   | dd}| t | } t| } | fS )Ntranslate_pctg?)getr   r   )r   r   r   r   r   r   _translate_rel_level_to_arg   s   r   c                 C   s   t | t d fS N   r   r   r   r   r   r   _posterize_level_to_arg   s   r   c                 C      dt | |d  fS )Nr   r   )r   )r   r   r   r   r   "_posterize_increasing_level_to_arg  s   r   c                 C   s   t | t d d fS r   r   r   r   r   r    _posterize_original_level_to_arg  s   r   c                 C   s   t dt| t d fS )Nrc   ri   r   r   r   r   r   r   _solarize_level_to_arg  s   r   c                 C   r   )Nrc   r   )r   r   r   r   r   !_solarize_increasing_level_to_arg  s   r   c                 C   s   t dt| t d fS )Nr   n   r   r   r   r   r   _solarize_add_level_to_arg!  s   r   AutoContrastEqualizeInvertRotate	PosterizePosterizeIncreasingPosterizeOriginalSolarizeSolarizeIncreasingSolarizeAddrz   ColorIncreasingru   ContrastIncreasingr|   BrightnessIncreasingr~   r   )r   r   r   rA   )
SharpnessIncreasingShearXShearY
TranslateX
TranslateYTranslateXRelTranslateYRel
Desaturater   GaussianBlurRandc                   @   s&   e Zd Zd
ddZdd Zdd	 ZdS )	AugmentOpr   
   Nc                 C   s   |pt }|| _t| | _t| | _|| _|| _| | _	t
d|v r%|d ntd|v r.|d ntd| _| j	dd| _| j	dd | _d S )Nr   r$   )r&   r   magnitude_stdr   magnitude_max)_HPARAMS_DEFAULTname
NAME_TO_OPaug_fnLEVEL_TO_ARGlevel_fnprob	magnitudecopyr   dict_FILL_RANDOM_INTERPOLATIONr#   r   r   r   )selfr   r   r   r   r   r   r   __init__g  s   



zAugmentOp.__init__c                 C   s   | j dk rt | j kr|S | j}| jdkr0| jtdkr$td|}n| jdkr0t|| j}| jp4t}t	dt
||}| jd urI| || jnt }| j|g|R i | jS )Nr   r   infrC   )r   r!   r   r   r   r   gaussr   r   r   ri   r   r   r    r   r#   )r   r2   r   upper_bound
level_argsr   r   r   __call__|  s   


zAugmentOp.__call__c                 C   sZ   | j jd| j d| j  }|d| j d| j 7 }| jd ur'|d| j 7 }|d7 }|S )Nz(name=z, p=z, m=z, mstd=z, mmax=))	__class____name__r   r   r   r   r   )r   fsr   r   r   __repr__  s   
zAugmentOp.__repr__)r   r   Nr   
__module____qualname__r   r   r   r   r   r   r   r   e  s    
r   c                       ddgddgddgddgd	d
gddgddgddgddgddgddgddgddgddgddgddgd d!gd"d#gd$d%gd&d'gd(d)gd*d+gd,d-gdd.gd/d0gg} fd1d2|D }|S )3Nr   皙?r,   r   r   r   rz   皙?	   r   333333?   rz   r   r,   r   r   rq   r   r   r   r   r      r   r   r   r   r   r   rz   皙?r   r   r   rq   r   r   rq   r   r   r   r   r   r   rz   r   r,   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rz   r   r   r   r   r   )r   r      r   r   r   r   r   rq   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rC   r   r   r   r   r   r   r   rz   r   r   rz   r   r   r   r   r   r   r   r   r   rC   rq   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r,   rz   r   r  r   r   r(   c                       g | ]} fd d|D qS )c                       g | ]	}t |d  iqS r   r   r   rG   r   r   r   r         z5auto_augment_policy_v0.<locals>.<listcomp>.<listcomp>r   r   spr   r   r   r         z*auto_augment_policy_v0.<locals>.<listcomp>r   r   policypcr   r   r   auto_augment_policy_v0  8   r*  c                    r   )3Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r   r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r   r   r   r  r  r  r  c                    r  )c                    r  r   r!  r"  r   r   r   r     r#  z6auto_augment_policy_v0r.<locals>.<listcomp>.<listcomp>r   r$  r   r   r   r     r&  z+auto_augment_policy_v0r.<locals>.<listcomp>r   r'  r   r   r   auto_augment_policy_v0r  s8   r-  c                       ddgddgddgddgd	d
gddgddgddgddgddgddgddgddgddgddgddgddgd d!gd"d#gddgd	d
gddgddgddgddgg} fd$d%|D }|S )&N)r   r   rq   r   r   r   r   r   r(   r   r   r(   r   r   )r   r   r   )r   r   r  r   r
  r   r   r   r   r   rq   r   r   r   r   r   r   )r   r   r(   r   r   r   r   r  r   r   rq   )r   r   r  rz   r   r   r   r   r   r   r   r   r   rC   r   r   r   r   r   r   rq   r  ru   r   rq   rz   r   r   rz   r   rq   r   r   r   r~   r   r   r   r   rq   r   r   r(   r  c                    r  )c                    r  r   r!  r"  r   r   r   r     r#  z;auto_augment_policy_original.<locals>.<listcomp>.<listcomp>r   r$  r   r   r   r     r&  z0auto_augment_policy_original.<locals>.<listcomp>r   r'  r   r   r   auto_augment_policy_original  r+  rE  c                    r.  )&N)r   r   rq   r/  r0  r1  r   r   )r   r   r   )r   r   r  r   r
  r2  r3  r4  r5  )r   r   r(   r   r6  r  r7  r,  r8  r9  r:  r;  r<  r=  r  r>  r?  r@  rA  rB  rC  rD  r  c                    r  )c                    r  r   r!  r"  r   r   r   r     r#  z<auto_augment_policy_originalr.<locals>.<listcomp>.<listcomp>r   r$  r   r   r   r     r&  z1auto_augment_policy_originalr.<locals>.<listcomp>r   r'  r   r   r   auto_augment_policy_originalr  r+  rF  c                    s&   dgdgdgg} fdd|D }|S )N)r   r   r(   )r   r   r   )r   r   r   c                    r  )c                    r  r   r!  r"  r   r   r   r   "  r#  z5auto_augment_policy_3a.<locals>.<listcomp>.<listcomp>r   r$  r   r   r   r   "  r&  z*auto_augment_policy_3a.<locals>.<listcomp>r   r'  r   r   r   auto_augment_policy_3a  s   rG  v0c                 C   sf   |pt }| dkrt|S | dkrt|S | dkrt|S | dkr$t|S | dkr,t|S J d|  )Noriginal	originalrrH  v0r3aFzUnknown AA policy )r   rE  rF  r*  r-  rG  )r   r   r   r   r   auto_augment_policy&  s   rM  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )AutoAugmentc                 C   s
   || _ d S rD   )r(  )r   r(  r   r   r   r   7  r^   zAutoAugment.__init__c                 C   s"   t | j}|D ]}||}q|S rD   )r!   r"   r(  )r   r2   
sub_policyopr   r   r   r   :  s   
zAutoAugment.__call__c                 C   sL   | j jd }| jD ]}|d7 }|ddd |D 7 }|d7 }q	|d7 }|S )Nz(policy=z
	[z, c                 S   r   r   )str)r   rP  r   r   r   r   D  r   z(AutoAugment.__repr__.<locals>.<listcomp>]r   )r   r   r(  join)r   r   pr   r   r   r   @  s   

zAutoAugment.__repr__Nr   r   r   r   r   rN  5  s    rN  
config_strr   c           	      C   s   |  d}|d }|dd }|D ]'}t d|}t|dk r q|dd \}}|dkr5|dt| qJ d
t||d}t|S )a   Create a AutoAugment transform

    Args:
        config_str: String defining configuration of auto augmentation. Consists of multiple sections separated by
            dashes ('-').
            The first section defines the AutoAugment policy (one of 'v0', 'v0r', 'original', 'originalr').
            While the remaining sections define other arguments
                * 'mstd' -  float std deviation of magnitude noise applied
        hparams: Other hparams (kwargs) for the AutoAugmentation scheme

    Returns:
         A PyTorch compatible Transform

    Examples::

        'original-mstd0.5' results in AutoAugment with original policy, magnitude_std 0.5
    -r   r,   N(\d.*)r   mstdr   Fz"Unknown AutoAugment config sectionr   )splitrerk   
setdefaultr   rM  rN  )	rU  r   configpolicy_namerI   cskeyval	aa_policyr   r   r   auto_augment_transformJ  s   
rb  )r   r   r   r   r   r   r   rz   ru   r|   r~   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r  r   r,   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   g      ?g?)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
transformsc                 C   s4   t t|   \} }t|}|t| }| |fS rD   )r   zipitemsnparraysum)rc  probsr   r   r   _get_weighted_transforms  s   
rj  r   c                 C   s0   | dkrt S | dkrtS | dkrtS |rtS tS )Nweights3awrL  )_RAND_WEIGHTED_0_RAND_WEIGHTED_3A_RAND_3A_RAND_INCREASING_TRANSFORMS_RAND_TRANSFORMS)r   
increasingr   r   r   rand_augment_choices  s   rs  r   r   r   c                    s&    pt  |pt} fdd|D S )Nc                    s   g | ]
}t | d qS )r   r   r   r!  r   r   r   r   r   r   r   r     s
    
z$rand_augment_ops.<locals>.<listcomp>)r   rq  r   r   r   rc  r   rv  r   rand_augment_ops  s
   rx  c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
RandAugmentr   Nc                 C   s   || _ || _|| _d S rD   )ops
num_layerschoice_weights)r   rz  r{  r|  r   r   r   r     s   
zRandAugment.__init__c                 C   s6   t jj| j| j| jd u | jd}|D ]}||}q|S )N)replacerT  )rf  r!   r"   rz  r{  r|  )r   r2   rz  rP  r   r   r   r     s   
zRandAugment.__call__c                 C   s<   | j jd| j d }| jD ]	}|d| 7 }q|d7 }|S )Nz(n=, ops=
	r   )r   r   r{  rz  r   r   rP  r   r   r   r     s
   
zRandAugment.__repr__)r   Nr   r   r   r   r   ry    s    
ry  c                 C   s  t }d}d}d}| d}|d dksJ |dd }|D ]x}|d	r3t|dd }	|du r2|	}qtd
|}
t|
dk r@q|
dd \}}	|dkr_t|	}|dkrXtd}|d| q|dkrl|dt|	 q|dkrwt	|	rvd}q|dkrt|	}q|dkrt|	}q|dkrt|	}qJ dt
|trt||d}n
|du r|rtnt}d}t
|trt|\}}t||||d}t|||dS )a;   Create a RandAugment transform

    Args:
        config_str (str): String defining configuration of random augmentation. Consists of multiple sections separated
            by dashes ('-'). The first section defines the specific variant of rand augment (currently only 'rand').
            The remaining sections, not order specific determine
                * 'm' - integer magnitude of rand augment
                * 'n' - integer num layers (number of transform ops selected per image)
                * 'p' - float probability of applying each layer (default 0.5)
                * 'mstd' -  float std deviation of magnitude noise applied, or uniform sampling if infinity (or > 100)
                * 'mmax' - set upper bound for magnitude to something other than default of  _LEVEL_DENOM (10)
                * 'inc' - integer (bool), use augmentations that increase in severity with magnitude (default: 0)
                * 't' - str name of transform set to use
        hparams (dict): Other hparams (kwargs) for the RandAugmentation scheme

    Returns:
         A PyTorch compatible Transform

    Examples::

        'rand-m9-n3-mstd0.5' results in RandAugment with magnitude 9, num_layers 3, magnitude_std 0.5

        'rand-mstd1-tweights' results in mag std 1.0, weighted transforms, default mag of 10 and num_layers 2

    r   Fr   rV  r   randr,   NtrW  rX  d   r   r   mmaxr   incTmnrT  z"Unknown RandAugment config section)rr  rw  )r|  )r   rY  
startswithrQ  rZ  rk   r   r[  r   boolr   rs  rp  rq  r   rj  rx  ry  )rU  r   rc  r   r{  rr  r   r\  rI   r`  r^  r_  rX  r|  ra_opsr   r   r   rand_augment_transform  sX   






r  )r   r   r   r   r   r   r   r   r   r   r   r   r   c                    s$    pt  |pt} fdd|D S )Nc                    s   g | ]
}t |d  dqS )r   rt  r!  ru  r   r   r   r   r   f  s    
zaugmix_ops.<locals>.<listcomp>)r   _AUGMIX_TRANSFORMS)r   r   rc  r   r  r   
augmix_ops_  s
   r  c                   @   sB   e Zd ZdZdddZdd	 Zd
d Zdd Zdd Zdd Z	dS )AugMixAugmenta   AugMix Transform
    Adapted and improved from impl here: https://github.com/google-research/augmix/blob/master/imagenet.py
    From paper: 'AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty -
    https://arxiv.org/abs/1912.02781
    r   r   Fc                 C   s"   || _ || _|| _|| _|| _d S rD   )rz  alphawidthdepthblended)r   rz  r  r  r  r  r   r   r   r   t  s
   
zAugMixAugment.__init__c                 C   s\   || }d}g }|d d d D ]}|| }|d| 9 }| | qtj|d d d tjdS )Nr   r  r,   dtype)rh   rf  rg  float32)r   wsr  cumprwsrT   r  r   r   r   _calc_blended_weights{  s   z#AugMixAugment._calc_blended_weightsc                 C   sx   |  }| ||}|D ]-}| jdkr| jntjdd}tjj| j|dd}|}	|D ]}
|
|	}	q+t	||	|}q|S )Nr   r,   r   Tr}  )
r   r  r  rf  r!   randintr"   rz  r   blend)r   r2   mixing_weightsr  img_origr  rT   r  rz  img_augrP  r   r   r   _apply_blended  s   
zAugMixAugment._apply_blendedc                 C   s   |j d |j d t| f}tj|tjd}|D ]2}| jdkr#| jntjdd}tjj	| j
|dd}|}	|D ]}
|
|	}	q8||tj|	tjd 7 }qtj|dd|d t|tj}t|||S )	Nr   r,   r  r   Tr  g     o@)out)r/   rk   getbandsrf  zerosr  r  r!   r  r"   rz  asarrayclipr   	fromarrayastypeuint8r  )r   r2   r  r  	img_shapemixedmwr  rz  r  rP  r   r   r   _apply_basic  s   
zAugMixAugment._apply_basicc                 C   s^   t t j| jg| j }t t j| j| j}| jr&| |||}|S | 	|||}|S rD   )
rf  r  r!   	dirichletr  r  betar  r  r  )r   r2   r  r  r  r   r   r   r     s   zAugMixAugment.__call__c                 C   sL   | j jd| j d| j d| j d }| jD ]	}|d| 7 }q|d7 }|S )Nz(alpha=z, width=z, depth=r~  r  r   )r   r   r  r  r  rz  r  r   r   r   r     s
   &
zAugMixAugment.__repr__N)r   r   r  F)
r   r   r   __doc__r   r  r  r  r   r   r   r   r   r   r  n  s    

	r  c                 C   s  d}d}d}d}d}|  d}|d dksJ |dd	 }|D ]T}t d
|}	t|	dk r.q|	d	d \}
}|
dkrC|dt| q|
dkrLt|}q|
dkrUt|}q|
dkr^t|}q|
dkrgt|}q|
dkrpt|}qJ d|dtd t||d}t|||||dS )a
   Create AugMix PyTorch transform

    Args:
        config_str (str): String defining configuration of random augmentation. Consists of multiple sections separated
            by dashes ('-'). The first section defines the specific variant of rand augment (currently only 'rand').
            The remaining sections, not order specific determine
                'm' - integer magnitude (severity) of augmentation mix (default: 3)
                'w' - integer width of augmentation chain (default: 3)
                'd' - integer depth of augmentation chain (-1 is random [1, 3], default: -1)
                'b' - integer (bool), blend each branch of chain into end result without a final blend, less CPU (default: 0)
                'mstd' -  float std deviation of magnitude noise applied (default: 0)
            Ex 'augmix-m5-w4-d2' results in AugMix with severity 5, chain width 4, chain depth 2

        hparams: Other hparams (kwargs) for the Augmentation transforms

    Returns:
         A PyTorch compatible Transform
    r   r  r   FrV  r   augmixr,   NrW  r   rX  r   r  rT   rJ   rG   rH   zUnknown AugMix config sectionr   )r   r   )r  r  r  r  )	rY  rZ  rk   r[  r   r   r  r  r  )rU  r   r   r  r  r  r  r\  rI   r^  r_  r`  rz  r   r   r   augment_and_mix_transform  s:   





r  )r   )rC   r   T)rH  NrD   )T)r   r   NN)NN)r   NN)ar  r!   rN   rZ  	functoolsr   typingr   r   r   r   PILr   r   r	   r
   r   numpyrf  r    __version__rY  r)   r   r   r   r   hasattrr   BILINEARBICUBICr   r   r%   r*   r4   r6   r;   r=   r?   r@   rM   r]   r_   r`   ra   rp   rr   rx   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*  r-  rE  rF  rG  rM  rN  rQ  rb  rq  rp  ro  rn  rm  rj  rs  r   r   rx  ry  r  r  r  r  r  r   r   r   r   <module>   s   "



	
 	
2!"!!

#


T

I