Files
openvino/ngraph/python/tests/test_ngraph/test_dyn_attributes.py
Mateusz Tabaka 47485646bb Revise DetectionOutput reference implementation (#3448)
* Revice DetectionOutput reference implementation

Ticket: 37433

* fix test_create_op

* fix test_dyn_attributes

* apply code format

* fix crash on Windows when variance_encoded_in_target == 1

* add more checks for DetectionOutput inputs

* Fix single layer tests

* apply code format

* fix ssd_vgg16_300 inference with batch size > 1

* update types in docs

* fix crash on windows

* apply code style

* fix python tests

* fix setting output type

* change False to false and True to true in docs

* Allow prior boxes to have different type than box logits

Some models work that way

* simplify output shape calculation

* fixes to docs
2020-12-16 11:02:12 +03:00

240 lines
8.8 KiB
Python

# ******************************************************************************
# Copyright 2017-2020 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ******************************************************************************
import numpy as np
import pytest
import ngraph as ng
@pytest.fixture()
def _proposal_node():
attributes = {
"base_size": np.uint16(1),
"pre_nms_topn": np.uint16(20),
"post_nms_topn": np.uint16(64),
"nms_thresh": np.float64(0.34),
"feat_stride": np.uint16(16),
"min_size": np.uint16(32),
"ratio": np.array([0.1, 1.5, 2.0, 2.5], dtype=np.float64),
"scale": np.array([2, 3, 3, 4], dtype=np.float64),
}
batch_size = 7
class_probs = ng.parameter([batch_size, 12, 34, 62], np.float64, "class_probs")
bbox_deltas = ng.parameter([batch_size, 24, 34, 62], np.float64, "bbox_deltas")
image_shape = ng.parameter([3], np.float64, "image_shape")
return ng.proposal(class_probs, bbox_deltas, image_shape, attributes)
def test_dynamic_attributes_softmax():
axis = 2
data = ng.parameter([1, 2, 3, 4], np.float32, "data_in")
node = ng.softmax(data, axis)
assert node.get_axis() == axis
node.set_axis(3)
assert node.get_axis() == 3
@pytest.mark.parametrize(
"int_dtype, fp_dtype",
[
(np.int8, np.float32),
(np.int16, np.float32),
(np.int32, np.float32),
(np.int64, np.float32),
(np.uint8, np.float32),
(np.uint16, np.float32),
(np.uint32, np.float32),
(np.uint64, np.float32),
(np.int32, np.float16),
(np.int32, np.float64),
],
)
def test_dynamic_get_attribute_value(int_dtype, fp_dtype):
attributes = {
"num_classes": int_dtype(85),
"background_label_id": int_dtype(13),
"top_k": int_dtype(16),
"variance_encoded_in_target": True,
"keep_top_k": np.array([64, 32, 16, 8], dtype=int_dtype),
"code_type": "caffe.PriorBoxParameter.CENTER_SIZE",
"share_location": False,
"nms_threshold": fp_dtype(0.645),
"confidence_threshold": fp_dtype(0.111),
"clip_after_nms": True,
"clip_before_nms": False,
"decrease_label_id": True,
"normalized": True,
"input_height": int_dtype(86),
"input_width": int_dtype(79),
"objectness_score": fp_dtype(0.77),
}
box_logits = ng.parameter([4, 680], fp_dtype, "box_logits")
class_preds = ng.parameter([4, 170], fp_dtype, "class_preds")
proposals = ng.parameter([4, 1, 8], fp_dtype, "proposals")
aux_class_preds = ng.parameter([4, 4], fp_dtype, "aux_class_preds")
aux_box_preds = ng.parameter([4, 680], fp_dtype, "aux_box_preds")
node = ng.detection_output(box_logits, class_preds, proposals, attributes, aux_class_preds, aux_box_preds)
assert node.get_num_classes() == int_dtype(85)
assert node.get_background_label_id() == int_dtype(13)
assert node.get_top_k() == int_dtype(16)
assert node.get_variance_encoded_in_target()
assert np.all(np.equal(node.get_keep_top_k(), np.array([64, 32, 16, 8], dtype=int_dtype)))
assert node.get_code_type() == "caffe.PriorBoxParameter.CENTER_SIZE"
assert not node.get_share_location()
assert np.isclose(node.get_nms_threshold(), fp_dtype(0.645))
assert np.isclose(node.get_confidence_threshold(), fp_dtype(0.111))
assert node.get_clip_after_nms()
assert not node.get_clip_before_nms()
assert node.get_decrease_label_id()
assert node.get_normalized()
assert node.get_input_height() == int_dtype(86)
assert node.get_input_width() == int_dtype(79)
assert np.isclose(node.get_objectness_score(), fp_dtype(0.77))
assert node.get_num_classes() == int_dtype(85)
@pytest.mark.parametrize(
"int_dtype, fp_dtype",
[
(np.uint8, np.float32),
(np.uint16, np.float32),
(np.uint32, np.float32),
(np.uint64, np.float32),
(np.uint32, np.float16),
(np.uint32, np.float64),
],
)
def test_dynamic_set_attribute_value(int_dtype, fp_dtype):
attributes = {
"base_size": int_dtype(1),
"pre_nms_topn": int_dtype(20),
"post_nms_topn": int_dtype(64),
"nms_thresh": fp_dtype(0.34),
"feat_stride": int_dtype(16),
"min_size": int_dtype(32),
"ratio": np.array([0.1, 1.5, 2.0, 2.5], dtype=fp_dtype),
"scale": np.array([2, 3, 3, 4], dtype=fp_dtype),
}
batch_size = 7
class_probs = ng.parameter([batch_size, 12, 34, 62], fp_dtype, "class_probs")
bbox_deltas = ng.parameter([batch_size, 24, 34, 62], fp_dtype, "bbox_deltas")
image_shape = ng.parameter([3], fp_dtype, "image_shape")
node = ng.proposal(class_probs, bbox_deltas, image_shape, attributes)
node.set_base_size(int_dtype(15))
node.set_pre_nms_topn(int_dtype(7))
node.set_post_nms_topn(int_dtype(33))
node.set_nms_thresh(fp_dtype(1.55))
node.set_feat_stride(int_dtype(8))
node.set_min_size(int_dtype(123))
node.set_ratio(np.array([1.1, 2.5, 3.0, 4.5], dtype=fp_dtype))
node.set_scale(np.array([2.1, 3.2, 3.3, 4.4], dtype=fp_dtype))
node.set_clip_before_nms(True)
node.set_clip_after_nms(True)
node.set_normalize(True)
node.set_box_size_scale(fp_dtype(1.34))
node.set_box_coordinate_scale(fp_dtype(0.88))
node.set_framework("OpenVINO")
assert node.get_base_size() == int_dtype(15)
assert node.get_pre_nms_topn() == int_dtype(7)
assert node.get_post_nms_topn() == int_dtype(33)
assert np.isclose(node.get_nms_thresh(), fp_dtype(1.55))
assert node.get_feat_stride() == int_dtype(8)
assert node.get_min_size() == int_dtype(123)
assert np.allclose(node.get_ratio(), np.array([1.1, 2.5, 3.0, 4.5], dtype=fp_dtype))
assert np.allclose(node.get_scale(), np.array([2.1, 3.2, 3.3, 4.4], dtype=fp_dtype))
assert node.get_clip_before_nms()
assert node.get_clip_after_nms()
assert node.get_normalize()
assert np.isclose(node.get_box_size_scale(), fp_dtype(1.34))
assert np.isclose(node.get_box_coordinate_scale(), fp_dtype(0.88))
assert node.get_framework() == "OpenVINO"
def test_dynamic_attr_cache(_proposal_node):
node = _proposal_node
assert not node._attr_cache_valid
node.set_nms_thresh(1.3453678102)
assert not node._attr_cache_valid
assert np.isclose(node.get_nms_thresh(), np.float64(1.3453678102))
assert node._attr_cache_valid
def test_dynamic_attr_transitivity(_proposal_node):
node = _proposal_node
node2 = node
node.set_ratio(np.array([1.1, 2.5, 3.0, 4.5], dtype=np.float64))
assert np.allclose(node.get_ratio(), np.array([1.1, 2.5, 3.0, 4.5], dtype=np.float64))
assert np.allclose(node2.get_ratio(), np.array([1.1, 2.5, 3.0, 4.5], dtype=np.float64))
node2.set_scale(np.array([2.1, 3.2, 3.3, 4.4], dtype=np.float64))
assert np.allclose(node2.get_scale(), np.array([2.1, 3.2, 3.3, 4.4], dtype=np.float64))
assert np.allclose(node.get_scale(), np.array([2.1, 3.2, 3.3, 4.4], dtype=np.float64))
def test_dynamic_attributes_simple():
batch_size = 1
input_size = 16
hidden_size = 128
X_shape = [batch_size, input_size]
H_t_shape = [batch_size, hidden_size]
W_shape = [3 * hidden_size, input_size]
R_shape = [3 * hidden_size, hidden_size]
B_shape = [4 * hidden_size]
parameter_X = ng.parameter(X_shape, name="X", dtype=np.float32)
parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=np.float32)
parameter_W = ng.parameter(W_shape, name="W", dtype=np.float32)
parameter_R = ng.parameter(R_shape, name="R", dtype=np.float32)
parameter_B = ng.parameter(B_shape, name="B", dtype=np.float32)
activations = ["tanh", "relu"]
activations_alpha = [1.0, 2.0]
activations_beta = [1.0, 2.0]
clip = 0.5
linear_before_reset = True
node = ng.gru_cell(
parameter_X,
parameter_H_t,
parameter_W,
parameter_R,
parameter_B,
hidden_size,
activations,
activations_alpha,
activations_beta,
clip,
linear_before_reset,
)
assert node.get_hidden_size() == hidden_size
assert all(map(lambda x, y: x == y, node.get_activations(), activations))
assert all(np.equal(node.get_activations_alpha(), activations_alpha))
assert all(np.equal(node.get_activations_beta(), activations_beta))
assert node.get_linear_before_reset() == linear_before_reset
assert np.isclose(node.get_clip(), clip)