
    0h                      v    d Z ddlmc 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)
z"Keras cropping layer for 2D input.    N)Layer)	InputSpec)
conv_utils)keras_exportzkeras.layers.Cropping2Dc                   :     e Zd ZdZd fd	Zd Zd Z fdZ xZS )
Cropping2Dac  Cropping layer for 2D input (e.g. picture).

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

    Examples:

    >>> input_shape = (2, 28, 28, 3)
    >>> x = np.arange(np.prod(input_shape)).reshape(input_shape)
    >>> y = tf.keras.layers.Cropping2D(cropping=((2, 2), (4, 4)))(x)
    >>> print(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 TF-Keras config file at
         `~/.keras/keras.json` (if exists) else 'channels_last'.
        Defaults to 'channels_last'.

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

    Output shape:
      4D tensor with shape:
      - If `data_format` is `"channels_last"`:
        `(batch_size, cropped_rows, cropped_cols, channels)`
      - If `data_format` is `"channels_first"`:
        `(batch_size, channels, cropped_rows, cropped_cols)`
    c                    t        |   di | t        j                  |      | _        t        |t              r||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 )N__len__   z/`cropping` should have two elements. Received: .r   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:    )ndim )super__init__r   normalize_data_formatdata_format
isinstanceintcroppinghasattrlen
ValueErrornormalize_tupler   
input_spec)selfr   r   kwargsheight_croppingwidth_cropping	__class__s         b/var/www/html/engine/venv/lib/python3.12/site-packages/tf_keras/src/layers/reshaping/cropping2d.pyr   zCropping2D.__init__P   s    "6"%;;KHh$&1Hh3GHDMXy)8}! !!)
!-  )88Q 7DO (77Q 7DN -n=DM
 &Ja)  $+    c                 l   t        j                  |      j                         }| j                  dk(  rt        j                  |d   |d   |d   r+|d   | j                  d   d   z
  | j                  d   d   z
  nd |d   r0|d   | j                  d   d   z
  | j                  d   d   z
  g      S d g      S t        j                  |d   |d   r+|d   | j                  d   d   z
  | j                  d   d   z
  nd |d   r+|d   | j                  d   d   z
  | j                  d   d   z
  nd |d   g      S )Nchannels_firstr   r   r      )tfTensorShapeas_listr   r   )r   input_shapes     r#   compute_output_shapezCropping2D.compute_output_shapem   sg   nn[199;//>>NN"1~  NT]]1%5a%884==;KA;NN"1~  NT]]1%5a%884==;KA;NN	  	  >>N"1~  NT]]1%5a%884==;KA;NN"1~  NT]]1%5a%884==;KA;NNN	 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   zQArgument `cropping` must be greater than the input shape. Received: inputs.shape=z, and cropping=)r   shapesumr   r   )r   inputss     r#   callzCropping2D.call   sd   //Q+a()V\\!_<Q+a()V\\!_< L||nODMM?D 
 }}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\\!_< L||nODMM?D 
 }}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        |          }t	        t        |j                               t        |j                               z         S )N)r   r   )r   r   r   
get_configdictlistitems)r   configbase_configr"   s      r#   r3   zCropping2D.get_config   sM    "mmD<L<LMg(*D**,-V\\^0DDEEr$   ))r   r   r9   N)	__name__
__module____qualname____doc__r   r,   r1   r3   __classcell__)r"   s   @r#   r   r      s&    0d,:<JXF Fr$   r   )r=   tensorflow.compat.v2compatv2r(   tf_keras.src.engine.base_layerr   tf_keras.src.engine.input_specr   tf_keras.src.utilsr    tensorflow.python.util.tf_exportr   r   r   r$   r#   <module>rF      sG    ) " ! 0 4 ) : '(}F }F )}Fr$   