// // Copyright © 2022 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include #include #include "ArmnnNetworkExecutor.hpp" #include "Types.hpp" #include "ImageUtils.hpp" #include "SSDResultDecoder.hpp" #include "YoloResultDecoder.hpp" using namespace std; static string GetResourceFilePath(const string& filename) { string testResources = TEST_RESOURCE_DIR; if(testResources.back() != '/') { return testResources + "/" + filename; } else { return testResources + filename; } } TEST_CASE("Test Delegate Execution SSD_MOBILE") { string testResources = TEST_RESOURCE_DIR; REQUIRE(testResources != ""); vector m_backends = {"CpuRef"}; string file_path = GetResourceFilePath("ssd_mobilenet_v1.tflite"); common::InferenceResults results; cv::Mat processed; cv::Mat cache; float detectionThreshold = 0.6; common::Profiling profiling(true); profiling.ProfilingStart(); auto executor = make_unique>(file_path, m_backends, true); int width = executor->GetImageAspectRatio().m_Width; int height = executor->GetImageAspectRatio().m_Height; od::SSDResultDecoder ssdResult(detectionThreshold); /* check GetInputDataType */ CHECK(executor->GetInputDataType() == armnn::DataType::QAsymmU8); /* check GetImageAspectRatio */ CHECK(width == 300); CHECK(height == 300); cv::Mat inputFrame = cv::imread(GetResourceFilePath("basketball1.png"), cv::IMREAD_COLOR); cv::cvtColor(inputFrame, inputFrame, cv::COLOR_BGR2RGB); ResizeWithPad(inputFrame, processed, cache, common::Size(width,height)); CHECK(executor->Run(processed.data, processed.total() * processed.elemSize(), results) == true); od::DetectedObjects detections = ssdResult.Decode(results, common::Size(inputFrame.size().width, inputFrame.size().height), common::Size(width, height), {}); /* Make sure we've found 2 persons in the image */ CHECK(detections.size() == 2 ); CHECK(detections[0].GetLabel() == "0"); CHECK(detections[1].GetLabel() == "0"); /* check GetQuantizationScale */ CHECK(to_string(executor->GetQuantizationScale()) == string("0.007812")); /* check GetQuantizationOffset */ CHECK(executor->GetQuantizationOffset() == 128); /* check GetQuantizationScale */ CHECK(executor->GetOutputQuantizationScale(0) == 0.0f); /* check GetOutputQuantizationOffset */ CHECK(executor->GetOutputQuantizationOffset(0) == 0); profiling.ProfilingStopAndPrintUs("Overall test"); } TEST_CASE("Test Delegate Execution YOLO_V3") { string testResources = TEST_RESOURCE_DIR; REQUIRE(testResources != ""); vector m_backends = {"CpuRef"}; string file_path = GetResourceFilePath("yolo_v3_tiny_darknet_fp32.tflite"); common::InferenceResults results; cv::Mat processed; cv::Mat cache; float NMSThreshold = 0.3f; float ClsThreshold = 0.3f; float ObjectThreshold = 0.3f; auto executor = make_unique>(file_path, m_backends); int width = executor->GetImageAspectRatio().m_Width; int height = executor->GetImageAspectRatio().m_Height; od::YoloResultDecoder yoloResult(NMSThreshold, ClsThreshold, ObjectThreshold); /* check GetInputDataType */ CHECK(executor->GetInputDataType() == armnn::DataType::Float32); /* check GetImageAspectRatio */ CHECK(width == 416); CHECK(height == 416); /* read the image */ cv::Mat inputFrame = cv::imread(GetResourceFilePath("basketball1.png"), cv::IMREAD_COLOR); /* resize it according to the the input tensor requirments */ ResizeWithPad(inputFrame, processed, cache, common::Size(width,height)); /* converting to 3 channel matrix of 32 bits floats */ processed.convertTo(processed, CV_32FC3); /* run the inference */ CHECK(executor->Run(processed.data, processed.total() * processed.elemSize(), results) == true); /* decode the results */ od::DetectedObjects detections = yoloResult.Decode(results, common::Size(inputFrame.size().width, inputFrame.size().height), common::Size(width, height), {}); /* Make sure we've found 2 persons in the image */ CHECK(detections.size() == 2 ); CHECK(detections[0].GetLabel() == "0"); CHECK(detections[1].GetLabel() == "0"); /* check GetQuantizationScale */ CHECK(to_string(executor->GetQuantizationScale()) == string("0.000000")); /* check GetQuantizationOffset */ CHECK(executor->GetQuantizationOffset() == 0); /* check GetQuantizationScale */ CHECK(executor->GetOutputQuantizationScale(0) == 0.0f); /* check GetOutputQuantizationOffset */ CHECK(executor->GetOutputQuantizationOffset(0) == 0); }