Scheaven
2021-09-18 291deeb1fcf45dbf39a24aa72a213ff3fd6b3405
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
U
©r_fwã@sdZddlZddlZddlZddlZddlZddlmZmZm    Z    e
dd„ej   d¡dd…DƒƒZ dZd    Zed
ed ZejejfZd d „Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Z d$d%„Z!d‰d'd(„Z"d)d*„Z#d+d,„Z$d-d.„Z%d/d0„Z&d1d2„Z'd3d4„Z(d5d6„Z)d7d8„Z*d9d:„Z+d;d<„Z,d=d>„Z-d?d@„Z.dAdB„Z/dCdD„Z0dEdF„Z1dGdH„Z2dIdJ„Z3dKdL„Z4ddde)e/e0e1e2e3e4e*e+e*e+e*e+e*e+e,e,e-e-e.e.dMœZ5ee eee#e#e#e!e!e"e%e%e$e$e&e&e'e'eeeeeedMœZ6GdNdO„dOƒZ7dPdQ„Z8dRdS„Z9dTdU„Z:dVdW„Z;dŠdYdZ„Z<Gd[d\„d\ƒZ=d]d^„Z>d_d`dadbdcdddedfdgdhdidjdkdldmgZ?d_d`dadbdndodedpdqdrdsdjdkdldmgZ@dtdududvdvdwdwdwdxdxdxdxdxdddyœZAd‹dzd{„ZBdŒd}d~„ZCGdd€„d€ƒZDdd‚„ZEd_dpdqdrdsd`dbdndodjdkdldmg ZFddƒd„„ZGGd…d†„d†ƒZHd‡dˆ„ZIdS)Žz9
@author:  liaoxingyu
@contact: sherlockliao01@gmail.com
éN)ÚImageÚImageOpsÚ ImageEnhancecCsg|] }t|ƒ‘qS©)Úint)Ú.0Úxrrú ./data/transforms/autoaugment.pyÚ
<listcomp>sr
Ú.é)é€r r g$@é9)Útranslate_constÚimg_meancCs.| dtj¡}t|ttfƒr&t |¡S|SdS)NÚresample)ÚpoprÚBILINEARÚ
isinstanceÚlistÚtupleÚrandomÚchoice)ÚkwargsÚ interpolationrrr    Ú_interpolation-s
rcCs*d|krtdkr| d¡t|ƒ|d<dS)NÚ    fillcolor©érr)Ú_PIL_VERrr)rrrr    Ú_check_args_tf5s
r c    Ks*t|ƒ|j|jtjd|ddddff|ŽS©Nér©r Ú    transformÚsizerÚAFFINE©ÚimgÚfactorrrrr    Úshear_x;sr*c    Ks*t|ƒ|j|jtjddd|ddff|ŽSr!r#r'rrr    Úshear_y@sr+c    Ks8||jd}t|ƒ|j|jtjdd|dddff|ŽS)Nrr"©r%r r$rr&©r(ÚpctrÚpixelsrrr    Útranslate_x_relEsr0c    Ks8||jd}t|ƒ|j|jtjddddd|ff|ŽSr!r,r-rrr    Útranslate_y_relKsr1c    Ks*t|ƒ|j|jtjdd|dddff|ŽSr!r#©r(r/rrrr    Útranslate_x_absQsr3c    Ks*t|ƒ|j|jtjddddd|ff|ŽSr!r#r2rrr    Útranslate_y_absVsr4c
Ks$t|ƒtdkr|j|f|ŽStdkr|j\}}d}|d|df}t |¡ }tt |¡dƒtt |¡dƒdtt |¡ dƒtt |¡dƒdg}dd„}    |    |d     |d    |d
 |d
