Ë
    éÓ^jd  ã                   óT   — d Z ddlZddlZddlZej                  dfd„Z G d„ d«      Zy)zÊ Random Erasing (Cutout)

Originally inspired by impl at https://github.com/zhunzhong07/Random-Erasing, Apache 2.0
Copyright Zhun Zhong & Liang Zheng

Hacked together by / Copyright 2019, Ross Wightman
é    NÚcudac                 óê   — | r&t        j                  |||¬«      j                  «       S |r,t        j                  |d   ddf||¬«      j                  «       S t        j                  |d   ddf||¬«      S )N©ÚdtypeÚdevicer   é   )ÚtorchÚemptyÚnormal_Úzeros)Ú	per_pixelÚ
rand_colorÚ
patch_sizer   r   s        úc/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/data/random_erasing.pyÚ_get_pixelsr      sk   € ñ Ü�{‰{˜:¨U¸6ÔB×JÑJÓLÐLÙ	Ü�{‰{˜J q™M¨1¨aÐ0¸ÀfÔM×UÑUÓWÐWä�{‰{˜J q™M¨1¨aÐ0¸ÀfÔMÐMó    c                   ó>   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 dd„Zd„ Zd„ Zd„ Zy)ÚRandomErasingaY   Randomly selects a rectangle region in an image and erases its pixels.
        'Random Erasing Data Augmentation' by Zhong et al.
        See https://arxiv.org/pdf/1708.04896.pdf

        This variant of RandomErasing is intended to be applied to either a batch
        or single image tensor after it has been normalized by dataset mean and std.
    Args:
         probability: Probability that the Random Erasing operation will be performed.
         min_area: Minimum percentage of erased area wrt input image area.
         max_area: Maximum percentage of erased area wrt input image area.
         min_aspect: Minimum aspect ratio of erased area.
         mode: pixel color mode, one of 'const', 'rand', or 'pixel'
            'const' - erase block is constant color of 0 for all channels
            'rand'  - erase block is same per-channel random (normal) color
            'pixel' - erase block is per-pixel random (normal) color
        max_count: maximum number of erasing blocks per image, area per box is scaled by count.
            per-image count is randomly chosen between 1 and this value.
    Nc                 óÖ  — || _         || _        || _        |xs d|z  }t        j                  |«      t        j                  |«      f| _        || _        |xs || _        |	| _        |j                  «       | _
        d| _        d| _        | j                  dk(  rd| _        |
| _        y | j                  dk(  rd| _        |
| _        y | j                  r| j                  dk(  sJ ‚|
| _        y )Nr   FÚrandTÚpixelÚconst)ÚprobabilityÚmin_areaÚmax_areaÚmathÚlogÚlog_aspect_ratioÚ	min_countÚ	max_countÚ
num_splitsÚlowerÚmoder   r   r   )Úselfr   r   r   Ú
min_aspectÚ
max_aspectr#   r   r    r!   r   s              r   Ú__init__zRandomErasing.__init__.   s×   € ð 'ˆÔØ ˆŒØ ˆŒØÒ1 1 z¡>ˆ
Ü!%§¡¨*Ó!5´t·x±xÀ
Ó7KÐ LˆÔØ"ˆŒØ"Ò/ iˆŒØ$ˆŒØ—J‘J“LˆŒ	ØˆŒØˆŒØ�9‰9˜ÒØ"ˆDŒOð
 ˆ�ð	 �Y‰Y˜'Ò!Ø!ˆDŒNð ˆ�ð —y’y D§I¡I°Ò$8Ð8Ð8Øˆ�r   c           
      ó¢  — t        j                   «       | j                  kD  ry ||z  }| j                  | j                  k(  r| j                  n)t        j                  | j                  | j                  «      }t        |«      D �]J  }t        d«      D �]8  }	t        j                  | j                  | j                  «      |z  |z  }
