
    Ng*9                     x    d Z ddlZddlZddZddZddZddZdd
Z G d d          Z	 G d de	          Z
dS )aY   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
    N      ?        c                     |                                                      dd          } t          j        |                                 d         |f|| j                                      d| |          S )N   r   )device)longviewtorchfullsizer   scatter_)xnum_classeson_value	off_values       K/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/data/mixup.pyone_hotr      s\    	b!A:qvvxx{K0)AHMMMVVWXZ[]efff    c                     ||z  }d|z
  |z   }t          | |||          }t          |                     d          |||          }||z  |d|z
  z  z   S )Nr   )r   r   r   )r   flip)targetr   lam	smoothingr   r   y1y2s           r   mixup_targetr      sg    K'II~	)H	x9	M	M	MB	Qx9	U	U	UB8bBHo%%r   c                 f   t          j        d|z
            }| dd         \  }}t          ||z            t          ||z            }}t          ||z            t          ||z            }
}	t           j                            d|	z   ||	z
  |          }t           j                            d|
z   ||
z
  |          }t          j        ||dz  z
  d|          }t          j        ||dz  z   d|          }t          j        ||dz  z
  d|          }t          j        ||dz  z   d|          }||||fS )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_bboxr8      s.    GAGERSS>LE5uu}%%s55='9'95EVe^,,c&5..A.AhH			1x<)9		F	FB			1x<)9		F	FB	eqj!U	+	+B	eqj!U	+	+B	eqj!U	+	+B	eqj!U	+	+Br2r>r   c                 2   t          |          dk    sJ | dd         \  }}t          j                            t	          ||d         z            t	          ||d         z            |          }t          j                            t	          ||d         z            t	          ||d         z            |          }t          j                            d||z
  |          }t          j                            d||z
  |          }||z   }	||z   }
||	||
fS )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/   r4   r6   yuxus              r   rand_bbox_minmaxr>   6   s
    v;;!RSS>LE5Ic%&)"344c%&):K6L6LSXYYEIc%&)"344c%&):K6L6LSXYYE			1eem%		8	8B			1eem%		8	8B	eB	eBr2r>r   Tc                     |t          | ||          \  }}}}nt          | ||          \  }}}}|s|/||z
  ||z
  z  }	d|	t          | d         | d         z            z  z
  }||||f|fS )z0 Generate bbox and apply lambda correction.
    N)r*   r   r   r   )r>   r8   float)
r(   r   ratio_minmaxcorrect_lamr*   r4   r<   r6   r=   	bbox_areas
             r   cutmix_bbox_and_lamrD   M   s     ))\OOOBBB"9c???BB Dl."Wb)	9uYr]Yr]%BCCCCBS  r   c                   B    e Zd ZdZ	 	 dd
Zd Zd Zd Zd Zd Z	d Z
dS )Mixupas   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
    r   r   N      ?batchT皙?  c
                     || _         || _        || _        | j        !t          | j                  dk    sJ d| _        || _        || _        || _        |	| _        || _        || _	        d| _
        d S )Nr!   r   T)mixup_alphacutmix_alphacutmix_minmaxr:   mix_probswitch_problabel_smoothingr   moderB   mixup_enabled)
selfrL   rM   rN   probrP   rR   rB   rQ   r   s
             r   __init__zMixup.__init__h   s    &(*)t)**a//// #D&.&	&!r   c           	         t          j        |t           j                  }t          j        |t                    }| j        r| j        dk    r| j        dk    rt           j        	                    |          | j
        k     }t          j        |t           j                            | j        | j        |          t           j                            | j        | j        |                    }n| j        dk    r-t           j                            | j        | j        |          }n]| j        dk    rHt          j        |t                    }t           j                            | j        | j        |          }n
J d            t          j        t           j        	                    |          | j        k     |                    t           j                  |          }||fS )Ndtyper   r    FROne of mixup_alpha > 0., cutmix_alpha > 0., cutmix_minmax not None should be true.)r"   onesfloat32zerosboolrS   rL   rM   r%   randrP   wherebetarO   astype)rT   
batch_sizer   
use_cutmixlam_mixs        r   _params_per_elemzMixup._params_per_elemy   s   gj
333Xj555
 	h"$$):R)?)?Y^^J77$:JJ