|ƒ\|d <|d <|d |d    7<|d |d
7<|j    |jt
j |f|ŽS|j||d dSdS)N)rr r)rrg@éçc    Ss8|\}}}}}}||||||||||fS©Nr)    rÚyÚmatrixÚaÚbÚcÚdÚeÚfrrr    r$mszrotate.<locals>.transformrr"r rr)r) r rÚrotater%ÚmathÚradiansÚroundÚcosÚsinr$rr&)
r(ÚdegreesrÚwÚhÚ
post_transÚ rotn_centerÚangler9r$rrr    r@[s2
 
 ú    ÿr@cKs
t |¡Sr7)rÚ autocontrast©r(Ú__rrr    Ú auto_contrast{srOcKs
t |¡Sr7)rÚinvertrMrrr    rPsrPcKs
t |¡Sr7)rÚequalizerMrrr    rQƒsrQcKs t ||¡Sr7)rÚsolarize)r(ÚthreshrNrrr    rR‡srRr cKsxg}tdƒD],}||kr.| td||ƒ¡q | |¡q |jdkrp|jdkrft|ƒdkrf|||}| |¡S|SdS)Nééÿ)ÚLÚRGBrW)ÚrangeÚappendÚminÚmodeÚlenÚpoint)r(ÚaddrSrNÚlutÚirrr    Ú solarize_add‹s  
 
racKs|dkr |St ||¡S)Né)rÚ    posterize)r(Z bits_to_keeprNrrr    rcšsrccKst |¡ |¡Sr7)rÚContrastÚenhance©r(r)rNrrr    Úcontrast srgcKst |¡ |¡Sr7)rÚColorrerfrrr    Úcolor¤sricKst |¡ |¡Sr7)rÚ
Brightnessrerfrrr    Ú
brightness¨srkcKst |¡ |¡Sr7)rÚ    Sharpnessrerfrrr    Ú    sharpness¬srmcCst ¡dkr| S|S)zWith 50% prob, negate the valueçà?)r)Úvrrr    Ú_randomly_negate°srpcCs|td}t|ƒ}|fS)Ng>@©Ú
_MAX_LEVELrp©ÚlevelZ_hparamsrrr    Ú_rotate_level_to_argµs rucCs|tddfS)NgÍÌÌÌÌÌü?皙™™™™¹?)rrrsrrr    Ú_enhance_level_to_arg¼srwcCs|td}dt|ƒ}|fS)NgÍÌÌÌÌÌì?çð?rqrsrrr    Ú _enhance_increasing_level_to_argÁs  rycCs|td}t|ƒ}|fS)Nç333333Ó?rqrsrrr    Ú_shear_level_to_argÉs r{cCs&|d}|tt|ƒ}t|ƒ}|fS)Nr)rrÚfloatrp)rtÚhparamsrrrr    Ú_translate_abs_level_to_argÐsr~cCs&| dd¡}|t|}t|ƒ}|fS)NÚ translate_pctgÍÌÌÌÌÌÜ?)Úgetrrrp)rtr}rrrr    Ú_translate_rel_level_to_arg×s  rcCst|tdƒfS©Né©rrrrsrrr    Ú_posterize_level_to_argßsr…cCsdt||ƒdfS)Nrƒr)r…)rtr}rrr    Ú"_posterize_increasing_level_to_argæsr†cCst|tdƒdfSr‚r„rsrrr    Ú _posterize_original_level_to_argísr‡cCst|tdƒfS)NrTr„rsrrr    Ú_solarize_level_to_argôsrˆcCsdt||ƒdfS)NrTr)rˆrsrrr    Ú!_solarize_increasing_level_to_argúsr‰cCst|tdƒfS)Nénr„rsrrr    Ú_solarize_add_level_to_argsr‹)Ú AutoContrastÚEqualizeÚInvertÚRotateÚ    PosterizeÚPosterizeIncreasingÚPosterizeOriginalÚSolarizeÚSolarizeIncreasingÚ SolarizeAddrhÚColorIncreasingrdÚContrastIncreasingrjÚBrightnessIncreasingrlÚSharpnessIncreasingÚShearXÚShearYZ
TranslateXZ
TranslateYÚ TranslateXRelÚ TranslateYRelc@seZdZddd„Zdd„ZdS)    Ú    AugmentOprné
NcCst|pt}t||_t||_||_||_| ¡|_t    d|krD|dnt
d|krV|dnt d|_ |j  dd¡|_dS)Nrr)rrÚ magnitude_stdr)Ú_HPARAMS_DEFAULTÚ
NAME_TO_OPÚaug_fnÚ LEVEL_TO_ARGÚlevel_fnÚprobÚ    magnitudeÚcopyr}ÚdictÚ_FILLÚ_RANDOM_INTERPOLATIONrr€r )ÚselfÚnamer¦r§r}rrr    Ú__init__?s
 
 
þ    zAugmentOp.__init__cCs‚|jdkrt ¡|jkr|S|j}|jr@|jdkr@t ||j¡}tttd|ƒƒ}|jdk    rh| ||j    ¡nt
ƒ}|j |f|ž|j ŽS)Nrxr) r¦rr§r ÚgaussrZrrÚmaxr¥r}rr£r)r¬r(r§Z
level_argsrrr    Ú__call__QszAugmentOp.__call__)rnrŸN©Ú__name__Ú
__module__Ú __qualname__r®r±rrrr    rž=s
ržcs°ddgddgddgddgd    d
gd d gd dgddgddgddgddgddgddgddgddgddgd d!gd"d#gd$d%gd&d'gd(d)gd*d+gd,d-gdd.gd/d0gg}‡fd1d2„|Dƒ}|S)3N©rçš™™™™™é?r"©r›r·rƒ©rh皙™™™™Ù?é    ©rç333333ã?é©rhrºr"©rr½rb©r“r·r¾©rrºé©r“rºr ©r“r½r ©rh皙™™™™É?r©rr·rb©rrºrb©r•r·r¾©ršrÇr»©rhr½r"©rrxr ©rŽrºr»©rr½r©rrxr»©r›r½r¾©rhrºrérr½r)rrºé©rŒrºrér“r½rb©rhr½r»©r“rÇrƒ©rr·r»©rrxrérr·r»©ršr6r©r“r·rƒ©r›r·r©rhr½rƒ©rhrxr©rr½r ©rr·rƒ©rr6rb©rrxrƒ©rŒr½r ©r›rºrér•r½rÃ)rr·r ©r“r½rŸ©rr½r"©rhr·rÔ©rrºrcsg|]}‡fdd„|Dƒ‘qS)csg|]}t|dˆiŽ‘qS©r}©rž©rr:rìrr    r
ysz5auto_augment_policy_v0.<locals>.<listcomp>.<listcomp>r©rÚsprìrr    r
ysz*auto_augment_policy_v0.<locals>.<listcomp>r©r}ÚpolicyZpcrrìr    Úauto_augment_policy_v0\s8çrócs°ddgddgddgddgd    d
gd d gd dgddgddgddgddgddgddgddgddgddgd d!gd"d#gd$d%gd&d'gd(d)gd*d+gd,d-gdd.gd/d0gg}‡fd1d2„|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ëcsg|]}‡fdd„|Dƒ‘qS)csg|]}t|dˆiŽ‘qSrìrírîrìrr    r
›sz6auto_augment_policy_v0r.<locals>.<listcomp>.<listcomp>rrïrìrr    r
›sz+auto_augment_policy_v0r.<locals>.<listcomp>rrñrrìr    Úauto_augment_policy_v0r}s8çrõcs°ddgddgddgddgd    d
gd d gd dgddgddgddgd dgddgddgddgddgd dgddgd d!gd"d#gddgd    d
gddgddgddgddgg}‡fd$d%„|Dƒ}|S)&N)r’rºrb©rr½r»©r“r½r©rŒr½rrÈr¼)r’r½rÃ)r’r½rÔrÂrØ©rrºrƒ©rr·rb©r“r½r¾©rr½rÃ)r’r·rrÍ©rrÇr¾rÖ©rr½rb)r’rºrÔ©rhrºr©rrºr»©rr½r ©rr6rérŽr½rƒ©rrxrbrß©rdrxrb©rhrxr ©rhr·rb©r“r·rérlrºrérŽr½rb©ršr½rrÐcsg|]}‡fdd„|Dƒ‘qS)csg|]}t|dˆiŽ‘qSrìrírîrìrr    r
¼sz;auto_augment_policy_original.<locals>.<listcomp>.<listcomp>rrïrìrr    r
¼sz0auto_augment_policy_original.<locals>.<listcomp>rrñrrìr    Úauto_augment_policy_originalŸs8çr cs°ddgddgddgddgd    d
gd d gd dgddgddgddgd dgddgddgddgddgd dgddgd d!gd"d#gddgd    d
gddgddgddgddgg}‡fd$d%„|Dƒ}|S)&N)r‘rºrbrör÷rørÈr¼)r‘r½rÃ)r‘r½rÔrÂrØrùrúrûrü)r‘r·rrÍrýrÖrþrôrÿrrrrrrßrrrrr    r
r rÐcsg|]}‡fdd„|Dƒ‘qS)csg|]}t|dˆiŽ‘qSrìrírîrìrr    r
Ýsz<auto_augment_policy_originalr.<locals>.<listcomp>.<listcomp>rrïrìrr    r
Ýsz1auto_augment_policy_originalr.<locals>.<listcomp>rrñrrìr    Úauto_augment_policy_originalrÀs8çr ÚoriginalcCsXt}|dkrt|ƒS|dkr$t|ƒS|dkr4t|ƒS|dkrDt|ƒSdsTtd|ƒ‚dS)NrZ    originalrZv0Zv0rFzUnknown AA policy (%s))r¡r r rórõÚAssertionError)r­r}rrr    Úauto_augment_policyásrc@seZdZdd„Zdd„ZdS)Ú AutoAugmentcCs||_d|_tƒ|_dS)Nr)Ú
total_iterÚgammarrò)r¬rrrr    r®ñszAutoAugment.__init__cCsTt dd¡|jkrLt |j¡}td|jd|jƒ|_|D] }||ƒ}q:|S|SdS)Nrr"rx)rÚuniformrrròrZr)r¬r(Z
sub_policyÚoprrr    r±ös 
zAutoAugment.__call__Nr²rrrr    rïsrc    Csˆ| d¡}|d}|dd…}|D]T}t d|¡}t|ƒdkr@q"|dd…\}}|dkrj| dt|ƒ¡q"d    s"td
ƒ‚q"t|ƒ}t|ƒS) a[
    Create a AutoAugment transform
    :param 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, not order sepecific determine
        'mstd' -  float std deviation of magnitude noise applied
    Ex 'original-mstd0.5' results in AutoAugment with original policy, magnitude_std 0.5
    :param hparams: Other hparams (kwargs) for the AutoAugmentation scheme
    :return: A PyTorch compatible Transform
    ú-rr"Nú(\d.*)r Úmstdr Fz"Unknown AutoAugment config section)ÚsplitÚrer\Ú
