U
    ¯Ê¹jÞŠ  ã                   @   st  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ƒrÆe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-d¨d*d+„Z.d,d-„ Z/d.d/„ Z0d0d1„ Z1d2d3„ Z2d4d5„ Z3d6d7„ Z4d8d9„ Z5d:d;„ Z6d<d=„ Z7d>d?„ Z8d@dA„ Z9dBdC„ Z:d©dGdH„Z;dIdJ„ Z<dKdL„ Z=dMdN„ Z>dOdP„ Z?dQdR„ Z@dSdT„ ZAdUdV„ ZBdWdX„ ZCdYdZ„ ZDddde8e?e@eAeBeCeDe9e:e9e:e9e:e9e:e<e<e=e=e>e>ee;d[dEd\�ee;d]d^d\�e;d_œZEe*e,e+e)e/e/e/e-e-e.e1e1e0e0e2e2e3e3e#e$e'e(e%e&e6e4e5d_œZFG d`da„ daƒZGdbdc„ ZHddde„ ZIdfdg„ ZJdhdi„ ZKdjdk„ ZLdªdmdn„ZMG dodp„ dpƒZNd«eOe	e dqœdrds„ZPdtdudvdwdxdydzd{d|d}d~dd€d�d‚gZQdtdudvdwdƒd„dzd…d†d‡dˆdd€d�d‚gZRd„d‰dŠgZSd‹d‹d‹dŒd	d	d�d�d�d�d�d�d�d�dŽœZTdŒd	d	d�d�d�d�d�d�d�d�d�d�d�d�d‘œZUed’œd“d”„ZVd¬eOd•œd–d—„ZWd­e
eXeYf eYe	e e	e
eef  d™œdšd›„ZZG dœd�„ d�ƒZ[d®eOe	e e	e
eOeef  džœdŸd „Z\dtd…d†d‡dˆdudwdƒd„dd€d�d‚gZ]d¯e
eXeYf e	e e	e
eOeef  d¡œd¢d£„Z^G d¤d¥„ d¥ƒZ_d°eOe	e dqœd¦d§„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   s   g | ]}t |ƒ‘qS © )Úint)Ú.0Úxr   r   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/data/auto_augment.pyÚ
<listcomp>"   s     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| k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|ŽS ©Né   r   ©r(   Ú	transformÚsizer   ÚAFFINE©ÚimgÚfactorr!   r   r   r   Úshear_xB   s    r2   c              	   K   s*   t |ƒ | j| jtjddd|ddff|ŽS r)   r+   r/   r   r   r   Úshear_yG   s    r3   c              	   K   s8   || j d  }t|ƒ | j| j tjdd|dddff|ŽS )Nr   r*   ©r-   r(   r,   r   r.   ©r0   Zpctr!   Úpixelsr   r   r   Útranslate_x_relL   s    r7   c              	   K   s8   || j d  }t|ƒ | j| j tjddddd|ff|ŽS r)   r4   r5   r   r   r   Útranslate_y_relR   s    r8   c              	   K   s*   t |ƒ | j| jtjdd|dddff|ŽS r)   r+   ©r0   r6   r!   r   r   r   Útranslate_x_absX   s    r:   c              	   K   s*   t |ƒ | j| jtjddddd|ff|ŽS r)   r+   r9   r   r   r   Útranslate_y_abs]   s    r;   c           
      K   s   t |ƒ tdkr| j|f|Ž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|Ž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   r.   )
r0   Údegreesr!   ÚwÚhZ
post_transZrotn_centerZanglerA   r,   r   r   r   rH   b   s2    

ú	  ÿrH   c                 K   s
   t  | ¡S r?   )r   Zautocontrast©r0   Ú__r   r   r   Úauto_contrast�   s    rS   c                 K   s
   t  | ¡S r?   )r   ÚinvertrQ   r   r   r   rT   …   s    rT   c                 K   s
   t  | ¡S r?   )r   ÚequalizerQ   r   r   r   rU   ‰   s    rU   c                 K   s   t  | |¡S r?   )r   Úsolarize)r0   ÚthreshrR   r   r   r   rV   �   s    rV   r   c                 K   st   g }t dƒD ],}||k r.| td|| ƒ¡ q| |¡ q| jdkrp| jdkrft|ƒdkrf|| | }|  |¡S | S )Né   éÿ   )ÚLÚRGBr[   )ÚrangeÚappendÚminÚmodeÚlenÚpoint)r0   ÚaddrW   rR   ZlutÚir   r   r   Úsolarize_add‘   s    