(INN4#4d6GjNYYINN4#3T5EJNWWY Y !B&&)..)94;KR\.]]"R''WZt<<<
)..):D<MT^.__rrrrr(29>>*55Ew~~VXV`GaGacfggCJr   c                    d}d}| j         rCt          j                                        | j        k     r| j        dk    r| j        dk    r~t          j                                        | j        k     }|r*t          j                            | j        | j                  n)t          j                            | j        | j                  }nx| j        dk    r+t          j                            | j        | j                  }nB| j        dk    r-d}t          j                            | j        | j                  }n
J d            t          |          }||fS )Nr   Fr   TrZ   )
rS   r"   r%   r_   rO   rL   rM   rP   ra   r@   )rT   r   rd   re   s       r   _params_per_batchzMixup._params_per_batch   s&   
 	!").."2"2T]"B"B"$$):R)?)?Y^^--0@@
R\ G")..):D<MNNNINN4#3T5EFF !B&&)..)94;KLL"R''!
)..):D<MNNrrrrr..CJr   c                 8   t          |          }|                     |          \  }}|                                }t          |          D ]}||z
  dz
  }||         }|dk    r||         r_t	          ||         j        || j        | j                  \  \  }	}
}}}||         d d |	|
||f         ||         d d |	|
||f<   |||<   ||         |z  ||         d|z
  z  z   ||<   t          j	        ||j
        |j                                      d          S )Nr   r   rA   rB   r   rY   )r:   rf   clonerangerD   shaperN   rB   r   tensorr   rY   	unsqueezerT   r   rc   	lam_batchrd   x_origijr   r4   r5   r6   r7   s                r   	_mix_elemzMixup._mix_elem   sD   VV
 $ 5 5j A A	:z"" 
	> 
	>AQ"AA,Cbyya= >,?!
Cd6HVZVf-h -h -h)$RRc,21IaaaB2o,FAaDBrE2b5)#&IaLLQ4#:q	QW(==AaD|IahagFFFPPQRSSSr   c                    t          |          }|                     |dz            \  }}|                                }t          |dz            D ]}||z
  dz
  }||         }|dk    r||         rt	          ||         j        || j        | j                  \  \  }	}
}}}||         d d |	|
||f         ||         d d |	|
||f<   ||         d d |	|
||f         ||         d d |	|
||f<   |||<   ||         |z  ||         d|z
  z  z   ||<   ||         |z  ||         d|z
  z  z   ||<   t          j	        ||d d d         f          }t          j        ||j        |j                                      d          S )Nr!   r   r   rj   r   rk   )r:   rf   rl   rm   rD   rn   rN   rB   r"   concatenater   ro   r   rY   rp   rq   s                r   	_mix_pairzMixup._mix_pair   s   VV
 $ 5 5jAo F F	:zQ'' 	> 	>AQ"AA,Cbyya= >,?!
Cd6HVZVf-h -h -h)$RRc,21IaaaB2o,FAaDBrE2b5),21IaaaB2o,FAaDBrE2b5)#&IaLLQ4#:q	QW(==AaDQ4#:q	QW(==AaDNIy2#?@@	|IahagFFFPPQRSSSr   c                    |                                  \  }}|dk    rdS |rat          |j        || j        | j                  \  \  }}}}}|                    d          d d d d ||||f         |d d d d ||||f<   nS|                    d                              d|z
            }|                    |                              |           |S )Nr   rj   r   )rh   rD   rn   rN   rB   r   mul_add_)	rT   r   r   rd   r4   r5   r6   r7   	x_flippeds	            r   
_mix_batchzMixup._mix_batch   s    0022Z"992 	($74+=4K[%] %] %]!RRc$%FF1IIaaaBrE2b5.@$AAaaaBrE2b5 !!q		rCx00IFF3KKY'''
r   c                 0   t          |          dz  dk    s
J d            | j        dk    r|                     |          }n6| j        dk    r|                     |          }n|                     |          }t          || j        || j                  }||fS )Nr!   r   )Batch size should be even when using thiselempair)r:   rR   rv   ry   r~   r   r   rQ   )rT   r   r   r   s       r   __call__zMixup.__call__   s    1vvzQ K9..##CCY&  ..##CC//!$$Cfd&6T=QRR&yr   )	r   r   Nr   rG   rH   TrI   rJ   )__name__
__module____qualname____doc__rV   rf   rh   rv   ry   r~   r    r   r   rF   rF   Z   s          cfRV" " " ""  (  $T T T"T T T(  	 	 	 	 	r   rF   c                   .    e Zd ZdZddZd Zd Zd	dZdS )
FastCollateMixupz Fast Collate w/ Mixup/Cutmix that applies different params to each element or whole batch

    A Mixup impl that's performed while collating the batches.
    Fc           	         t          |          }|r|dz  n|}t          |          |k    sJ |                     |          \  }}t          |          D ]G}||z
  dz
  }	||         }
||         d         }|
dk    r||         ro|s|                                }t	          |j        |
| j        | j                  \  \  }}}}}
||	         d         d d ||||f         |d d ||||f<   |
||<   nj|                    t          j
                  |
z  ||	         d                             t          j
                  d|
z
  z  z   }t          j        ||           ||xx         t          j        |                    t          j                            z  cc<   I|r(t          j        |t          j        |          f          }t          j        |                              d          S )Nr!   r   r   r   rj   out)r:   rf   rm   copyrD   rn   rN   rB   rb   r"   r\   rintr   
from_numpyuint8rx   r[   ro   rp   )rT   outputrH   halfrc   num_elemrr   rd   rt   ru   r   mixedr4   r5   r6   r7   s                   r   _mix_elem_collatez"FastCollateMixup._mix_elem_collate   s   ZZ
&*::??
6{{h&&&& $ 5 5h ? ?	:x 	B 	BAQ"AA,C!HQKEbyya= 	. - %

,?c8JX\Xh-j -j -j)$RRc-21Xa[BrE2b5-IE!!!RUBrE/*#&IaLL!LL44s:U1Xa[=O=OPRPZ=[=[_`cf_f=ggEGEu----1III)%,,rx*@*@AAAIIII 	G	2783D3D'EFFI|I&&00333r   c           	         t          |          }|                     |dz            \  }}t          |dz            D ]	}||z
  dz
  }||         }||         d         }	||         d         }
