
    2Vhx                     l    d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	  ed       G d de             Z
y	)
    )ops)keras_export)BaseImagePreprocessingLayer)SeedGenerator)backend_utilszkeras.layers.MixUpc                   `     e Zd ZdZd
 fd	ZddZddZddZ	 ddZ	 ddZ	d Z
 fd	Z xZS )MixUpag  MixUp implements the MixUp data augmentation technique.

    Args:
        alpha: Float between 0 and 1. Controls the blending strength.
               Smaller values mean less mixing, while larger values allow
               for more  blending between images. Defaults to 0.2,
               recommended for ImageNet1k classification.
        seed: Integer. Used to create a random seed.

    References:
        - [MixUp paper](https://arxiv.org/abs/1710.09412).
        - [MixUp for Object Detection paper](https://arxiv.org/pdf/1902.04103).

    Example:
    ```python
    (images, labels), _ = keras.datasets.cifar10.load_data()
    images, labels = images[:8], labels[:8]
    labels = keras.ops.cast(keras.ops.one_hot(labels.flatten(), 10), "float32")
    mix_up = keras.layers.MixUp(alpha=0.2)
    output = mix_up({"images": images, "labels": labels})
    ```
    c                 d    t        |   dd|i| || _        || _        t	        |      | _        y )Ndata_format )super__init__alphaseedr   	generator)selfr   r   r   kwargs	__class__s        i/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/layers/preprocessing/image_preprocessing/mix_up.pyr   zMixUp.__init__#   s2    ;[;F;
	&t,    c                 4   t        |t              r|d   }n|}| j                  j                  |      }t	        |      dk(  rd}n| j                  j                  |      d   }|%| j                  | j                  j                        }| j                  j                  j                  | j                  j                  j                  d|d      |      }| j                  j                  j                  |f| j                  | j                  |      }||dS )	Nimages      r   int64dtype)r   )
mix_weightpermutation_order)
isinstancedictbackendshapelen_get_seed_generator_backendrandomshufflenumpyarangebetar   )	r   datatrainingr   r   images_shape
batch_sizer   r   s	            r   get_random_transformationzMixUp.get_random_transformation)   s    dD!(^FF||))&1|!J++F3A6J<++DLL,A,ABD LL//77LL%%a7%C 8 

 \\((--M4::tzz . 

 %!2
 	
r   c                 (      fd}|r	 |||      }|S )Nc                    j                   j                  | j                        } |d   }|d   }j                   j                  j                   j                  j	                  |g d      j                        }j                   j                  j                   j                  j                  | |d      j                        }|| z  d|z
  |z  z   } | S )Nr   r   r   r   r   r   r   axis      ?)r"   castcompute_dtyper)   reshapetake)r   transformationr   r   mix_up_imagesr   s        r   _mix_up_inputz-MixUp.transform_images.<locals>._mix_up_inputG   s    \\&&vt/A/ABF'5J ./B C**""**:}E(( + J !LL--""''0A'J(( . M  &(C*,<+MMFMr   r   )r   r   r<   r-   r>   s   `    r   transform_imageszMixUp.transform_imagesF   s    	 "6>:Fr   c                 (      fd}|r	 |||      }|S )Nc                     |d   }|d   }j                   j                  j                  | |d      }j                   j                  j                  |ddg      }|| z  d|z
  |z  z   } | S )Nr   r   r   r5   r4   r   r7   )r"   r)   r;   r:   )labelsr<   r   r   labels_for_mix_upr   s        r   _mix_up_labelsz.MixUp.transform_labels.<locals>._mix_up_labels[   s    '5J ./B C $ 2 2 7 7) !8 ! ++33JQHJV#sZ'7;L&LL  Mr   r   )r   rB   r<   r-   rD   s   `    r   transform_labelszMixUp.transform_labelsZ   s    
	 #FN;Fr   c                 (      fd}|r	 |||      }|S )Nc                 ,   t        j                         rj                  j                  d       |d   }t	        j
                  |      }| d   | d   }}j                  j                  j                  ||d      }j                  j                  j                  ||d      }j                  j                  j                  ||gd      }j                  j                  j                  ||gd      }j                  j                          ||dS )	N
tensorflowr   boxesrB   r   r5   r   )rI   rB   )
r   in_tf_graphr"   set_backendr   convert_to_numpyr)   r;   concatenatereset)bounding_boxesr<   r   rI   rB   boxes_for_mix_uprC   r   s          r   _mix_up_bounding_boxesz>MixUp.transform_bounding_boxes.<locals>._mix_up_bounding_boxesq   s   ((*((6 ./B C # 4 45F G*73^H5M6E#||1166(q  7   !% 2 2 7 7) !8 ! LL&&22() 3 E \\''33*+! 4 F LL "f55r   r   )r   rO   r<   r-   rQ   s   `    r   transform_bounding_boxeszMixUp.transform_bounding_boxesk   s$    	68 3N r   c                 (      fd}|r	 |||      }|S )Nc                     |d   }t        j                  |      }|d   }j                  j                  j	                  |g d      }j                  j                  j                  | |      }|| z  d|z
  |z  z   } | S )Nr   r   r3   r7   )r   rL   r"   r)   r:   r;   )segmentation_masksr<   r   r   segmentation_masks_for_mix_upr   s        r   _mix_up_segmentation_maskszFMixUp.transform_segmentation_masks.<locals>._mix_up_segmentation_masks   s    '5J--j9J ./B C++33JNJ,0LL,>,>,C,C"$5-) //#'DDE  &%r   r   )r   rU   r<   r-   rW   s   `    r   transform_segmentation_masksz"MixUp.transform_segmentation_masks   s%    	& !;"N" "!r   c                     |S )Nr   )r   input_shapes     r   compute_output_shapezMixUp.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   r]   zMixUp.get_config   s7    ZZII
 g(*(+(((r   )g?NN)TN)NT)T)__name__
__module____qualname____doc__r   r0   r?   rE   rR   rX   r[   r]   __classcell__)r   s   @r   r	   r	   
   sA    .-
:(* 	&R <@"0) )r   r	   N)	keras.srcr   keras.src.api_exportr   Qkeras.src.layers.preprocessing.image_preprocessing.base_image_preprocessing_layerr   keras.src.randomr   keras.src.utilsr   r	   r   r   r   <module>rj      s=     - + ) "#i)' i) $i)r   