t        j                  t        j                  | j                  Ž «      }t        t        t        j                  |
|z  «      «      «      }t        t        t        j                  |
|z  «      «      «      }||k  sŒ½||k  sŒÃt        j                  d||z
  «      }t        j                  d||z
  «      }t        | j                   | j"                  |||f|| j$                  ¬«      |d d …|||z   …|||z   …f<    �ŒJ �ŒM y )Né
   r   r   )Úrandomr   r   r    ÚrandintÚrangeÚuniformr   r   r   Úexpr   ÚintÚroundÚsqrtr   r   r   r   )r$   ÚimgÚchanÚimg_hÚimg_wr   ÚareaÚcountÚ_ÚattemptÚtarget_areaÚaspect_ratioÚhÚwÚtopÚlefts                   r   Ú_erasezRandomErasing._eraseN   st  € Ü�=‰=‹?˜T×-Ñ-Ò-ØØ�u‰}ˆØ"&§.¡.°D·N±NÒ"B�—’Ü�N‰N˜4Ÿ>™>¨4¯>©>Ó:ð 	ä�u“ó 	ˆAÜ  ›9ó �Ü$Ÿn™n¨T¯]©]¸D¿M¹MÓJÈTÑQÐTYÑY�Ü#Ÿx™x¬¯©¸×8MÑ8MÐ(NÓO�ÜœœdŸi™i¨°lÑ(BÓCÓDÓE�ÜœœdŸi™i¨°lÑ(BÓCÓDÓE�Ø�u“9  U£Ü Ÿ.™.¨¨E°A©IÓ6�CÜ!Ÿ>™>¨!¨U°Q©YÓ7�DÜ9DØŸ™ØŸ™Ø˜q !˜Ø#Ø#Ÿ{™{ô:�Cš˜3˜s Q™w˜;¨¨T°A©X¨Ð5Ñ6ò òñ	r   c                 ól  — t        |j                  «       «      dk(  r/ | j                  |g|j                  «       ¢|j                  ‘­Ž  |S |j                  «       \  }}}}| j                  dkD  r|| j                  z  nd}t        ||«      D ]$  }| j                  ||   ||||j                  «       Œ& |S )Né   r   r   )ÚlenÚsizer@   r   r!   r,   )r$   ÚinputÚ
batch_sizer3   r4   r5   Úbatch_startÚis           r   Ú__call__zRandomErasing.__call__f   s©   € Üˆu�z‰z‹|Ó Ò!ØˆD�K‰K˜Ð: §
¡
£Ð:¨e¯k©kÓ:ð ˆð .3¯Z©Z«\Ñ*ˆJ˜˜e Uà;?¿?¹?ÈQÒ;N˜*¨¯©Ò7ÐTUˆKÜ˜;¨
Ó3ò G�Ø—‘˜E !™H d¨E°5¸%¿+¹+ÕFðGàˆr   c                 ó¬   — | j                   j                  d| j                  › d| j                  › �z   }|d| j                  › d| j
                  › d�z  }|S )Nz(p=z, mode=z	, count=(z, z)))Ú	__class__Ú__name__r   r#   r   r    )r$   Úfss     r   Ú__repr__zRandomErasing.__repr__q   sV   € à�^‰^×$Ñ$¨¨T×-=Ñ-=Ð,>¸gÀdÇiÁiÀ[Ð'QÑQˆØ
�	˜$Ÿ.™.Ð)¨¨D¯N©NÐ+;¸2Ð>Ñ>ˆØˆ	r   )
g      à?g{®Gáz”?gUUUUUUÕ?g333333Ó?Nr   r   Nr   r   )rL   Ú
__module__Ú__qualname__Ú__doc__r'   r@   rI   rN   © r   r   r   r      s<   „ ñð* ØØØØØØØØØóò@ò0	ór   r   )rQ   r*   r   r	   Úfloat32r   r   rR   r   r   ú<module>rT      s2   ðñó Û ã ð :?¿¹Èvó 	N÷[ò [r   