g=tSrSSKrSSKrSSKrSSKJrJrJrJr SSKrSSK r \ "\RRS5SSVs/sH n\"U5PM sn5rSrSr\"S\S 9r\R(\R*4rS rS rS rS rSrSrSrSrSrSr Sr!Sr"Sr#SXSjr$Sr%Sr&Sr'Sr(Sr)Sr*Sr+Sr,S r-S!r.S"r/S#r0S$r1S%r2S&r3S'r4S(r5S)r60S*S_S+S_S,S_S-\+_S.\1_S/\2_S0\3_S1\4_S2\5_S3\6_S4\,_S5\-_S6\,_S7\-_S8\,_S9\-_S:\,_\-\.\.\/\/\0\0S;.Er70S*\ _S+\"_S,\!_S-\_S.\%_S/\%_S0\%_S1\#_S2\#_S3\$_S4\'_S5\'_S6\&_S7\&_S8\(_S9\(_S:\)_\)\\\\\\S;.Er8"S<S=5r9S>r:S?r;S@r"SCSD5r?SEr@/SFQrA/SGQrBSHSISISJSJSKSKSKSLSLSLSLSLSSSM.rCSZSNjrDS[SOjrE"SPSQ5rFSRrG/SSQrHS[STjrI"SUSV5rJSWrKgs snf)\aOAutoAugment, RandAugment, and AugMix 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 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 Hacked together by / Copyright 2020 Ross Wightman N)ImageImageOps ImageEnhance ImageChops.)r r g$@)translate_constimg_meancURS[R5n[U[[ 45(a[ R"U5$U$)Nresample)poprBILINEAR isinstancelisttuplerandomchoice)kwargs interpolations ;C:\Users\Terry\Desktop\FGVC-HERBS\timm\data\auto_augment.py_interpolationr,s<JJz5>>:M-$//}}]++cbSU;a:aURS5 [U5US'g)N fillcolorrr)_PIL_VERrr)rs r_check_args_tfr 4s,fF!2 ;'/F:rc ~[U5 UR"UR[RSUSSSS440UD6$Nrr transformsizerAFFINEimgfactorrs rshear_xr+:s76 ==5<Uup4pVpxX0-XA--U-X`-Xq--U-4$N) xymatrixabcdefs rr%rotate..transformls3!' Q1515=1$aeaema&77 7rrr#rrr)r) r rrotater&mathradiansroundcossinr%rr') r)degreesrwh post_trans rotn_centeranglerCr%s rrKrKZsX66zz',V,, V xx 3wC( g&& $((5/2 & $((5/2 &  488E?"B ' $((5/2 &    8 ) ^Ojm +k!n_z!}-Lf q 6!9 q [^# q [^# }}SXXu||VFvFFzz':,>z??rc .[R"U5$r?)r autocontrastr)__s r auto_contrastr[zs   %%rc .[R"U5$r?)rinvertrYs rr]r]~s ??3 rc .[R"U5$r?)requalizerYs rr_r_s   S !!rc .[R"X5$r?)rsolarize)r)threshrZs rraras   S ))rc &/n[S5H8nXR:aUR[SXQ-55 M'URU5 M: URS;a7URS:Xa[ U5S:XaXD-U-nUR U5$U$)N)LRGBrg)rangeappendminmodelenpoint)r)addrbrZlutis r solarize_addrqs| C 3Z : JJs3( ) JJqM   xx< 88u SS)c/Cyy~ rc >US:aU$[R"X5$)N)r posterize)r) bits_to_keeprZs rrtrts q   c 00rc L[R"U5RU5$r?)rContrastenhancer)r*rZs rcontrastrzs   % - -f 55rc L[R"U5RU5$r?)rColorrxrys rcolorr}s   c " * *6 22rc L[R"U5RU5$r?)r Brightnessrxrys r brightnessrs  " "3 ' / / 77rc L[R"U5RU5$r?)r Sharpnessrxrys r sharpnessrs  ! !# & . .v 66rc>[R"5S:aU*$U$)zWith 50% prob, negate the value?)r)vs r_randomly_negaters3&A2-A-rc6U[- S-n[U5nU4$)Ng>@ _MAX_LEVELrlevel_hparamss r_rotate_level_to_argr" Z 3 &E U #E 6Mrc"U[- S-S-4$)Ng?皙?)rrs r_enhance_level_to_argrs J # % + ,,rc<U[- S-nS[U5-nU4$)Ng??rrs r _enhance_increasing_level_to_argrs*Z 2 %E "5) )E 6Mrc6U[- S-n[U5nU4$)N333333?rrs r_shear_level_to_argrrrcRUSnU[- [U5-n[U5nU4$)Nr )rfloatr)rhparamsr s r_translate_abs_level_to_argrs2/0O Z 5#9 9E U #E 6MrcZURSS5nU[- U-n[U5nU4$)N translate_pctg?)getrr)rrrs r_translate_rel_level_to_argrs2KK6M Z = 0E U #E 6Mrc.[U[- S-54$Nintrrs r_posterize_level_to_argrs  "a' ( ))rc&S[X5S- 4$)Nrr)r)rrs r"_posterize_increasing_level_to_argrs &u6q9 9 ::rc4[U[- S-5S-4$rrrs r _posterize_original_level_to_argrs!  "a' (1 , --rc.[U[- S-54$)Nrdrrs r_solarize_level_to_argrs  "c) * ++rc&S[X5S- 4$)Nrdr)rrs r!_solarize_increasing_level_to_argrs '8; ; <r?rrrr s rauto_augment_policy_originalrrBs* )*<= 78 34 (*IJ 34 12 34 (*>? 12 >? ./ 12 34 12 01 ./ 01  23 12 01 34 78 12 01 343F6BH H22 62a9a ) )2 6B H I 7 Hr%cU=(d [nUS:Xa [U5$US:Xa [U5$US:Xa [U5$US:Xa [ U5$SU-5e)Noriginal originalrv0v0rzUnknown AA policy (%s))rr@rBr$r()rrs rauto_augment_policyrHsg))G z+G44  ,W55 %g.. &w//5.55urc \rSrSrSrSrSrg) AutoAugmenticXlgr?r!)rr!s rrAutoAugment.__init__s rch[R"UR5nUH nU"U5nM U$r?)rrr!)rr) sub_policyops rrAutoAugment.__call__s,]]4;;/ BS'C rrLNrr@rrrJrJs rrJc URS5nUSnUSSnUHZn[R"SU5n[U5S:aM+USSupgUS:XaURS[ U55 MUS 5e [ X1S 9n[ U5$) 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.*)rmstdrz"Unknown AutoAugment config section)r)splitrerl setdefaultrrHrJ) config_strrconfig policy_namerFcskeyval aa_policys rauto_augment_transformr`s  c "F)K ABZF  XXi # r7Q; bq6 &=   c ; >> >5$KAI y !!r)rrrrrrrr|rwrrrrrr)rrrrrrrrrrrrrrrrrrg?g{Gzt?)rrrrrr|rrrrrwrrrrcU=(d [nUS:Xde[nUVs/sHo2UPM nnU[R"U5-nU$s snf)Nr)_RAND_TRANSFORMS_RAND_CHOICE_WEIGHTS_0npsum) weight_idx transforms rand_weightskprobss r_select_rand_weightsrk\sP//J ??)L&0 1j!_jE 1 RVVE]E L 2sA c U=(d [nU=(d [nUVs/sHn[USXS9PM sn$s snf)Nrrrr)rrbrrrrgrs rrand_augment_opsroesM))G//JJT VJT$  3) >JT VV V;c$\rSrSrSSjrSrSrg) RandAugmentilNc(XlX lX0lgr?)ops num_layerschoice_weights)rrtrurvs rrRandAugment.__init__ms$,rc[RRURURUR SLUR S9nUH nU"U5nM U$)N)replacep)rdrrrtrurv)rr)rtrPs rrRandAugment.__call__rsVii HHdoot/B/Bd/JdNaNacBS'C r)rvrurt)rNrr@rrrrrrls - rrrc[nSnSn[nURS5nUSS:XdeUSSnUHn[R"SU5n[ U5S:aM+USSupU S:XaUR S [ U 55 MUU S :Xa[U 5(a[nMsMuU S :Xa [U 5nMU S :Xa [U 5nMU S :Xa [U 5nMS5e [X!US9n UcSO [U5n [XU S9$)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 rNrSrrandr#rTrUrincmnrRz"Unknown RandAugment config section)rrrg)rv) rrbrVrWrlrXrbool_RAND_INCREASING_TRANSFORMSrrorkrr) rYrrrurfrgrZrFr\r]r^ra_opsrvs rrand_augment_transformr{s&IJJ!J   c "F !9   ABZF  XXi # r7Q; bq6 &=   c ; E\Cyy8  CZCI CZSJ CZSJ >> >5%& z ZF'/T5I*5UN v. IIr) rrrrrrrrrrrrrc U=(d [nU=(d [nUVs/sHn[USXS9PM sn$s snf)Nrrm)r_AUGMIX_TRANSFORMSrrns r augmix_opsrsM))G11JJT VJT$  3) >JT VV Vrpc:\rSrSrSrS SjrSrSrSrSr Sr g ) AugMixAugmentizAugMix 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 c@XlX lX0lX@lXPlgr?)rtalphawidthdepthblended)rrtrrrrs rrAugMixAugment.__init__s    rcX-nSn/nUSSS2H nXS- nUSU- -nURU5 M" [R"USSS2[RS9$)Nrr#dtype)rirdarrayfloat32)rwsrcumprwsrRrs r_calc_blended_weights#AugMixAugment._calc_blended_weightsse VDbDAHE QY D JJu xxDbD 44rcxUR5nURX#5nUHnURS:a URO[RR SS5n[RR URUSS9nUn UH n U "U 5n M [R"XU5nM U$)Nrr#rTry) rrrrdrrandintrrtrblend) rr)mixing_weightsrimg_origrrRrrtimg_augrPs r_apply_blendedAugMixAugment._apply_blendeds 88:  ' ' :A"&**q.DJJbii6G6G16ME))""488UD"ACGW+++cA.C  rcURSURS[UR554n[R"U[R S9nUHnUR S:a UR O[RRSS5n[RRURUSS9nUn UH n U "U 5n M XV[R"U [R S9-- nM [R"USSUS9 [R"UR[R 55n[R""XU5$) Nrr#rrTrgo@)out)r&rlgetbandsrdzerosrrrrrrtasarrayclipr fromarrayastypeuint8r) rr)rr img_shapemixedmwrrtrrPs r _apply_basicAugMixAugment._apply_basicsHHQK!c#,,..AA "**5 B"&**q.DJJbii6G6G16ME))""488UD"ACGW+ "**WBJJ?? ?E ! q$E* RXX 67{{3q))rc[R"[RRUR/UR -55n[R"[RR URUR55nUR(aURXU5nU$URXU5nU$r?) rdrr dirichletrrbetarrr)rr)rrrs rrAugMixAugment.__call__sBII$7$7 tzz8Q$RS JJryy~~djj$**= > <<''Q?E %%c1=E r)rrrrtrN)rrrF) rrrr__doc__rrrrrrr@rrrrs  5 *"rrcSnSnSnSnSn[S5US'URS5nUSS :XdeUS S nUHn[R"S U5n [U 5S :aM+U S S upU S:XaUR S[U 55 MUU S:Xa [ U 5nMhU S:Xa [ U 5nM{U S:Xa [ U 5nMU S:Xa [U 5nMU S:Xa [ U 5nMS5e [X!S9n [XX4US9$)aCreate 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 rrrFrrrSraugmixr#NrTrrUrrRrGrDrEzUnknown AugMix config section)rr)rrrr) rrVrWrlrXrrrr) rYrrrrrrrZrFr\r]r^rts raugment_and_mix_transformrs"I E E EG$U|GO   c "F !9  ABZF  XXi # r7Q; bq6 &=   c ; CZCI CZHE CZHE CZ#JE CZ3iG 99 95'( y :C W UUr)r )rFN)rN)rNN)LrrrLrWPILrrrrnumpyrdr __version__rVrrrrrrrBICUBICrrr r+r-r3r5r8r:rKr[r]r_rarqrtrzr}rrrrrrrrrrrrrrrrrrr$r(r@rBrHrJr`rbrrcrkrorrrrrrr)rAs0rrs& 99  #//"7"7"(0 &V  /Jd"V??D/VWBsG