
    2VhB                     T    d dl mZ d dlmZ d dlmZ  ed       G d de             Zy)    )keras_export)BaseImagePreprocessingLayer)SeedGeneratorzkeras.layers.CutMixc                   z     e Zd ZdZdZdZd fd	ZddZd Zd Z	d Z
dd	Zdd
Z	 ddZ	 ddZd Z fdZ xZS )CutMixat  CutMix data augmentation technique.

    CutMix is a data augmentation method where patches are cut and pasted
    between two images in the dataset, while the labels are also mixed
    proportionally to the area of the patches.

    Args:
        factor: A single float or a tuple of two floats between 0 and 1.
            If a tuple of numbers is passed, a `factor` is sampled
            between the two values.
            If a single float is passed, a value between 0 and the passed
            float is sampled. These values define the range from which the
            mixing weight is sampled. A higher factor increases the variability
            in patch sizes, leading to more diverse and larger mixed patches.
            Defaults to 1.
        seed: Integer. Used to create a random seed.

    References:
       - [CutMix paper]( https://arxiv.org/abs/1905.04899).
    F)r      c                     t        |   dd|i| | j                  |       || _        t	        |      | _        | j                  dk(  rd| _        d| _        d| _	        y d| _        d| _        d| _	        y )Ndata_formatchannels_first )
super__init___set_factorseedr   	generatorr
   height_axis
width_axischannel_axis)selffactorr   r
   kwargs	__class__s        j/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/layers/preprocessing/image_preprocessing/cut_mix.pyr   zCutMix.__init__"   sv    ;[;F; 	&t,//!D DO "D!D DO "D    c                    |sy t        |t              r|d   }n|}| j                  j                  |      }t	        |      dk(  ry |d   }|| j
                     }|| j                     }|xs% | j                  | j                  j                        }| j                  ||      }	| j                  j                  j                  d|	z
        }
| j                  |||
|      \  }}| j                  |||
|      \  }}| j                  |||||f      \  }}	| j                  j                  j                  | j                  j                  j!                  d|d      |      }|||	dS )	Nimages   r         ?int32dtype)r   )permutation_orderbatch_masks
mix_weight)
isinstancedictbackendshapelenr   r   _get_seed_generator_backend_generate_mix_weightnumpysqrt_compute_crop_bounds_generate_batch_maskrandomshufflearange)r   datatrainingr   r   images_shape
batch_sizeimage_heightimage_widthr'   ratiox0x1y0y1r&   r%   s                    r   get_random_transformationz CutMix.get_random_transformation1   sq   dD!(^FF||))&1|!!!_
#D$4$45"4??3Ft//0E0EF..z4@
""''j(89**:{E4PB**eT
B #'";";R#
Z
 !LL//77LL%%a7%C 8 
 "3&$
 	
r   c                      fd}| j                      | j                     }} |||      \  }}|\  }}	}
}|d d d d d f   }|
d d d d d f   }
|	d d d d d f   }	|d d d d d f   }||k\  ||	k  z  ||
k\  z  ||k  z  } j                  j                  j	                  || j
                      j
                        }d|	|z
  ||
z
  z  ||z  z  z
  }||fS )Nc                    j                   j                  j                  j                   j                  j                  | j                        j                   j                  j                  |j                        d      \  }}j
                  dk(  rhj                   j                  |d d d d d d f   j                        }j                   j                  |d d d d d d f   j                        }||fS j                   j                  |d d d d d d f   j                        }j                   j                  |d d d d d d f   j                        }||fS )Nr#   ij)indexingchannels_last)r*   r0   meshgridr6   compute_dtyper
   cast)r;   r<   grid_ygrid_xr   s       r   _generate_grid_xyz6CutMix._generate_batch_mask.<locals>._generate_grid_xy]   ss   !\\//88"")) (:(: *  ""))t'9'9 *   9 NFF ?2**4At+,D4F4F +  **4At+,D4F4F +  6>! **4q!+,D4F4F +  **4q!+,D4F4F +  6>!r   axisr!   )r   r   r*   r0   repeatr   )r   r9   box_cornersrM   r;   r<   rL   rK   r>   r?   r@   rA   r&   r'   s   `             r   r3   zCutMix._generate_batch_mask\   s&   	"6 ))*) " +<E$BB4t#$4t#$4t#$4t#$ r\frk*fl;v{K 	 ll((//d&7&78t?P?P 0 
 BGR0K,4NOO
J&&r   c                     | j                   j                  ||z  | j                        }| j                   j                  j	                  |gdd| j                  |      ||z
  z  }||z   }||fS )Nr#   r   r   r+   minvalmaxvalr$   r   )r*   rJ   rI   r4   uniform)r   r:   image_length
crop_ratior   crop_length	start_posend_poss           r   r2   zCutMix._compute_crop_bounds   s    ll''%T-?-? ( 
 LL''//,$$ 0 
 K')	 k)'!!r   c                    | j                   j                  j                  d| j                  d   | j                  d   | j                  |      dz   }| j                   j                  j                  |f|||| j                        }|S )Nr   r   r   rS   gư>)r   r$   )r*   r4   rV   r   rI   beta)r   r:   r   alphar'   s        r   r/   zCutMix._generate_mix_weight   s    LL''{{1~{{1~(( (   	 \\((--M5%d$:L:L . 

 r   c                 T   |r|}| j                   j                  || j                        }|d   }|d   }| j                   j                  j	                  || j                   j                  j                  ||d      |      }| j                   j                  || j                        }|S )Nr%   r&   r   rN   )r*   rJ   rI   r0   wheretake)r   r   transformationr8   r%   r&   s         r   transform_imageszCutMix.transform_images   s    2\\&&vt/A/ABF ./B C(7K\\''--""''0A'JF
 ""64+=+=>r   c                     |rj|h|d   }|d   }| j                   j                  j                  ||d      }| j                   j                  j                  |ddg      }||z  d|z
  |z  z   }|S )Nr%   r'   r   rN   r   r   r!   )r*   r0   ra   reshape)r   labelsrb   r8   r%   r'   cutout_labelss          r   transform_labelszCutMix.transform_labels   s    2 ./B C'5J LL..33) 4 M ++33JQHJ&(C*,<+MMFr   c                     t               N)NotImplementedError)r   bounding_boxesrb   r8   s       r   transform_bounding_boxeszCutMix.transform_bounding_boxes   s     "##r   c                 (    | j                  |||      S rj   )rc   )r   segmentation_masksrb   r8   s       r   transform_segmentation_masksz#CutMix.transform_segmentation_masks   s     $$
 	
r   c                     |S rj   r   )r   input_shapes     r   compute_output_shapezCutMix.compute_output_shape   s    r   c                 ^    | j                   | j                  d}t        |          }i ||S )N)r   r   )r   r   r   
get_config)r   configbase_configr   s      r   ru   zCutMix.get_config   s7    kkII
 g(*(+(((r   )r!   NN)TN)NT)T)__name__
__module____qualname____doc___USE_BASE_FACTOR_FACTOR_BOUNDSr   rB   r3   r2   r/   rc   rh   rm   rp   rs   ru   __classcell__)r   s   @r   r   r      s^    * N#)
V/'b"" " 	$ <@
) )r   r   N)keras.src.api_exportr   Qkeras.src.layers.preprocessing.image_preprocessing.base_image_preprocessing_layerr   keras.src.randomr   r   r   r   r   <module>r      s7    - + #$Y)( Y) %Y)r   