
    RЦi>                     t    S r SSKrSSKrSS jrSS jrSS jrSS jrSS jr " S S	5      r	 " S
 S\	5      r
g)aX  Mixup and Cutmix

Papers:
mixup: Beyond Empirical Risk Minimization (https://arxiv.org/abs/1710.09412)

CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features (https://arxiv.org/abs/1905.04899)

Code Reference:
CutMix: https://github.com/clovaai/CutMix-PyTorch

Hacked together by / Copyright 2019, Ross Wightman
    Nc                     U R                  5       R                  SS5      n [        R                  " U R	                  5       S   U4X0R
                  S9R                  SX5      $ )N   r   )device)longviewtorchfullsizer   scatter_)xnum_classeson_value	off_values       N/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/data/mixup.pyone_hotr      sK    	b!A::qvvx{K0)HHMVVWXZ[ff    c                 |    X1-  nSU-
  U-   n[        XXTS9n[        U R                  S5      XUS9nXb-  USU-
  -  -   $ )N      ?)r   r   r   )r   flip)targetr   lam	smoothingr   r   y1y2s           r   mixup_targetr      sO    'II~	)H	x	MB	Q9	UB8bBHo%%r   c                 (   [         R                  " SU-
  5      nU SS u  pV[        XT-  5      [        Xd-  5      p[        X'-  5      [        X(-  5      p[         R                  R	                  SU	-   XY-
  US9n[         R                  R	                  SU
-   Xj-
  US9n[         R
                  " XS-  -
  SU5      n[         R
                  " XS-  -   SU5      n[         R
                  " XS-  -
  SU5      n[         R
                  " XS-  -   SU5      nXUU4$ )a  Standard CutMix bounding-box
Generates a random square bbox based on lambda value. This impl includes
support for enforcing a border margin as percent of bbox dimensions.

Args:
    img_shape (tuple): Image shape as tuple
    lam (float): Cutmix lambda value
    margin (float): Percentage of bbox dimension to enforce as margin (reduce amount of box outside image)
    count (int): Number of bbox to generate
r   Nr   r      )npsqrtintrandomrandintclip)	img_shaper   margincountratioimg_himg_wcut_hcut_wmargin_ymargin_xcycxylyhxlxhs                    r   	rand_bboxr7      s     GGAGERS>LEu}%s5='95V^,c&..Ah			1x<)9		FB			1x<)9		FB	qj!U	+B	qj!U	+B	qj!U	+B	qj!U	+B2r>r   c                    [        U5      S:X  d   eU SS u  p4[        R                  R                  [	        X1S   -  5      [	        X1S   -  5      US9n[        R                  R                  [	        XAS   -  5      [	        XAS   -  5      US9n[        R                  R                  SX5-
  US9n[        R                  R                  SXF-
  US9nXu-   n	X-   n
XyX4$ )a  Min-Max CutMix bounding-box
Inspired by Darknet cutmix impl, generates a random rectangular bbox
based on min/max percent values applied to each dimension of the input image.

Typical defaults for minmax are usually in the  .2-.3 for min and .8-.9 range for max.

Args:
    img_shape (tuple): Image shape as tuple
    minmax (tuple or list): Min and max bbox ratios (as percent of image size)
    count (int): Number of bbox to generate
r    r   Nr   r   r   )lenr!   r$   r%   r#   )r'   minmaxr)   r+   r,   r-   r.   r3   r5   yuxus              r   rand_bbox_minmaxr=   6   s     v;!RS>LEIIc%)"34c%):K6LSXYEIIc%)"34c%):K6LSXYE			1em%		8B			1em%		8B	B	B2>r   c                     Ub  [        XUS9u  pVpxO[        XUS9u  pVpxU(       d  Ub#  Xe-
  X-
  -  n	SU	[        U S   U S   -  5      -  -
  nXVXx4U4$ )z/Generate bbox and apply lambda correction.
    )r)   r   r   r   )r=   r7   float)
r'   r   ratio_minmaxcorrect_lamr)   r3   r;   r5   r<   	bbox_areas
             r   cutmix_bbox_and_lamrC   M   ss     ))OB"9?l.W)	9uYr]Yr]%BCCCBS  r   c                   J    \ rS rSrSr  SS jrS rS rS rS r	S	 r
S
 rSrg)MixupZ   aF  Mixup/Cutmix that applies different params to each element or whole batch

