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
- Reshape end_points to (4, 2) or (N, 4, 2) with exactly four corner pairs per image
- Verify corner ordering and coordinate pairs are not flattened into a single axis
- 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 = TrueView on GitHub (pinned to 7a34a03db6)