keras-team/keras · error · ValueError

Invalid end_points shape: expected (4,2) for a single image…

Error message

Invalid end_points shape: expected (4,2) for a single image or (N,4,2) for a batch. Received shape: {end_points.shape}

What it means

Shape guard in `perspective_transform` (NumPy backend), the counterpart of the start_points check: the destination quadrilateral `end_points` must also be (4, 2) for a single image or (N, 4, 2) for a batch, since the homography maps the four start corners onto the four end corners. Failing either the ndim or the (4, 2) trailing-shape check raises this error with the received shape.

Solutions

  1. Reshape end_points to (4, 2) or (N, 4, 2) with exactly four corner pairs per image
  2. Verify corner ordering and coordinate pairs are not flattened into a single axis
  3. Match the batching of end_points to start_points and the images tensor
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at keras/src/backend/numpy/ops/image.py:691 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of keras-team/keras@7a34a03db6 (2026-08-25). Data as JSON: /api/errors/62af19fb0adec81f. Report an issue: GitHub.

Appendix: source

Thrown at keras/src/backend/numpy/ops/image.py:691

            "Invalid value for argument `interpolation`. Expected of one "
            f"{AFFINE_TRANSFORM_INTERPOLATIONS}. Received: "
            f"interpolation={interpolation}"
        )

    if len(images.shape) not in (3, 4):
        raise ValueError(
            "Invalid images rank: expected rank 3 (single image) "
            "or rank 4 (batch of images). Received input with shape: "
            f"images.shape={images.shape}"
        )

    if start_points.ndim not in (2, 3) or start_points.shape[-2:] != (4, 2):
        raise ValueError(
            "Invalid start_points shape: expected (4,2) for a single image"
            f" or (N,4,2) for a batch. Received shape: {start_points.shape}"
        )
    if end_points.ndim not in (2, 3) or end_points.shape[-2:] != (4, 2):
        raise ValueError(
            "Invalid end_points shape: expected (4,2) for a single image"
            f" or (N,4,2) for a batch. Received shape: {end_points.shape}"
        )
    if start_points.shape != end_points.shape:
        raise ValueError(
            "start_points and end_points must have the same shape."
            f" Received start_points.shape={start_points.shape}, "
            f"end_points.shape={end_points.shape}"
        )

    input_dtype = images.dtype
    if input_dtype == "float16":
        images = images.astype("float32")

    need_squeeze = False
    if len(images.shape) == 3:
        images = np.expand_dims(images, axis=0)
        need_squeeze = True

View on GitHub (pinned to 7a34a03db6)