setdefaultr|rrr)    Ú
config_strr}ÚconfigZ policy_namer<ÚcsÚkeyÚvalZ    aa_policyrrr    Úauto_augment_transforms
   r!rŒrrŽrrr“r•rhrdrjrlršr›rœrr‘r”r–r—r˜r™rzrÇrvgš™™™™™™?g{®Gázt?)rršr›rœrrhrlrŒr“r•rdrjrrrŽcs<|pt}|dkst‚t‰‡fdd„|Dƒ}|t |¡}|S)Nrcsg|] }ˆ|‘qSrr)rÚk©Z rand_weightsrr    r
\sz(_select_rand_weights.<locals>.<listcomp>)Ú_RAND_TRANSFORMSrÚ_RAND_CHOICE_WEIGHTS_0ÚnpÚsum)Ú
weight_idxÚ
transformsÚprobsrr#r    Ú_select_rand_weightsXs  r+rŸcs$ˆpt‰|pt}‡‡fdd„|DƒS)Ncsg|]}t|dˆˆd‘qS)rn©r¦r§r}rí©rr­©r}r§rr    r
dsÿÿz$rand_augment_ops.<locals>.<listcomp>)r¡r$©r§r}r)rr.r    Úrand_augment_opsas
 ÿr0c@seZdZddd„Zdd„ZdS)Ú RandAugmentr NcCs||_||_||_dSr7)ÚopsÚ
