mirror of
https://github.com/vllm-project/vllm.git
synced 2026-08-16 02:38:12 +00:00
[Bugfix] Handle HWC images in ImageProcessorItems.get_image_size (#45057)
Signed-off-by: YellowFoxH4XOR <[email protected]> Co-authored-by: Claude <[email protected]>
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
import numpy as np
|
||||
import pytest
|
||||
import torch
|
||||
from PIL import Image
|
||||
|
||||
from vllm.multimodal.parse import ImageProcessorItems, VideoProcessorItems
|
||||
|
||||
H, W = 480, 640
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"image",
|
||||
[
|
||||
Image.new("RGB", (W, H)),
|
||||
# HWC, e.g. from np.array(PIL.Image)
|
||||
np.zeros((H, W, 3), dtype=np.uint8),
|
||||
torch.zeros((H, W, 3), dtype=torch.uint8),
|
||||
# CHW, standard PyTorch / numpy convention
|
||||
np.zeros((3, H, W), dtype=np.uint8),
|
||||
torch.zeros((3, H, W), dtype=torch.uint8),
|
||||
],
|
||||
)
|
||||
def test_image_size_hwc_chw(image):
|
||||
"""Image sizes must be channel-layout agnostic.
|
||||
|
||||
`get_image_size` determines the multimodal placeholder count; reading an
|
||||
HWC array (the layout `np.array(PIL.Image)` produces) as CHW yields a
|
||||
bogus size and a placeholder/embedding count mismatch at inference time.
|
||||
"""
|
||||
items = ImageProcessorItems([image])
|
||||
|
||||
assert items.get_image_size(0) == (W, H)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"frame",
|
||||
[
|
||||
Image.new("RGB", (W, H)),
|
||||
np.zeros((H, W, 3), dtype=np.uint8),
|
||||
torch.zeros((H, W, 3), dtype=torch.uint8),
|
||||
np.zeros((3, H, W), dtype=np.uint8),
|
||||
torch.zeros((3, H, W), dtype=torch.uint8),
|
||||
],
|
||||
)
|
||||
def test_frame_size_hwc_chw(frame):
|
||||
"""`get_frame_size` must stay consistent with `get_image_size`."""
|
||||
items = VideoProcessorItems([[frame]])
|
||||
|
||||
assert items.get_frame_size(0) == (W, H)
|
||||
@@ -334,7 +334,13 @@ class ImageProcessorItems(ProcessorBatchItems[HfImageItem | None]):
|
||||
if isinstance(image, PILImage.Image):
|
||||
return ImageSize(*image.size)
|
||||
if isinstance(image, (np.ndarray, torch.Tensor)):
|
||||
_, h, w = image.shape
|
||||
if image.ndim == 3 and image.shape[-1] in (1, 3, 4):
|
||||
# HWC format (e.g. from np.array(PIL.Image)).
|
||||
# PIL images are always channels-last.
|
||||
h, w = image.shape[0], image.shape[1]
|
||||
else:
|
||||
# CHW format (standard PyTorch / numpy convention).
|
||||
_, h, w = image.shape
|
||||
return ImageSize(w, h)
|
||||
|
||||
assert_never(image)
|
||||
|
||||
Reference in New Issue
Block a user