rd   c                 K   s   |dkr| S t  | |¡S )Né   )r   Ú	posterize)r0   Zbits_to_keeprR   r   r   r   rf   ¡   s    rf   c                 K   s   t  | ¡ |¡S r?   )r	   ÚContrastÚenhance©r0   r1   rR   r   r   r   Úcontrast§   s    rj   c                 K   s   t  | ¡ |¡S r?   )r	   ÚColorrh   ri   r   r   r   Úcolor«   s    rl   c                 K   s   t  | ¡ |¡S r?   )r	   Ú
Brightnessrh   ri   r   r   r   Ú
brightness¯   s    rn   c                 K   s   t  | ¡ |¡S r?   )r	   Ú	Sharpnessrh   ri   r   r   r   Ú	sharpness³   s    rp   c                 K   s   |   tj|d�¡} | S )N©Zradius)Úfilterr   ÚGaussianBlurri   r   r   r   Úgaussian_blur·   s    rt   c                 K   s*   d}d}|   tjt ||| ¡d�¡} | S )Nçš™™™™™¹?r<   rq   )rr   r   rs   r   Úuniform)r0   r1   rR   Z
radius_minZ
radius_maxr   r   r   Úgaussian_blur_rand¼   s    rw   c                 K   s$   t dtdd| ƒƒ}t | ¡ |¡S )Nç      ð?r>   )r^   Úmaxr	   rk   rh   )r0   r1   Ú_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   s   | t  d } t| ƒ} | fS )Ng      >@©Ú_LEVEL_DENOMr~   ©ÚlevelÚ_hparamsr   r   r   Ú_rotate_level_to_argÎ   s    r„   c                 C   s   | t  d d fS )NgÍÌÌÌÌÌü?ru   )r€   r�   r   r   r   Ú_enhance_level_to_argÕ   s    r…   c                 C   s$   | t  d } tddt| ƒ ƒ} | fS )NgÍÌÌÌÌÌì?ru   rx   )r€   ry   r~   r�   r   r   r   Ú _enhance_increasing_level_to_argÚ   s    r†   r>   rx   Tc                 C   s2   | t  } ||| |   } |r,t|t|| ƒƒ} | fS r?   )r€   ry   r^   )r‚   rƒ   Úmin_valÚmax_valÚclampr   r   r   Ú_minmax_level_to_argâ   s
    rŠ   c                 C   s   | t  d } t| ƒ} | fS )Ng333333Ó?r   r�   r   r   r   Ú_shear_level_to_argê   s    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   s   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 )NrX   ©r^   r   r€   r�   r   r   r   Ú_solarize_level_to_arg  s    r™   c                 C   s   dt | |ƒd  fS )NrX   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œ   r|   )r‡   rˆ   ru   r<   )ÚAutoContrastÚEqualizeÚInvertÚRotateÚ	PosterizeÚPosterizeIncreasingÚPosterizeOriginalÚSolarizeÚSolarizeIncreasingÚSolarizeAddrk   ÚColorIncreasingrg   ÚContrastIncreasingrm   ÚBrightnessIncreasingro   ÚSharpnessIncreasingÚShearXÚShearYZ