num_layersÚchoice_weights)r¬r2r3r4rrr    r®iszRandAugment.__init__cCs6tjj|j|j|jdk|jd}|D] }||ƒ}q$|S)N)ÚreplaceÚp)r&rrr2r3r4)r¬r(r2rrrr    r±nsÿ
zRandAugment.__call__)r Nr²rrrr    r1hs
r1c Cs t}d}d}t}| d¡}|ddks*t‚|dd…}|D] }t d|¡}t|ƒdkrXq:|dd…\}    }
|    dkr‚| d    t|
ƒ¡q:|    d
kr˜t|
ƒrÚt    }q:|    d krªt
|
ƒ}q:|    d kr¼t
|
ƒ}q:|    d krÎt
|
ƒ}q:ds:tdƒ‚q:t |||d} |dkrödnt |ƒ} t | || dS)a
    Create a RandAugment transform
    :param config_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)
        'w' - integer probabiliy weight index (index of a set of weights to influence choice of op)
        'mstd' -  float std deviation of magnitude noise applied
        'inc' - integer (bool), use augmentations that increase in severity with magnitude (default: 0)
    Ex 'rand-m9-n3-mstd0.5' results in RandAugment with magnitude 9, num_layers 3, magnitude_std 0.5
    'rand-mstd1-w0' results in magnitude_std 1.0, weights 0, default magnitude of 10 and num_layers 2
    :param hparams: Other hparams (kwargs) for the RandAugmentation scheme
    :return: A PyTorch compatible Transform
    r NrrÚrandr"rrr ÚincÚmÚnrGFz"Unknown RandAugment config sectionr/)r4)rrr$rrrr\rr|ÚboolÚ_RAND_INCREASING_TRANSFORMSrr0r+r1) rr}r§r3r(r)rr<rrr Zra_opsr4rrr    Úrand_augment_transformws6
 
 
 
