
    2Vh.)                     x    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	 d dl
mZ  ed       G d d	e             Zy
)    backend)keras_export)BaseImagePreprocessingLayer)convert_format)densify_bounding_boxes)SeedGeneratorzkeras.layers.RandomCropc                   b     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 )
RandomCropa  A preprocessing layer which randomly crops images during training.

    During training, this layer will randomly choose a location to crop images
    down to a target size. The layer will crop all the images in the same batch
    to the same cropping location.

    At inference time, and during training if an input image is smaller than the
    target size, the input will be resized and cropped so as to return the
    largest possible window in the image that matches the target aspect ratio.
    If you need to apply random cropping at inference time, set `training` to
    True when calling the layer.

    Input pixel values can be of any range (e.g. `[0., 1.)` or `[0, 255]`) and
    of integer or floating point dtype. By default, the layer will output
    floats.

    **Note:** This layer is safe to use inside a `tf.data` pipeline
    (independently of which backend you're using).

    Input shape:
        3D (unbatched) or 4D (batched) tensor with shape:
        `(..., height, width, channels)`, in `"channels_last"` format.

    Output shape:
        3D (unbatched) or 4D (batched) tensor with shape:
        `(..., target_height, target_width, channels)`.

    Args:
        height: Integer, the height of the output shape.
        width: Integer, the width of the output shape.
        seed: Integer. Used to create a random seed.
        **kwargs: Base layer keyword arguments, such as
            `name` and `dtype`.
    c                    t        |   d	d|i| || _        || _        ||nt        j
                  j                         | _        t        |      | _	        t	        j                  |      | _        | j                  dk(  rd| _        d| _        n| j                  dk(  rd| _        d| _        d| _        d| _        d| _        d| _        y )
Nnamechannels_firstchannels_lastFT )super__init__heightwidthr   randommake_default_seedseedr	   	generatorstandardize_data_formatdata_formatheight_axis
width_axissupports_maskingsupports_jit_convert_input_args!_allow_non_tensor_positional_args)selfr   r   r   r   r   kwargs	__class__s          n/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/layers/preprocessing/image_preprocessing/random_crop.pyr   zRandomCrop.__init__4   s     	-d-f-
$D'..*J*J*L 		 't,"::;G//!D DO0!D DO %!#( 15.    c           
      |   |%| j                  | j                  j                        }t        |t              r| j                  j                  |d         }n| j                  j                  |      }|| j                     || j                     }}||t        d|       |r|| j                  kD  r|| j                  kD  r| j                  j                  | j                  j                  j                  ddt        || j                  z
  dz         |      d      }| j                  j                  | j                  j                  j                  ddt        || j                  z
  dz         |      d      }||fS t        t        || j                  z        | j                  z        }	t!        t#        ||	      d      }	t        t        || j                  z        | j                  z        }
t!        t#        ||
      d      }
t        t        ||	z
        dz        }t        t        ||
z
        dz        }||fS )	Nimagesz_RandomCrop requires the input to have a fully defined height and width. Received: images.shape=r   r      )maxvalr   int32   )_get_seed_generatorr   _backend
isinstancedictshaper   r   
ValueErrorr   r   castr   uniformfloatintmaxmin)r$   datatrainingr   input_shapeinput_heightinput_widthh_startw_startcrop_height
crop_widths              r'   get_random_transformationz$RandomCrop.get_random_transformationL   s   <++DLL,A,ABDdD!,,,,T(^<K,,,,T2K (()( " ;#6<<G=J 
 t{{2{TZZ7Oll''##++ !;a!?@	 ,  G ll''##++ tzz!9A!=>	 ,  G"  eK$++$=>KLKc,<a@KU<$**#<=KLJSj91=J%{ :;a?@G%j 89A=>Gr(   c                    |r| j                   j                  || j                        }|\  }}| j                  }| j                  }| j
                  dk(  rEt        |j                        dk(  r|d d |||z   |||z   d d f   }nY||||z   |||z   d d f   }nDt        |j                        dk(  r|d d d d |||z   |||z   f   }n|d d |||z   |||z   f   }| j                   j                  |      }|| j                     }	|| j                     }