d|cxk    rdk    sn J |dk     rD||         r~t          |j        || j        | j                  \  \  }}}}}|	d d ||||f                                         }|
d d ||||f         |	d d ||||f<   ||
d d ||||f<   |||<   n|	                    t          j
                  |z  |
                    t          j
                  d|z
  z  z   }|
                    t          j
                  |z  |	                    t          j
                  d|z
  z  z   }
|}	t          j        |
|
           t          j        |	|	           ||xx         t          j        |	                    t          j                            z  cc<   ||xx         t          j        |
                    t          j                            z  cc<   t          j        ||d d d         f          }t          j        |                              d          S )Nr!   r   r   r   rj   r   r   )r:   rf   rm   rD   rn   rN   rB   r   rb   r"   r\   r   r   r   r   rx   ro   rp   )rT   r   rH   rc   rr   rd   rt   ru   r   mixed_imixed_jr4   r5   r6   r7   patch_i
mixed_temps                    r   _mix_pair_collatez"FastCollateMixup._mix_pair_collate   s   ZZ
 $ 5 5jAo F F	:zQ'' 	D 	DAQ"AA,CAhqkGAhqkG????s??????Rxxa= 2,?c8JX\Xh-j -j -j)$RRc%aaaB2o6;;==G/6qqq"R%B/GGAAAr"ubeO,/6GAAAr"ubeO,#&IaLL!(
!;!;c!AGNNSUS]D^D^bcfibiDj!jJ%nnRZ883>PRPZA[A[_`cf_fAggG(GGG1111GG11111III)'..*B*BCCCIII1III)'..*B*BCCCIIIINIy2#?@@	|I&&00333r   c           	         t          |          }|                                 \  }}|r*t          |j        || j        | j                  \  \  }}}}	}t          |          D ]}
||
z
  dz
  }||
         d         }|dk    r|r>|                                }||         d         d d ||||	f         |d d ||||	f<   nj|                    t          j
                  |z  ||         d                             t          j
                  d|z
  z  z   }t          j        ||           ||
xx         t          j        |                    t          j                            z  cc<   
|S )Nrj   r   r   r   r   )r:   rh   rD   rn   rN   rB   rm   r   rb   r"   r\   r   r   r   r   )rT   r   rH   rc   r   rd   r4   r5   r6   r7   rt   ru   r   s                r   _mix_batch_collatez#FastCollateMixup._mix_batch_collate  s   ZZ
0022Z 	b$7c0BPTP`%b %b %b!RRcz"" 
	B 
	BAQ"A!HQKEbyy .!JJLLE-21Xa[BrE2b5-IE!!!RUBrE/**!LL44s:U1Xa[=O=OPRPZ=[=[_`cf_f=ggEGEu----1III)%,,rx*@*@AAAIIII
r   Nc                 F   t          |          }|dz  dk    s
J d            d| j        v }|r|dz  }t          j        |g|d         d         j        R t          j                  }| j        dk    s| j        dk    r|                     |||          }n8| j        dk    r|                     ||          }n|                     ||          }t          j	        d	 |D             t          j
                  }t          || j        || j                  }|d |         }||fS )
Nr!   r   r   r   rX   r   )r   r   c                     g | ]
}|d          S )r   r   ).0bs     r   
<listcomp>z-FastCollateMixup.__call__.<locals>.<listcomp>8  s    333qt333r   )r:   rR   r   r]   rn   r   r   r   r   ro   int64r   r   rQ   )rT   rH   _rc   r   r   r   r   s           r   r   zFastCollateMixup.__call__+  s9   ZZ
A~"""$O"""" 	1Jj=58A;+<==U[QQQ9$)v"5"5((T(BBCCY&  ((77CC))&%88C33U3335;GGGfd&6T=QRR$v~r   )FN)r   r   r   r   r   r   r   r   r   r   r   r   r      sd         
4 4 4 424 4 48  &     r   r   )r   r   )r   Nr   )NTN)r   numpyr"   r   r   r   r8   r>   rD   rF   r   r   r   r   <module>r      s         g g g g
& & & &   0   .
! 
! 
! 
!@ @ @ @ @ @ @ @F^ ^ ^ ^ ^u ^ ^ ^ ^ ^r   