[Python API] Deprecate IENetLayer class (#1731)
authorAnastasia Kuporosova <anastasia.kuporosova@intel.com>
Mon, 17 Aug 2020 09:41:54 +0000 (12:41 +0300)
committerGitHub <noreply@github.com>
Mon, 17 Aug 2020 09:41:54 +0000 (12:41 +0300)
* [Python API] Deprecate IENetLayer class

* update samples

* undo changes in samples

inference-engine/ie_bridges/python/src/openvino/inference_engine/ie_api.pyx
inference-engine/ie_bridges/python/tests/test_DataPtr.py
inference-engine/ie_bridges/python/tests/test_IECore.py
inference-engine/ie_bridges/python/tests/test_IENetLayer.py
inference-engine/ie_bridges/python/tests/test_IENetwork.py
inference-engine/ie_bridges/python/tests/test_NGraph.py

index 8c1ab61..9260ed7 100644 (file)
@@ -1261,6 +1261,10 @@ cdef class InferRequest:
 
 
 ## This class represents a main layer information and providing setters allowing to modify layer properties
+#
+#  \note This class is deprecated: for working with layers, please, use nGraph Python API.
+#        This class is going to be removed in 2021.2
+#
 cdef class IENetLayer:
     ## Name of the layer
     @property
@@ -1272,22 +1276,6 @@ cdef class IENetLayer:
     def type(self):
         return deref(self._ptr).type.decode()
 
-    ## \note This property is deprecated.
-    #  Please, use out_data property to access DataPtr objects for all output ports, which contains full
-    #  information about layer's output data including precision.
-    #
-    #  Layer base operating precision. Provides getter and setter interfaces.
-    @property
-    def precision(self):
-        warnings.warn("precision property of IENetLayer is deprecated. "
-                      "Please instead use precision property of DataPtr objects "
-                      "returned by out_data property",
-                      DeprecationWarning)
-        return deref(self._ptr).precision.name().decode()
-
-    @precision.setter
-    def precision(self, precision: str):
-        deref(self._ptr).precision = C.Precision.FromStr(precision.encode())
 
     ## Layer affinity set by user or a default affinity may be setted using `IECore.query_network() method`
     #  which returns dictionary {layer_name : device}.
@@ -1342,35 +1330,6 @@ cdef class IENetLayer:
             for layer in _l_ptr_map:
                 input_to_list.append(deref(layer.second).name.decode())
         return input_to_list
-    ## \note This property is deprecated.
-    # Please, use out_data property to access DataPtr objects for all output ports, which contains full
-    # information about layer's output data including layout
-    #
-    # Returns the layout of the layer output data on 1st port
-    @property
-    def layout(self):
-        warnings.warn("layout property of IENetLayer is deprecated. "
-                      "Please instead use shape property of DataPtr objects "
-                      "returned by in_data or out_data property to access shape of input or output data "
-                      "on corresponding ports",
-                      DeprecationWarning)
-        cdef C.DataPtr c_input = deref(self._ptr).outData[0]
-        return layout_int_to_str_map[deref(c_input).getLayout()]
-
-    ## \note This property is deprecated.
-    # Please, use out_data property to access DataPtr objects for all output ports, which contains full
-    # information about layer's output data including shape
-    #
-    # Return the list of dimension of the layer output data on 1st port
-    @property
-    def shape(self):
-        warnings.warn("shape property of IENetLayer is deprecated. "
-                      "Please use shape property of DataPtr instead objects "
-                      "returned by in_data or out_data property to access shape of input or output data "
-                      "on corresponding ports",
-                      DeprecationWarning)
-        cdef C.DataPtr c_input = deref(self._ptr).outData[0]
-        return deref(c_input).getDims()
 
     ## Returns a list of DataPtr objects representing the output data of the layer on corresponding port
     @property
@@ -1411,17 +1370,6 @@ cdef class IENetLayer:
             blobs_map[blob.first.decode()] = weights_buffer.to_numpy()
         return blobs_map
 
-    ## \note This property is deprecated.
-    #  Please use blobs property instead.
-    #
-    #  Dictionary with layer weights, biases or custom blobs if any
-    @property
-    def weights(self):
-        warnings.warn("weights property of IENetLayer is deprecated. "
-                      "Please use blobs property instead.",
-                      DeprecationWarning)
-        return self.blobs
-
 
 ## This class contains the information about the network model read from IR and allows you to manipulate with
 #  some model parameters such as layers affinity and output layers.
@@ -1564,10 +1512,18 @@ cdef class IENetwork:
             raise AttributeError("Invalid batch size {}! Batch size should be positive integer value".format(batch))
         self.impl.setBatch(batch)
 
-    ## Return dictionary that maps network layer names in topological order to IENetLayer
+    ## \note The property is deprecated. Please use get_ops()/get_ordered_ops() methods
+    #  from nGraph Python API.
+    #  This property will be removed in 2021.2.
+    #
+    #  Return dictionary that maps network layer names in topological order to IENetLayer
     #  objects containing layer properties
     @property
     def layers(self):
+        warnings.warn("'layers' property of IENetwork class is deprecated. "
+              "For iteration over network please use get_ops()/get_ordered_ops() methods "
+              "from nGraph Python API",
+              DeprecationWarning)
         cdef vector[C.CNNLayerPtr] c_layers = self.impl.getLayers()
         layers = OrderedDict()
         cdef IENetLayer net_l
index 1536298..71a4dc1 100644 (file)
@@ -1,4 +1,5 @@
 import pytest
+import warnings
 
 from openvino.inference_engine import IECore, IENetLayer, DataPtr
 from conftest import model_path
@@ -13,41 +14,63 @@ def layer_out_data():
     return net.layers['19/Fused_Add_'].out_data[0]
 
 
-def test_name():
+def test_name(recwarn):
+    warnings.simplefilter("always")
     assert layer_out_data().name == "19/Fused_Add_", "Incorrect name for layer '19/Fused_Add_'"
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_precision():
+def test_precision(recwarn):
+    warnings.simplefilter("always")
     assert layer_out_data().precision == "FP32", "Incorrect precision for layer '19/Fused_Add_'"
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_precision_setter():
+def test_precision_setter(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     net.layers['19/Fused_Add_'].out_data[0].precision = "I8"
     assert net.layers['19/Fused_Add_'].out_data[0].precision == "I8", "Incorrect precision for layer '19/Fused_Add_'"
+    assert len(recwarn) == 2
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_incorrect_precision_setter():
+def test_incorrect_precision_setter(recwarn):
+    warnings.simplefilter("always")
     with pytest.raises(ValueError) as e:
         layer_out_data().precision = "123"
     assert "Unsupported precision 123! List of supported precisions:" in str(e.value)
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_layout():
+def test_layout(recwarn):
+    warnings.simplefilter("always")
     assert layer_out_data().layout == "NCHW", "Incorrect layout for layer '19/Fused_Add_'"
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_initialized():
+def test_initialized(recwarn):
+    warnings.simplefilter("always")
     assert layer_out_data().initialized, "Incorrect value for initialized property for layer '19/Fused_Add_'"
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_input_to():
+def test_input_to(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     input_to = net.layers['26'].out_data[0].input_to
     assert len(input_to) == 1
     assert input_to[0].name == '27'
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
+
 
 def test_input_to_via_input_info():
     ie = IECore()
@@ -58,7 +81,9 @@ def test_input_to_via_input_info():
     assert len(input_to) == 1
     assert input_to[0].name == '19/Fused_Add_'
 
-def test_input_to_via_inputs():
+
+def test_input_to_via_inputs(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     inputs = net.inputs
@@ -66,6 +91,9 @@ def test_input_to_via_inputs():
     input_to = inputs['data'].input_to
     assert len(input_to) == 1
     assert input_to[0].name == '19/Fused_Add_'
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
+
 
 def test_creator_layer():
     ie = IECore()
@@ -75,4 +103,4 @@ def test_creator_layer():
     creator_layer = outputs['fc_out'].creator_layer
     params = creator_layer.params
     params['originalLayersNames'] == 'fc_out'
-    params['axis'] == '1'
\ No newline at end of file
+    params['axis'] == '1'
index 577d647..81781d0 100644 (file)
@@ -52,12 +52,14 @@ def test_load_network_wrong_device():
 
 
 @pytest.mark.skip(reason="IENetwork.layers return not all layers in case of ngraph representation due to inner conversion into legacy representation")
-def test_query_network(device):
+def test_query_network(device, recwarn):
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     query_res = ie.query_network(net, device)
     assert net.layers.keys() == query_res.keys(), "Not all network layers present in query_network results"
     assert next(iter(set(query_res.values()))) == device, "Wrong device for some layers"
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
 
 
 @pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "CPU", reason="Device independent test")
@@ -203,7 +205,7 @@ def test_read_net_from_buffer():
     assert isinstance(net, IENetwork)
 
 
-def test_net_from_buffer_valid():
+def test_net_from_buffer_valid(recwarn):
     ie = IECore()
     with open(test_net_bin, 'rb') as f:
         bin = f.read()
@@ -215,3 +217,5 @@ def test_net_from_buffer_valid():
         for blob, data in layer.blobs.items():
             assert np.allclose(data, net2.layers[name].blobs[blob]), \
                 "Incorrect weights for layer {} and blob {}".format(name, blob)
+    assert len(recwarn) == 2
+    assert recwarn.pop(DeprecationWarning)
index 9ffa0b6..ea54245 100644 (file)
@@ -8,81 +8,69 @@ from conftest import model_path
 test_net_xml, test_net_bin = model_path()
 
 
-def test_name():
-    ie = IECore()
-    net = ie.read_network(model=test_net_xml, weights=test_net_bin)
-    assert net.layers['27'].name == "27"
-
-
-def test_type():
-    ie = IECore()
-    net = ie.read_network(model=test_net_xml, weights=test_net_bin)
-    assert net.layers['27'].type == "Pooling"
-
-
-def test_precision_getter(recwarn):
+def test_name(recwarn):
     warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
-    assert net.layers['27'].precision == "FP32"
+    assert net.layers['27'].name == "27"
     assert len(recwarn) == 1
     assert recwarn.pop(DeprecationWarning)
 
 
-def test_precision_setter(recwarn):
+def test_type(recwarn):
     warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
-    net.layers['27'].precision = "I8"
-    assert net.layers['27'].precision == "I8"
+    assert net.layers['27'].type == "Pooling"
     assert len(recwarn) == 1
     assert recwarn.pop(DeprecationWarning)
 
 
-def test_affinity_getter():
+def test_affinity_getter(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     assert net.layers['27'].affinity == ""
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_affinity_setter():
+def test_affinity_setter(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     net.layers['27'].affinity = "CPU"
     assert net.layers['27'].affinity == "CPU"
+    assert len(recwarn) == 2
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_blobs():
+def test_blobs(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     assert isinstance(net.layers['19/Fused_Add_'].blobs["biases"], numpy.ndarray)
     assert isinstance(net.layers['19/Fused_Add_'].blobs["weights"], numpy.ndarray)
     assert net.layers['19/Fused_Add_'].blobs["biases"].size != 0
     assert net.layers['19/Fused_Add_'].blobs["weights"].size != 0
-
-
-def test_weights(recwarn):
-    warnings.simplefilter("always")
-    ie = IECore()
-    net = ie.read_network(model=test_net_xml, weights=test_net_bin)
-    assert isinstance(net.layers['19/Fused_Add_'].weights["biases"], numpy.ndarray)
-    assert isinstance(net.layers['19/Fused_Add_'].weights["weights"], numpy.ndarray)
-    assert net.layers['19/Fused_Add_'].weights["biases"].size != 0
-    assert net.layers['19/Fused_Add_'].weights["weights"].size != 0
     assert len(recwarn) == 4
     assert recwarn.pop(DeprecationWarning)
 
 
-def test_params_getter():
+def test_params_getter(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     assert net.layers['27'].params == {"kernel" : "2,2", "pads_begin" : "0,0",
                                        "pads_end" : "0,0", "rounding_type" : "floor",
                                        "strides" : "2,2", "pool-method" : "max",
                                        "originalLayersNames" : "27"}
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_params_setter():
+def test_params_setter(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     params = net.layers['27'].params
@@ -92,45 +80,45 @@ def test_params_setter():
                                        "pads_end" : "0,0", "rounding_type" : "floor",
                                        "strides" : "2,2", "pool-method" : "max",
                                        "originalLayersNames" : "27", 'PrimitivesPriority': 'cpu:ref_any'}
+    assert len(recwarn) == 3
+    assert recwarn.pop(DeprecationWarning)
+
 
-def test_layout(recwarn):
+def test_out_data(recwarn):
     warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
-    assert net.layers['27'].layout == 'NCHW'
+    assert isinstance(net.layers['27'].out_data[0], DataPtr)
     assert len(recwarn) == 1
     assert recwarn.pop(DeprecationWarning)
 
 
-def test_shape(recwarn):
+def test_in_data(recwarn):
     warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
-    assert net.layers['27'].shape == [1, 64, 9, 9]
+    assert isinstance(net.layers['27'].in_data[0], DataPtr)
     assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
 
 
-def test_out_data():
-    ie = IECore()
-    net = ie.read_network(model=test_net_xml, weights=test_net_bin)
-    assert isinstance(net.layers['27'].out_data[0], DataPtr)
-
-
-def test_in_data():
-    ie = IECore()
-    net = ie.read_network(model=test_net_xml, weights=test_net_bin)
-    assert isinstance(net.layers['27'].in_data[0], DataPtr)
-
-def test_parents():
+def test_parents(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     parents = net.layers['27'].parents
     assert len(parents) == 1
     assert(parents[0] == '26')
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
+
 
-def test_children():
+def test_children(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     children = net.layers['26'].children
     assert len(children) == 1
-    assert(children[0] == '27')
\ No newline at end of file
+    assert(children[0] == '27')
+    assert len(recwarn) == 1
+    assert recwarn.pop(DeprecationWarning)
index 49ed978..29175e5 100644 (file)
@@ -181,17 +181,21 @@ def test_batch_size_after_reshape():
     assert net.input_info['data'].input_data.shape == [8, 3, 32, 32]
 
 
-def test_layers():
+def test_layers(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     layers_name = [key for key in net.layers]
     assert sorted(layers_name) == ['19/Fused_Add_', '21', '22', '23', '24/Fused_Add_',
                                    '26', '27', '29', 'data', 'fc_out']
     assert isinstance(net.layers['19/Fused_Add_'], IENetLayer)
+    assert len(recwarn) == 2
+    assert recwarn.pop(DeprecationWarning)
 
 
 @pytest.mark.skip(reason="Test is failed due-to ngraph conversion")
-def test_serialize():
+def test_serialize(recwarn):
+    warnings.simplefilter("always")
     ie = IECore()
     net = ie.read_network(model=test_net_xml, weights=test_net_bin)
     net.serialize("./serialized_net.xml", "./serialized_net.bin")
@@ -199,6 +203,8 @@ def test_serialize():
     assert net.layers.keys() == serialized_net.layers.keys()
     os.remove("./serialized_net.xml")
     os.remove("./serialized_net.bin")
+    assert len(recwarn) == 2
+    assert recwarn.pop(DeprecationWarning)
 
 
 def test_reshape():
@@ -233,11 +239,7 @@ def test_net_from_buffer_valid_deprecated():
             for blob, data in l.blobs.items():
                 assert np.allclose(data, net2.layers[name].blobs[blob]), \
                     "Incorrect weights for layer {} and blob {}".format(name, blob)
-        assert len(w) == 2
-        for warns in w:
-            assert issubclass(warns.category, DeprecationWarning)
-            assert "Reading network using constructor is deprecated. " \
-                   "Please, use IECore.read_network() method instead" in str(warns.message)
+        assert len(w) == 11
 
 
 def test_multi_out_data():
index 9de972d..4987a54 100644 (file)
@@ -1,4 +1,4 @@
-from openvino.inference_engine import IENetwork
+from openvino.inference_engine import IECore, IENetwork
 
 try:
     import ngraph as ng
@@ -8,13 +8,18 @@ try:
 except:
     ngraph_available=False
 
-import numpy as np
 import pytest
 
+from conftest import model_path
+
+
+test_net_xml, test_net_bin = model_path()
+
 if not ngraph_available:
     pytest.skip("NGraph is not installed, skip", allow_module_level=True)
 
-def test_CreateIENetworkFromNGraph():
+
+def test_create_IENetwork_from_nGraph():
     element_type = Type.f32
     param = Parameter(element_type, Shape([1, 3, 22, 22]))
     relu = ng.relu(param)
@@ -22,10 +27,12 @@ def test_CreateIENetworkFromNGraph():
     caps = Function.to_capsule(func)
     cnnNetwork = IENetwork(caps)
     assert cnnNetwork != None
-    assert ng.function_from_cnn(cnnNetwork) != None
-    assert len(cnnNetwork.layers) == 2
+    func2 = ng.function_from_cnn(cnnNetwork)
+    assert func2 != None
+    assert len(func2.get_ops()) == 3
+
 
-def test_GetIENetworkFromNGraph():
+def test_get_IENetwork_from_nGraph():
     element_type = Type.f32
     param = Parameter(element_type, Shape([1, 3, 22, 22]))
     relu = ng.relu(param)
@@ -36,3 +43,18 @@ def test_GetIENetworkFromNGraph():
     assert ng.function_from_cnn(cnnNetwork) != None
     func2 = ng.function_from_cnn(cnnNetwork)
     assert func2 != None
+
+
+def test_get_ops_from_IENetwork():
+    ie = IECore()
+    net = ie.read_network(model=test_net_xml, weights=test_net_bin)
+    func = ng.function_from_cnn(net)
+    ops = func.get_ordered_ops()
+    ops_names = [op.friendly_name for op in ops]
+    assert ops_names == ['data', '20/mean/Fused_Mul_614616_const', '19/WithoutBiases', 'data_add_575/copy_const',
+                         '19/Fused_Add_', '21', '22', 'onnx_initializer_node_8/Output_0/Data__const',
+                         '23/WithoutBiases', '23/Dims357/copy_const', '23', '25/mean/Fused_Mul_618620_const',
+                         '24/WithoutBiases', 'data_add_578583/copy_const', '24/Fused_Add_', '26', '27',
+                         '28/Reshape/Cast_1955_const', '28/Reshape', 'onnx_initializer_node_17/Output_0/Data__const',
+                         '29/WithoutBiases', 'onnx_initializer_node_18/Output_0/Data_/copy_const', '29', 'fc_out',
+                         'fc_out/sink_port_0']