From 034b3d4cf912fab82f02b0d8d475cd588bfa33ba Mon Sep 17 00:00:00 2001 From: "Kazantsev, Roman" Date: Sun, 12 May 2024 15:44:54 +0400 Subject: [PATCH 1/4] [TF FE] Support TF Hub openimages-v4-ssd-mobilenet-v2 model Signed-off-by: Kazantsev, Roman --- src/frontends/tensorflow/src/input_model.cpp | 14 ++++++++++++-- .../tensorflow/model_lists/precommit_read_model | 4 +++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/frontends/tensorflow/src/input_model.cpp b/src/frontends/tensorflow/src/input_model.cpp index cd64c466dec1b3..14474eec64125a 100644 --- a/src/frontends/tensorflow/src/input_model.cpp +++ b/src/frontends/tensorflow/src/input_model.cpp @@ -376,11 +376,12 @@ std::vector> InputModel::InputModelTFImpl::topologicall ops_to_do.push(output_operation_place); } - // walk through all NextIteration nodes and put their producers into ops_to_do - // this is needed to avoid missed nodes in the body graph of TF1 While operation for (const auto& op_place : m_op_places) { auto op_decoder = op_place->get_decoder(); + auto op_name = op_decoder->get_op_name(); if (op_decoder->get_op_type() == "NextIteration") { + // walk through all NextIteration nodes and put their producers into ops_to_do + // this is needed to avoid missed nodes in the body graph of TF1 While operation std::string producer_name; std::string producer_output_port_name; size_t producer_output_port_idx; @@ -390,6 +391,15 @@ std::vector> InputModel::InputModelTFImpl::topologicall "NextIteration is not found among operation places " + producer_name); ops_to_do.push(m_op_places_map.at(producer_name)); + } else if (op_decoder->get_op_type() == "LookupTableImport" || + op_decoder->get_op_type() == "LookupTableImportV2") { + // all LookupTableImport nodes must be preserved in a graph for conversion because + // they can be terminating nodes and contain input values for HashTable initialization + FRONT_END_GENERAL_CHECK(m_op_places_map.count(op_name), + "[TensorFlow Frontend] internal error or inconsistent model: LookupTableImport " + "operation is not found among operation places " + + op_name); + ops_to_do.push(m_op_places_map.at(op_name)); } } diff --git a/tests/model_hub_tests/tensorflow/model_lists/precommit_read_model b/tests/model_hub_tests/tensorflow/model_lists/precommit_read_model index 8e24ef1cbd8833..2a40914e660d84 100644 --- a/tests/model_hub_tests/tensorflow/model_lists/precommit_read_model +++ b/tests/model_hub_tests/tensorflow/model_lists/precommit_read_model @@ -4,4 +4,6 @@ mil-nce/s3d,https://www.kaggle.com/models/deepmind/mil-nce/frameworks/tensorFlow yamnet,https://www.kaggle.com/models/google/yamnet/frameworks/tensorFlow2/variations/yamnet/versions/1 universal-sentence-encoder-multilingual,https://www.kaggle.com/models/google/universal-sentence-encoder/frameworks/tensorFlow2/variations/multilingual/versions/2 movenet/singlepose/lightning,https://www.kaggle.com/models/google/movenet/frameworks/tensorFlow2/variations/singlepose-lightning/versions/4 -imagenet/resnet_v2_50/feature_vector,https://www.kaggle.com/models/google/resnet-v2/frameworks/tensorFlow2/variations/50-feature-vector/versions/2 \ No newline at end of file +imagenet/resnet_v2_50/feature_vector,https://www.kaggle.com/models/google/resnet-v2/frameworks/tensorFlow2/variations/50-feature-vector/versions/2 +# LookupTableImportV2 is terminating node and is needed for conversion +openimages_v4/ssd/mobilenet_v2,https://www.kaggle.com/models/google/mobilenet-v2/frameworks/tensorFlow1/variations/openimages-v4-ssd-mobilenet-v2/versions/1 \ No newline at end of file From b364567caacba71afea6755941693b15c9c9d7d1 Mon Sep 17 00:00:00 2001 From: "Kazantsev, Roman" Date: Sun, 12 May 2024 17:53:04 +0400 Subject: [PATCH 2/4] Add comparation logic for string, boolean and object types Signed-off-by: Kazantsev, Roman --- .../model_hub_tests/models_hub_common/utils.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/model_hub_tests/models_hub_common/utils.py b/tests/model_hub_tests/models_hub_common/utils.py index 9c5a02207b5729..6cb48f0c2586c0 100644 --- a/tests/model_hub_tests/models_hub_common/utils.py +++ b/tests/model_hub_tests/models_hub_common/utils.py @@ -56,7 +56,22 @@ def get_models_list_not_skipped(model_list_file: str, skip_list_file: str): def compare_two_tensors(ov_res, fw_res, eps): is_ok = True - if not np.allclose(ov_res, fw_res, atol=eps, rtol=eps, equal_nan=True): + if ov_res.dtype.type == str or ov_res.dtype.type == np.str_ or ov_res.dtype.type == np.object_: + ov_res = ov_res.astype('U') + # TF can represent string tensors in different format: array of bytestreams + # so we have to align formats of both string tensors, for example, to unicode + if ov_res.dtype.type != fw_res.dtype.type: + try: + fw_res = fw_res.astype('U') + except: + # ref_array of object type and each element must be utf-8 decoded + utf8_decoded_elems = [elem.decode('UTF-8') for elem in fw_res.flatten()] + fw_res = np.array(utf8_decoded_elems, dtype=str).reshape(fw_res.shape) + is_ok = np.array_equal(ov_res, fw_res) + elif ov_res.dtype == bool: + abs_diff = np.absolute(ov_res ^ fw_res) + is_ok = (abs_diff < eps).all() + elif not np.allclose(ov_res, fw_res, atol=eps, rtol=eps, equal_nan=True): is_ok = False max_diff = np.abs(ov_res.astype(np.float32) - fw_res.astype(np.float32)).max() print("Max diff is {}".format(max_diff)) From 212ac395a6a765d108ebebafd4a94d11a57a117e Mon Sep 17 00:00:00 2001 From: "Kazantsev, Roman" Date: Sun, 12 May 2024 18:03:02 +0400 Subject: [PATCH 3/4] Fix comparison for boolean type Signed-off-by: Kazantsev, Roman --- tests/model_hub_tests/models_hub_common/utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/model_hub_tests/models_hub_common/utils.py b/tests/model_hub_tests/models_hub_common/utils.py index 6cb48f0c2586c0..727b68dd0274d8 100644 --- a/tests/model_hub_tests/models_hub_common/utils.py +++ b/tests/model_hub_tests/models_hub_common/utils.py @@ -69,8 +69,7 @@ def compare_two_tensors(ov_res, fw_res, eps): fw_res = np.array(utf8_decoded_elems, dtype=str).reshape(fw_res.shape) is_ok = np.array_equal(ov_res, fw_res) elif ov_res.dtype == bool: - abs_diff = np.absolute(ov_res ^ fw_res) - is_ok = (abs_diff < eps).all() + is_ok = np.array_equal(ov_res, fw_res) elif not np.allclose(ov_res, fw_res, atol=eps, rtol=eps, equal_nan=True): is_ok = False max_diff = np.abs(ov_res.astype(np.float32) - fw_res.astype(np.float32)).max() From d04d7dbd5b31c346e8ccd044c66b96614357c4e3 Mon Sep 17 00:00:00 2001 From: "Kazantsev, Roman" Date: Sun, 12 May 2024 18:05:46 +0400 Subject: [PATCH 4/4] FIx reporting about success Signed-off-by: Kazantsev, Roman --- tests/model_hub_tests/models_hub_common/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/model_hub_tests/models_hub_common/utils.py b/tests/model_hub_tests/models_hub_common/utils.py index 727b68dd0274d8..d223f3bc984c6e 100644 --- a/tests/model_hub_tests/models_hub_common/utils.py +++ b/tests/model_hub_tests/models_hub_common/utils.py @@ -74,7 +74,8 @@ def compare_two_tensors(ov_res, fw_res, eps): is_ok = False max_diff = np.abs(ov_res.astype(np.float32) - fw_res.astype(np.float32)).max() print("Max diff is {}".format(max_diff)) - else: + + if is_ok: print("Accuracy validation successful!\n") print("absolute eps: {}, relative eps: {}".format(eps, eps)) return is_ok