Args:
    mixup_alpha (float): mixup alpha value, mixup is active if > 0.
    cutmix_alpha (float): cutmix alpha value, cutmix is active if > 0.
    cutmix_minmax (List[float]): cutmix min/max image ratio, cutmix is active and uses this vs alpha if not None.
    prob (float): probability of applying mixup or cutmix per batch or element
    switch_prob (float): probability of switching to cutmix instead of mixup when both are active
    mode (str): how to apply mixup/cutmix params (per 'batch', 'pair' (pair of elements), 'elem' (element)
    correct_lam (bool): apply lambda correction when cutmix bbox clipped by image borders
    label_smoothing (float): apply label smoothing to the mixed target tensor
    num_classes (int): number of classes for target
Nc
                     Xl         X l        X0l        U R                  b"  [        U R                  5      S:X  d   eSU l        X@l        XPl        Xl        Xl        X`l        Xpl	        SU l
        g )Nr    r   T)mixup_alphacutmix_alphacutmix_minmaxr9   mix_probswitch_problabel_smoothingr   moderA   mixup_enabled)
selfrH   rI   rJ   probrL   rN   rA   rM   r   s
             r   __init__Mixup.__init__h   sk    &(*)t))*a/// #D&.&	&!r   c           
      @   [         R                  " U[         R                  S9n[         R                  " U[        S9nU R
                  (       Ga  U R                  S:  a  U R                  S:  a  [         R                  R                  U5      U R                  :  n[         R                  " U[         R                  R                  U R                  U R                  US9[         R                  R                  U R                  U R                  US95      nOU R                  S:  a4  [         R                  R                  U R                  U R                  US9nOdU R                  S:  aM  [         R                  " U[        S9n[         R                  R                  U R                  U R                  US9nO S5       e[         R                  " [         R                  R                  U5      U R                  :  UR                  [         R                  5      U5      nX#4$ )Ndtype        r   ROne of mixup_alpha > 0., cutmix_alpha > 0., cutmix_minmax not None should be true.)r!   onesfloat32zerosboolrO   rH   rI   r$   randrL   wherebetarK   astype)rP   
batch_sizer   
use_cutmixlam_mixs        r   _params_per_elemMixup._params_per_elemy   s   ggj

3XXj5
"$):):R)?YY^^J7$:J:JJ
((IINN4#4#4d6G6GjNYIINN4#3#3T5E5EJNWY !!B&))..)9)94;K;KR\.]""R'WWZt<
))..):):D<M<MT^._rrru((299>>*5Ew~~VXV`V`GacfgCr   c                 @   SnSnU R                   (       Ga  [        R                  R                  5       U R                  :  GaY  U R
                  S:  a  U R                  S:  a  [        R                  R                  5       U R                  :  nU(       a4  [        R                  R                  U R                  U R                  5      O3[        R                  R                  U R
                  U R
                  5      nOU R
                  S:  a5  [        R                  R                  U R
                  U R
                  5      nONU R                  S:  a7  Sn[        R                  R                  U R                  U R                  5      nO S5       e[        U5      nX4$ )Nr   FrW   TrX   )
rO   r!   r$   r]   rK   rH   rI   rL   r_   r?   )rP   r   rb   rc   s       r   _params_per_batchMixup._params_per_batch   s$   
")).."2T]]"B"$):):R)?YY^^-0@0@@
R\"))..):):D<M<MNIINN4#3#3T5E5EF !!B&))..)9)94;K;KL""R'!
))..):):D<M<MNrrru.Cr   c                    [        U5      nU R                  U5      u  p4UR                  5       n[        U5       H  nX&-
  S-
  nX6   nUS:w  d  M  XF   (       aQ  [	        X   R
                  XR                  U R                  S9u  u  ppnXW   S S 2X2X24   X   S S 2X2X24'   XU'   Mp  X   U-  XW   SU-
  -  -   X'   M     [        R                  " X1R                  UR                  S9R                  S5      $ )Nr   r   r@   rA   r   rV   )r9   rd   clonerangerC   shaperJ   rA   r	   tensorr   rV   	unsqueezerP   r   ra   	lam_batchrb   x_origijr   r3   r4   r5   r6   s                r   	_mix_elemMixup._mix_elem   s    V
 $ 5 5j A	z"A"A,Cby=,?

C6H6HVZVfVf-h)$RRc,2Iao,FADBE25)#&aL4#:	QW(==AD # ||IhhaggFPPQRSSr   c                    [        U5      nU R                  US-  5      u  p4UR                  5       n[        US-  5       H  nX&-
  S-
  nX6   nUS:w  d  M  XF   (       ak  [	        X   R
                  XR                  U R                  S9u  u  ppnXW   S S 2X2X24   X   S S 2X2X24'   XV   S S 2X2X24   X   S S 2X2X24'   XU'   M  X   U-  XW   SU-
  -  -   X'   X   U-  XV   SU-
  -  -   X'   M     [        R                  " X3S S S2   45      n[        R                  " X1R                  UR                  S9R                  S5      $ )Nr    r   r   rj   r   rk   )r9   rd   rl   rm   rC   rn   rJ   rA   r!   concatenater	   ro   r   rV   rp   rq   s                r   	_mix_pairMixup._mix_pair   s]   V
 $ 5 5jAo F	zQ'A"A,Cby=,?

C6H6HVZVfVf-h)$RRc,2Iao,FADBE25),2Iao,FADBE25)#&aL4#:	QW(==AD4#:	QW(==AD ( NNI2#?@	||IhhaggFPPQRSSr   c                    U R                  5       u  p#US:X  a  gU(       a\  [        UR                  X R                  U R                  S9u  u  pEpgnUR                  S5      S S 2S S 2XE2Xg24   US S 2S S 2XE2Xg24'   U$ UR                  S5      R                  SU-
  5      nUR                  U5      R                  U5        U$ )Nr   rj   r   )rg   rC   rn   rJ   rA   r   mul_add_)	rP   r   r   rb   r3   r4   r5   r6   	x_flippeds	            r   
_mix_batchMixup._mix_batch   s    002"9$7+=+=4K[K[%]!RRc$%FF1IaBE25.@$AAaBE25 ! 
 q	rCx0IFF3KY'
r   c                 $   [        U5      S-  S:X  d   S5       eU R                  S:X  a  U R                  U5      nO3U R                  S:X  a  U R                  U5      nOU R	                  U5      n[        X R                  X0R                  5      nX4$ )Nr    r   )Batch size should be even when using thiselempair)r9   rN   rv   rz   r   r   r   rM   )rP   r   r   r   s       r   __call__Mixup.__call__   s~    1vzQK KK99..#CYY& ..#C//!$Cf&6&6=Q=QRyr   )
rA   rI   rJ   rM   rK   rH   rO   rN   r   rL   )	r   rW   Nr   g      ?batchTg?i  )__name__
__module____qualname____firstlineno____doc__rR   rd   rg   rv   rz   r   r   __static_attributes__ r   r   rE   rE   Z   s6     cfRV""($T"T(	r   rE   c                   8    \ rS rSrSrS	S jrS rS rS
S jrSr	g)FastCollateMixup   zFast Collate w/ Mixup/Cutmix that applies different params to each element or whole batch

