This is an automated email from the ASF dual-hosted git repository. mbrookhart pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push: new 5c5aea6 [BUG_FIX][TOPI] Allow topi resize to accept more options (#7532) 5c5aea6 is described below commit 5c5aea620bb940fd4fb7106602ae51111c7af03a Author: Lily Orth-Smith <lilyorthsm...@gmail.com> AuthorDate: Fri Feb 26 16:00:54 2021 -0500 [BUG_FIX][TOPI] Allow topi resize to accept more options (#7532) * Make topi more permissive * Remove testing stuff * lint * Downsampling tests --- python/tvm/topi/image/resize.py | 6 +----- tests/python/frontend/onnx/test_forward.py | 12 ++++++++++++ tests/python/relay/test_op_level5.py | 20 +++++++++++++------- tests/python/topi/python/test_topi_image.py | 20 +++++++++++--------- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/python/tvm/topi/image/resize.py b/python/tvm/topi/image/resize.py index 103850d..433a920 100644 --- a/python/tvm/topi/image/resize.py +++ b/python/tvm/topi/image/resize.py @@ -653,11 +653,7 @@ def resize( or 5-D with shape [batch, channel-major, in_height*scale, in_width*scale, channel-minor] """ method = method.lower() - if method == "nearest_neighbor" and coordinate_transformation_mode != "asymmetric": - raise ValueError( - "Topi Resize does not support the combination of method %s " - "and coordinate_transformation_mode %s" % (method, coordinate_transformation_mode) - ) + if layout == "NHWC": in_n, in_h, in_w, in_c = data.shape if output_shape is None: diff --git a/tests/python/frontend/onnx/test_forward.py b/tests/python/frontend/onnx/test_forward.py index 9e59117..8dbd049 100644 --- a/tests/python/frontend/onnx/test_forward.py +++ b/tests/python/frontend/onnx/test_forward.py @@ -3356,15 +3356,27 @@ def test_resize(): # upsampling verify([1, 16, 32, 32], [1, 16, 64, 64], [], "nearest", "asymmetric") + verify([1, 16, 32, 32], [1, 16, 64, 64], [], "linear", "asymmetric") + verify([1, 16, 32, 32], [1, 16, 64, 64], [], "nearest", "align_corners") verify([1, 16, 32, 32], [1, 16, 64, 64], [], "linear", "align_corners") + verify([1, 16, 32, 32], [1, 16, 64, 64], [], "nearest", "half_pixel") verify([1, 16, 32, 32], [1, 16, 64, 64], [], "linear", "half_pixel") + # downsampling verify([1, 16, 32, 32], [1, 16, 16, 16], [], "nearest", "asymmetric") + verify([1, 16, 32, 32], [1, 16, 16, 16], [], "linear", "asymmetric") + verify([1, 16, 32, 32], [1, 16, 16, 16], [], "nearest", "align_corners") verify([1, 16, 32, 32], [1, 16, 16, 16], [], "linear", "align_corners") + verify([1, 16, 32, 32], [1, 16, 16, 16], [], "nearest", "half_pixel") verify([1, 16, 32, 32], [1, 16, 16, 16], [], "linear", "half_pixel") + # scales are specified instead of sizes verify([1, 16, 32, 32], [], [1, 1, 2, 2], "nearest", "asymmetric") + verify([1, 16, 32, 32], [], [1, 1, 2, 2], "linear", "asymmetric") + verify([1, 16, 32, 32], [], [1, 1, 2, 2], "nearest", "align_corners") + verify([1, 16, 32, 32], [], [1, 1, 2, 2], "linear", "align_corners") verify([1, 16, 32, 32], [], [1, 1, 0.5, 0.5], "linear", "half_pixel") + verify([1, 16, 32, 32], [], [1, 1, 0.5, 0.5], "nearest", "half_pixel") def verify_opset_10(ishape, scales, mode): nodes = [ diff --git a/tests/python/relay/test_op_level5.py b/tests/python/relay/test_op_level5.py index 87f3ab8..929764b 100644 --- a/tests/python/relay/test_op_level5.py +++ b/tests/python/relay/test_op_level5.py @@ -67,13 +67,19 @@ def test_resize(): for kind in ["graph", "debug"]: intrp = relay.create_executor(kind, ctx=ctx, target=target) op_res = intrp.evaluate(func)(x_data) - tvm.testing.assert_allclose(op_res.asnumpy(), ref_res, rtol=1e-4, atol=1e-5) - - for layout in ["NHWC", "NCHW"]: - verify_resize((1, 4, 4, 4), 2, "bilinear", layout, "align_corners") - verify_resize((2, 8, 17, 20), 3, "bilinear", layout, "half_pixel") - verify_resize((2, 8, 17, 20), 3, "bilinear", layout, "asymmetric") - verify_resize((3, 4, 5, 6), 5, "nearest_neighbor", layout, "asymmetric") + tvm.testing.assert_allclose(op_res.asnumpy(), ref_res, rtol=1e-3, atol=1e-4) + + for method in ["nearest_neighbor", "bilinear"]: + for coord_trans in ["asymmetric", "half_pixel", "align_corners"]: + for layout in ["NHWC", "NCHW"]: + # TODO: Topi test does not have a function to produce numpy output for resize with + # nearest_neighbors and align_corners. Enable when topi test has this option + if coord_trans == "align_corners" and method == "nearest_neighbor": + continue + verify_resize((1, 4, 4, 4), 2, method, layout, coord_trans) + verify_resize((2, 8, 17, 20), 3, method, layout, coord_trans) + verify_resize((2, 8, 17, 20), 3, method, layout, coord_trans) + verify_resize((3, 4, 5, 6), 5, method, layout, coord_trans) def test_resize3d_infer_type(): diff --git a/tests/python/topi/python/test_topi_image.py b/tests/python/topi/python/test_topi_image.py index 518ee1f..c605df7 100644 --- a/tests/python/topi/python/test_topi_image.py +++ b/tests/python/topi/python/test_topi_image.py @@ -59,6 +59,9 @@ def verify_resize( a_np, (out_height, out_width), layout, coord_trans ) else: + # TODO: Nearest neighbor case doesn't do anything with coordinate transform mode, and also + # nearest_neighbors and align_corners combination in topi doesn't match the output of this + # function. scale_h = out_height / in_height scale_w = out_width / in_width b_np = tvm.topi.testing.upsampling_python(a_np, (scale_h, scale_w), layout) @@ -88,15 +91,14 @@ def test_resize(): verify_resize(4, 16, 32, 32, 50, 50, "NHWC") # Scale NHWC + Align Corners verify_resize(6, 32, 64, 64, 20, 20, "NHWC") - # Nearest + Fractional - verify_resize(4, 16, 32, 32, 50, 50, "NCHW", "asymmetric", method="nearest_neighbor") - verify_resize(4, 16, 32, 32, 50, 50, "NHWC", "asymmetric", method="nearest_neighbor") - # half_pixel - verify_resize(4, 16, 16, 16, 32, 32, "NCHW", "half_pixel", method="bilinear") - verify_resize(4, 16, 16, 16, 32, 32, "NHWC", "half_pixel", method="bilinear") - # Bilinear + Fractional - verify_resize(4, 16, 32, 32, 50, 50, "NCHW", "asymmetric", method="bilinear") - verify_resize(4, 16, 32, 32, 50, 50, "NHWC", "asymmetric", method="bilinear") + for method in ["nearest_neighbor", "bilinear"]: + for coord_trans in ["asymmetric", "half_pixel", "align_corners"]: + for layout in ["NCHW", "NHWC"]: + # TODO: When topi test has an option for align corners and nearest neighbor that + # produces correct results, re-enable it. + if coord_trans == "align_corners" and method == "nearest_neighbor": + continue + verify_resize(4, 16, 32, 32, 50, 50, layout, coord_trans, method=method) def verify_resize3d(