TranslateXZ
TranslateYÚTranslateXRelÚTranslateYRelÚ
Desaturaters   Ú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|krJ|d ntd|k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r`| jtdƒkrHt d|¡}n| jdkr`t || j¡}| jpht}t	dt
||ƒƒ}| jd k	r’|  || j¡ntƒ }| j|f|ž| jŽS )Nrx   r   Úinfr>   )r»   r   r¼   r³   rŒ   rv   Úgaussr´   r€   ry   r^   rº   r�   r   r¸   r!   )rÁ   r0   r¼   Úupper_boundZ
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 k	rN|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                    s°   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“   ©rk   çš™™™™™Ù?é	   ©rž   ç333333ã?é   ©rk   rÓ   r*   ©r    rÖ   re   ©r¤   rÐ   r×   ©rž   rÓ   é   ©r¤   rÓ   r   ©r¤   rÖ   r   ©rk   çš™™™™™É?r   ©rž   rÐ   re   ©rž   rÓ   re   ©r¦   rÐ   r×   ©r«   rà   rÔ   ©rk   rÖ   r*   ©rž   rx   r   ©rŸ   rÓ   rÔ   ©r    rÖ   r   ©rž   rx   rÔ   ©r¬   rÖ   r×   ©rk   rÓ   rÜ   ©rž   rÖ   r   )r¡   rÓ   é   ©r�   rÓ   rÜ   ©r¤   rÖ   re   ©rk   rÖ   rÔ   ©r¤   rà   r“   ©r    rÐ   rÔ   ©r    rx   rÜ   ©r®   rÐ   rÔ   ©r«   r>   r   ©r¤   rÐ   r“   ©r¬   rÐ   r   ©rk   rÖ   r“   ©rk   rx   r   ©r    rÖ   r   ©rž   rÐ   r“   ©rž   r>   re   ©rž   rx   r“   ©r�   rÖ   r   ©r¬   rÓ   rÜ   ©r¦   rÖ   rÜ   )r¡   rÐ   r   ©r¤   rÖ   r²   ©rž   rÖ   r*   ©rk   rÐ   rí   ©r    rÓ   r&   c                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    s   g | ]}t |d ˆ iŽ‘qS ©r�   ©r±   ©r   rB   r  r   r   r   ´  s     z5auto_augment_policy_v0.<locals>.<listcomp>.<listcomp>r   ©r   Úspr  r   r   r   ´  s     z*auto_augment_policy_v0.<locals>.<listcomp>r   ©r�   ÚpolicyZpcr   r  r   Úauto_augment_policy_v0—  s8    çr  c                    s°   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 )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                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    s   g | ]}t |d ˆ iŽ‘qS r  r  r  r  r   r   r   Ö  s     z6auto_augment_policy_v0r.<locals>.<listcomp>.<listcomp>r   r  r  r   r   r   Ö  s     z+auto_augment_policy_v0r.<locals>.<listcomp>r   r
  r   r  r   Úauto_augment_policy_v0r¸  s8    çr  c                    s°   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Ó   re   ©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   ©r¤   rÖ   r×   ©rž   rÖ   rÜ   )r£   rÐ   r&   ræ   ©r    rà   r×   rï   ©rž   rÖ   re   )r£   rÓ   rí   ©rk   rÓ   r   ©r    rÓ   rÔ   ©rž   rÖ   r   ©rž   r>   rÜ   ©rŸ   rÖ   r“   ©rž   rx   re   rø   ©rg   rx   re   ©rk   rx   r   ©rk   rÐ   re   ©r¤   rÐ   rÜ   ©ro   rÓ   rÜ   ©rŸ   rÖ   re   ©r«   rÖ   r&   ré   c                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    s   g | ]}t |d ˆ iŽ‘qS r  r  r  r  r   r   r   ÷  s     z;auto_augment_policy_original.<locals>.<listcomp>.<listcomp>r   r  r  r   r   r   ÷  s     z0auto_augment_policy_original.<locals>.<listcomp>r   r
  r   r  r   Úauto_augment_policy_originalÚ  s8    çr%  c                    s°   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Ó   re   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                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    s   g | ]}t |d ˆ iŽ‘qS r  r  r  r  r   r   r     s     z<auto_augment_policy_originalr.<locals>.<listcomp>.<listcomp>r   r  r  r   r   r     s     z1auto_augment_policy_originalr.<locals>.<listcomp>r   r
  r   r  r   Úauto_augment_policy_originalrû  s8    çr&  c                    s&   dgdgdgg}‡ fdd„|D ƒ}|S )N)r¤   rx   r&   )r¯   rx   r²   )r°   rx   r²   c                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    s   g | ]}t |d ˆ iŽ‘qS r  r  r  r  r   r   r   "  s     z5auto_augment_policy_3a.<locals>.<listcomp>.<listcomp>r   r  r  r   r   r   "  s     z*auto_augment_policy_3a.<locals>.<listcomp>r   r
  r   r  r   Úauto_augment_policy_3a  s    ýr'  Úv0c                 C   sn   |pt }| dkrt|ƒS | dkr(t|ƒS | dkr8t|ƒS | dkrHt|ƒS | dkrXt|ƒS dsjtd| › �ƒ‚d S )NÚoriginalZ	originalrr(  Zv0rÚ3aFzUnknown AA policy )rµ   r%  r&  r  r  r'  ÚAssertionError)r¶   r�   r   r   r   Úauto_augment_policy&  s    r,  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚAutoAugmentc                 C   s
   || _ d S r?   )r  )rÁ   r  r   r   r   rÂ   7  s    zAutoAugment.__init__c                 C   s"   t  | j¡}|D ]}||ƒ}q|S r?   )r   r    r  )rÁ   r0   Z
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   s   g | ]}t |ƒ‘qS r   )Ústr)r   r.  r   r   r   r   D  s     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   r-  5  s   r-  )Ú
config_strr�   c           	      C   sŒ   |   d¡}|d }|dd… }|D ]T}t  d|¡}t|ƒdk r@q"|dd… \}}|dkrj| dt|ƒ¡ q"d	s"td
ƒ‚q"t||d�}t|ƒS )az  
    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').

            The remaining sections:
                'mstd' -  float std deviation of magnitude noise applied
            Ex 'original-mstd0.5' results in AutoAugment with original policy, magnitude_std 0.5

        hparams: Other hparams (kwargs) for the AutoAugmentation scheme

    Returns:
         A PyTorch compatible Transform
    ú-r   r*   Nú(\d.*)r   Úmstdr³   Fz"Unknown AutoAugment config sectionr  )ÚsplitÚrer`   Ú
