[PyOV] Extend Python API with `Col2Im-15` (#24569)

### Details:
 - Add Python API for `Col2Im-15`
- Requires https://github.com/openvinotoolkit/openvino/pull/24548 to
work and pass CI

### Tickets:
 - CVS-138920

### Related PRs:
- https://github.com/openvinotoolkit/openvino/pull/24548
- https://github.com/openvinotoolkit/openvino/pull/24197
- https://github.com/openvinotoolkit/openvino/pull/23947

---------

Co-authored-by: Michal Lukaszewski <michal.lukaszewski@intel.com>
This commit is contained in:
Przemyslaw Wysocki 2024-05-23 09:51:22 +02:00 committed by GitHub
parent 3bbb35cea6
commit c4f33cec55
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 73 additions and 1 deletions

View File

@ -6,4 +6,5 @@
# TODO (ticket 138273): Add previous opset operators at the end of opset15 development
from openvino.runtime.opset1.ops import parameter
from openvino.runtime.opset15.ops import col2im
from openvino.runtime.opset15.ops import scatter_nd_update

View File

@ -4,7 +4,7 @@
"""Factory functions for ops added to openvino opset15."""
from functools import partial
from typing import Optional, Literal
from typing import Optional, Literal, List
from openvino.runtime import Node, Type
from openvino.runtime.opset_utils import _get_node_factory
@ -39,3 +39,47 @@ def scatter_nd_update(
if reduction:
attributes["reduction"] = reduction
return _get_node_factory_opset15().create("ScatterNDUpdate", inputs, attributes)
@nameable_op
def col2im(
data: NodeInput,
output_size: NodeInput,
kernel_size: NodeInput,
strides: Optional[List[int]] = None,
dilations: Optional[List[int]] = None,
pads_begin: Optional[List[int]] = None,
pads_end: Optional[List[int]] = None,
name: Optional[str] = None,
) -> Node:
"""Perform data movement operation which combines sliding blocks into an image tensor.
:param data: The node providing input data.
:param output_size: Shape of the spatial dimensions of the output image.
:param kernel_size: Size of the sliding blocks.
:param strides: Stride on the sliding blocks in the input spatial dimensions. Defaults to [1, 1].
:param dilations: The dilation of filter elements (distance between elements). Defaults to [1, 1].
:param pads_begin: The number of pixels added at the beginning along each axis. Defaults to [0, 0].
:param pads_end: The number of pixels added at the end along each axis. Defaults to [0, 0].
:param name: The optional name for the created output node.
:return: The new node performing Col2Im operation.
"""
if strides is None:
strides = [1, 1]
if dilations is None:
dilations = [1, 1]
if pads_begin is None:
pads_begin = [0, 0]
if pads_end is None:
pads_end = [0, 0]
return _get_node_factory_opset15().create(
"Col2Im",
as_nodes(data, output_size, kernel_size, name=name),
{
"strides": strides,
"dilations": dilations,
"pads_begin": pads_begin,
"pads_end": pads_end,
},
)

View File

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2018-2024 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
from openvino import Type
import openvino.runtime.opset15 as ov
import numpy as np
import pytest
@pytest.mark.parametrize(("input_shape", "output_size", "kernel_size", "expected_shape", "params"), [
((3, 4), [2, 2], [1, 1], [3, 2, 2], []),
((3, 4), [2, 2], [1, 1], [3, 2, 2], [[1, 1], [1, 1], [0, 0], [0, 0]]),
((12, 25), [4, 4], [2, 2], [3, 4, 4], [[2, 2], [1, 1], [3, 3], [3, 3]]),
((2, 8, 8), [5, 5], [2, 2], [2, 2, 5, 5], [[2, 2], [1, 1], [0, 2], [0, 2]]),
((2, 32, 12), [6, 6], [4, 4], [2, 2, 6, 6], [[2, 2], [2, 2], [4, 3], [4, 3]]),
])
def test_col2im(input_shape, output_size, kernel_size, expected_shape, params):
input_data = ov.parameter(input_shape, name="input_data", dtype=np.float32)
output_size = np.array(output_size, np.int32)
kernel_size = np.array(kernel_size, np.int32)
node = ov.col2im(input_data, output_size, kernel_size, *params)
assert node.get_type_name() == "Col2Im"
assert node.get_output_size() == 1
assert list(node.get_output_shape(0)) == expected_shape
assert node.get_output_element_type(0) == Type.f32