Files
wehub-resource-sync 5cbd3f29e3
Fuzz / Run fuzz harnesses (${{ github.event_name == 'schedule' && 'nightly' || 'smoke' }}) (push) Has been cancelled
Create Releases / call-mac (push) Has been cancelled
Create Releases / call-linux (push) Has been cancelled
Create Releases / call-sdist (push) Has been cancelled
Create Releases / call-win (push) Has been cancelled
Create Releases / call-pyodide (push) Has been cancelled
Windows_No_Exception_CI / build (x64, 3.10) (push) Has been cancelled
Check URLs / build (push) Has been cancelled
Create Releases / Attest CI build artifacts (push) Has been cancelled
Create Releases / Check for Publish release build to pypi (push) Has been cancelled
Create Releases / Check for Publish preview build to test.pypi-weekly (push) Has been cancelled
Create Releases / Publish preview build to test.pypi-weekly (push) Has been cancelled
Create Releases / Check for Publish release build to test.pypi (rc-candidates) (push) Has been cancelled
Create Releases / Publish release build to test.pypi (push) Has been cancelled
Create Releases / Check for Publish preview build to pypi-weekly (push) Has been cancelled
Create Releases / Publish preview build to pypi-weekly (push) Has been cancelled
Create Releases / Publish release build to pypi (push) Has been cancelled
Create Releases / test source distribution (push) Has been cancelled
clang-tidy / clang-tidy (push) Has been cancelled
Lint / Validate SBOM (push) Has been cancelled
Lint / Enforce style (push) Has been cancelled
CI / Test windows-2022, 3.14, External, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test windows-latest, 3.10, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test windows-latest, 3.14, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test windows-latest, 3.14t, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, Internal, debug=1, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, External, debug=0, unity_build=1, onnx_ml=1, autogen=1 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, External, debug=0, unity_build=0, onnx_ml=0, autogen=0 (push) Has been cancelled
CI / Test macos-latest, 3.10, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test macos-latest, 3.14, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test macos-latest, 3.14t, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, External, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.10, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
CI / Test ubuntu-24.04, 3.14t, Internal, debug=0, unity_build=0, onnx_ml=1, autogen=0 (push) Has been cancelled
Pixi CI / Install and lint (ubuntu-24.04-arm) (push) Has been cancelled
Pixi CI / Install and lint (windows-2022) (push) Has been cancelled
Pixi CI / Xcode generator build (push) Has been cancelled
Pixi CI / Install and test (macos-latest, default) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-24.04-arm, default) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-latest, default) (push) Has been cancelled
Pixi CI / Install and test (windows-2022, default) (push) Has been cancelled
Pixi CI / Install and test (macos-latest, oldies) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-24.04-arm, oldies) (push) Has been cancelled
Pixi CI / Install and test (ubuntu-latest, oldies) (push) Has been cancelled
Pixi CI / Install and test (windows-2022, oldies) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Copilot Setup Steps / copilot-setup-steps (push) Has been cancelled
Generate and publish ONNX docs / build (push) Has been cancelled
Generate and publish ONNX docs / deploy (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:41:19 +08:00

643 lines
19 KiB
Python

# Copyright (c) ONNX Project Contributors
#
# SPDX-License-Identifier: Apache-2.0
from __future__ import annotations
import numpy as np
import onnx
from onnx.backend.test.case.base import Base
from onnx.backend.test.case.node import expect
class GridSample(Base):
@staticmethod
def export_gridsample() -> None:
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="linear",
padding_mode="zeros",
align_corners=0,
)
# X shape, [N, C, H, W] - [1, 1, 4, 4]
X = np.array(
[
[
[
[0.0, 1.0, 2.0, 3.0],
[4.0, 5.0, 6.0, 7.0],
[8.0, 9.0, 10.0, 11.0],
[12.0, 13.0, 14.0, 15.0],
]
]
],
dtype=np.float32,
)
# Grid shape, [N, H_out, W_out, 2] - [1, 6, 6, 2]
Grid = np.array(
[
[
[
[-1.0000, -1.0000],
[-0.6000, -1.0000],
[-0.2000, -1.0000],
[0.2000, -1.0000],
[0.6000, -1.0000],
[1.0000, -1.0000],
],
[
[-1.0000, -0.6000],
[-0.6000, -0.6000],
[-0.2000, -0.6000],
[0.2000, -0.6000],
[0.6000, -0.6000],
[1.0000, -0.6000],
],
[
[-1.0000, -0.2000],
[-0.6000, -0.2000],
[-0.2000, -0.2000],
[0.2000, -0.2000],
[0.6000, -0.2000],
[1.0000, -0.2000],
],
[
[-1.0000, 0.2000],
[-0.6000, 0.2000],
[-0.2000, 0.2000],
[0.2000, 0.2000],
[0.6000, 0.2000],
[1.0000, 0.2000],
],
[
[-1.0000, 0.6000],
[-0.6000, 0.6000],
[-0.2000, 0.6000],
[0.2000, 0.6000],
[0.6000, 0.6000],
[1.0000, 0.6000],
],
[
[-1.0000, 1.0000],
[-0.6000, 1.0000],
[-0.2000, 1.0000],
[0.2000, 1.0000],
[0.6000, 1.0000],
[1.0000, 1.0000],
],
]
],
dtype=np.float32,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 6, 6]
Y = np.array(
[
[
[
[0.0000, 0.1500, 0.5500, 0.9500, 1.3500, 0.7500],
[0.6000, 1.5000, 2.3000, 3.1000, 3.9000, 2.1000],
[2.2000, 4.7000, 5.5000, 6.3000, 7.1000, 3.7000],
[3.8000, 7.9000, 8.7000, 9.5000, 10.3000, 5.3000],
[5.4000, 11.1000, 11.9000, 12.7000, 13.5000, 6.9000],
[3.0000, 6.1500, 6.5500, 6.9500, 7.3500, 3.7500],
]
]
],
dtype=np.float32,
)
expect(node, inputs=[X, Grid], outputs=[Y], name="test_gridsample")
@staticmethod
def export_gridsample_paddingmode() -> None:
# X shape, [N, C, H, W] - [1, 1, 3, 2]
X = np.array(
[[[[0.0, 1.0], [2.0, 3.0], [4.0, 5.0]]]],
dtype=np.float32,
)
# Grid shape, [N, H_out, W_out, 2] - [1, 2, 4, 2]
Grid = np.array(
[
[
[
[-10.0000, -10.0000],
[-5.0000, -5.0000],
[-0.2000, -0.2000],
[10.0000, 10.0000],
],
[
[10.0000, 10.0000],
[-0.2000, -0.2000],
[5.0000, 5.0000],
[10.0000, 10.0000],
],
]
],
dtype=np.float32,
)
# setting padding_mode = 'zeros'
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
padding_mode="zeros",
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_zeros = np.array(
[[[[0.0000, 0.0000, 1.7000, 0.0000], [0.0000, 1.7000, 0.0000, 0.0000]]]],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_zeros],
name="test_gridsample_zeros_padding",
)
# setting padding_mode = 'border'
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
padding_mode="border",
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_border = np.array(
[[[[0.0000, 0.0000, 1.7000, 5.0000], [5.0000, 1.7000, 5.0000, 5.0000]]]],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_border],
name="test_gridsample_border_padding",
)
# setting padding_mode = 'reflection'
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
padding_mode="reflection",
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_reflection = np.array(
[[[[2.5000, 0.0000, 1.7000, 2.5000], [2.5000, 1.7000, 5.0000, 2.5000]]]],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_reflection],
name="test_gridsample_reflection_padding",
)
@staticmethod
def export_gridsample_mode_aligncorners() -> None:
# X shape, [N, C, H, W] - [1, 1, 3, 2]
X = np.array(
[[[[0.0, 1.0], [2.0, 3.0], [4.0, 5.0]]]],
dtype=np.float32,
)
# Grid shape, [N, H_out, W_out, 2] - [1, 2, 4, 2]
Grid = np.array(
[
[
[
[-1.0000, -1.0000],
[-0.5000, -0.5000],
[-0.2000, -0.2000],
[0.0000, 0.0000],
],
[
[0.0000, 0.0000],
[-0.2000, -0.2000],
[0.5000, 0.5000],
[1.0000, 1.0000],
],
]
],
dtype=np.float32,
)
# setting mode = 'bilinear', default align_corners = 0
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="linear",
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_bilinear = np.array(
[[[[0.0000, 0.5000, 1.7000, 2.5000], [2.5000, 1.7000, 4.5000, 1.2500]]]],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_bilinear],
name="test_gridsample_bilinear",
)
# setting mode = 'bilinear', align_corners = 1
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="linear",
align_corners=1,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_align_corners = np.array(
[[[[0.0000, 1.2500, 2.0000, 2.5000], [2.5000, 2.0000, 3.7500, 5.0000]]]],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_align_corners],
name="test_gridsample_aligncorners_true",
)
# setting mode = 'nearest'
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="nearest",
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_nearest = np.array(
[[[[0.0, 0.0, 2.0, 2.0], [2.0, 2.0, 5.0, 0.0]]]],
dtype=np.float32,
)
expect(
node, inputs=[X, Grid], outputs=[Y_nearest], name="test_gridsample_nearest"
)
# setting mode = 'bicubic'
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="cubic",
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_bicubic = np.array(
[[[[-0.1406, 0.3828, 1.7556, 2.9688], [2.9688, 1.7556, 5.1445, 1.3906]]]],
dtype=np.float32,
)
expect(
node, inputs=[X, Grid], outputs=[Y_bicubic], name="test_gridsample_bicubic"
)
# ============================================================================
# Additional tests
# The reference output tensors were generated using PyTorch 2.0.
Grid = np.array(
[
[
[[-1.0, -0.8], [-0.6, -0.5], [-0.1, -0.2], [0.7, 0.0]],
[[0.0, 0.4], [0.2, -0.2], [-0.3, 0.5], [-1.0, 1.0]],
]
],
dtype=np.float32,
)
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="nearest",
align_corners=0,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_nearest = np.array(
[[[[0.0, 0.0, 2.0, 3.0], [4.0, 3.0, 4.0, 4.0]]]],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_nearest],
name="test_gridsample_nearest_align_corners_0_additional_1",
)
# setting mode = 'nearest'
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="nearest",
align_corners=1,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_nearest = np.array(
[[[[0.0, 0.0, 2.0, 3.0], [2.0, 3.0, 4.0, 4.0]]]],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_nearest],
name="test_gridsample_nearest_align_corners_1_additional_1",
)
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="linear",
align_corners=0,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_bilinear = np.array(
[[[[0.0000, 0.4500, 1.8000, 2.4000], [3.7000, 2.1000, 3.7000, 1.0000]]]],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_bilinear],
name="test_gridsample_bilinear_align_corners_0_additional_1",
)
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="linear",
align_corners=1,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_bilinear = np.array(
[[[[0.4000, 1.2000, 2.0500, 2.8500], [3.3000, 2.2000, 3.3500, 4.0000]]]],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_bilinear],
name="test_gridsample_bilinear_align_corners_1_additional_1",
)
# These two new bicubic tests produces slightly higher error ~5e-5
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="cubic",
align_corners=0,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_bicubic = np.array(
[
[
[
[-0.173250, 0.284265, 1.923106, 2.568000],
[5.170375, 2.284414, 4.744844, 1.046875],
]
]
],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_bicubic],
name="test_gridsample_bicubic_align_corners_0_additional_1",
)
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="cubic",
align_corners=1,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_bicubic = np.array(
[
[
[
[0.304001, 1.128750, 2.266270, 3.144844],
[4.531500, 2.455360, 4.599819, 4.000000],
]
]
],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_bicubic],
name="test_gridsample_bicubic_align_corners_1_additional_1",
)
@staticmethod
def export_volumeetric_gridsample_mode_aligncorners() -> None:
X = np.array(
[
[
[
[[1.0, 2.0], [3.0, 4.0]],
[[5.0, 6.0], [7.0, 8.0]],
[[9.0, 10.0], [11.0, 12.0]],
]
]
],
dtype=np.float32,
)
Grid = np.array(
[
[
[
[[-1.0, -1.0, -1.0], [-1.0, -0.5, 0.3]],
[[-0.5, -0.5, -0.5], [1.0, -0.6, -1.0]],
[[-0.2, -0.2, -0.2], [0.4, 0.2, 0.6]],
[[0.0, 0.0, 0.0], [-1.0, 0.0, 0.0]],
],
[
[[0.0, 0.0, 0.0], [-1.0, 1.0, 0.0]],
[[-0.2, -0.2, -0.2], [1.0, 0.4, -0.2]],
[[0.5, 0.5, 0.5], [-1.0, -0.8, 0.8]],
[[1.0, 1.0, 1.0], [0.4, 0.6, -0.3]],
],
]
],
dtype=np.float32,
)
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="nearest",
align_corners=0,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_nearest = np.array(
[
[
[
[[1.0, 5.0], [1.0, 0.0], [5.0, 12.0], [5.0, 5.0]],
[[5.0, 0.0], [5.0, 0.0], [12.0, 9.0], [0.0, 8.0]],
]
]
],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_nearest],
name="test_gridsample_volumetric_nearest_align_corners_0",
)
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="nearest",
align_corners=1,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_nearest = np.array(
[
[
[
[[1.0, 5.0], [1.0, 2.0], [5.0, 12.0], [5.0, 5.0]],
[[5.0, 7.0], [5.0, 8.0], [12.0, 9.0], [12.0, 8.0]],
]
]
],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_nearest],
name="test_gridsample_volumetric_nearest_align_corners_1",
)
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="linear",
align_corners=0,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_bilinear = np.array(
[
[
[
[
[0.1250, 3.4000],
[2.0000, 0.4500],
[4.7000, 10.9000],
[6.5000, 3.0000],
],
[
[6.5000, 1.7500],
[4.7000, 3.3000],
[11.0000, 2.5200],
[1.5000, 5.4900],
],
]
]
],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_bilinear],
name="test_gridsample_volumetric_bilinear_align_corners_0",
)
node = onnx.helper.make_node(
"GridSample",
inputs=["X", "Grid"],
outputs=["Y"],
mode="linear",
align_corners=1,
)
# Y shape, [N, C, H_out, W_out] - [1, 1, 2, 4]
Y_bilinear = np.array(
[
[
[
[
[1.0000, 6.7000],
[3.7500, 2.4000],
[5.4000, 9.3000],
[6.5000, 6.0000],
],
[
[6.5000, 7.0000],
[5.4000, 6.6000],
[9.2500, 8.4000],
[12.0000, 6.1000],
],
]
]
],
dtype=np.float32,
)
expect(
node,
inputs=[X, Grid],
outputs=[Y_bilinear],
name="test_gridsample_volumetric_bilinear_align_corners_1",
)
"""
For someone who want to test by script. Comment it cause github ONNX CI
do not have the torch python package.
@staticmethod
def export_gridsample_torch(): # type: () -> None
node = onnx.helper.make_node(
'GridSample',
inputs=['X', 'Grid'],
outputs=['Y'],
mode='bilinear',
padding_mode='zeros',
align_corners=0,
)
# X shape, [N, C, H, W] - [1, 1, 4, 4]
# Grid shape, [N, H_out, W_out, 2] - [1, 6, 6, 2]
# Y shape, [N, C, H_out, W_out] - [1, 1, 6, 6]
import torch
X = torch.arange(3 * 3).view(1, 1, 3, 3).float()
d = torch.linspace(-1, 1, 6)
meshx, meshy = torch.meshgrid((d, d))
grid = torch.stack((meshy, meshx), 2)
Grid = grid.unsqueeze(0)
Y = torch.nn.functional.grid_sample(X, Grid, mode='bilinear',
padding_mode='zeros', align_corners=False)
expect(node, inputs=[X.numpy(), Grid.numpy()], outputs=[Y.numpy()],
name='test_gridsample_torch')
"""