setdefaultrŒ   r+  r,  r-  )	r3  r�   ÚconfigZpolicy_namerD   ÚcsÚkeyÚvalZ	aa_policyr   r   r   Úauto_augment_transformJ  s    
r>  r�   rž   rŸ   r    r¡   r¤   r¦   rk   rg   rm   ro   r«   r¬   r­   r®   r¢   r¥   r§   r¨   r©   rª   r¯   rs   rí   r×   r*   )r¥   r¯   rs   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 r?   )r   ÚzipÚitemsÚnpÚarrayÚsum)r?  Zprobsr   r   r   Ú_get_weighted_transformsÃ  s    
rE  )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ÚweightsZ3awr*  )Ú_RAND_WEIGHTED_0Ú_RAND_WEIGHTED_3AÚ_RAND_3AÚ_RAND_INCREASING_TRANSFORMSÚ_RAND_TRANSFORMS)r¶   Ú
increasingr   r   r   Úrand_augment_choicesÊ  s    rM  r²   ©r¼   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µ   rK  rN  r   rQ  r   Úrand_augment_opsÔ  s
    ÿrR  c                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚRandAugmentr   Nc                 C   s   || _ || _|| _d S r?   )ÚopsÚ
num_layersÚchoice_weights)rÁ   rT  rU  rV  r   r   r   rÂ   á  s    zRandAugment.__init__c                 C   s6   t jj| j| j| jd k| jd�}|D ]}||ƒ}q$|S )N)Úreplacer2  )rB  r   r    rT  rU  rV  )rÁ   r0   rT  r.  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É   rU  rT  ©rÁ   rÊ   r.  r   r   r   rË   ò  s
    
zRandAugment.__repr__)r   NrÌ   r   r   r   r   rS  à  s   
rS  )r3  r�   r?  c                 C   s¤  t }d}d}d}|  d¡}|d dks*t‚|dd… }|D ]ü}| d	¡rft|dd… ƒ}	|dkrd|	}q:t d
|¡}
t|
ƒdk r€q:|
dd… \}}	|dkr¾t|	ƒ}|dkr°tdƒ}| d|¡ q:|dkrØ| dt	|	ƒ¡ q:|dkrît
|	ƒrìd}q:|dk�rt	|	ƒ}q:|dk�rt	|	ƒ}q:|dk�r*t|	ƒ}q:ds:tdƒ‚q:t|tƒ�rRt||d�}n|dk�rj|�rftnt}d}t|tƒ�r†t|ƒ\}}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 sepecific 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
            Ex '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

        hparams (dict): Other hparams (kwargs) for the RandAugmentation scheme

    Returns:
         A PyTorch compatible Transform
    r   Fr|   r4  r   Zrandr*   NÚtr5  r6  éd   rÃ   r³   Zmmaxr´   ÚincTÚmÚnr2  z"Unknown RandAugment config section)rL  rN  )rV  )r€   r7  r+  Ú
