From f4aefe78cc910b2b88a73eeab4f02ca909925a79 Mon Sep 17 00:00:00 2001 From: Kwanghoon Son Date: Fri, 10 Apr 2020 12:27:38 +0900 Subject: [PATCH 01/16] Add DLDT inference result test add gtest Change-Id: Ie3a25292f0c109277c4ea1c95865a7162d5126ac Signed-off-by: Kwanghoon Son --- test/src/inference_engine_test.cpp | 194 +++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) diff --git a/test/src/inference_engine_test.cpp b/test/src/inference_engine_test.cpp index d93c90d..1352c62 100644 --- a/test/src/inference_engine_test.cpp +++ b/test/src/inference_engine_test.cpp @@ -37,6 +37,7 @@ class InferenceEngineCommonTest : public testing::TestWithParam { }; class InferenceEngineCommonTest_2 : public testing::TestWithParam { }; class InferenceEngineTfliteTest : public testing::TestWithParam { }; class InferenceEngineCaffeTest : public testing::TestWithParam { }; +class InferenceEngineDldtTest : public testing::TestWithParam { }; std::map Model_Formats = { { "caffemodel", INFERENCE_MODEL_CAFFE }, @@ -864,6 +865,192 @@ TEST_P(InferenceEngineCaffeTest, Inference) delete engine; } +TEST_P(InferenceEngineDldtTest, Inference) +{ + std::string backend_name; + int target_devices; + int test_type; + int iteration; + int tensor_type; + std::vector image_paths; + size_t height; + size_t width; + size_t ch; + std::vector input_layers; + std::vector output_layers; + std::vector model_paths; + std::vector answers; + + std::tie(backend_name, target_devices, test_type, iteration, tensor_type, image_paths, height, width, ch, input_layers, output_layers, model_paths, answers) = GetParam(); + + if (iteration < 1) { + iteration = 1; + } + + std::string test_name; + switch (test_type) { + case TEST_IMAGE_CLASSIFICATION: + test_name.append("Image classification"); + break; + case TEST_OBJECT_DETECTION: + test_name.append("Object detection"); + break; + case TEST_FACE_DETECTION: + test_name.append("Face detection"); + break; + case TEST_FACIAL_LANDMARK_DETECTION: + test_name.append("Facial landmark detection"); + break; + case TEST_POSE_ESTIMATION: + test_name.append("Pose estimation"); + break; + } + + std::cout << test_name << " inference test : backend = " << backend_name << ", target device = " << Target_Formats[target_devices] << std::endl; + inference_engine_config config = { + .backend_name = backend_name, + .target_devices = target_devices + }; + + InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + if (engine == nullptr) { + ASSERT_TRUE(engine); + return; + } + + int ret = engine->EnableProfiler(true); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + ret = engine->DumpProfileToFile("profile_data_" + backend_name + "_caffe_model.txt"); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + ret = engine->BindBackend(&config); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + inference_engine_capacity capacity; + ret = engine->GetBackendCapacity(&capacity); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + ret = engine->SetTargetDevices(target_devices); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + std::vector models; + int model_type = GetModelInfo(model_paths, models); + if (model_type == -1) { + delete engine; + ASSERT_NE(model_type, -1); + return; + } + + inference_engine_layer_property input_property; + std::vector::iterator iter; + + for (iter = input_layers.begin(); iter != input_layers.end(); iter++) { + inference_engine_tensor_info tensor_info = { + { 1, ch, height, width }, + (inference_tensor_shape_type_e)TENSOR_SHAPE_NCHW, + (inference_tensor_data_type_e)tensor_type, + (size_t)(1 * ch * height * width) + }; + + input_property.layer_names.push_back(*iter); + input_property.tensor_infos.push_back(tensor_info); + } + + ret = engine->SetInputLayerProperty(input_property); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + inference_engine_layer_property output_property; + + for (iter = output_layers.begin(); iter != output_layers.end(); iter++) { + output_property.layer_names.push_back(*iter); + } + + ret = engine->SetOutputLayerProperty(output_property); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + ret = engine->Load(models, (inference_model_format_e)model_type); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + std::vector inputs, outputs; + ret = PrepareTensorBuffers(engine, inputs, outputs); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + // Copy input image tensor data from a given file to input tensor buffer. + for (int i = 0; i < (int)image_paths.size(); ++i) { + CopyFileToMemory(image_paths[i].c_str(), inputs[i], inputs[i].size); + } + + for (int repeat = 0; repeat < iteration; ++repeat) { + ret = engine->Run(inputs, outputs); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + } + + tensor_t result; + FillOutputResult(engine, outputs, result); + + switch (test_type) { + case TEST_IMAGE_CLASSIFICATION: + ret = VerifyImageClassificationResults(result, answers[0]); + EXPECT_EQ(ret, 1); + break; + case TEST_OBJECT_DETECTION: + // 1024 : fixed height size of dumped image, 636 : fixed width size of dumped image. + ret = VerifyObjectDetectionResults(result, answers, 636, 1024); + EXPECT_EQ(ret, 1); + break; + case TEST_FACE_DETECTION: + // 1152 : fixed height size of dumped image, 1536 : fixed width size of dumped image. + ret = VerifyObjectDetectionResults(result, answers, 1152, 1536); + EXPECT_EQ(ret, 1); + break; + case TEST_FACIAL_LANDMARK_DETECTION: + // 128 : fixed height size of dumped image, 128 : fixed width size of dumped image. + ret = VerifyFacialLandmarkDetectionResults(result, answers, 128, 128); + EXPECT_EQ(ret, 1); + break; + case TEST_POSE_ESTIMATION: + // 563 : fixed height size of dumped image, 750 : fixed width size of dumped image. + ret = VerifyPoseEstimationResults(result, answers, 563, 750); + EXPECT_EQ(ret, 1); + break; + } + + CleanupTensorBuffers(inputs, outputs); + + engine->UnbindBackend(); + models.clear(); + + delete engine; +} INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineCommonTest, testing::Values( // parameter order : backend name, target device @@ -973,4 +1160,11 @@ INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineCaffeTest, { 53, 45, 85, 46, 66, 64, 54, 78, 82, 79}) /* TODO */ ) +); + +INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineDldtTest, + testing::Values( + // DLDT + ParamType_Infer("dldt", INFERENCE_TARGET_CUSTOM, TEST_FACE_DETECTION, 10, TENSOR_DATA_TYPE_FLOAT32, { "/opt/usr/images/dldt_banana_classification.bin" }, 224, 224, 3, { "data" }, { "prob" }, { "/usr/share/capi-media-vision/models/IC/dldt/googlenet-v1.xml", "/usr/share/capi-media-vision/models/IC/dldt/googlenet-v1.bin" }, { 954 }) + ) ); \ No newline at end of file -- 2.7.4 From 4ac2c163f498a97124a5fe2e5eda9657b9a4a03f Mon Sep 17 00:00:00 2001 From: Kwanghoon Son Date: Fri, 10 Apr 2020 12:58:08 +0900 Subject: [PATCH 02/16] Add dldt verify data update bin date (banana img) file Change-Id: I5adc21e30f4afe5bf2ea41d0847f3399fb8ea6de Signed-off-by: Kwanghoon Son --- test/res/dldt_banana_classification.bin | Bin 0 -> 602112 bytes test/src/inference_engine_test.cpp | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 test/res/dldt_banana_classification.bin diff --git a/test/res/dldt_banana_classification.bin b/test/res/dldt_banana_classification.bin new file mode 100644 index 0000000000000000000000000000000000000000..519acfe5784d4ba87118877574fcadde61e53796 GIT binary patch literal 602112 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
d+U#R|c$Mgvv6ixQU|p8AmYbl) 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"profile_data_" + backend_name + "_caffe_model.txt"); + ret = engine->DumpProfileToFile("profile_data_" + backend_name + "_dldt_model.txt"); if (ret != INFERENCE_ENGINE_ERROR_NONE) { delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); @@ -1165,6 +1165,6 @@ INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineCaffeTest, INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineDldtTest, testing::Values( // DLDT - ParamType_Infer("dldt", INFERENCE_TARGET_CUSTOM, TEST_FACE_DETECTION, 10, TENSOR_DATA_TYPE_FLOAT32, { "/opt/usr/images/dldt_banana_classification.bin" }, 224, 224, 3, { "data" }, { "prob" }, { "/usr/share/capi-media-vision/models/IC/dldt/googlenet-v1.xml", "/usr/share/capi-media-vision/models/IC/dldt/googlenet-v1.bin" }, { 954 }) + ParamType_Infer("dldt", INFERENCE_TARGET_CUSTOM, TEST_IMAGE_CLASSIFICATION, 10, TENSOR_DATA_TYPE_FLOAT32, { "/opt/usr/images/dldt_banana_classification.bin" }, 224, 224, 3, { "data" }, { "prob" }, { "/usr/share/capi-media-vision/models/IC/dldt/googlenet-v1.xml", "/usr/share/capi-media-vision/models/IC/dldt/googlenet-v1.bin" }, { 954 }) ) ); \ No newline at end of file -- 2.7.4 From f9cc349154a50595c96fe0ea9adc53db4d92b9d7 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Tue, 14 Apr 2020 10:22:11 +0900 Subject: [PATCH 03/16] packaging: drop opencv buildrequires opencv package isn't required anymore. Change-Id: Iea34932c12a15f7e7d34e099924f632a10dd29a4 Signed-off-by: Inki Dae --- packaging/inference-engine-interface.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/packaging/inference-engine-interface.spec b/packaging/inference-engine-interface.spec index 4c48e28..22a0790 100644 --- a/packaging/inference-engine-interface.spec +++ b/packaging/inference-engine-interface.spec @@ -9,7 +9,6 @@ BuildRequires: cmake BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(capi-base-common) -BuildRequires: pkgconfig(opencv) BuildRequires: pkgconfig(python) BuildRequires: pkgconfig(iniparser) BuildRequires: gtest-devel -- 2.7.4 From 6332866b5bff9137465745457fd22c0280298fbe Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Fri, 17 Apr 2020 16:33:41 +0900 Subject: [PATCH 04/16] clean up header file Change-Id: I0e3108bb59b0a09a1993264cedc07194287b35a8 Signed-off-by: Inki Dae --- include/inference_engine_type.h | 47 +++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/include/inference_engine_type.h b/include/inference_engine_type.h index 311f3a3..5a3a653 100644 --- a/include/inference_engine_type.h +++ b/include/inference_engine_type.h @@ -115,6 +115,7 @@ typedef enum { * tensor_t inputTensor; * inputTensor.dimInfo.push_back(dim); * inputTensor.data = (void*)pImageData; + * @endcode * * // Do something with inputTensor * @since_tizen 5.5 @@ -127,8 +128,8 @@ typedef struct _tensor_t { /** * @brief Inference engine backend configuration * - * This structure should be configured before InferenceEngineCommon object is - * created and then passed to InferenceEngineCommon's constructor. + * @details This structure should be configured before InferenceEngineCommon object is + * created and then passed to InferenceEngineCommon's constructor. * * @since_tizen 6.0 */ @@ -139,10 +140,10 @@ typedef struct _inference_engine_config { } inference_engine_config; /** - * @brief tensor buffer structure + * @brief Tensor buffer structure * - * This buffer contains actual tensor data so type-casting is required - * according to a tensor data type. + * @details This buffer contains actual tensor data so type-casting is required + * according to a tensor data type. * * @since_tizen 6.0 */ @@ -155,16 +156,16 @@ typedef struct _inference_engine_tensor_buffer { } inference_engine_tensor_buffer; /** - * @brief tensor information structure + * @brief Tensor information structure * - * This structure corresponding to a tensor contains below tensor information, - * - a name of a given layer - * - a tensor shape of the layer - * - a tensor type of the layer - * - a tensor element size of the layer. + * @details This structure corresponding to a tensor contains below tensor information, + * - a name of a given layer + * - a tensor shape of the layer + * - a tensor type of the layer + * - a tensor element size of the layer. * - * Caution. Tensor element size is not in-memory buffer size in bytes so based on a given tensor element size, - * upper framework should allocate actual tensor buffer according to tensor data types (i.e., uint8, float32...) + * @remarks Tensor element size is not in-memory buffer size in bytes so based on a given tensor element size, + * upper framework should allocate actual tensor buffer according to tensor data types (i.e., uint8, float32...) * * @since_tizen 6.0 */ @@ -177,11 +178,11 @@ typedef struct _inference_engine_tensor_info { } inference_engine_tensor_info; /** - * @brief a layer property structure + * @brief A layer property structure * - * This structure is used to get/set information to one more tensors from/to a backend engine. - * - layer names of input or output layer. - * - information of tensors. + * @details This structure is used to get/set information to one more tensors from/to a backend engine. + * - layer names of input or output layer. + * - information of tensors. * @since_tizen 6.0 */ typedef struct _inference_engine_layer_property { @@ -191,13 +192,13 @@ typedef struct _inference_engine_layer_property { } inference_engine_layer_property; /** - * @brief a capacity structure to a backend engine. + * @brief A capacity structure to a backend engine. * - * This structure is used to get information such as what features and - * constraints a given backend engine has, and it contains below information, - * - device list which is able to compute operations. - * - tensor shape information a given backend engine supports for. - * - neural network models a given backend engine supports for. + * @details This structure is used to get information such as what features and + * constraints a given backend engine has, and it contains below information, + * - device list which is able to compute operations. + * - tensor shape information a given backend engine supports for. + * - neural network models a given backend engine supports for. * * @since_tizen 6.0 */ -- 2.7.4 From a2db73447171efa72e20f3bf020761ca3ebe9af2 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Fri, 17 Apr 2020 16:40:05 +0900 Subject: [PATCH 05/16] clean up enumeration prefix Change-Id: I48bfa0d402dcf0f68f8f6f1afde34afb35ae84c2 Signed-off-by: Inki Dae --- include/inference_engine_type.h | 20 +++++----- test/src/inference_engine_test.cpp | 78 +++++++++++++++++++------------------- 2 files changed, 48 insertions(+), 50 deletions(-) diff --git a/include/inference_engine_type.h b/include/inference_engine_type.h index 5a3a653..ef7e74f 100644 --- a/include/inference_engine_type.h +++ b/include/inference_engine_type.h @@ -80,8 +80,8 @@ typedef enum { * */ typedef enum { - TENSOR_SHAPE_NCHW = 0, /**< tensor order is batch size, a number of channels, height, width. */ - TENSOR_SHAPE_NHWC, /**< tensor order is batch size, height, width, a number of channels. */ + INFERENCE_TENSOR_SHAPE_NCHW = 0, /**< tensor order is batch size, a number of channels, height, width. */ + INFERENCE_TENSOR_SHAPE_NHWC, /**< tensor order is batch size, height, width, a number of channels. */ } inference_tensor_shape_type_e; /** @@ -91,17 +91,15 @@ typedef enum { * */ typedef enum { - TENSOR_DATA_TYPE_NONE = 0, - TENSOR_DATA_TYPE_FLOAT16, - TENSOR_DATA_TYPE_FLOAT32, - TENSOR_DATA_TYPE_UINT8, - TENSOR_DATA_TYPE_UINT16, - TENSOR_DATA_TYPE_UINT32, - TENSOR_DATA_TYPE_MAX + INFERENCE_TENSOR_DATA_TYPE_NONE = 0, + INFERENCE_TENSOR_DATA_TYPE_FLOAT16, + INFERENCE_TENSOR_DATA_TYPE_FLOAT32, + INFERENCE_TENSOR_DATA_TYPE_UINT8, + INFERENCE_TENSOR_DATA_TYPE_UINT16, + INFERENCE_TENSOR_DATA_TYPE_UINT32, + INFERENCE_TENSOR_DATA_TYPE_MAX } inference_tensor_data_type_e; -#define INFERENCE_TARGET_MASK (INFERENCE_TARGET_CPU | INFERENCE_TARGET_GPU | INFERENCE_TARGET_CUSTOM) - /** * @brief Tensor defined by the dimension and their corresponding data * @details @a dimInfo is the information diff --git a/test/src/inference_engine_test.cpp b/test/src/inference_engine_test.cpp index 1199a24..b0a457c 100644 --- a/test/src/inference_engine_test.cpp +++ b/test/src/inference_engine_test.cpp @@ -147,10 +147,10 @@ int PrepareTensorBuffers(InferenceEngineCommon *engine, std::vector &inputs, s continue; } - if (tensor_buffer.data_type == TENSOR_DATA_TYPE_FLOAT32) + if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) delete[] (float *)tensor_buffer.buffer; else delete[] (unsigned char *)tensor_buffer.buffer; @@ -228,7 +228,7 @@ void CleanupTensorBuffers(std::vector &inputs, s continue; } - if (tensor_buffer.data_type == TENSOR_DATA_TYPE_FLOAT32) + if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) delete[] (float *)tensor_buffer.buffer; else delete[] (unsigned char *)tensor_buffer.buffer; @@ -321,7 +321,7 @@ void FillOutputResult(InferenceEngineCommon *engine, std::vector Date: Mon, 20 Apr 2020 10:36:56 +0900 Subject: [PATCH 06/16] Fix build error due to the use of wrong enumeration Change-Id: Ib92b31e055544322ea394329a24a380247eda5ab Signed-off-by: Inki Dae --- src/inference_engine_common_impl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/inference_engine_common_impl.cpp b/src/inference_engine_common_impl.cpp index 1a87fd8..7c5f893 100755 --- a/src/inference_engine_common_impl.cpp +++ b/src/inference_engine_common_impl.cpp @@ -113,7 +113,7 @@ int InferenceEngineCommon::CheckTensorBuffers(std::vector= TENSOR_DATA_TYPE_MAX) { + if (tensor_buffer.data_type <= INFERENCE_TENSOR_DATA_TYPE_NONE || tensor_buffer.data_type >= INFERENCE_TENSOR_DATA_TYPE_MAX) { LOGE("tensor data type is invalid."); return INFERENCE_ENGINE_ERROR_INVALID_PARAMETER; } @@ -133,7 +133,7 @@ int InferenceEngineCommon::CheckLayerProperty(inference_engine_layer_property &p return INFERENCE_ENGINE_ERROR_INVALID_PARAMETER; } - if (tensor_info.data_type < TENSOR_DATA_TYPE_FLOAT16 || tensor_info.data_type > TENSOR_DATA_TYPE_UINT32) { + if (tensor_info.data_type < INFERENCE_TENSOR_DATA_TYPE_FLOAT16 || tensor_info.data_type > INFERENCE_TENSOR_DATA_TYPE_UINT32) { LOGE("tensor data type is invalid."); return INFERENCE_ENGINE_ERROR_INVALID_PARAMETER; } -- 2.7.4 From 6a3a87446347360ac61adee2e6e94826b0495843 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Thu, 23 Apr 2020 16:19:11 +0900 Subject: [PATCH 07/16] Drop gmock dependency For gtest based tc, gmock isn't required. Change-Id: I7eed61f7009e5c8dc5a6703cdcedac0045f963a0 Signed-off-by: Inki Dae --- packaging/inference-engine-interface.spec | 1 - test/src/CMakeLists.txt | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/inference-engine-interface.spec b/packaging/inference-engine-interface.spec index 22a0790..81ce68d 100644 --- a/packaging/inference-engine-interface.spec +++ b/packaging/inference-engine-interface.spec @@ -12,7 +12,6 @@ BuildRequires: pkgconfig(capi-base-common) BuildRequires: pkgconfig(python) BuildRequires: pkgconfig(iniparser) BuildRequires: gtest-devel -BuildRequires: gmock-devel %description Interface of inference engines diff --git a/test/src/CMakeLists.txt b/test/src/CMakeLists.txt index 0bc02bc..379d2cd 100644 --- a/test/src/CMakeLists.txt +++ b/test/src/CMakeLists.txt @@ -7,12 +7,13 @@ if(NOT SKIP_WARNINGS) endif() find_package(GTest REQUIRED) -set(GTEST_LIBRARY gmock) +set(GTEST_LIBRARY gtest) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/bin) include_directories(${PROJECT_SOURCE_DIR}) include_directories(${CMAKE_BINARY_DIR}/include) +include_directories(/usr/include/gtest) file(GLOB INFER_GTEST_INC_LIST "${PROJECT_SOURCE_DIR}/*.h") file(GLOB INFER_GTEST_SRC_LIST "${PROJECT_SOURCE_DIR}/*.cpp") -- 2.7.4 From 8aae3a7bd8c8c043739532a507f67dcc5bf14660 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Wed, 29 Apr 2020 11:56:37 +0900 Subject: [PATCH 08/16] test: add inference_engine_tc This patch adds a inference_engine_tc.cpp which contains test cases moved from inference_engine_test.cpp. Change-Id: I3e60b74b79a574f169d726447118dce883f58cfe Signed-off-by: Inki Dae --- packaging/inference-engine-interface.spec | 2 + test/src/CMakeLists.txt | 21 +- test/src/inference_engine_tc.cpp | 535 ++++++++++++++++++++++++++++++ test/src/inference_engine_test.cpp | 125 +------ 4 files changed, 555 insertions(+), 128 deletions(-) create mode 100644 test/src/inference_engine_tc.cpp diff --git a/packaging/inference-engine-interface.spec b/packaging/inference-engine-interface.spec index 81ce68d..0344a16 100644 --- a/packaging/inference-engine-interface.spec +++ b/packaging/inference-engine-interface.spec @@ -66,6 +66,7 @@ mkdir -p %{buildroot}/opt/usr/images/ %make_install install -m 755 test/bin/inference_engine_test %{buildroot}%{_bindir} +install -m 755 test/bin/inference_engine_tc %{buildroot}%{_bindir} install -m 755 start_profiler.sh %{buildroot}%{_bindir} install -m 666 test/res/*.bin %{buildroot}/opt/usr/images @@ -82,5 +83,6 @@ install -m 666 test/res/*.bin %{buildroot}/opt/usr/images %{_libdir}/pkgconfig/*common.pc %{_libdir}/lib*-common.so %{_bindir}/inference_engine_test +%{_bindir}/inference_engine_tc %{_bindir}/start_profiler.sh /opt/usr/images/*.bin diff --git a/test/src/CMakeLists.txt b/test/src/CMakeLists.txt index 379d2cd..7bd4400 100644 --- a/test/src/CMakeLists.txt +++ b/test/src/CMakeLists.txt @@ -1,5 +1,8 @@ project(inference_engine_test) +set(INFERENCE_ENGINE_TEST_CASE inference_engine_tc) +set(INFERENCE_TEST inference_engine_test) + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG _DEBUG) if(NOT SKIP_WARNINGS) @@ -16,14 +19,24 @@ include_directories(${CMAKE_BINARY_DIR}/include) include_directories(/usr/include/gtest) file(GLOB INFER_GTEST_INC_LIST "${PROJECT_SOURCE_DIR}/*.h") -file(GLOB INFER_GTEST_SRC_LIST "${PROJECT_SOURCE_DIR}/*.cpp") -add_executable(${PROJECT_NAME} +add_executable(${INFERENCE_TEST} + ${INFER_GTEST_INC_LIST} + ${PROJECT_SOURCE_DIR}/inference_engine_test.cpp + ) + +target_link_libraries(${INFERENCE_TEST} ${GTEST_LIBRARY} + ${GTEST_MAIN_LIBRARY} + ${INFERENCE_ENGINE_INTERFACE_LIB_NAME} + dl + ) + +add_executable(${INFERENCE_ENGINE_TEST_CASE} ${INFER_GTEST_INC_LIST} - ${INFER_GTEST_SRC_LIST} + ${PROJECT_SOURCE_DIR}/inference_engine_tc.cpp ) -target_link_libraries(${PROJECT_NAME} ${GTEST_LIBRARY} +target_link_libraries(${INFERENCE_ENGINE_TEST_CASE} ${GTEST_LIBRARY} ${GTEST_MAIN_LIBRARY} ${INFERENCE_ENGINE_INTERFACE_LIB_NAME} dl diff --git a/test/src/inference_engine_tc.cpp b/test/src/inference_engine_tc.cpp new file mode 100644 index 0000000..78f2b67 --- /dev/null +++ b/test/src/inference_engine_tc.cpp @@ -0,0 +1,535 @@ +/** + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" + +#include "inference_engine_error.h" +#include "inference_engine_common_impl.h" + +using namespace InferenceEngineInterface::Common; + +typedef std::tuple ParamType_Bind; +typedef std::tuple> ParamType_Load; +typedef std::tuple, int, int, int, std::vector, std::vector, std::vector, std::vector> ParamType_Infer; + +class InferenceEngineTestCase_G1 : public testing::TestWithParam { }; +class InferenceEngineTestCase_G2 : public testing::TestWithParam { }; +class InferenceEngineTestCase_G3 : public testing::TestWithParam { }; + +std::map Model_Formats = { + { "caffemodel", INFERENCE_MODEL_CAFFE }, + { "pb", INFERENCE_MODEL_TF }, + { "tflite", INFERENCE_MODEL_TFLITE }, + { "t7", INFERENCE_MODEL_TORCH }, + { "weights", INFERENCE_MODEL_DARKNET }, + { "xml", INFERENCE_MODEL_DLDT }, + { "onnx", INFERENCE_MODEL_ONNX } +}; + +std::map Target_Formats = { + { INFERENCE_TARGET_CPU, "cpu" }, + { INFERENCE_TARGET_GPU, "gpu" }, + { INFERENCE_TARGET_CUSTOM, "custom" } +}; + +enum { + TEST_IMAGE_CLASSIFICATION = 0, + TEST_OBJECT_DETECTION, + TEST_FACE_DETECTION, + TEST_FACIAL_LANDMARK_DETECTION, + TEST_POSE_ESTIMATION +}; + +TEST_P(InferenceEngineTestCase_G1, Bind_P) +{ + std::string backend_name; + int target_devices; + + std::tie(backend_name, target_devices) = GetParam(); + + std::cout <<"Bind test : backend = " << backend_name << ", target device = " << Target_Formats[target_devices] << std::endl; + + inference_engine_config config = { + .backend_name = backend_name, + .target_devices = target_devices + }; + + InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + ASSERT_TRUE(engine); + + int ret = engine->BindBackend(&config); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + inference_engine_capacity capacity; + ret = engine->GetBackendCapacity(&capacity); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + engine->UnbindBackend(); + + delete engine; +} + +int GetModelInfo(std::vector &model_paths, std::vector &models) +{ + std::string model_path = model_paths[0]; + std::string ext_str = model_path.substr(model_path.find_last_of(".") + 1); + std::map::iterator key = Model_Formats.find(ext_str); + int ret = key != Model_Formats.end() ? key->second : -1; + EXPECT_NE(ret, -1); + + if (ret == -1) { + return ret; + } + + switch (ret) { + case INFERENCE_MODEL_CAFFE: + case INFERENCE_MODEL_TF: + case INFERENCE_MODEL_DARKNET: + case INFERENCE_MODEL_DLDT: + case INFERENCE_MODEL_ONNX: + models.push_back(model_paths[0]); + models.push_back(model_paths[1]); + break; + case INFERENCE_MODEL_TFLITE: + case INFERENCE_MODEL_TORCH: + models.push_back(model_paths[0]); + break; + default: + break; + } + + return ret; +} + +int PrepareTensorBuffers(InferenceEngineCommon *engine, std::vector &inputs, + std::vector &outputs) +{ + int ret = engine->GetInputTensorBuffers(inputs); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + if (inputs.empty()) { + inference_engine_layer_property input_property; + ret = engine->GetInputLayerProperty(input_property); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + // If backend is OpenCV then the buffers will be allocated out of this function. + if (input_property.tensor_infos.empty()) { + return INFERENCE_ENGINE_ERROR_NONE; + } + + for (int i = 0; i < (int)input_property.tensor_infos.size(); ++i) { + inference_engine_tensor_info tensor_info = input_property.tensor_infos[i]; + inference_engine_tensor_buffer tensor_buffer; + if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) { + tensor_buffer.buffer = (void *)(new float[tensor_info.size]); + tensor_buffer.size = tensor_info.size * 4; + } else if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { + tensor_buffer.buffer = (void *)(new unsigned char[tensor_info.size]); + tensor_buffer.size = tensor_info.size; + } + + EXPECT_TRUE(tensor_buffer.buffer); + tensor_buffer.owner_is_backend = 0; + tensor_buffer.data_type = tensor_info.data_type; + inputs.push_back(tensor_buffer); + } + } + + ret = engine->GetOutputTensorBuffers(outputs); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + if (outputs.empty()) { + inference_engine_layer_property output_property; + ret = engine->GetOutputLayerProperty(output_property); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + // If backend is OpenCV then the buffers will be allocated out of this function. + if (output_property.tensor_infos.empty()) { + return INFERENCE_ENGINE_ERROR_NONE; + } + + for (int i = 0; i < (int)output_property.tensor_infos.size(); ++i) { + inference_engine_tensor_info tensor_info = output_property.tensor_infos[i]; + inference_engine_tensor_buffer tensor_buffer; + if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) { + tensor_buffer.buffer = (void *)(new float[tensor_info.size]); + tensor_buffer.size = tensor_info.size * 4; + } else if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { + tensor_buffer.buffer = (void *)(new unsigned char[tensor_info.size]); + tensor_buffer.size = tensor_info.size; + } + + EXPECT_TRUE(tensor_buffer.buffer); + tensor_buffer.owner_is_backend = 0; + tensor_buffer.data_type = tensor_info.data_type; + outputs.push_back(tensor_buffer); + } + } + + return INFERENCE_ENGINE_ERROR_NONE; +} + +void CleanupTensorBuffers(std::vector &inputs, std::vector &outputs) +{ + if (!inputs.empty()) { + std::vector::iterator iter; + for (iter = inputs.begin(); iter != inputs.end(); iter++) { + inference_engine_tensor_buffer tensor_buffer = *iter; + + // If tensor buffer owner is a backend then skip to release the tensor buffer. + // This tensor buffer will be released by the backend. + if (tensor_buffer.owner_is_backend) { + continue; + } + + if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) + delete[] (float *)tensor_buffer.buffer; + else + delete[] (unsigned char *)tensor_buffer.buffer; + } + std::vector().swap(inputs); + } + + if (!outputs.empty()) { + std::vector::iterator iter; + for (iter = outputs.begin(); iter != outputs.end(); iter++) { + inference_engine_tensor_buffer tensor_buffer = *iter; + + // If tensor buffer owner is a backend then skip to release the tensor buffer. + // This tensor buffer will be released by the backend. + if (tensor_buffer.owner_is_backend) { + continue; + } + + if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) + delete[] (float *)tensor_buffer.buffer; + else + delete[] (unsigned char *)tensor_buffer.buffer; + } + std::vector().swap(outputs); + } +} + +void CopyFileToMemory(const char *file_name, inference_engine_tensor_buffer &buffer, unsigned int size) +{ + int fd = open(file_name, O_RDONLY); + if (fd == -1) { + ASSERT_NE(fd, -1); + return; + } + + int num = read(fd, buffer.buffer, size); + if (num == -1) { + close(fd); + ASSERT_NE(num, -1); + return; + } + + close(fd); +} + + +TEST_P(InferenceEngineTestCase_G2, Load_P) +{ + std::string backend_name; + int target_devices; + std::vector model_paths; + + std::tie(backend_name, target_devices, model_paths) = GetParam(); + + std::cout <<"Load test : backend = " << backend_name << ", target device = " << Target_Formats[target_devices] << std::endl; + + inference_engine_config config = { + .backend_name = backend_name, + .target_devices = target_devices + }; + + InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + ASSERT_TRUE(engine); + + int ret = engine->BindBackend(&config); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + inference_engine_capacity capacity; + ret = engine->GetBackendCapacity(&capacity); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + ret = engine->SetTargetDevices(target_devices); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + std::vector models; + int model_type = GetModelInfo(model_paths, models); + if (model_type == -1) { + delete engine; + ASSERT_NE(model_type, -1); + return; + } + + ret = engine->Load(models, (inference_model_format_e)model_type); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + engine->UnbindBackend(); + + delete engine; +} + +void FillOutputResult(InferenceEngineCommon *engine, std::vector &outputs, tensor_t &outputData) +{ + inference_engine_layer_property property; + int ret = engine->GetOutputLayerProperty(property); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + for (int i = 0; i < (int)property.tensor_infos.size(); ++i) { + inference_engine_tensor_info tensor_info = property.tensor_infos[i]; + + std::vector tmpDimInfo; + for (int i = 0; i < (int)tensor_info.shape.size(); i++) { + tmpDimInfo.push_back(tensor_info.shape[i]); + } + + outputData.dimInfo.push_back(tmpDimInfo); + + // Normalize output tensor data converting it to float type in case of quantized model. + if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { + unsigned char *ori_buf = (unsigned char *)outputs[i].buffer; + float *new_buf = new float[tensor_info.size]; + ASSERT_TRUE(new_buf); + + for (int j = 0; j < (int)tensor_info.size; j++) { + new_buf[j] = (float)ori_buf[j] / 255.0f; + } + + // replace original buffer with new one, and release origin one. + outputs[i].buffer = new_buf; + if (!outputs[i].owner_is_backend) { + delete[] ori_buf; + } + } + + outputData.data.push_back((void *)outputs[i].buffer); + } +} + +int VerifyImageClassificationResults(tensor_t &outputData, int answer) +{ + std::vector> inferDimInfo(outputData.dimInfo); + std::vector inferResults(outputData.data.begin(), outputData.data.end()); + + int idx = -1; + int count = inferDimInfo[0][1]; + float value = 0.0f; + + float *prediction = reinterpret_cast(inferResults[0]); + for (int i = 0; i < count; ++i) { + if (value < prediction[i]) { + value = prediction[i]; + idx = i; + } + } + + return idx == answer; +} + +TEST_P(InferenceEngineTestCase_G3, Inference) +{ + std::string backend_name; + int target_devices; + int test_type; + int iteration; + int tensor_type; + std::vector image_paths; + size_t height; + size_t width; + size_t ch; + std::vector input_layers; + std::vector output_layers; + std::vector model_paths; + std::vector answers; + + std::tie(backend_name, target_devices, test_type, iteration, tensor_type, image_paths, height, width, ch, input_layers, output_layers, model_paths, answers) = GetParam(); + + if (iteration < 1) { + iteration = 1; + } + + std::string test_name; + switch (test_type) { + case TEST_IMAGE_CLASSIFICATION: + test_name.append("Image classification"); + break; + default: + return; + } + + std::cout << test_name << " inference test : backend = " << backend_name << ", target device = " << Target_Formats[target_devices] << std::endl; + inference_engine_config config = { + .backend_name = backend_name, + .target_devices = target_devices + }; + + InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + if (engine == nullptr) { + ASSERT_TRUE(engine); + return; + } + + int ret = engine->BindBackend(&config); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + inference_engine_capacity capacity; + ret = engine->GetBackendCapacity(&capacity); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + ret = engine->SetTargetDevices(target_devices); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + std::vector models; + int model_type = GetModelInfo(model_paths, models); + if (model_type == -1) { + delete engine; + ASSERT_NE(model_type, -1); + return; + } + + inference_engine_layer_property input_property; + std::vector::iterator iter; + + for (iter = input_layers.begin(); iter != input_layers.end(); iter++) { + inference_engine_tensor_info tensor_info = { + { 1, ch, height, width }, + (inference_tensor_shape_type_e)INFERENCE_TENSOR_SHAPE_NCHW, + (inference_tensor_data_type_e)tensor_type, + (size_t)(1 * ch * height * width) + }; + + input_property.layer_names.push_back(*iter); + input_property.tensor_infos.push_back(tensor_info); + } + + ret = engine->SetInputLayerProperty(input_property); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + inference_engine_layer_property output_property; + + for (iter = output_layers.begin(); iter != output_layers.end(); iter++) { + output_property.layer_names.push_back(*iter); + } + + ret = engine->SetOutputLayerProperty(output_property); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + ret = engine->Load(models, (inference_model_format_e)model_type); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + std::vector inputs, outputs; + ret = PrepareTensorBuffers(engine, inputs, outputs); + if (ret != INFERENCE_ENGINE_ERROR_NONE) { + delete engine; + ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + return; + } + + // Copy input image tensor data from a given file to input tensor buffer. + for (int i = 0; i < (int)image_paths.size(); ++i) { + CopyFileToMemory(image_paths[i].c_str(), inputs[i], inputs[i].size); + } + + for (int repeat = 0; repeat < iteration; ++repeat) { + ret = engine->Run(inputs, outputs); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + } + + tensor_t result; + FillOutputResult(engine, outputs, result); + + ret = VerifyImageClassificationResults(result, answers[0]); + EXPECT_EQ(ret, 1); + + CleanupTensorBuffers(inputs, outputs); + + engine->UnbindBackend(); + models.clear(); + + delete engine; +} + +INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineTestCase_G1, + testing::Values( + // parameter order : backend name, target device + // ARMNN. + ParamType_Bind("armnn", INFERENCE_TARGET_CPU), + // TFLITE. + ParamType_Bind("tflite", INFERENCE_TARGET_CPU) + /* TODO */ + + ) +); + +INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineTestCase_G2, + testing::Values( + // parameter order : backend name, target device, model path/s + // mobilenet based image classification model loading test + // ARMNN. + ParamType_Load("armnn", INFERENCE_TARGET_CPU, { "/usr/share/capi-media-vision/models/IC/tflite/ic_tflite_model.tflite" }), + // TFLITE. + ParamType_Load("tflite", INFERENCE_TARGET_CPU, { "/usr/share/capi-media-vision/models/IC/tflite/ic_tflite_model.tflite" }) + /* TODO */ + ) +); + +INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineTestCase_G3, + testing::Values( + // parameter order : backend name, target device, input image path/s, height, width, channel count, input layer names, output layer names, model path/s, inference result + // mobilenet based image classification test + // ARMNN. + ParamType_Infer("armnn", INFERENCE_TARGET_CPU, TEST_IMAGE_CLASSIFICATION, 10, INFERENCE_TENSOR_DATA_TYPE_FLOAT32, { "/opt/usr/images/image_classification.bin" }, 224, 224, 3, { "input_2" }, { "dense_3/Softmax" }, { "/usr/share/capi-media-vision/models/IC/tflite/ic_tflite_model.tflite" }, { 3 }), + // TFLITE. + ParamType_Infer("tflite", INFERENCE_TARGET_CPU, TEST_IMAGE_CLASSIFICATION, 10, INFERENCE_TENSOR_DATA_TYPE_FLOAT32, { "/opt/usr/images/image_classification.bin" }, 224, 224, 3, { "input_2" }, { "dense_3/Softmax" }, { "/usr/share/capi-media-vision/models/IC/tflite/ic_tflite_model.tflite" }, { 3 }) + /* TODO */ + ) +); diff --git a/test/src/inference_engine_test.cpp b/test/src/inference_engine_test.cpp index b0a457c..db50a80 100644 --- a/test/src/inference_engine_test.cpp +++ b/test/src/inference_engine_test.cpp @@ -29,12 +29,8 @@ using namespace InferenceEngineInterface::Common; -typedef std::tuple ParamType; -typedef std::tuple> ParamType_Load; typedef std::tuple, int, int, int, std::vector, std::vector, std::vector, std::vector> ParamType_Infer; -class InferenceEngineCommonTest : public testing::TestWithParam { }; -class InferenceEngineCommonTest_2 : public testing::TestWithParam { }; class InferenceEngineTfliteTest : public testing::TestWithParam { }; class InferenceEngineCaffeTest : public testing::TestWithParam { }; class InferenceEngineDldtTest : public testing::TestWithParam { }; @@ -63,39 +59,6 @@ enum { TEST_POSE_ESTIMATION }; -TEST_P(InferenceEngineCommonTest, Bind) -{ - std::string backend_name; - int target_devices; - - std::tie(backend_name, target_devices) = GetParam(); - - std::cout <<"Bind test : backend = " << backend_name << ", target device = " << Target_Formats[target_devices] << std::endl; - - inference_engine_config config = { - .backend_name = backend_name, - .target_devices = target_devices - }; - - InferenceEngineCommon *engine = new InferenceEngineCommon(&config); - ASSERT_TRUE(engine); - - int ret = engine->BindBackend(&config); - if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; - ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - return; - } - - inference_engine_capacity capacity; - ret = engine->GetBackendCapacity(&capacity); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - engine->UnbindBackend(); - - delete engine; -} - int GetModelInfo(std::vector &model_paths, std::vector &models) { std::string model_path = model_paths[0]; @@ -255,55 +218,6 @@ void CopyFileToMemory(const char *file_name, inference_engine_tensor_buffer &buf close(fd); } - -TEST_P(InferenceEngineCommonTest_2, Load) -{ - std::string backend_name; - int target_devices; - std::vector model_paths; - - std::tie(backend_name, target_devices, model_paths) = GetParam(); - - std::cout <<"Load test : backend = " << backend_name << ", target device = " << Target_Formats[target_devices] << std::endl; - - inference_engine_config config = { - .backend_name = backend_name, - .target_devices = target_devices - }; - - InferenceEngineCommon *engine = new InferenceEngineCommon(&config); - ASSERT_TRUE(engine); - - int ret = engine->BindBackend(&config); - if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; - ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - return; - } - - inference_engine_capacity capacity; - ret = engine->GetBackendCapacity(&capacity); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - ret = engine->SetTargetDevices(target_devices); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - std::vector models; - int model_type = GetModelInfo(model_paths, models); - if (model_type == -1) { - delete engine; - ASSERT_NE(model_type, -1); - return; - } - - ret = engine->Load(models, (inference_model_format_e)model_type); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - engine->UnbindBackend(); - - delete engine; -} - void FillOutputResult(InferenceEngineCommon *engine, std::vector &outputs, tensor_t &outputData) { inference_engine_layer_property property; @@ -333,7 +247,7 @@ void FillOutputResult(InferenceEngineCommon *engine, std::vector Date: Wed, 29 Apr 2020 12:09:06 +0900 Subject: [PATCH 09/16] test: avoid code from duplicated This patch moves common code from test files to a new file, inference_enigne_test_common.cpp, to avoid code from duplicated. Change-Id: Id516b91298bc9fbef779d6568de449b9538ecba6 Signed-off-by: Inki Dae --- test/src/CMakeLists.txt | 2 + test/src/inference_engine_tc.cpp | 244 +------------------ test/src/inference_engine_test.cpp | 377 +---------------------------- test/src/inference_engine_test_common.cpp | 387 ++++++++++++++++++++++++++++++ test/src/inference_engine_test_common.h | 55 +++++ 5 files changed, 447 insertions(+), 618 deletions(-) create mode 100644 test/src/inference_engine_test_common.cpp create mode 100644 test/src/inference_engine_test_common.h diff --git a/test/src/CMakeLists.txt b/test/src/CMakeLists.txt index 7bd4400..12dec3a 100644 --- a/test/src/CMakeLists.txt +++ b/test/src/CMakeLists.txt @@ -23,6 +23,7 @@ file(GLOB INFER_GTEST_INC_LIST "${PROJECT_SOURCE_DIR}/*.h") add_executable(${INFERENCE_TEST} ${INFER_GTEST_INC_LIST} ${PROJECT_SOURCE_DIR}/inference_engine_test.cpp + ${PROJECT_SOURCE_DIR}/inference_engine_test_common.cpp ) target_link_libraries(${INFERENCE_TEST} ${GTEST_LIBRARY} @@ -34,6 +35,7 @@ target_link_libraries(${INFERENCE_TEST} ${GTEST_LIBRARY} add_executable(${INFERENCE_ENGINE_TEST_CASE} ${INFER_GTEST_INC_LIST} ${PROJECT_SOURCE_DIR}/inference_engine_tc.cpp + ${PROJECT_SOURCE_DIR}/inference_engine_test_common.cpp ) target_link_libraries(${INFERENCE_ENGINE_TEST_CASE} ${GTEST_LIBRARY} diff --git a/test/src/inference_engine_tc.cpp b/test/src/inference_engine_tc.cpp index 78f2b67..5aa508a 100644 --- a/test/src/inference_engine_tc.cpp +++ b/test/src/inference_engine_tc.cpp @@ -26,8 +26,7 @@ #include "inference_engine_error.h" #include "inference_engine_common_impl.h" - -using namespace InferenceEngineInterface::Common; +#include "inference_engine_test_common.h" typedef std::tuple ParamType_Bind; typedef std::tuple> ParamType_Load; @@ -37,30 +36,6 @@ class InferenceEngineTestCase_G1 : public testing::TestWithParam class InferenceEngineTestCase_G2 : public testing::TestWithParam { }; class InferenceEngineTestCase_G3 : public testing::TestWithParam { }; -std::map Model_Formats = { - { "caffemodel", INFERENCE_MODEL_CAFFE }, - { "pb", INFERENCE_MODEL_TF }, - { "tflite", INFERENCE_MODEL_TFLITE }, - { "t7", INFERENCE_MODEL_TORCH }, - { "weights", INFERENCE_MODEL_DARKNET }, - { "xml", INFERENCE_MODEL_DLDT }, - { "onnx", INFERENCE_MODEL_ONNX } -}; - -std::map Target_Formats = { - { INFERENCE_TARGET_CPU, "cpu" }, - { INFERENCE_TARGET_GPU, "gpu" }, - { INFERENCE_TARGET_CUSTOM, "custom" } -}; - -enum { - TEST_IMAGE_CLASSIFICATION = 0, - TEST_OBJECT_DETECTION, - TEST_FACE_DETECTION, - TEST_FACIAL_LANDMARK_DETECTION, - TEST_POSE_ESTIMATION -}; - TEST_P(InferenceEngineTestCase_G1, Bind_P) { std::string backend_name; @@ -94,166 +69,6 @@ TEST_P(InferenceEngineTestCase_G1, Bind_P) delete engine; } -int GetModelInfo(std::vector &model_paths, std::vector &models) -{ - std::string model_path = model_paths[0]; - std::string ext_str = model_path.substr(model_path.find_last_of(".") + 1); - std::map::iterator key = Model_Formats.find(ext_str); - int ret = key != Model_Formats.end() ? key->second : -1; - EXPECT_NE(ret, -1); - - if (ret == -1) { - return ret; - } - - switch (ret) { - case INFERENCE_MODEL_CAFFE: - case INFERENCE_MODEL_TF: - case INFERENCE_MODEL_DARKNET: - case INFERENCE_MODEL_DLDT: - case INFERENCE_MODEL_ONNX: - models.push_back(model_paths[0]); - models.push_back(model_paths[1]); - break; - case INFERENCE_MODEL_TFLITE: - case INFERENCE_MODEL_TORCH: - models.push_back(model_paths[0]); - break; - default: - break; - } - - return ret; -} - -int PrepareTensorBuffers(InferenceEngineCommon *engine, std::vector &inputs, - std::vector &outputs) -{ - int ret = engine->GetInputTensorBuffers(inputs); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - if (inputs.empty()) { - inference_engine_layer_property input_property; - ret = engine->GetInputLayerProperty(input_property); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - // If backend is OpenCV then the buffers will be allocated out of this function. - if (input_property.tensor_infos.empty()) { - return INFERENCE_ENGINE_ERROR_NONE; - } - - for (int i = 0; i < (int)input_property.tensor_infos.size(); ++i) { - inference_engine_tensor_info tensor_info = input_property.tensor_infos[i]; - inference_engine_tensor_buffer tensor_buffer; - if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) { - tensor_buffer.buffer = (void *)(new float[tensor_info.size]); - tensor_buffer.size = tensor_info.size * 4; - } else if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { - tensor_buffer.buffer = (void *)(new unsigned char[tensor_info.size]); - tensor_buffer.size = tensor_info.size; - } - - EXPECT_TRUE(tensor_buffer.buffer); - tensor_buffer.owner_is_backend = 0; - tensor_buffer.data_type = tensor_info.data_type; - inputs.push_back(tensor_buffer); - } - } - - ret = engine->GetOutputTensorBuffers(outputs); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - if (outputs.empty()) { - inference_engine_layer_property output_property; - ret = engine->GetOutputLayerProperty(output_property); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - // If backend is OpenCV then the buffers will be allocated out of this function. - if (output_property.tensor_infos.empty()) { - return INFERENCE_ENGINE_ERROR_NONE; - } - - for (int i = 0; i < (int)output_property.tensor_infos.size(); ++i) { - inference_engine_tensor_info tensor_info = output_property.tensor_infos[i]; - inference_engine_tensor_buffer tensor_buffer; - if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) { - tensor_buffer.buffer = (void *)(new float[tensor_info.size]); - tensor_buffer.size = tensor_info.size * 4; - } else if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { - tensor_buffer.buffer = (void *)(new unsigned char[tensor_info.size]); - tensor_buffer.size = tensor_info.size; - } - - EXPECT_TRUE(tensor_buffer.buffer); - tensor_buffer.owner_is_backend = 0; - tensor_buffer.data_type = tensor_info.data_type; - outputs.push_back(tensor_buffer); - } - } - - return INFERENCE_ENGINE_ERROR_NONE; -} - -void CleanupTensorBuffers(std::vector &inputs, std::vector &outputs) -{ - if (!inputs.empty()) { - std::vector::iterator iter; - for (iter = inputs.begin(); iter != inputs.end(); iter++) { - inference_engine_tensor_buffer tensor_buffer = *iter; - - // If tensor buffer owner is a backend then skip to release the tensor buffer. - // This tensor buffer will be released by the backend. - if (tensor_buffer.owner_is_backend) { - continue; - } - - if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) - delete[] (float *)tensor_buffer.buffer; - else - delete[] (unsigned char *)tensor_buffer.buffer; - } - std::vector().swap(inputs); - } - - if (!outputs.empty()) { - std::vector::iterator iter; - for (iter = outputs.begin(); iter != outputs.end(); iter++) { - inference_engine_tensor_buffer tensor_buffer = *iter; - - // If tensor buffer owner is a backend then skip to release the tensor buffer. - // This tensor buffer will be released by the backend. - if (tensor_buffer.owner_is_backend) { - continue; - } - - if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) - delete[] (float *)tensor_buffer.buffer; - else - delete[] (unsigned char *)tensor_buffer.buffer; - } - std::vector().swap(outputs); - } -} - -void CopyFileToMemory(const char *file_name, inference_engine_tensor_buffer &buffer, unsigned int size) -{ - int fd = open(file_name, O_RDONLY); - if (fd == -1) { - ASSERT_NE(fd, -1); - return; - } - - int num = read(fd, buffer.buffer, size); - if (num == -1) { - close(fd); - ASSERT_NE(num, -1); - return; - } - - close(fd); -} - - TEST_P(InferenceEngineTestCase_G2, Load_P) { std::string backend_name; @@ -302,63 +117,6 @@ TEST_P(InferenceEngineTestCase_G2, Load_P) delete engine; } -void FillOutputResult(InferenceEngineCommon *engine, std::vector &outputs, tensor_t &outputData) -{ - inference_engine_layer_property property; - int ret = engine->GetOutputLayerProperty(property); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - for (int i = 0; i < (int)property.tensor_infos.size(); ++i) { - inference_engine_tensor_info tensor_info = property.tensor_infos[i]; - - std::vector tmpDimInfo; - for (int i = 0; i < (int)tensor_info.shape.size(); i++) { - tmpDimInfo.push_back(tensor_info.shape[i]); - } - - outputData.dimInfo.push_back(tmpDimInfo); - - // Normalize output tensor data converting it to float type in case of quantized model. - if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { - unsigned char *ori_buf = (unsigned char *)outputs[i].buffer; - float *new_buf = new float[tensor_info.size]; - ASSERT_TRUE(new_buf); - - for (int j = 0; j < (int)tensor_info.size; j++) { - new_buf[j] = (float)ori_buf[j] / 255.0f; - } - - // replace original buffer with new one, and release origin one. - outputs[i].buffer = new_buf; - if (!outputs[i].owner_is_backend) { - delete[] ori_buf; - } - } - - outputData.data.push_back((void *)outputs[i].buffer); - } -} - -int VerifyImageClassificationResults(tensor_t &outputData, int answer) -{ - std::vector> inferDimInfo(outputData.dimInfo); - std::vector inferResults(outputData.data.begin(), outputData.data.end()); - - int idx = -1; - int count = inferDimInfo[0][1]; - float value = 0.0f; - - float *prediction = reinterpret_cast(inferResults[0]); - for (int i = 0; i < count; ++i) { - if (value < prediction[i]) { - value = prediction[i]; - idx = i; - } - } - - return idx == answer; -} - TEST_P(InferenceEngineTestCase_G3, Inference) { std::string backend_name; diff --git a/test/src/inference_engine_test.cpp b/test/src/inference_engine_test.cpp index db50a80..61d195b 100644 --- a/test/src/inference_engine_test.cpp +++ b/test/src/inference_engine_test.cpp @@ -26,8 +26,7 @@ #include "inference_engine_error.h" #include "inference_engine_common_impl.h" - -using namespace InferenceEngineInterface::Common; +#include "inference_engine_test_common.h" typedef std::tuple, int, int, int, std::vector, std::vector, std::vector, std::vector> ParamType_Infer; @@ -35,378 +34,6 @@ class InferenceEngineTfliteTest : public testing::TestWithParam class InferenceEngineCaffeTest : public testing::TestWithParam { }; class InferenceEngineDldtTest : public testing::TestWithParam { }; -std::map Model_Formats = { - { "caffemodel", INFERENCE_MODEL_CAFFE }, - { "pb", INFERENCE_MODEL_TF }, - { "tflite", INFERENCE_MODEL_TFLITE }, - { "t7", INFERENCE_MODEL_TORCH }, - { "weights", INFERENCE_MODEL_DARKNET }, - { "xml", INFERENCE_MODEL_DLDT }, - { "onnx", INFERENCE_MODEL_ONNX } -}; - -std::map Target_Formats = { - { INFERENCE_TARGET_CPU, "cpu" }, - { INFERENCE_TARGET_GPU, "gpu" }, - { INFERENCE_TARGET_CUSTOM, "custom" } -}; - -enum { - TEST_IMAGE_CLASSIFICATION = 0, - TEST_OBJECT_DETECTION, - TEST_FACE_DETECTION, - TEST_FACIAL_LANDMARK_DETECTION, - TEST_POSE_ESTIMATION -}; - -int GetModelInfo(std::vector &model_paths, std::vector &models) -{ - std::string model_path = model_paths[0]; - std::string ext_str = model_path.substr(model_path.find_last_of(".") + 1); - std::map::iterator key = Model_Formats.find(ext_str); - int ret = key != Model_Formats.end() ? key->second : -1; - EXPECT_NE(ret, -1); - - if (ret == -1) { - return ret; - } - - switch (ret) { - case INFERENCE_MODEL_CAFFE: - case INFERENCE_MODEL_TF: - case INFERENCE_MODEL_DARKNET: - case INFERENCE_MODEL_DLDT: - case INFERENCE_MODEL_ONNX: - models.push_back(model_paths[0]); - models.push_back(model_paths[1]); - break; - case INFERENCE_MODEL_TFLITE: - case INFERENCE_MODEL_TORCH: - models.push_back(model_paths[0]); - break; - default: - break; - } - - return ret; -} - -int PrepareTensorBuffers(InferenceEngineCommon *engine, std::vector &inputs, - std::vector &outputs) -{ - int ret = engine->GetInputTensorBuffers(inputs); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - if (inputs.empty()) { - inference_engine_layer_property input_property; - ret = engine->GetInputLayerProperty(input_property); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - // If backend is OpenCV then the buffers will be allocated out of this function. - if (input_property.tensor_infos.empty()) { - return INFERENCE_ENGINE_ERROR_NONE; - } - - for (int i = 0; i < (int)input_property.tensor_infos.size(); ++i) { - inference_engine_tensor_info tensor_info = input_property.tensor_infos[i]; - inference_engine_tensor_buffer tensor_buffer; - if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) { - tensor_buffer.buffer = (void *)(new float[tensor_info.size]); - tensor_buffer.size = tensor_info.size * 4; - } else if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { - tensor_buffer.buffer = (void *)(new unsigned char[tensor_info.size]); - tensor_buffer.size = tensor_info.size; - } - - EXPECT_TRUE(tensor_buffer.buffer); - tensor_buffer.owner_is_backend = 0; - tensor_buffer.data_type = tensor_info.data_type; - inputs.push_back(tensor_buffer); - } - } - - ret = engine->GetOutputTensorBuffers(outputs); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - if (outputs.empty()) { - inference_engine_layer_property output_property; - ret = engine->GetOutputLayerProperty(output_property); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - // If backend is OpenCV then the buffers will be allocated out of this function. - if (output_property.tensor_infos.empty()) { - return INFERENCE_ENGINE_ERROR_NONE; - } - - for (int i = 0; i < (int)output_property.tensor_infos.size(); ++i) { - inference_engine_tensor_info tensor_info = output_property.tensor_infos[i]; - inference_engine_tensor_buffer tensor_buffer; - if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) { - tensor_buffer.buffer = (void *)(new float[tensor_info.size]); - tensor_buffer.size = tensor_info.size * 4; - } else if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { - tensor_buffer.buffer = (void *)(new unsigned char[tensor_info.size]); - tensor_buffer.size = tensor_info.size; - } - - EXPECT_TRUE(tensor_buffer.buffer); - tensor_buffer.owner_is_backend = 0; - tensor_buffer.data_type = tensor_info.data_type; - outputs.push_back(tensor_buffer); - } - } - - return INFERENCE_ENGINE_ERROR_NONE; -} - -void CleanupTensorBuffers(std::vector &inputs, std::vector &outputs) -{ - if (!inputs.empty()) { - std::vector::iterator iter; - for (iter = inputs.begin(); iter != inputs.end(); iter++) { - inference_engine_tensor_buffer tensor_buffer = *iter; - - // If tensor buffer owner is a backend then skip to release the tensor buffer. - // This tensor buffer will be released by the backend. - if (tensor_buffer.owner_is_backend) { - continue; - } - - if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) - delete[] (float *)tensor_buffer.buffer; - else - delete[] (unsigned char *)tensor_buffer.buffer; - } - std::vector().swap(inputs); - } - - if (!outputs.empty()) { - std::vector::iterator iter; - for (iter = outputs.begin(); iter != outputs.end(); iter++) { - inference_engine_tensor_buffer tensor_buffer = *iter; - - // If tensor buffer owner is a backend then skip to release the tensor buffer. - // This tensor buffer will be released by the backend. - if (tensor_buffer.owner_is_backend) { - continue; - } - - if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) - delete[] (float *)tensor_buffer.buffer; - else - delete[] (unsigned char *)tensor_buffer.buffer; - } - std::vector().swap(outputs); - } -} - -void CopyFileToMemory(const char *file_name, inference_engine_tensor_buffer &buffer, unsigned int size) -{ - int fd = open(file_name, O_RDONLY); - if (fd == -1) { - ASSERT_NE(fd, -1); - return; - } - - int num = read(fd, buffer.buffer, size); - if (num == -1) { - close(fd); - ASSERT_NE(num, -1); - return; - } - - close(fd); -} - -void FillOutputResult(InferenceEngineCommon *engine, std::vector &outputs, tensor_t &outputData) -{ - inference_engine_layer_property property; - int ret = engine->GetOutputLayerProperty(property); - EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); - - for (int i = 0; i < (int)property.tensor_infos.size(); ++i) { - inference_engine_tensor_info tensor_info = property.tensor_infos[i]; - - std::vector tmpDimInfo; - for (int i = 0; i < (int)tensor_info.shape.size(); i++) { - tmpDimInfo.push_back(tensor_info.shape[i]); - } - - outputData.dimInfo.push_back(tmpDimInfo); - - // Normalize output tensor data converting it to float type in case of quantized model. - if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { - unsigned char *ori_buf = (unsigned char *)outputs[i].buffer; - float *new_buf = new float[tensor_info.size]; - ASSERT_TRUE(new_buf); - - for (int j = 0; j < (int)tensor_info.size; j++) { - new_buf[j] = (float)ori_buf[j] / 255.0f; - } - - // replace original buffer with new one, and release origin one. - outputs[i].buffer = new_buf; - if (!outputs[i].owner_is_backend) { - delete[] ori_buf; - } - } - - outputData.data.push_back((void *)outputs[i].buffer); - } -} - -int VerifyImageClassificationResults(tensor_t &outputData, int answer) -{ - std::vector> inferDimInfo(outputData.dimInfo); - std::vector inferResults(outputData.data.begin(), outputData.data.end()); - - int idx = -1; - int count = inferDimInfo[0][1]; - float value = 0.0f; - - float *prediction = reinterpret_cast(inferResults[0]); - for (int i = 0; i < count; ++i) { - if (value < prediction[i]) { - value = prediction[i]; - idx = i; - } - } - - return idx == answer; -} - -int VerifyObjectDetectionResults(tensor_t &outputData, std::vector &answers, int height, int width) -{ - std::vector> inferDimInfo(outputData.dimInfo); - std::vector inferResults(outputData.data.begin(), outputData.data.end()); - - float* boxes = nullptr; - float* classes = nullptr; - float* scores = nullptr; - int num_of_detections = 0; - - if (outputData.dimInfo.size() == 1) { - // there is no way to know how many objects are detect unless the number of objects aren't - // provided. In the case, each backend should provide the number of results manually. - // For example, in OpenCV, MobilenetV1-SSD doesn't provide it so the number of objects are - // written to the 1st element i.e., outputData.data[0] (the shape is 1x1xNx7 and the 1st of 7 - // indicats the image id. But it is useless if a batch mode isn't supported. - // So, use the 1st of 7. - - num_of_detections = (int)(*reinterpret_cast(outputData.data[0])); - - boxes = new float[num_of_detections * 4]; - classes = new float[num_of_detections]; - scores = new float[num_of_detections]; - - for (int idx = 0; idx < num_of_detections; ++idx) { - classes[idx] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 1]; - scores[idx] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 2]; - - boxes[idx*4] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 4]; - boxes[idx*4 + 1] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 3]; - boxes[idx*4 + 2] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 6]; - boxes[idx*4 + 3] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 5]; - } - } else { - boxes = reinterpret_cast(inferResults[0]); - classes = reinterpret_cast(inferResults[1]); - scores = reinterpret_cast(inferResults[2]); - num_of_detections = (int)(*reinterpret_cast(inferResults[3])); - } - - int left = 0, top = 0, right = 0, bottom = 0; - float max_score = 0.0f; - - for (int i = 0; i < num_of_detections; ++i) { - if (max_score < scores[i]) { - max_score = scores[i]; - - left = (int)(boxes[i * 4 + 1] * width); - top = (int)(boxes[i * 4 + 0] * height); - right = (int)(boxes[i * 4 + 3] * width); - bottom = (int)(boxes[i * 4 + 2] * height); - } - } - - if (outputData.dimInfo.size() == 1) { - delete [] boxes; - delete [] classes; - delete [] scores; - } - - return (answers[0] == left && answers[1] == top && answers[2] == right && answers[3] == bottom); -} - -int VerifyFacialLandmarkDetectionResults(tensor_t &outputData, std::vector &answers, int height, int width) -{ - std::vector> inferDimInfo(outputData.dimInfo); - std::vector inferResults(outputData.data.begin(), outputData.data.end()); - std::vector result_x, result_y; - - long number_of_detections = inferDimInfo[0][1]; - float* loc = reinterpret_cast(inferResults[0]); - - for (int idx = 0; idx < number_of_detections; idx+=2) { - result_x.push_back((int)(loc[idx] * width)); - result_y.push_back((int)(loc[idx+1] * height)); - } - - int ret = 1; - for (int i = 0; i < (number_of_detections>>1); i++) { - if (result_x[i] != answers[i*2] || result_y[i] != answers[i*2 + 1]) { - ret = 0; - break; - } - } - - return ret; -} - -int VerifyPoseEstimationResults(tensor_t &outputData, std::vector &answers, int height, int width) -{ - std::vector> inferDimInfo(outputData.dimInfo); - std::vector inferResults(outputData.data.begin(), outputData.data.end()); - std::vector result_x, result_y; - - const int heat_map_width = 96, heat_map_height = 96; - int num_of_pose = inferDimInfo[0][3]; - float *data = static_cast(inferResults[0]); - - float ratio_x = (float)width / (float)inferDimInfo[0][2]; - float ratio_y = (float)height / (float)inferDimInfo[0][1]; - - for (int idx = 0; idx < num_of_pose; ++idx) { - float max_score = 0.0f; - int max_x = 0, max_y = 0; - - for (int y = 0; y < heat_map_height; ++y) { - for (int x = 0; x < heat_map_width; ++x) { - // head_map[Yy][Xx][Kidx] = (Yy * heat_map_height * num_of_pose) + (Xx * num_of_pose) + Kidx - float score = data[(y * heat_map_width * num_of_pose) + (x * num_of_pose) + idx]; - if (score > max_score) { - max_score = score; - max_x = x; - max_y = y; - } - } - } - - result_x.push_back((int)((float)(max_x + 1) * ratio_x)); - result_y.push_back((int)((float)(max_y + 1) * ratio_y)); - } - - int ret = 1; - for (int i = 0; i < num_of_pose; ++i) { - if (result_x[i] != answers[i] || result_y[i] != answers[num_of_pose + i]) { - ret = 0; - break; - } - } - - return ret; -} - TEST_P(InferenceEngineTfliteTest, Inference) { std::string backend_name; @@ -1044,4 +671,4 @@ INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineDldtTest, // DLDT ParamType_Infer("dldt", INFERENCE_TARGET_CUSTOM, TEST_IMAGE_CLASSIFICATION, 10, INFERENCE_TENSOR_DATA_TYPE_FLOAT32, { "/opt/usr/images/dldt_banana_classification.bin" }, 224, 224, 3, { "data" }, { "prob" }, { "/usr/share/capi-media-vision/models/IC/dldt/googlenet-v1.xml", "/usr/share/capi-media-vision/models/IC/dldt/googlenet-v1.bin" }, { 954 }) ) -); \ No newline at end of file +); diff --git a/test/src/inference_engine_test_common.cpp b/test/src/inference_engine_test_common.cpp new file mode 100644 index 0000000..9a2791e --- /dev/null +++ b/test/src/inference_engine_test_common.cpp @@ -0,0 +1,387 @@ +/** + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" + +#include "inference_engine_error.h" +#include "inference_engine_common_impl.h" +#include "inference_engine_test_common.h" + +static std::map Model_Formats = { + { "caffemodel", INFERENCE_MODEL_CAFFE }, + { "pb", INFERENCE_MODEL_TF }, + { "tflite", INFERENCE_MODEL_TFLITE }, + { "t7", INFERENCE_MODEL_TORCH }, + { "weights", INFERENCE_MODEL_DARKNET }, + { "xml", INFERENCE_MODEL_DLDT }, + { "onnx", INFERENCE_MODEL_ONNX } +}; + +int GetModelInfo(std::vector &model_paths, std::vector &models) +{ + std::string model_path = model_paths[0]; + std::string ext_str = model_path.substr(model_path.find_last_of(".") + 1); + std::map::iterator key = Model_Formats.find(ext_str); + int ret = key != Model_Formats.end() ? key->second : -1; + EXPECT_NE(ret, -1); + + if (ret == -1) { + return ret; + } + + switch (ret) { + case INFERENCE_MODEL_CAFFE: + case INFERENCE_MODEL_TF: + case INFERENCE_MODEL_DARKNET: + case INFERENCE_MODEL_DLDT: + case INFERENCE_MODEL_ONNX: + models.push_back(model_paths[0]); + models.push_back(model_paths[1]); + break; + case INFERENCE_MODEL_TFLITE: + case INFERENCE_MODEL_TORCH: + models.push_back(model_paths[0]); + break; + default: + break; + } + + return ret; +} + +int PrepareTensorBuffers(InferenceEngineCommon *engine, std::vector &inputs, + std::vector &outputs) +{ + int ret = engine->GetInputTensorBuffers(inputs); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + if (inputs.empty()) { + inference_engine_layer_property input_property; + ret = engine->GetInputLayerProperty(input_property); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + // If backend is OpenCV then the buffers will be allocated out of this function. + if (input_property.tensor_infos.empty()) { + return INFERENCE_ENGINE_ERROR_NONE; + } + + for (int i = 0; i < (int)input_property.tensor_infos.size(); ++i) { + inference_engine_tensor_info tensor_info = input_property.tensor_infos[i]; + inference_engine_tensor_buffer tensor_buffer; + if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) { + tensor_buffer.buffer = (void *)(new float[tensor_info.size]); + tensor_buffer.size = tensor_info.size * 4; + } else if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { + tensor_buffer.buffer = (void *)(new unsigned char[tensor_info.size]); + tensor_buffer.size = tensor_info.size; + } + + EXPECT_TRUE(tensor_buffer.buffer); + tensor_buffer.owner_is_backend = 0; + tensor_buffer.data_type = tensor_info.data_type; + inputs.push_back(tensor_buffer); + } + } + + ret = engine->GetOutputTensorBuffers(outputs); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + if (outputs.empty()) { + inference_engine_layer_property output_property; + ret = engine->GetOutputLayerProperty(output_property); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + // If backend is OpenCV then the buffers will be allocated out of this function. + if (output_property.tensor_infos.empty()) { + return INFERENCE_ENGINE_ERROR_NONE; + } + + for (int i = 0; i < (int)output_property.tensor_infos.size(); ++i) { + inference_engine_tensor_info tensor_info = output_property.tensor_infos[i]; + inference_engine_tensor_buffer tensor_buffer; + if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) { + tensor_buffer.buffer = (void *)(new float[tensor_info.size]); + tensor_buffer.size = tensor_info.size * 4; + } else if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { + tensor_buffer.buffer = (void *)(new unsigned char[tensor_info.size]); + tensor_buffer.size = tensor_info.size; + } + + EXPECT_TRUE(tensor_buffer.buffer); + tensor_buffer.owner_is_backend = 0; + tensor_buffer.data_type = tensor_info.data_type; + outputs.push_back(tensor_buffer); + } + } + + return INFERENCE_ENGINE_ERROR_NONE; +} + +void CleanupTensorBuffers(std::vector &inputs, std::vector &outputs) +{ + if (!inputs.empty()) { + std::vector::iterator iter; + for (iter = inputs.begin(); iter != inputs.end(); iter++) { + inference_engine_tensor_buffer tensor_buffer = *iter; + + // If tensor buffer owner is a backend then skip to release the tensor buffer. + // This tensor buffer will be released by the backend. + if (tensor_buffer.owner_is_backend) { + continue; + } + + if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) + delete[] (float *)tensor_buffer.buffer; + else + delete[] (unsigned char *)tensor_buffer.buffer; + } + std::vector().swap(inputs); + } + + if (!outputs.empty()) { + std::vector::iterator iter; + for (iter = outputs.begin(); iter != outputs.end(); iter++) { + inference_engine_tensor_buffer tensor_buffer = *iter; + + // If tensor buffer owner is a backend then skip to release the tensor buffer. + // This tensor buffer will be released by the backend. + if (tensor_buffer.owner_is_backend) { + continue; + } + + if (tensor_buffer.data_type == INFERENCE_TENSOR_DATA_TYPE_FLOAT32) + delete[] (float *)tensor_buffer.buffer; + else + delete[] (unsigned char *)tensor_buffer.buffer; + } + std::vector().swap(outputs); + } +} + +void CopyFileToMemory(const char *file_name, inference_engine_tensor_buffer &buffer, unsigned int size) +{ + int fd = open(file_name, O_RDONLY); + if (fd == -1) { + ASSERT_NE(fd, -1); + return; + } + + int num = read(fd, buffer.buffer, size); + if (num == -1) { + close(fd); + ASSERT_NE(num, -1); + return; + } + + close(fd); +} + +void FillOutputResult(InferenceEngineCommon *engine, std::vector &outputs, tensor_t &outputData) +{ + inference_engine_layer_property property; + int ret = engine->GetOutputLayerProperty(property); + EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); + + for (int i = 0; i < (int)property.tensor_infos.size(); ++i) { + inference_engine_tensor_info tensor_info = property.tensor_infos[i]; + + std::vector tmpDimInfo; + for (int i = 0; i < (int)tensor_info.shape.size(); i++) { + tmpDimInfo.push_back(tensor_info.shape[i]); + } + + outputData.dimInfo.push_back(tmpDimInfo); + + // Normalize output tensor data converting it to float type in case of quantized model. + if (tensor_info.data_type == INFERENCE_TENSOR_DATA_TYPE_UINT8) { + unsigned char *ori_buf = (unsigned char *)outputs[i].buffer; + float *new_buf = new float[tensor_info.size]; + ASSERT_TRUE(new_buf); + + for (int j = 0; j < (int)tensor_info.size; j++) { + new_buf[j] = (float)ori_buf[j] / 255.0f; + } + + // replace original buffer with new one, and release origin one. + outputs[i].buffer = new_buf; + if (!outputs[i].owner_is_backend) { + delete[] ori_buf; + } + } + + outputData.data.push_back((void *)outputs[i].buffer); + } +} + +int VerifyImageClassificationResults(tensor_t &outputData, int answer) +{ + std::vector> inferDimInfo(outputData.dimInfo); + std::vector inferResults(outputData.data.begin(), outputData.data.end()); + + int idx = -1; + int count = inferDimInfo[0][1]; + float value = 0.0f; + + float *prediction = reinterpret_cast(inferResults[0]); + for (int i = 0; i < count; ++i) { + if (value < prediction[i]) { + value = prediction[i]; + idx = i; + } + } + + return idx == answer; +} + +int VerifyObjectDetectionResults(tensor_t &outputData, std::vector &answers, int height, int width) +{ + std::vector> inferDimInfo(outputData.dimInfo); + std::vector inferResults(outputData.data.begin(), outputData.data.end()); + + float* boxes = nullptr; + float* classes = nullptr; + float* scores = nullptr; + int num_of_detections = 0; + + if (outputData.dimInfo.size() == 1) { + // there is no way to know how many objects are detect unless the number of objects aren't + // provided. In the case, each backend should provide the number of results manually. + // For example, in OpenCV, MobilenetV1-SSD doesn't provide it so the number of objects are + // written to the 1st element i.e., outputData.data[0] (the shape is 1x1xNx7 and the 1st of 7 + // indicats the image id. But it is useless if a batch mode isn't supported. + // So, use the 1st of 7. + + num_of_detections = (int)(*reinterpret_cast(outputData.data[0])); + + boxes = new float[num_of_detections * 4]; + classes = new float[num_of_detections]; + scores = new float[num_of_detections]; + + for (int idx = 0; idx < num_of_detections; ++idx) { + classes[idx] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 1]; + scores[idx] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 2]; + + boxes[idx*4] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 4]; + boxes[idx*4 + 1] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 3]; + boxes[idx*4 + 2] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 6]; + boxes[idx*4 + 3] = (reinterpret_cast(outputData.data[0]))[idx*inferDimInfo[0][3] + 5]; + } + } else { + boxes = reinterpret_cast(inferResults[0]); + classes = reinterpret_cast(inferResults[1]); + scores = reinterpret_cast(inferResults[2]); + num_of_detections = (int)(*reinterpret_cast(inferResults[3])); + } + + int left = 0, top = 0, right = 0, bottom = 0; + float max_score = 0.0f; + + for (int i = 0; i < num_of_detections; ++i) { + if (max_score < scores[i]) { + max_score = scores[i]; + + left = (int)(boxes[i * 4 + 1] * width); + top = (int)(boxes[i * 4 + 0] * height); + right = (int)(boxes[i * 4 + 3] * width); + bottom = (int)(boxes[i * 4 + 2] * height); + } + } + + if (outputData.dimInfo.size() == 1) { + delete [] boxes; + delete [] classes; + delete [] scores; + } + + return (answers[0] == left && answers[1] == top && answers[2] == right && answers[3] == bottom); +} + +int VerifyFacialLandmarkDetectionResults(tensor_t &outputData, std::vector &answers, int height, int width) +{ + std::vector> inferDimInfo(outputData.dimInfo); + std::vector inferResults(outputData.data.begin(), outputData.data.end()); + std::vector result_x, result_y; + + long number_of_detections = inferDimInfo[0][1]; + float* loc = reinterpret_cast(inferResults[0]); + + for (int idx = 0; idx < number_of_detections; idx+=2) { + result_x.push_back((int)(loc[idx] * width)); + result_y.push_back((int)(loc[idx+1] * height)); + } + + int ret = 1; + for (int i = 0; i < (number_of_detections>>1); i++) { + if (result_x[i] != answers[i*2] || result_y[i] != answers[i*2 + 1]) { + ret = 0; + break; + } + } + + return ret; +} + +int VerifyPoseEstimationResults(tensor_t &outputData, std::vector &answers, int height, int width) +{ + std::vector> inferDimInfo(outputData.dimInfo); + std::vector inferResults(outputData.data.begin(), outputData.data.end()); + std::vector result_x, result_y; + + const int heat_map_width = 96, heat_map_height = 96; + int num_of_pose = inferDimInfo[0][3]; + float *data = static_cast(inferResults[0]); + + float ratio_x = (float)width / (float)inferDimInfo[0][2]; + float ratio_y = (float)height / (float)inferDimInfo[0][1]; + + for (int idx = 0; idx < num_of_pose; ++idx) { + float max_score = 0.0f; + int max_x = 0, max_y = 0; + + for (int y = 0; y < heat_map_height; ++y) { + for (int x = 0; x < heat_map_width; ++x) { + // head_map[Yy][Xx][Kidx] = (Yy * heat_map_height * num_of_pose) + (Xx * num_of_pose) + Kidx + float score = data[(y * heat_map_width * num_of_pose) + (x * num_of_pose) + idx]; + if (score > max_score) { + max_score = score; + max_x = x; + max_y = y; + } + } + } + + result_x.push_back((int)((float)(max_x + 1) * ratio_x)); + result_y.push_back((int)((float)(max_y + 1) * ratio_y)); + } + + int ret = 1; + for (int i = 0; i < num_of_pose; ++i) { + if (result_x[i] != answers[i] || result_y[i] != answers[num_of_pose + i]) { + ret = 0; + break; + } + } + + return ret; +} diff --git a/test/src/inference_engine_test_common.h b/test/src/inference_engine_test_common.h new file mode 100644 index 0000000..bcd38cf --- /dev/null +++ b/test/src/inference_engine_test_common.h @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +#include +#include + +#include "inference_engine_common_impl.h" + +using namespace InferenceEngineInterface::Common; + +static std::map Target_Formats = { + { INFERENCE_TARGET_CPU, "cpu" }, + { INFERENCE_TARGET_GPU, "gpu" }, + { INFERENCE_TARGET_CUSTOM, "custom" } +}; + +enum { + TEST_IMAGE_CLASSIFICATION = 0, + TEST_OBJECT_DETECTION, + TEST_FACE_DETECTION, + TEST_FACIAL_LANDMARK_DETECTION, + TEST_POSE_ESTIMATION +}; + +int GetModelInfo(std::vector &model_paths, std::vector &models); + +int PrepareTensorBuffers(InferenceEngineCommon *engine, std::vector &inputs, + std::vector &outputs); + +void CleanupTensorBuffers(std::vector &inputs, std::vector &outputs); + +void CopyFileToMemory(const char *file_name, inference_engine_tensor_buffer &buffer, unsigned int size); + +void FillOutputResult(InferenceEngineCommon *engine, std::vector &outputs, tensor_t &outputData); + +int VerifyImageClassificationResults(tensor_t &outputData, int answer); + +int VerifyObjectDetectionResults(tensor_t &outputData, std::vector &answers, int height, int width); + +int VerifyFacialLandmarkDetectionResults(tensor_t &outputData, std::vector &answers, int height, int width); + +int VerifyPoseEstimationResults(tensor_t &outputData, std::vector &answers, int height, int width); \ No newline at end of file -- 2.7.4 From cc1d16c9b7f1e9d3b1b287a7fd08a4ebff58be07 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Wed, 29 Apr 2020 12:14:39 +0900 Subject: [PATCH 10/16] test: rename a test file Just rename inference_engine_test.cpp to inference_engine_profiler.cpp Change-Id: Ia20af23be4f6256dd969eb19a44ff5d780b9ad12 Signed-off-by: Inki Dae --- packaging/inference-engine-interface.spec | 4 ++-- start_profiler.sh | 6 +++--- test/src/CMakeLists.txt | 8 ++++---- .../{inference_engine_test.cpp => inference_engine_profiler.cpp} | 0 4 files changed, 9 insertions(+), 9 deletions(-) rename test/src/{inference_engine_test.cpp => inference_engine_profiler.cpp} (100%) diff --git a/packaging/inference-engine-interface.spec b/packaging/inference-engine-interface.spec index 0344a16..c5a8826 100644 --- a/packaging/inference-engine-interface.spec +++ b/packaging/inference-engine-interface.spec @@ -65,7 +65,7 @@ mkdir -p %{buildroot}/usr/bin/ mkdir -p %{buildroot}/opt/usr/images/ %make_install -install -m 755 test/bin/inference_engine_test %{buildroot}%{_bindir} +install -m 755 test/bin/inference_engine_profiler %{buildroot}%{_bindir} install -m 755 test/bin/inference_engine_tc %{buildroot}%{_bindir} install -m 755 start_profiler.sh %{buildroot}%{_bindir} install -m 666 test/res/*.bin %{buildroot}/opt/usr/images @@ -82,7 +82,7 @@ install -m 666 test/res/*.bin %{buildroot}/opt/usr/images %{_includedir}/media/*.h %{_libdir}/pkgconfig/*common.pc %{_libdir}/lib*-common.so -%{_bindir}/inference_engine_test +%{_bindir}/inference_engine_profiler %{_bindir}/inference_engine_tc %{_bindir}/start_profiler.sh /opt/usr/images/*.bin diff --git a/start_profiler.sh b/start_profiler.sh index 9daa935..5ee2a80 100644 --- a/start_profiler.sh +++ b/start_profiler.sh @@ -8,7 +8,7 @@ echo "Tflite model test case count = $CNT" LIST=$(seq 0 $CNT) for i in $LIST do - /usr/bin/inference_engine_test --gtest_filter=Prefix/InferenceEngineTfliteTest.Inference/$i + /usr/bin/inference_engine_profiler --gtest_filter=Prefix/InferenceEngineTfliteTest.Inference/$i done # Caffe model @@ -19,7 +19,7 @@ echo "Caffe model test case count = $CNT" LIST=$(seq 0 $CNT) for i in $LIST do - /usr/bin/inference_engine_test --gtest_filter=Prefix/InferenceEngineCaffeTest.Inference/$i + /usr/bin/inference_engine_profiler --gtest_filter=Prefix/InferenceEngineCaffeTest.Inference/$i done # If you want to add new model tests then add script for it below @@ -28,5 +28,5 @@ done # LIST=$(seq 0 $CNT) # for i in $LIST # do -# /usr/bin/inference_engine_test --gtest_filter=Prefix/InferenceEngine_model_name_Test.Inference/$i +# /usr/bin/inference_engine_profiler --gtest_filter=Prefix/InferenceEngine_model_name_Test.Inference/$i # done diff --git a/test/src/CMakeLists.txt b/test/src/CMakeLists.txt index 12dec3a..965d997 100644 --- a/test/src/CMakeLists.txt +++ b/test/src/CMakeLists.txt @@ -1,7 +1,7 @@ project(inference_engine_test) set(INFERENCE_ENGINE_TEST_CASE inference_engine_tc) -set(INFERENCE_TEST inference_engine_test) +set(INFERENCE_ENGINE_PROFILER inference_engine_profiler) set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG _DEBUG) @@ -20,13 +20,13 @@ include_directories(/usr/include/gtest) file(GLOB INFER_GTEST_INC_LIST "${PROJECT_SOURCE_DIR}/*.h") -add_executable(${INFERENCE_TEST} +add_executable(${INFERENCE_ENGINE_PROFILER} ${INFER_GTEST_INC_LIST} - ${PROJECT_SOURCE_DIR}/inference_engine_test.cpp + ${PROJECT_SOURCE_DIR}/inference_engine_profiler.cpp ${PROJECT_SOURCE_DIR}/inference_engine_test_common.cpp ) -target_link_libraries(${INFERENCE_TEST} ${GTEST_LIBRARY} +target_link_libraries(${INFERENCE_ENGINE_PROFILER} ${GTEST_LIBRARY} ${GTEST_MAIN_LIBRARY} ${INFERENCE_ENGINE_INTERFACE_LIB_NAME} dl diff --git a/test/src/inference_engine_test.cpp b/test/src/inference_engine_profiler.cpp similarity index 100% rename from test/src/inference_engine_test.cpp rename to test/src/inference_engine_profiler.cpp -- 2.7.4 From db403ba582653c84c62fbec2d181e9da2601c3e2 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Thu, 7 May 2020 18:05:57 +0900 Subject: [PATCH 11/16] Fix UNREACHABLE_CODE issues Change-Id: Idb729c0e74c21e60285df6dd1ffd1a0f9f217aeb Signed-off-by: Inki Dae --- src/inference_engine_profiler.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/inference_engine_profiler.cpp b/src/inference_engine_profiler.cpp index c9427a1..b4a9c2e 100644 --- a/src/inference_engine_profiler.cpp +++ b/src/inference_engine_profiler.cpp @@ -133,7 +133,7 @@ void InferenceEngineProfiler::GetMemoryUsage(MemoryData &data) void InferenceEngineProfiler::Start(const unsigned int type) { - if (IE_PROFILER_MIN >= type && IE_PROFILER_MAX <= type) { + if (IE_PROFILER_MIN >= type || IE_PROFILER_MAX <= type) { LOGE("Invalid profiler type."); return; } @@ -152,7 +152,7 @@ void InferenceEngineProfiler::Start(const unsigned int type) void InferenceEngineProfiler::Stop(const unsigned int type, const char *func_name) { - if (IE_PROFILER_MIN >= type && IE_PROFILER_MAX <= type) { + if (IE_PROFILER_MIN >= type || IE_PROFILER_MAX <= type) { LOGE("Invalid profiler type."); return; } @@ -235,7 +235,7 @@ void InferenceEngineProfiler::DumpToFile(const unsigned int dump_type, std::stri void InferenceEngineProfiler::Dump(const unsigned int dump_type) { - if (IE_PROFILER_DUMP_MIN >= dump_type && IE_PROFILER_DUMP_MAX <= dump_type) { + if (IE_PROFILER_DUMP_MIN >= dump_type || IE_PROFILER_DUMP_MAX <= dump_type) { LOGE("Invalid profiler dump type."); return; } -- 2.7.4 From bd7733b39fb22f6f9ac772f453fd8ec6191c42ae Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Thu, 7 May 2020 18:14:11 +0900 Subject: [PATCH 12/16] Fix UNINIT.CTOR.MANY issues Change-Id: Ieef228cea4ac43b0da154659ca408b04ab726a35 Signed-off-by: Inki Dae --- src/inference_engine_common_impl.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/inference_engine_common_impl.cpp b/src/inference_engine_common_impl.cpp index 7c5f893..ee277f0 100755 --- a/src/inference_engine_common_impl.cpp +++ b/src/inference_engine_common_impl.cpp @@ -41,10 +41,14 @@ namespace Common { InferenceEngineCommon::InferenceEngineCommon() : mSelectedBackendEngine(INFERENCE_BACKEND_NONE), + mProfiler(nullptr), + mUseProfiler(false), + mProfilerDumpType(IE_PROFILER_DUMP_MIN), mBackendModule(nullptr), mBackendHandle(nullptr) { LOGE("ENTER"); + InferenceEngineInI ini; ini.LoadInI(); mSelectedBackendEngine = static_cast(ini.GetSelectedBackendEngine()); @@ -55,20 +59,29 @@ InferenceEngineCommon::InferenceEngineCommon() : InferenceEngineCommon::InferenceEngineCommon(std::string backend) : mSelectedBackendEngine(INFERENCE_BACKEND_NONE), + mProfiler(nullptr), + mUseProfiler(false), + mProfilerDumpType(IE_PROFILER_DUMP_MIN), mBackendModule(nullptr), mBackendHandle(nullptr) { LOGE("ENTER"); + mBackendLibName = "libinference-engine-" + backend + ".so"; + LOGE("LEAVE"); } InferenceEngineCommon::InferenceEngineCommon(inference_backend_type_e backend) : mSelectedBackendEngine(INFERENCE_BACKEND_NONE), + mProfiler(nullptr), + mUseProfiler(false), + mProfilerDumpType(IE_PROFILER_DUMP_MIN), mBackendModule(nullptr), mBackendHandle(nullptr) { LOGE("ENTER"); + SetBackendEngine(backend); LOGI("Backend engine is selected by enum input[%d] set[%d]", backend, mSelectedBackendEngine); LOGE("LEAVE"); @@ -77,13 +90,13 @@ InferenceEngineCommon::InferenceEngineCommon(inference_backend_type_e backend) : InferenceEngineCommon::InferenceEngineCommon(inference_engine_config *config) : mSelectedBackendEngine(INFERENCE_BACKEND_NONE), + mProfiler(nullptr), + mUseProfiler(false), + mProfilerDumpType(IE_PROFILER_DUMP_MIN), mBackendModule(nullptr), mBackendHandle(nullptr) { LOGI("ENTER"); - - mUseProfiler = false; - LOGI("LEAVE"); } -- 2.7.4 From 4c6eab517a2157073a2fdd941a3e6655cdf514c5 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Fri, 8 May 2020 15:29:45 +0900 Subject: [PATCH 13/16] Clean up constructor functions Constructor function of InferenceEngineCommon class doesn't need any parameter so drop other unused functions. Change-Id: Icb806d10050b55456929b6bca5e2901fee2b0354 Signed-off-by: Inki Dae --- include/inference_engine_common_impl.h | 21 --------------- src/inference_engine_common_impl.cpp | 49 ---------------------------------- test/src/inference_engine_profiler.cpp | 6 ++--- test/src/inference_engine_tc.cpp | 6 ++--- 4 files changed, 6 insertions(+), 76 deletions(-) diff --git a/include/inference_engine_common_impl.h b/include/inference_engine_common_impl.h index ccd9cb3..4e3bd64 100755 --- a/include/inference_engine_common_impl.h +++ b/include/inference_engine_common_impl.h @@ -32,29 +32,8 @@ namespace Common { class InferenceEngineCommon { public: - /** - * Deprecated. - */ InferenceEngineCommon(); - /** - * Deprecated. - */ - InferenceEngineCommon(std::string backend); - - /** - * Deprecated. - */ - InferenceEngineCommon(inference_backend_type_e backend); - - /** - * @brief Intialization. - * @details Load the backend engine by dlopen() and initialize the engine by - * calling EngineCommonInit which is found by dlsym(). - * @since_tizen 6.0 - */ - InferenceEngineCommon(inference_engine_config *config); - ~InferenceEngineCommon(); diff --git a/src/inference_engine_common_impl.cpp b/src/inference_engine_common_impl.cpp index ee277f0..ee69405 100755 --- a/src/inference_engine_common_impl.cpp +++ b/src/inference_engine_common_impl.cpp @@ -47,55 +47,6 @@ InferenceEngineCommon::InferenceEngineCommon() : mBackendModule(nullptr), mBackendHandle(nullptr) { - LOGE("ENTER"); - - InferenceEngineInI ini; - ini.LoadInI(); - mSelectedBackendEngine = static_cast(ini.GetSelectedBackendEngine()); - SetBackendEngine(mSelectedBackendEngine); - LOGI("Backend engine is selected by ini file [%d]", mSelectedBackendEngine); - LOGE("LEAVE"); -} - -InferenceEngineCommon::InferenceEngineCommon(std::string backend) : - mSelectedBackendEngine(INFERENCE_BACKEND_NONE), - mProfiler(nullptr), - mUseProfiler(false), - mProfilerDumpType(IE_PROFILER_DUMP_MIN), - mBackendModule(nullptr), - mBackendHandle(nullptr) -{ - LOGE("ENTER"); - - mBackendLibName = "libinference-engine-" + backend + ".so"; - - LOGE("LEAVE"); -} - -InferenceEngineCommon::InferenceEngineCommon(inference_backend_type_e backend) : - mSelectedBackendEngine(INFERENCE_BACKEND_NONE), - mProfiler(nullptr), - mUseProfiler(false), - mProfilerDumpType(IE_PROFILER_DUMP_MIN), - mBackendModule(nullptr), - mBackendHandle(nullptr) -{ - LOGE("ENTER"); - - SetBackendEngine(backend); - LOGI("Backend engine is selected by enum input[%d] set[%d]", backend, mSelectedBackendEngine); - LOGE("LEAVE"); -} - - -InferenceEngineCommon::InferenceEngineCommon(inference_engine_config *config) : - mSelectedBackendEngine(INFERENCE_BACKEND_NONE), - mProfiler(nullptr), - mUseProfiler(false), - mProfilerDumpType(IE_PROFILER_DUMP_MIN), - mBackendModule(nullptr), - mBackendHandle(nullptr) -{ LOGI("ENTER"); LOGI("LEAVE"); } diff --git a/test/src/inference_engine_profiler.cpp b/test/src/inference_engine_profiler.cpp index 61d195b..58324e5 100644 --- a/test/src/inference_engine_profiler.cpp +++ b/test/src/inference_engine_profiler.cpp @@ -81,7 +81,7 @@ TEST_P(InferenceEngineTfliteTest, Inference) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + InferenceEngineCommon *engine = new InferenceEngineCommon(); if (engine == nullptr) { ASSERT_TRUE(engine); return; @@ -266,7 +266,7 @@ TEST_P(InferenceEngineCaffeTest, Inference) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + InferenceEngineCommon *engine = new InferenceEngineCommon(); if (engine == nullptr) { ASSERT_TRUE(engine); return; @@ -453,7 +453,7 @@ TEST_P(InferenceEngineDldtTest, Inference) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + InferenceEngineCommon *engine = new InferenceEngineCommon(); if (engine == nullptr) { ASSERT_TRUE(engine); return; diff --git a/test/src/inference_engine_tc.cpp b/test/src/inference_engine_tc.cpp index 5aa508a..27c5004 100644 --- a/test/src/inference_engine_tc.cpp +++ b/test/src/inference_engine_tc.cpp @@ -50,7 +50,7 @@ TEST_P(InferenceEngineTestCase_G1, Bind_P) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + InferenceEngineCommon *engine = new InferenceEngineCommon(); ASSERT_TRUE(engine); int ret = engine->BindBackend(&config); @@ -84,7 +84,7 @@ TEST_P(InferenceEngineTestCase_G2, Load_P) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + InferenceEngineCommon *engine = new InferenceEngineCommon(); ASSERT_TRUE(engine); int ret = engine->BindBackend(&config); @@ -154,7 +154,7 @@ TEST_P(InferenceEngineTestCase_G3, Inference) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(&config); + InferenceEngineCommon *engine = new InferenceEngineCommon(); if (engine == nullptr) { ASSERT_TRUE(engine); return; -- 2.7.4 From a28e739d81d10e52805adc128358517464d8ab04 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Fri, 8 May 2020 15:46:40 +0900 Subject: [PATCH 14/16] test: use smart pointer instead of raw one Change-Id: I04e4f4e2f887d1850b4e2440a6d2f06a6029b546 Signed-off-by: Inki Dae --- test/src/inference_engine_profiler.cpp | 48 +++++++--------------------------- test/src/inference_engine_tc.cpp | 25 ++++-------------- 2 files changed, 14 insertions(+), 59 deletions(-) diff --git a/test/src/inference_engine_profiler.cpp b/test/src/inference_engine_profiler.cpp index 58324e5..d46ea1b 100644 --- a/test/src/inference_engine_profiler.cpp +++ b/test/src/inference_engine_profiler.cpp @@ -81,7 +81,7 @@ TEST_P(InferenceEngineTfliteTest, Inference) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(); + auto engine = std::make_unique(); if (engine == nullptr) { ASSERT_TRUE(engine); return; @@ -89,21 +89,18 @@ TEST_P(InferenceEngineTfliteTest, Inference) int ret = engine->EnableProfiler(true); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->DumpProfileToFile("profile_data_" + backend_name + "_tflite_model.txt"); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->BindBackend(&config); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -118,7 +115,6 @@ TEST_P(InferenceEngineTfliteTest, Inference) std::vector models; int model_type = GetModelInfo(model_paths, models); if (model_type == -1) { - delete engine; ASSERT_NE(model_type, -1); return; } @@ -140,7 +136,6 @@ TEST_P(InferenceEngineTfliteTest, Inference) ret = engine->SetInputLayerProperty(input_property); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -153,22 +148,19 @@ TEST_P(InferenceEngineTfliteTest, Inference) ret = engine->SetOutputLayerProperty(output_property); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->Load(models, (inference_model_format_e)model_type); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } std::vector inputs, outputs; - ret = PrepareTensorBuffers(engine, inputs, outputs); + ret = PrepareTensorBuffers(engine.get(), inputs, outputs); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -184,7 +176,7 @@ TEST_P(InferenceEngineTfliteTest, Inference) } tensor_t result; - FillOutputResult(engine, outputs, result); + FillOutputResult(engine.get(), outputs, result); switch (test_type) { case TEST_IMAGE_CLASSIFICATION: @@ -215,8 +207,6 @@ TEST_P(InferenceEngineTfliteTest, Inference) engine->UnbindBackend(); models.clear(); - - delete engine; } TEST_P(InferenceEngineCaffeTest, Inference) @@ -266,7 +256,7 @@ TEST_P(InferenceEngineCaffeTest, Inference) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(); + auto engine = std::make_unique(); if (engine == nullptr) { ASSERT_TRUE(engine); return; @@ -274,21 +264,18 @@ TEST_P(InferenceEngineCaffeTest, Inference) int ret = engine->EnableProfiler(true); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->DumpProfileToFile("profile_data_" + backend_name + "_caffe_model.txt"); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->BindBackend(&config); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -303,7 +290,6 @@ TEST_P(InferenceEngineCaffeTest, Inference) std::vector models; int model_type = GetModelInfo(model_paths, models); if (model_type == -1) { - delete engine; ASSERT_NE(model_type, -1); return; } @@ -325,7 +311,6 @@ TEST_P(InferenceEngineCaffeTest, Inference) ret = engine->SetInputLayerProperty(input_property); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -338,22 +323,19 @@ TEST_P(InferenceEngineCaffeTest, Inference) ret = engine->SetOutputLayerProperty(output_property); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->Load(models, (inference_model_format_e)model_type); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } std::vector inputs, outputs; - ret = PrepareTensorBuffers(engine, inputs, outputs); + ret = PrepareTensorBuffers(engine.get(), inputs, outputs); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -369,7 +351,7 @@ TEST_P(InferenceEngineCaffeTest, Inference) } tensor_t result; - FillOutputResult(engine, outputs, result); + FillOutputResult(engine.get(), outputs, result); switch (test_type) { case TEST_IMAGE_CLASSIFICATION: @@ -402,8 +384,6 @@ TEST_P(InferenceEngineCaffeTest, Inference) engine->UnbindBackend(); models.clear(); - - delete engine; } TEST_P(InferenceEngineDldtTest, Inference) @@ -453,7 +433,7 @@ TEST_P(InferenceEngineDldtTest, Inference) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(); + auto engine = std::make_unique(); if (engine == nullptr) { ASSERT_TRUE(engine); return; @@ -461,21 +441,18 @@ TEST_P(InferenceEngineDldtTest, Inference) int ret = engine->EnableProfiler(true); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->DumpProfileToFile("profile_data_" + backend_name + "_dldt_model.txt"); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->BindBackend(&config); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -490,7 +467,6 @@ TEST_P(InferenceEngineDldtTest, Inference) std::vector models; int model_type = GetModelInfo(model_paths, models); if (model_type == -1) { - delete engine; ASSERT_NE(model_type, -1); return; } @@ -512,7 +488,6 @@ TEST_P(InferenceEngineDldtTest, Inference) ret = engine->SetInputLayerProperty(input_property); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -525,22 +500,19 @@ TEST_P(InferenceEngineDldtTest, Inference) ret = engine->SetOutputLayerProperty(output_property); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->Load(models, (inference_model_format_e)model_type); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } std::vector inputs, outputs; - ret = PrepareTensorBuffers(engine, inputs, outputs); + ret = PrepareTensorBuffers(engine.get(), inputs, outputs); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -556,7 +528,7 @@ TEST_P(InferenceEngineDldtTest, Inference) } tensor_t result; - FillOutputResult(engine, outputs, result); + FillOutputResult(engine.get(), outputs, result); switch (test_type) { case TEST_IMAGE_CLASSIFICATION: @@ -589,8 +561,6 @@ TEST_P(InferenceEngineDldtTest, Inference) engine->UnbindBackend(); models.clear(); - - delete engine; } INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineTfliteTest, diff --git a/test/src/inference_engine_tc.cpp b/test/src/inference_engine_tc.cpp index 27c5004..2c1441e 100644 --- a/test/src/inference_engine_tc.cpp +++ b/test/src/inference_engine_tc.cpp @@ -50,12 +50,11 @@ TEST_P(InferenceEngineTestCase_G1, Bind_P) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(); + auto engine = std::make_unique(); ASSERT_TRUE(engine); int ret = engine->BindBackend(&config); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -65,8 +64,6 @@ TEST_P(InferenceEngineTestCase_G1, Bind_P) EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); engine->UnbindBackend(); - - delete engine; } TEST_P(InferenceEngineTestCase_G2, Load_P) @@ -84,12 +81,11 @@ TEST_P(InferenceEngineTestCase_G2, Load_P) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(); + auto engine = std::make_unique(); ASSERT_TRUE(engine); int ret = engine->BindBackend(&config); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -104,7 +100,6 @@ TEST_P(InferenceEngineTestCase_G2, Load_P) std::vector models; int model_type = GetModelInfo(model_paths, models); if (model_type == -1) { - delete engine; ASSERT_NE(model_type, -1); return; } @@ -113,8 +108,6 @@ TEST_P(InferenceEngineTestCase_G2, Load_P) EXPECT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); engine->UnbindBackend(); - - delete engine; } TEST_P(InferenceEngineTestCase_G3, Inference) @@ -154,7 +147,7 @@ TEST_P(InferenceEngineTestCase_G3, Inference) .target_devices = target_devices }; - InferenceEngineCommon *engine = new InferenceEngineCommon(); + auto engine = std::make_unique(); if (engine == nullptr) { ASSERT_TRUE(engine); return; @@ -162,7 +155,6 @@ TEST_P(InferenceEngineTestCase_G3, Inference) int ret = engine->BindBackend(&config); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -177,7 +169,6 @@ TEST_P(InferenceEngineTestCase_G3, Inference) std::vector models; int model_type = GetModelInfo(model_paths, models); if (model_type == -1) { - delete engine; ASSERT_NE(model_type, -1); return; } @@ -199,7 +190,6 @@ TEST_P(InferenceEngineTestCase_G3, Inference) ret = engine->SetInputLayerProperty(input_property); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -212,22 +202,19 @@ TEST_P(InferenceEngineTestCase_G3, Inference) ret = engine->SetOutputLayerProperty(output_property); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } ret = engine->Load(models, (inference_model_format_e)model_type); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } std::vector inputs, outputs; - ret = PrepareTensorBuffers(engine, inputs, outputs); + ret = PrepareTensorBuffers(engine.get(), inputs, outputs); if (ret != INFERENCE_ENGINE_ERROR_NONE) { - delete engine; ASSERT_EQ(ret, INFERENCE_ENGINE_ERROR_NONE); return; } @@ -243,7 +230,7 @@ TEST_P(InferenceEngineTestCase_G3, Inference) } tensor_t result; - FillOutputResult(engine, outputs, result); + FillOutputResult(engine.get(), outputs, result); ret = VerifyImageClassificationResults(result, answers[0]); EXPECT_EQ(ret, 1); @@ -252,8 +239,6 @@ TEST_P(InferenceEngineTestCase_G3, Inference) engine->UnbindBackend(); models.clear(); - - delete engine; } INSTANTIATE_TEST_CASE_P(Prefix, InferenceEngineTestCase_G1, -- 2.7.4 From 5c6fb5e20896984dfd8d8b540b46da80e27f134d Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Fri, 8 May 2020 17:27:20 +0900 Subject: [PATCH 15/16] Clean up class member initialization Change-Id: I29328408fe8f7495ba71ef26e8df08f72a0d4109 Signed-off-by: Inki Dae --- src/inference_engine_common_impl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/inference_engine_common_impl.cpp b/src/inference_engine_common_impl.cpp index ee69405..f1bd550 100755 --- a/src/inference_engine_common_impl.cpp +++ b/src/inference_engine_common_impl.cpp @@ -41,11 +41,11 @@ namespace Common { InferenceEngineCommon::InferenceEngineCommon() : mSelectedBackendEngine(INFERENCE_BACKEND_NONE), - mProfiler(nullptr), + mProfiler(), mUseProfiler(false), mProfilerDumpType(IE_PROFILER_DUMP_MIN), - mBackendModule(nullptr), - mBackendHandle(nullptr) + mBackendModule(), + mBackendHandle() { LOGI("ENTER"); LOGI("LEAVE"); -- 2.7.4 From 1d515df2f235fb6b5e24db3f8f2f12aa7e7ce4e0 Mon Sep 17 00:00:00 2001 From: Inki Dae Date: Mon, 11 May 2020 17:54:38 +0900 Subject: [PATCH 16/16] packaging: drop capi-base-common dependency capi-bace-common package isn't required anymore. Change-Id: I49afc28d97ddf8f7be808c16a3d6ccf72e07b25f Signed-off-by: Inki Dae --- CMakeLists.txt | 2 -- packaging/inference-engine-interface.spec | 1 - 2 files changed, 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ee4669a..5d1646a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,6 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR "${PROJECT_SOURCE_DIR}/include") SET(dependents "dlog iniparser") -SET(pc_dependents "capi-base-common") INCLUDE(FindPkgConfig) pkg_check_modules(${fw_name_common} REQUIRED ${dependents}) @@ -53,7 +52,6 @@ INSTALL( ) SET(PC_NAME ${fw_name_common}) -SET(PC_REQUIRED ${pc_dependents}) SET(PC_LDFLAGS -l${fw_name_common}) SET(PC_CFLAGS -I\${includedir}/media) diff --git a/packaging/inference-engine-interface.spec b/packaging/inference-engine-interface.spec index c5a8826..c7ec666 100644 --- a/packaging/inference-engine-interface.spec +++ b/packaging/inference-engine-interface.spec @@ -8,7 +8,6 @@ Source0: %{name}-%{version}.tar.gz BuildRequires: cmake BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(libtzplatform-config) -BuildRequires: pkgconfig(capi-base-common) BuildRequires: pkgconfig(python) BuildRequires: pkgconfig(iniparser) BuildRequires: gtest-devel -- 2.7.4