
    ~Wh                          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dS )
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 )	
Cropping2DaK  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)`.
        It defaults to the `image_data_format` value found in your
        Keras config file at `~/.keras/keras.json`.
        If you never set it, then it will be "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)`
    r   r   r
   Nc                     t                      j        di | t          j        |          | _        t          |t                    r||f||ff| _        nt          |d          rlt          |          dk    rt          d| d          t          j        |d         ddd          }t          j        |d	         dd
d          }||f| _        nt          d| d          t          d          | _        d S )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         g/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/keras/layers/reshaping/cropping2d.pyr   zCropping2D.__init__O   sJ   ""6"""%;KHHh$$ 	&1Hh3GHDMMXy)) 	8}}!! -!)- - -   )8Q 7D  O (7Q 7D  N -n=DMM)
 &) ) )   $+++    c                    t          j        |                                          }| j        dk    rt          j        |d         |d         |d         r0|d         | j        d         d         z
  | j        d         d         z
  nd |d         r0|d         | j        d         d         z
  | j        d         d         z
  nd g          S t          j        |d         |d         r0|d         | j        d         d         z
  | j        d         d         z
  nd |d         r0|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_shapel   sd   n[1199;;///>NN"1~KNT]1%5a%884=;KA;NNN"1~KNT]1%5a%884=;KA;NNN	   >N"1~KNT]1%5a%884=;KA;NNN"1~KNT]1%5a%884=;KA;NNNN	  r&   c                 F   | j         dk    r|j        d         )t          | j        d                   |j        d         k    s6|j        d         Ht          | j        d                   |j        d         k    rt	          d|j         d| j                   | j        d         d         | j        d         d         cxk    rdk    r9n n6|d d d d | j        d         d         d | j        d         d         d f         S | j        d         d         dk    rH|d d d d | j        d         d         d | j        d         d         | j        d         d          f         S | j        d         d         dk    rH|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    s6|j        d         Ht          | j        d                   |j        d         k    rt	          d|j         d| j                   | j        d         d         | j        d         d         cxk    rdk    r9n n6|d d | j        d         d         d | j        d         d         d d d f         S | j        d         d         dk    rH|d d | j        d         d         d | j        d         d         | j        d         d          d d f         S | j        d         d         dk    rH|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   s   ///Q+a())V\!_<<Q+a())V\!_<< D|D D48MD D  
 }Q"dmA&6q&9>>>>Q>>>>>AAqqq$-*1-//q1A!1D1F1FF  q!!$))AAAAM!$Q'))M!$Q'4=+;A+>*>>@  q!!$))AAAAM!$Q'4=+;A+>*>>M!$Q'))+  a #t}Q'7':&::a #t}Q'7':&::<  Q+a())V\!_<<Q+a())V\!_<< D|D D48MD D  
 }Q"dmA&6q&9>>>>Q>>>>>AAt}Q'*,,dmA.>q.A.C.CQQQF  q!!$))AAM!$Q'))M!$Q'4=+;A+>*>>AA  q!!$))AAM!$Q'4=+;A+>*>>M!$Q'))AA  a #t}Q'7':&::a #t}Q'7':&:: r&   c                    | j         | j        d}t                                                      }t	          t          |                                          t          |                                          z             S )N)r   r   )r   r   r   
get_configdictlistitems)r    configbase_configr$   s      r%   r5   zCropping2D.get_config   sa    "mD<LMMgg((**D**,,--V\\^^0D0DDEEEr&   )r	   N)	__name__
__module____qualname____doc__r   r.   r3   r5   __classcell__)r$   s   @r%   r   r      s        / /b, , , , , ,:  <K K KZF F F F F F F F Fr&   r   )r>   tensorflow.compat.v2compatv2r*   keras.engine.base_layerr   keras.engine.input_specr   keras.utilsr    tensorflow.python.util.tf_exportr   r   r   r&   r%   <module>rG      s    ) ( " ! ! ! ! ! ! ! ! ) ) ) ) ) ) - - - - - - " " " " " " : 9 9 9 9 9 '((}F }F }F }F }F }F }F )(}F }F }Fr&   