t        |	t              r.t        |
t              r|	| j                  k7  s|
| j                  k7  rn| j                   j                  j                  || j                  | j                  f| j
                        }| j                   j                  || j                        }|S )Nr      )sizer   )r   r5   compute_dtyper   r   r   lenr3   r   r   r1   r8   imageresize)r$   r*   transformationr<   crop_box_hstartcrop_box_wstartrB   rC   r3   
new_height	new_widths              r'   transform_imageszRandomCrop.transform_images|   s   \\&&vt/A/ABF/=,O_++KJ?2v||$)#'/K*GG'/J*FFF $'/K*GG'/J*FFF v||$)#'/K*GG'/J*FFHF $'/K*GG'/J*FFHF LL&&v.Et//0Jdoo.Iz3/!)S1,

*
 ++22++tzz2 $ 0 0 3  **643E3EFr(   c                     |S Nr   )r$   labelsrL   r<   s       r'   transform_labelszRandomCrop.transform_labels   s    r(   c                    |r|\  }}| j                   j                  |d         st        || j                         }|d   }t        || j                  d| j
                  | j                        }| j                   j                  ||j                        }| j                   j                  ||j                        }t        | j                   j                  |            dk(  r| j                   j                  j                  | j                   j                  j                  |dddddf   |z
  d      | j                   j                  j                  |dddddf   |z
  d      | j                   j                  j                  |ddddd	f   |z
  d      | j                   j                  j                  |dddddf   |z
  d      gd
      }n| j                   j                  j                  | j                   j                  j                  |dddf   |z
  d      | j                   j                  j                  |dddf   |z
  d      | j                   j                  j                  |ddd	f   |z
  d      | j                   j                  j                  |dddf   |z
  d      gd
      }t        |d| j                  | j
                  | j                        }||d   dS |S )a6  
        bounding_boxes = {
            "boxes": (batch, num_boxes, 4),  # left-top-right-bottom (xyxy)
            "labels": (batch, num_boxes, num_classes),
        }
        or
        bounding_boxes = {
            "boxes": (num_boxes, 4),
            "labels": (num_boxes, num_classes),
        }
        boxesr   xyxy)rW   sourcetargetr   r      Nr   r+   r.   r   )axisrT   )rW   rT   )r   	is_tensorr   r   bounding_box_formatr   r   r5   dtyperI   r3   numpystackmaximum)r$   bounding_boxesrL   r<   r@   rA   rW   s          r'   transform_bounding_boxesz#RandomCrop.transform_bounding_boxes   s   $ -GW<<)).*AB!7"DLL" #7+E"//{{jjE ll''=Gll''=G4<<%%e,-2**00**225Aq>G3KQO**225Aq>G3KQO**225Aq>G3KQO**225Aq>G3KQO	  1  **00**225A;3H!L**225A;3H!L**225A;3H!L**225A;3H!L	  1  #//{{jjE (2  r(   c                 &    | j                  ||      S rS   )rQ   )r$   segmentation_masksrL   r<   s       r'   transform_segmentation_masksz'RandomCrop.transform_segmentation_masks   s     $$%7HHr(   c                     t        |      }| j                  || j                  <   | j                  || j                  <   t        |      S rS   )listr   r   r   r   tuple)r$   r=   argsr%   s       r'   compute_output_shapezRandomCrop.compute_output_shape  s=    ;'(,D$$%'+zzDOO$[!!r(   c                     t         |          }|j                  | j                  | j                  | j
                  | j                  d       |S )N)r   r   r   r   )r   
get_configupdater   r   r   r   )r$   configr&   s     r'   rn   zRandomCrop.get_config
  sF    #%++		#//		
 r(   )NNN)TN)T)__name__
__module____qualname____doc__r   rD   rQ   rU   rd   rg   rl   rn   __classcell__)r&   s   @r'   r   r      sM    !H @D60. `7r 	EP <@I
"
 
r(   r   N)	keras.srcr   keras.src.api_exportr   Qkeras.src.layers.preprocessing.image_preprocessing.base_image_preprocessing_layerr   Lkeras.src.layers.preprocessing.image_preprocessing.bounding_boxes.convertersr   Lkeras.src.layers.preprocessing.image_preprocessing.bounding_boxes.validationr   keras.src.random.seed_generatorr	   r   r   r(   r'   <module>r|      sD     - : '(D, D )Dr(   