startswithr/  r8  r`   rŒ   r9  r   Úboolr   rM  rJ  rK  r   rE  rR  rS  )r3  r�   r?  r¼   rU  rL  r»   r:  rD   r=  r;  r<  r6  rV  Zra_opsr   r   r   Úrand_augment_transformú  sT    








rb  ©r¼   r�   r?  c                    s$   ˆ pt ‰ |pt}‡ ‡fdd„|D ƒS )Nc                    s   g | ]}t |d ˆˆ d�‘qS )rx   rO  r  rP  ©r�   r¼   r   r   r   c  s   ûüzaugmix_ops.<locals>.<listcomp>)rµ   Ú_AUGMIX_TRANSFORMSrc  r   rd  r   Ú
augmix_ops\  s
    ûrf  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
    rx   r×   éÿÿÿÿFc                 C   s"   || _ || _|| _|| _|| _d S r?   )rT  ÚalphaÚwidthÚdepthÚblended)rÁ   rT  ri  rj  rk  rl  r   r   r   rÂ   q  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 )Nrx   rh  r*   ©Zdtype)r]   rB  rC  Úfloat32)rÁ   Úwsr^  ZcumpZrwsrO   ri  r   r   r   Ú_calc_blended_weightsx  s    z#AugMixAugment._calc_blended_weightsc                 C   sx   |  ¡ }|  ||¡}|D ]Z}| jdkr,| jntj dd¡}tjj| j|dd�}|}	|D ]}
|
|	ƒ}	qVt 	||	|¡}q|S )Nr   r*   r“   T©rW  )
r½   rp  rk  rB  r   Úrandintr    rT  r   Úblend)rÁ   r0   Úmixing_weightsr^  Zimg_origro  rO   rk  rT  Úimg_augr.  r   r   r   Ú_apply_blended‚  s    
zAugMixAugment._apply_blendedc                 C   sÊ   |j d |j d t| ¡ ƒf}tj|tjd�}|D ]d}| jdkrF| jntj dd¡}tjj	| j
|dd�}|}	|D ]}
|
|	ƒ}	qp||tj|	tjd� 7 }q2tj|dd|d� t | tj¡¡}t |||¡S )	Nr   r*   rm  r“   Trq  g     ào@)Úout)r-   r`   ZgetbandsrB  Zzerosrn  rk  r   rr  r    rT  ZasarrayZclipr   Z	fromarrayZastypeZuint8rs  )rÁ   r0   rt  r^  Z	img_shapeÚmixedÚmwrk  rT  ru  r.  r   r   r   Ú_apply_basic’  s    
zAugMixAugment._apply_basicc                 C   s\   t  t j | jg| j ¡¡}t  t j | j| j¡¡}| jrJ|  |||¡}n|  	|||¡}|S r?   )
rB  rn  r   Z	dirichletri  rj  Úbetarl  rv  rz  )rÁ   r0   rt  r^  rx  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=rX  rY  rÇ   )rÈ   rÉ   ri  rj  rk  rT  rZ  r   r   r   rË   ¬  s
    &
zAugMixAugment.__repr__N)rx   r×   rh  F)
rÉ   rÍ   rÎ   Ú__doc__rÂ   rp  rv  rz  rÆ   rË   r   r   r   r   rg  k  s   

	rg  c                 C   s  d}d}d}d}d}|   d¡}|d dks.t‚|dd	… }|D ]®}t  d
|¡}	t|	ƒdk r\q>|	d	d… \}
}|
dkr†| dt|ƒ¡ q>|
dkr˜t|ƒ}q>|
dkrªt|ƒ}q>|
dkr¼t|ƒ}q>|
dkrÎt|ƒ}q>|
dkràt|ƒ}q>ds>tdƒ‚q>| 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 sepecific 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×   rh  rx   Fr4  r   Zaugmixr*   Nr5  r   r6  r³   r^  rO   rE   rB   rC   zUnknown AugMix config sectionrÃ   )r¼   r�   )ri  rj  rk  rl  )
r7  r+  r8  r`   r9  rŒ   r   ra  rf  rg  )r3  r�   r¼   rj  rk  ri  rl  r:  rD   r;  r<  r=  rT  r   r   r   Úaugment_and_mix_transform´  s:    





r}  )r   )r>   rx   T)r(  N)N)T)r²   r|   NN)NN)r²   NN)N)ar|  r   rI   r8  Ú	functoolsr   Útypingr   r   r   r   ZPILr   r   r	   r
   r   ÚnumpyrB  r   Ú__version__r7  r'   r¿   r€   r¾   rµ   Úhasattrr   ZBILINEARZBICUBICrÀ   r   r#   r(   r2   r3   r7   r8   r:   r;   rH   rS   rT   rU   rV   rd   rf   rj   rl   rn   rp   rt   rw   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>  rK  rJ  rI  rH  rG  rE  rM  r   rŒ   rR  rS  rb  re  rf  rg  r}  r   r   r   r   Ú<module>   sÐ  "þ



ä!å2!"!!

$ññýòñ    ü
ü  ýýRó   ý
ýI