A Mixup impl that's performed while collating the batches.
c           	         [        U5      nU(       a  US-  OUn[        U5      U:X  d   eU R                  U5      u  pg[        US   S   [        R                  5      n[        U5       GH  n	XI-
  S-
  n
Xi   nX)   S   nUS:w  Ga6  Xy   (       a  U(       d'  U(       a  UR                  5       OUR                  5       n[        UR                  UU R                  U R                  S9u  u  pnnnX*   S   S S 2X2UU24   US S 2X2UU24'   XU	'   OU(       ab  UR                  [        R                  5      U-  X*   S   R                  [        R                  5      SU-
  -  -   n[        R                  " XS9  OCUR                  5       U-  X*   S   R                  5       SU-
  -  -   n[         R"                  " XS9  X==   U(       a3  [         R$                  " UR                  [        R&                  5      5      OUR)                  5       -  ss'   GM     U(       a,  [        R*                  " U[        R,                  " U5      45      n[         R.                  " U5      R1                  S5      $ )Nr    r   r   r   rj   out)r9   rd   
isinstancer!   ndarrayrm   copyrl   rC   rn   rJ   rA   r`   rZ   rintr?   r	   round
from_numpyuint8bytery   rY   ro   rp   )rP   outputr   halfra   num_elemrr   rb   is_nprt   ru   r   mixedr3   r4   r5   r6   s                    r   _mix_elem_collate"FastCollateMixup._mix_elem_collate   s   Z
&*:?
6{h&&& $ 5 5h ?	58A;

3xA"A,CHQKEby=05

5;;=,?%)%7%7$($4$4	-)$RRc .3Xa[BE2b5-IE!RUBrE/*#&aL %RZZ 83 >!ASASTVT^T^A_cdgjcjAk k1 % 3ehqk6G6G6IQQTW6U UE5IU))%,,rxx*@APUPZPZP\\I/ !0 	27783D'EFI||I&0033r   c           	         [        U5      nU R                  US-  5      u  pE[        US   S   [        R                  5      n[        US-  5       GH  nX7-
  S-
  nXG   n	X'   S   n
X(   S   nSU	s=::  a  S::  d   e   eU	S:  Ga  XW   (       a  [        UR                  U	U R                  U R                  S9u  u  ppn	U(       a  U
S S 2X2X24   R                  5       OU
S S 2X2X24   R                  5       nUS S 2X2X24   U
S S 2X2X24'   UUS S 2X2X24'   XU'   GO@U(       a  U
R                  [        R                  5      U	-  UR                  [        R                  5      SU	-
  -  -   nUR                  [        R                  5      U	-  U
R                  [        R                  5      SU	-
  -  -   nUn
[        R                  " XS9  [        R                  " XS9  O~U
R                  5       U	-  UR                  5       SU	-
  -  -   nUR                  5       U	-  U
R                  5       SU	-
  -  -   nUn
[         R"                  " XS9  [         R"                  " XS9  X==   U(       a3  [         R$                  " U
R                  [        R&                  5      5      OU
R)                  5       -  ss'   X==   U(       a3  [         R$                  " UR                  [        R&                  5      5      OUR)                  5       -  ss'   GM     [        R*                  " XDS S S2   45      n[         R,                  " U5      R/                  S5      $ )Nr    r   r   r   rj   r   r   )r9   rd   r   r!   r   rm   rC   rn   rJ   rA   r   rl   r`   rZ   r   r?   r	   r   r   r   r   ry   ro   rp   )rP   r   r   ra   rr   rb   r   rt   ru   r   mixed_imixed_jr3   r4   r5   r6   patch_i
mixed_temps                     r   _mix_pair_collate"FastCollateMixup._mix_pair_collate  s   Z
 $ 5 5jAo F	58A;

3zQ'A"A,ChqkGhqkG?s?"?"?Rx=,?%)%7%7$($4$4	-)$RRc BGgao6;;=GTUWYW\^`^cTcLdLjLjLlG/6q"%/GGArubeO,/6GArubeO,#&aL%,^^BJJ%?#%EWYWaWaHbfgjmfmHn%n
").."<s"BW^^TVT^T^E_cdgjcjEk"k",55%,]]_s%:W]]_PQTWPW=X%X
")--/C"7'--/QQTW:U"U",G9G9Iu))'..*BCRYR^R^R``IIu))'..*BCRYR^R^R``IA (B NNI2#?@	||I&0033r   c           	         [        U5      nU R                  5       u  pE[        US   S   [        R                  5      nU(       a0  [        UR                  UU R                  U R                  S9u  u  pxpn[        U5       GHd  nX;-
  S-
  nX+   S   nUS:w  a  U(       aE  U(       a  UR                  5       OUR                  5       nX,   S   S S 2WW2W	W
24   US S 2Xx2X24'   OU(       ab  UR                  [        R                  5      U-  X,   S   R                  [        R                  5      SU-
  -  -   n[        R                  " XS9  OCUR                  5       U-  X,   S   R                  5       SU-
  -  -   n[         R"                  " XS9  X==   U(       a3  [         R$                  " UR                  [        R&                  5      5      OUR)                  5       -  ss'   GMg     U$ )Nr   rj   r   r   r   )r9   rg   r   r!   r   rC   rn   rJ   rA   rm   r   rl   r`   rZ   r   r?   r	   r   r   r   r   )rP   r   r   ra   r   rb   r   r3   r4   r5   r6   rt   ru   r   s                 r   _mix_batch_collate#FastCollateMixup._mix_batch_collate/  s   Z
00258A;

3$7!// ,,	%!RRc z"A"AHQKEby,1EJJLu{{}E-2Xa[BrE2b5-IE!RUBE/* %RZZ 83 >!ASASTVT^T^A_cdgjcjAk k1 % 3ehqk6G6G6IQQTW6U UE5IU))%,,rxx*@APUPZPZP\\I # 
r   Nc                 j   [        U5      nUS-  S:X  d   S5       eSU R                  ;   nU(       a  US-  n[        R                  " U/US   S   R                  Q7[        R
                  S9nU R                  S:X  d  U R                  S:X  a  U R                  XQUS9nO3U R                  S:X  a  U R                  XQ5      nOU R                  XQ5      n[        R                  " U Vs/ s H  owS	   PM	     sn[        R                  S9n[        XR                  X`R                  5      nUS U nXX4$ s  snf )
Nr    r   r   r   rU   r   )r   r   r   )r9   rN   r	   r[   rn   r   r   r   r   ro   int64r   r   rM   )	rP   r   _ra   r   r   r   br   s	            r   r   FastCollateMixup.__call__L  s   Z
A~"O$OO""1Jj=58A;+<+<=U[[Q99$))v"5((T(BCYY& ((7C))&8CU3UtU35;;Gf&6&6=Q=QR$~ 4s   &D0r   )FN)
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s    
!4F'4R:r   r   )r   rW   )rW   Nr   )NTN)r   numpyr!   r	   r   r   r7   r=   rC   rE   r   r   r   r   <module>r      sG     g
&0.
!@ @Fu r   