
    2VhT#                     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	)
    )backend)keras_export)	InputSpec)Layer)argument_validationzkeras.layers.Cropping2Dc                   :     e Zd ZdZd fd	Zd Zd Z fdZ xZS )
Cropping2Da  Cropping layer for 2D input (e.g. picture).

    It crops along spatial dimensions, i.e. height and width.

    Example:

    >>> input_shape = (2, 28, 28, 3)
    >>> x = np.arange(np.prod(input_shape)).reshape(input_shape)
    >>> y = keras.layers.Cropping2D(cropping=((2, 2), (4, 4)))(x)
    >>> y.shape
    (2, 24, 20, 3)

    Args:
        cropping: Int, or tuple of 2 ints, or tuple of 2 tuples of 2 ints.
            - If int: the same symmetric cropping is applied to height and
              width.
            - If tuple of 2 ints: interpreted as two different symmetric
              cropping values for height and width:
              `(symmetric_height_crop, symmetric_width_crop)`.
            - If tuple of 2 tuples of 2 ints: interpreted as
              `((top_crop, bottom_crop), (left_crop, right_crop))`.
        data_format: A string, one of `"channels_last"` (default) or
            `"channels_first"`. The ordering of the dimensions in the inputs.
            `"channels_last"` corresponds to inputs with shape
            `(batch_size, height, width, channels)` while `"channels_first"`
            corresponds to inputs with shape
            `(batch_size, channels, height, width)`.
            When unspecified, uses `image_data_format` value found in your Keras
            config file at `~/.keras/keras.json` (if exists). Defaults to
            `"channels_last"`.

    Input shape:
        4D tensor with shape:
        - If `data_format` is `"channels_last"`:
          `(batch_size, height, width, channels)`
        - If `data_format` is `"channels_first"`:
          `(batch_size, channels, height, width)`

    Output shape:
        4D tensor with shape:
        - If `data_format` is `"channels_last"`:
          `(batch_size, cropped_height, cropped_width, channels)`
        - If `data_format` is `"channels_first"`:
          `(batch_size, channels, cropped_height, cropped_width)`
    c                    t        |   di | t        j                  |      | _        t        |t              r"|dk  rt        d| d      ||f||ff| _        nzt        |d      r_t        |      dk7  rt        d| d      t        j                  |d   ddd	      }t        j                  |d
   ddd	      }||f| _        nt        d| d      t        d      | _        y )Nr   z2`cropping` cannot be negative. Received: cropping=.__len__   z8`cropping` should have two elements. Received: cropping=z1st entry of croppingT)
allow_zero   z2nd entry of croppingz`cropping` should be either an int, a tuple of 2 ints (symmetric_height_crop, symmetric_width_crop), or a tuple of 2 tuples of 2 ints ((top_crop, bottom_crop), (left_crop, right_crop)). Received: cropping=   )ndim )super__init__r   standardize_data_formatdata_format
isinstanceint
ValueErrorcroppinghasattrlenr   standardize_tupler   
input_spec)selfr   r   kwargsheight_croppingwidth_cropping	__class__s         U/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/layers/reshaping/cropping2d.pyr   zCropping2D.__init__8   s   "6""::;Gh$!| **216  '1Hh3GHDMXy)8}! **216  2CCQ 7DO 1BBQ 7DN -n=DM& '/Zq	2  $+    c                 V   | j                   dk(  r|d   t        | j                  d         |d   k\  s#|d   9t        | j                  d         |d   k\  rt        d| d| j                         |d   |d   |d   +|d   | j                  d   d   z
  | j                  d   d   z
  nd |d   ,|d   | j                  d   d   z
  | j                  d   d   z
  fS d fS |d   t        | j                  d         |d   k\  s#|d   9t        | j                  d         |d   k\  rt        d| d| j                         |d   |d   +|d   | j                  d   d   z
  | j                  d   d   z
  nd |d   +|d   | j                  d   d   z
  | j                  d   d   z
  nd |d   fS )Nchannels_firstr   r      r   z}Values in `cropping` argument should be smaller than the corresponding spatial dimension of the input. Received: input_shape=, cropping=)r   sumr   r   )r   input_shapes     r$   compute_output_shapezCropping2D.compute_output_shapeY   s)   //A*a()[^;A*a()[^; ##.-{4==/K  AA #1~1  NT]]1%5a%884==;KA;NN #1~1  NT]]1%5a%884==;KA;NN     A*a()[^;A*a()[^; ##.-{4==/K  A #1~1  NT]]1%5a%884==;KA;NN #1~1  NT]]1%5a%884==;KA;NNA r%   c                    | j                   dk(  r|j                  d   (t        | j                  d         |j                  d   k\  s7|j                  d   Mt        | j                  d         |j                  d   k\  r%t	        d|j                   d| j                         | j                  d   d   | j                  d   d   cxk(  rdk(  r4n n1|d d d d | j                  d   d   d | j                  d   d   d f   S | j                  d   d   dk(  rB|d d d d | j                  d   d   d | j                  d   d   | j                  d   d    f   S | j                  d   d   dk(  rB|d d d d | j                  d   d   | j                  d   d    | j                  d   d   d f   S |d d d d | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    f   S |j                  d   (t        | j                  d         |j                  d   k\  s7|j                  d   Mt        | j                  d         |j                  d   k\  r%t	        d|j                   d| j                         | j                  d   d   | j                  d   d   cxk(  rdk(  r4n n1|d d | j                  d   d   d | j                  d   d   d d d f   S | j                  d   d   dk(  rB|d d | j                  d   d   d | j                  d   d   | j                  d   d    d d f   S | j                  d   d   dk(  rB|d d | j                  d   d   | j                  d   d    | j                  d   d   d d d f   S |d d | j                  d   d   | j                  d   d    | j                  d   d   | j                  d   d    d d f   S )Nr'   r   r   r(   r   z~Values in `cropping` argument should be smaller than the corresponding spatial dimension of the input. Received: inputs.shape=r)   )r   shaper*   r   r   )r   inputss     r$   callzCropping2D.call   sb   //Q+a()V\\!_<Q+a()V\\!_< $$*LL>T]]OM 
 }}Q"dmmA&6q&9>Q>q$--*1-/q1A!1D1FF  q!!$)MM!$Q')MM!$Q'4==+;A+>*>>@  q!!$)MM!$Q'4==+;A+>*>>MM!$Q')+  a #t}}Q'7':&::a #t}}Q'7':&::<  Q+a()V\\!_<Q+a()V\\!_< $$*LL>T]]OM 
 }}Q"dmmA&6q&9>Q>t}}Q'*,dmmA.>q.A.CQF  q!!$)MM!$Q')MM!$Q'4==+;A+>*>>  q!!$)MM!$Q'4==+;A+>*>>MM!$Q')  a #t}}Q'7':&::a #t}}Q'7':&:: r%   c                 ^    | j                   | j                  d}t        |          }i ||S )N)r   r   )r   r   r   
get_config)r   configbase_configr#   s      r$   r2   zCropping2D.get_config   s4    "mmD<L<LMg(*(+(((r%   ))r   r   r5   N)	__name__
__module____qualname____doc__r   r,   r0   r2   __classcell__)r#   s   @r$   r	   r	      s&    ,\,B6pJX) )r%   r	   N)	keras.srcr   keras.src.api_exportr   keras.src.layers.input_specr   keras.src.layers.layerr   keras.src.utilsr   r	   r   r%   r$   <module>r@      s8     - 1 ( / '(W) W) )W)r%   