r=cs$ˆpt‰|pt}‡‡fdd„|DƒS)Ncsg|]}t|dˆˆd‘qS)rxr,rír-r.rr    r
ºsÿÿzaugmix_ops.<locals>.<listcomp>)r¡Ú_AUGMIX_TRANSFORMSr/rr.r    Ú
augmix_ops·s
 ÿr?c@s:eZdZdZddd„Zdd    „Zd
d „Zd d „Zdd„ZdS)Ú 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
    rxr¾éÿÿÿÿFcCs"||_||_||_||_||_dSr7)r2ÚalphaÚwidthÚdepthÚblended)r¬r2rBrCrDrErrr    r®Ås
zAugMixAugment.__init__cCs\||}d}g}|ddd…D]"}||}|d|9}| |¡qtj|ddd…tjdS)NrxrAr"©Údtype)rYr&ÚarrayÚfloat32)r¬Úwsr9ZcumpZrwsrGrBrrr    Ú_calc_blended_weightsÌs  z#AugMixAugment._calc_blended_weightsc Csx| ¡}| ||¡}|D]Z}|jdkr,|jn tj dd¡}tjj|j|dd}|}    |D] }
|
|    ƒ}    qVt     ||    |¡}q|S)Nrr"rƒT©r5)
r¨rKrDr&rÚrandintrr2rÚblend) r¬r(Úmixing_weightsr9Zimg_origrJrGrDr2Úimg_augrrrr    Ú_apply_blendedÖs 
zAugMixAugment._apply_blendedc CsÊ|jd|jdt| ¡ƒf}tj|tjd}|D]d}|jdkrF|jn tj dd¡}tjj    |j
|dd}|}    |D] }
|
|    ƒ}    qp||tj |    tjd7}q2tj |dd|dt  | tj¡¡}t  |||¡S)    Nrr"rFrƒTrLgào@)Úout)r%r\Úgetbandsr&ÚzerosrIrDrrMrr2ÚasarrayÚcliprÚ    fromarrayÚastypeÚuint8rN) r¬r(rOr9Ú    img_shapeÚmixedZmwrDr2rPrrrr    Ú _apply_basicæs
zAugMixAugment._apply_basiccCs\t tj |jg|j¡¡}t tj |j|j¡¡}|jrJ| |||¡}n|     |||¡}|Sr7)
r&rIrÚ    dirichletrBrCÚbetarErQr\)r¬r(rOr9r[rrr    r±÷s zAugMixAugment.__call__N)rxr¾rAF)    r³r´rµÚ__doc__r®rKrQr\r±rrrr    r@¾s 
 
r@c Cs d}d}d}d}d}| d¡}|ddks.t‚|dd    …}|D]®}t d
|¡}    t|    ƒd kr\q>|    d    d …\}
} |
d kr†| d t| ƒ¡q>|
dkr˜t| ƒ}q>|
dkrªt| ƒ}q>|
dkr¼t| ƒ}q>|
dkrÎt| ƒ}q>|
dkràt| ƒ}q>ds>tdƒ‚q>t||d} t    | ||||dS)aµ Create AugMix PyTorch transform
    :param config_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
    :param hparams: Other hparams (kwargs) for the Augmentation transforms
    :return: A PyTorch compatible Transform
    r¾rArxFrrZaugmixr"Nrr rr r9rGr=r:r;zUnknown AugMix config section)r§r})rBrCrDrE)
rrrr\rr|rr;r?r@) rr}r§rCrDrBrErr<rrr r2rrr    Úaugment_and_mix_transforms8
 
 
 
 
 
 r`)r )r)rN)rŸNN)rŸNN)Jr_rArrÚPILÚnumpyr&rrrrÚ __version__rrrªrrr©r¡rÚBICUBICr«rr r*r+r0r1r3r4r@rOrPrQrRrarcrgrirkrmrprurwryr{r~rr…r†r‡rˆr‰r‹r¤r¢ržrórõr r rrr!r$r<r%r+r0r1r=r>r?r@r`rrrr    Ú<module>sZ"þ  
çè!"!!
ñññ
    
0ó
C