Added the system resource management and monitoring functions

This commit is contained in:
tunm
2024-10-09 16:42:10 +08:00
parent 4f8c54a09b
commit 4b6acd0bd4
28 changed files with 1144 additions and 590 deletions

View File

@@ -2,9 +2,12 @@ cmake_minimum_required(VERSION 3.10)
project(HyperFaceTest)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
# If you want to test the benchmark, you need to set this to ON
option(ISF_ENABLE_BENCHMARK "Enable the benchmark test cases." ON)
option(ISF_ENABLE_USE_LFW_DATA "Enable test cases for LFW data sets." ON)
option(ISF_ENABLE_TEST_EVALUATION "Enable evaluation function test cases." ON)
# If you want to test the LFW data set, you need to set this to ON
option(ISF_ENABLE_USE_LFW_DATA "Enable test cases for LFW data sets." OFF)
# If you want to test the evaluation function, you need to set this to ON, need LFW data set.
option(ISF_ENABLE_TEST_EVALUATION "Enable evaluation function test cases." OFF)
if (ISF_ENABLE_BENCHMARK)
add_definitions("-DISF_ENABLE_BENCHMARK")

View File

@@ -7,35 +7,53 @@
#include <string>
/**
* @class Enviro
* @brief A singleton class for managing environment-specific configurations.
*
* This class provides methods to set and get various environment-specific configurations
* such as the resource pack name, test result directory, and runtime full path.
*/
class Enviro {
public:
static Enviro& getInstance() {
static Enviro &getInstance() {
static Enviro instance;
return instance;
}
Enviro(Enviro const&) = delete;
void operator=(Enviro const&) = delete;
Enviro(Enviro const &) = delete;
void operator=(Enviro const &) = delete;
std::string getPackName() const { return packName; }
void setPackName(const std::string& name) { packName = name; }
std::string getPackName() const {
return packName;
}
const std::string &getTestResDir() const { return testResDir; }
void setPackName(const std::string &name) {
packName = name;
}
void setTestResDir(const std::string &dir) { Enviro::testResDir = dir; }
const std::string &getTestResDir() const {
return testResDir;
}
const std::string &getTestRuntimeFullPath() const { return runtimeFullPath; }
void setTestResDir(const std::string &dir) {
Enviro::testResDir = dir;
}
void setTestRuntimeFullPath(const std::string &path) { Enviro::runtimeFullPath = path; }
const std::string &getTestRuntimeFullPath() const {
return runtimeFullPath;
}
void setTestRuntimeFullPath(const std::string &path) {
Enviro::runtimeFullPath = path;
}
private:
Enviro() {}
std::string packName = "Pikachu";
std::string testResDir = "test_res";
std::string runtimeFullPath = "";
std::string packName{"Pikachu"};
std::string testResDir{"test_res"};
std::string runtimeFullPath;
};
#endif //INSPIREFACE_ENVIRO_H
#endif // INSPIREFACE_ENVIRO_H

View File

@@ -9,31 +9,56 @@
#include <iostream>
#include "enviro.h"
// Define the test model file
#define TEST_MODEL_FILE Enviro::getInstance().getPackName()
#define TEST_MODEL_FILE Enviro::getInstance().getPackName() // Optional model file
// Set the pack name
#define SET_PACK_NAME(name) Enviro::getInstance().setPackName(name)
// Set the test directory
#define SET_TEST_DIR(dir) Enviro::getInstance().setTestResDir(dir)
// Set the runtime full path
#define SET_RUNTIME_FULLPATH_NAME(name) Enviro::getInstance().setTestRuntimeFullPath(name)
// Get the runtime full path
#define GET_RUNTIME_FULLPATH_NAME Enviro::getInstance().getTestRuntimeFullPath()
#define TEST_LFW_FUNNELED_TXT "valid_lfw_funneled.txt" // LFW Index txt file
#define LFW_FUNNELED_DIR "" // LFW funneled data dir
// Define the LFW funneled index txt file
#define TEST_LFW_FUNNELED_TXT "valid_lfw_funneled.txt"
// Define the LFW funneled data directory
#define LFW_FUNNELED_DIR ""
// Define the LFW evaluation txt file
#define TEST_LFW_EVALUATION_TXT "pairs.txt"
// Define the benchmark record file
#define TEST_BENCHMARK_RECORD "benchmark.csv"
// Define the evaluation record file
#define TEST_EVALUATION_RECORD "evaluation.csv"
using namespace Catch::Detail;
// Print test message
#define TEST_PRINT(...) SPDLOG_LOGGER_CALL(spdlog::get("TEST"), spdlog::level::trace, __VA_ARGS__)
// Print test message output
#define TEST_PRINT_OUTPUT(open) TestMessageBroadcast test_msg_broadcast_##open(open)
// Set the log output level
#define LOG_OUTPUT_LEVEL(level) LogLevelBroadcast log_level_broadcast_##level(level);
// Get the test data directory
#define GET_DIR getTestDataDir()
// Get the test data
#define GET_DATA(filename) getTestData(filename)
// Get the test models file
#define GET_MODEL_FILE() getTestModelsFile()
// Get the LFW funneled index txt file
#define GET_LFW_FUNNELED_TXT() getTestLFWFunneledTxt()
// Get the LFW funneled evaluation txt file
#define GET_LFW_FUNNELED_EVA_TXT() getTestLFWFunneledEvaTxt()
// Get the LFW funneled directory
#define GET_LFW_FUNNELED_DIR() getLFWFunneledDir()
// Get the benchmark record file
#define GET_BENCHMARK_RECORD_FILE() getBenchmarkRecordFile()
// Get the evaluation record file
#define GET_SAVE_DIR getTestSaveDir()
// Get the test save data
#define GET_SAVE_DATA(filename) getTestSaveData(filename)
std::string getTestDataDir();
@@ -87,14 +112,22 @@ public:
spdlog::get("TEST")->set_level(m_old_level);
}
private:
spdlog::level::level_enum m_old_level;
};
/**
* @class LogLevelBroadcast
* @brief A class for broadcasting log level changes.
*
* This class is used to set the log level for the logger.
*/
class LogLevelBroadcast {
public:
/**
* @brief Constructor for LogLevelBroadcast.
* @param level The log level to set.
*/
explicit LogLevelBroadcast(LOG_LEVEL level) {
m_oldLevel = level;
spdlog::set_level(spdlog::level::level_enum(level));
@@ -108,18 +141,12 @@ private:
LOG_LEVEL m_oldLevel;
};
struct test_case_split {
~test_case_split() {
std::cout
<< "==============================================================================="
<< std::endl;
std::cout << "===============================================================================" << std::endl;
}
#define DRAW_SPLIT_LINE test_case_split split_line_x;
};
#endif //BIGGUYSMAIN_TEST_SETTINGS_H
#endif // BIGGUYSMAIN_TEST_SETTINGS_H

View File

@@ -58,10 +58,9 @@ int main(int argc, char* argv[]) {
std::string packPath;
// Add command line options
auto cli =
session.cli() | Catch::clara::Opt(pack, "value")["--pack"]("Resource pack filename") |
Catch::clara::Opt(testDir, "value")["--test_dir"]("Test dir resource") |
Catch::clara::Opt(packPath, "value")["--pack_path"]("The specified path to the pack file");
auto cli = session.cli() | Catch::clara::Opt(pack, "value")["--pack"]("Resource pack filename") |
Catch::clara::Opt(testDir, "value")["--test_dir"]("Test dir resource") |
Catch::clara::Opt(packPath, "value")["--pack_path"]("The specified path to the pack file");
// Set combined CLI to the session
session.cli(cli);
@@ -105,8 +104,14 @@ int main(int argc, char* argv[]) {
// Set log level
HFSetLogLevel(HF_LOG_INFO);
// Run the test
ret = session.run();
// Terminate the InspireFace instance
HFTerminateInspireFace();
// Show resource statistics
HFDeBugShowResourceStatistics();
return ret;
}

View File

@@ -10,7 +10,6 @@
#include "unit/test_helper/test_help.h"
#include "unit/test_helper/test_tools.h"
TEST_CASE("test_FaceTrack", "[face_track]") {
DRAW_SPLIT_LINE
TEST_PRINT_OUTPUT(true);
@@ -67,7 +66,6 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
SECTION("Face tracking stability from frames") {
@@ -92,7 +90,7 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
HFMultipleFaceData multipleFaceData = {0};
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
REQUIRE(ret == HSUCCEED);
// CHECK(multipleFaceData.detectedNum == 1);
// CHECK(multipleFaceData.detectedNum == 1);
if (multipleFaceData.detectedNum != 1) {
count_loss++;
continue;
@@ -103,7 +101,7 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
std::string save = GET_SAVE_DATA("data/video_frames") + "/" + std::to_string(i) + ".jpg";
cv::imwrite(save, image);
auto id = multipleFaceData.trackIds[0];
// TEST_PRINT("{}", id);
// TEST_PRINT("{}", id);
if (id != expectedId) {
count_loss++;
}
@@ -111,9 +109,9 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
ret = HFReleaseImageStream(imgHandle);
REQUIRE(ret == HSUCCEED);
}
float loss = (float )count_loss / filenames.size();
float loss = (float)count_loss / filenames.size();
// The face track loss is allowed to have an error of 5%
// CHECK(loss == Approx(0.0f).epsilon(0.05));
// CHECK(loss == Approx(0.0f).epsilon(0.05));
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
@@ -220,7 +218,6 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
// finish
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
#ifdef ISF_ENABLE_BENCHMARK
@@ -243,11 +240,11 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
REQUIRE(ret == HSUCCEED);
HFMultipleFaceData multipleFaceData = {0};
auto start = (double) cv::getTickCount();
auto start = (double)cv::getTickCount();
for (int i = 0; i < loop; ++i) {
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
}
auto cost = ((double) cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
auto cost = ((double)cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
REQUIRE(ret == HSUCCEED);
REQUIRE(multipleFaceData.detectedNum == 1);
TEST_PRINT("<Benchmark> Face Detect@160 -> Loop: {}, Total Time: {:.5f}ms, Average Time: {:.5f}ms", loop, cost, cost / loop);
@@ -258,7 +255,6 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
SECTION("Face detection benchmark@320") {
@@ -280,11 +276,11 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
REQUIRE(ret == HSUCCEED);
HFMultipleFaceData multipleFaceData = {0};
auto start = (double) cv::getTickCount();
auto start = (double)cv::getTickCount();
for (int i = 0; i < loop; ++i) {
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
}
auto cost = ((double) cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
auto cost = ((double)cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
REQUIRE(ret == HSUCCEED);
REQUIRE(multipleFaceData.detectedNum == 1);
TEST_PRINT("<Benchmark> Face Detect@320 -> Loop: {}, Total Time: {:.5f}ms, Average Time: {:.5f}ms", loop, cost, cost / loop);
@@ -295,10 +291,8 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
SECTION("Face detection benchmark@640") {
int loop = 1000;
HResult ret;
@@ -318,11 +312,11 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
REQUIRE(ret == HSUCCEED);
HFMultipleFaceData multipleFaceData = {0};
auto start = (double) cv::getTickCount();
auto start = (double)cv::getTickCount();
for (int i = 0; i < loop; ++i) {
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
}
auto cost = ((double) cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
auto cost = ((double)cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
REQUIRE(ret == HSUCCEED);
REQUIRE(multipleFaceData.detectedNum == 1);
TEST_PRINT("<Benchmark> Face Detect@640 -> Loop: {}, Total Time: {:.5f}ms, Average Time: {:.5f}ms", loop, cost, cost / loop);
@@ -333,7 +327,6 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
#else
TEST_PRINT("Skip the face detection benchmark test. To run it, you need to turn on the benchmark test.");
@@ -359,11 +352,11 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
// Case: Execute the benchmark using the VIDEO mode(Track)
REQUIRE(ret == HSUCCEED);
HFMultipleFaceData multipleFaceData = {0};
auto start = (double) cv::getTickCount();
auto start = (double)cv::getTickCount();
for (int i = 0; i < loop; ++i) {
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
}
auto cost = ((double) cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
auto cost = ((double)cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
REQUIRE(ret == HSUCCEED);
REQUIRE(multipleFaceData.detectedNum > 0);
TEST_PRINT("<Benchmark> Face Track -> Loop: {}, Total Time: {:.5f}ms, Average Time: {:.5f}ms", loop, cost, cost / loop);
@@ -377,15 +370,13 @@ TEST_CASE("test_FaceTrack", "[face_track]") {
#else
TEST_PRINT("Skip the face light track benchmark test. To run it, you need to turn on the benchmark test.");
#endif
}
}
TEST_CASE("test_MultipleLevelFaceDetect", "[face_detect]") {
DRAW_SPLIT_LINE
TEST_PRINT_OUTPUT(true);
SECTION("Detect input 160px") {
HResult ret;
HFSessionCustomParameter parameter = {0};
@@ -417,7 +408,7 @@ TEST_CASE("test_MultipleLevelFaceDetect", "[face_detect]") {
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
SECTION("Detect input 320px") {
HResult ret;
HFSessionCustomParameter parameter = {0};
@@ -449,7 +440,7 @@ TEST_CASE("test_MultipleLevelFaceDetect", "[face_detect]") {
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
SECTION("Detect input 640px") {
HResult ret;
HFSessionCustomParameter parameter = {0};
@@ -481,8 +472,6 @@ TEST_CASE("test_MultipleLevelFaceDetect", "[face_detect]") {
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
}
TEST_CASE("test_FaceShowLandmark", "[face_landmark]") {
@@ -490,9 +479,9 @@ TEST_CASE("test_FaceShowLandmark", "[face_landmark]") {
TEST_PRINT_OUTPUT(true);
std::vector<std::string> images_path = {
GET_DATA("data/reaction/close_open_eyes.jpeg"),
GET_DATA("data/reaction/open_eyes.png"),
GET_DATA("data/reaction/close_eyes.jpeg"),
GET_DATA("data/reaction/close_open_eyes.jpeg"),
GET_DATA("data/reaction/open_eyes.png"),
GET_DATA("data/reaction/close_eyes.jpeg"),
};
HResult ret;
@@ -505,13 +494,12 @@ TEST_CASE("test_FaceShowLandmark", "[face_landmark]") {
HFSessionSetTrackPreviewSize(session, detectPixelLevel);
HFSessionSetFilterMinimumFacePixelSize(session, 0);
for (size_t i = 0; i < images_path.size(); i++)
{
for (size_t i = 0; i < images_path.size(); i++) {
HFImageStream imgHandle;
auto image = cv::imread(images_path[i]);
ret = CVImageToImageStream(image, imgHandle);
REQUIRE(ret == HSUCCEED);
// Extract basic face information from photos
HFMultipleFaceData multipleFaceData = {0};
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
@@ -519,7 +507,6 @@ TEST_CASE("test_FaceShowLandmark", "[face_landmark]") {
REQUIRE(multipleFaceData.detectedNum > 0);
HInt32 numOfLmk;
HFGetNumOfFaceDenseLandmark(&numOfLmk);
HPoint2f denseLandmarkPoints[numOfLmk];
@@ -534,9 +521,111 @@ TEST_CASE("test_FaceShowLandmark", "[face_landmark]") {
ret = HFReleaseImageStream(imgHandle);
REQUIRE(ret == HSUCCEED);
}
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
TEST_CASE("test_FaceDetectConfidence", "[face_track]") {
DRAW_SPLIT_LINE
TEST_PRINT_OUTPUT(true);
SECTION("DetectConfidenceSchedule-1") {
// Schedule 1:
HFloat threshold = 0.4f;
HInt32 detectPixelLevel = 160;
HInt32 maxDetectNum = 20;
HResult ret;
HFSessionCustomParameter parameter = {0};
HFDetectMode detMode = HF_DETECT_MODE_ALWAYS_DETECT;
HFSession session;
ret = HFCreateInspireFaceSession(parameter, detMode, maxDetectNum, detectPixelLevel, -1, &session);
REQUIRE(ret == HSUCCEED);
ret = HFSessionSetFaceDetectThreshold(session, threshold);
REQUIRE(ret == HSUCCEED);
// Prepare an image
HFImageStream imgHandle;
auto image = cv::imread(GET_DATA("data/bulk/pedestrian.png"));
ret = CVImageToImageStream(image, imgHandle);
REQUIRE(ret == HSUCCEED);
// Extract basic face information from photos
HFMultipleFaceData multipleFaceData = {0};
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
REQUIRE(ret == HSUCCEED);
for (int i = 0; i < multipleFaceData.detectedNum; i++) {
CHECK(multipleFaceData.detConfidence[i] >= threshold);
}
ret = HFReleaseImageStream(imgHandle);
REQUIRE(ret == HSUCCEED);
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
SECTION("DetectConfidenceSchedule-2") {
// Schedule 2:
HFloat threshold = 0.7f;
HInt32 detectPixelLevel = 320;
HInt32 maxDetectNum = 10;
HResult ret;
HFSessionCustomParameter parameter = {0};
HFDetectMode detMode = HF_DETECT_MODE_ALWAYS_DETECT;
HFSession session;
ret = HFCreateInspireFaceSession(parameter, detMode, maxDetectNum, detectPixelLevel, -1, &session);
REQUIRE(ret == HSUCCEED);
ret = HFSessionSetFaceDetectThreshold(session, threshold);
REQUIRE(ret == HSUCCEED);
// Prepare an image
HFImageStream imgHandle;
auto image = cv::imread(GET_DATA("data/bulk/pedestrian.png"));
ret = CVImageToImageStream(image, imgHandle);
REQUIRE(ret == HSUCCEED);
// Extract basic face information from photos
HFMultipleFaceData multipleFaceData = {0};
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
REQUIRE(ret == HSUCCEED);
for (int i = 0; i < multipleFaceData.detectedNum; i++) {
CHECK(multipleFaceData.detConfidence[i] >= threshold);
}
ret = HFReleaseImageStream(imgHandle);
REQUIRE(ret == HSUCCEED);
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
SECTION("DetectConfidenceSchedule-3") {
// Schedule 3:
HFloat threshold = 0.80f;
HInt32 detectPixelLevel = 640;
HInt32 maxDetectNum = 20;
HResult ret;
HFSessionCustomParameter parameter = {0};
HFDetectMode detMode = HF_DETECT_MODE_ALWAYS_DETECT;
HFSession session;
ret = HFCreateInspireFaceSession(parameter, detMode, maxDetectNum, detectPixelLevel, -1, &session);
REQUIRE(ret == HSUCCEED);
ret = HFSessionSetFaceDetectThreshold(session, threshold);
REQUIRE(ret == HSUCCEED);
// Prepare an image
HFImageStream imgHandle;
auto image = cv::imread(GET_DATA("data/bulk/pedestrian.png"));
ret = CVImageToImageStream(image, imgHandle);
REQUIRE(ret == HSUCCEED);
// Extract basic face information from photos
HFMultipleFaceData multipleFaceData = {0};
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
REQUIRE(ret == HSUCCEED);
for (int i = 0; i < multipleFaceData.detectedNum; i++) {
CHECK(multipleFaceData.detConfidence[i] >= threshold);
}
ret = HFReleaseImageStream(imgHandle);
REQUIRE(ret == HSUCCEED);
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
}

View File

@@ -2,6 +2,8 @@
#include "settings/test_settings.h"
#include "inspireface/c_api/inspireface.h"
#include "inspireface/herror.h"
#include "opencv2/opencv.hpp"
#include "unit/test_helper/test_tools.h"
#include <cstdio>
TEST_CASE("test_System", "[system]") {
@@ -37,4 +39,230 @@ TEST_CASE("test_System", "[system]") {
ret = HFReleaseInspireFaceSession(session);
REQUIRE(ret == HSUCCEED);
}
}
TEST_CASE("test_SystemSessionReleaseCase", "[system]") {
/**
* @brief Test the release of sessions
* @details Test the release of sessions and check the unreleased sessions count
*/
DRAW_SPLIT_LINE
TEST_PRINT_OUTPUT(true);
HResult ret;
SECTION("CreateSessions") {
/**
* @brief Create sessions
* @details Create 10 sessions and check the unreleased sessions count
*/
HInt32 count;
ret = HFDeBugGetUnreleasedSessionsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == 0);
HInt32 createCount = 10;
HFSession sessions[createCount];
for (int i = 0; i < createCount; ++i) {
ret = HFCreateInspireFaceSessionOptional(HF_ENABLE_NONE, HF_DETECT_MODE_ALWAYS_DETECT, 3, -1, -1, &sessions[i]);
REQUIRE(ret == HSUCCEED);
}
ret = HFDeBugGetUnreleasedSessionsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == createCount);
HFSession sessionsGet[createCount];
ret = HFDeBugGetUnreleasedSessions(sessionsGet, createCount);
REQUIRE(ret == HSUCCEED);
// The session list obtained from the api is also unordered because it is sorted internally using an unordered dictionary
for (int i = 0; i < createCount; ++i) {
bool found = false;
for (int j = 0; j < createCount; ++j) {
if (sessions[i] == sessionsGet[j]) {
found = true;
break;
}
}
REQUIRE(found);
}
}
SECTION("ReleaseSomeSessions") {
/**
* @brief Release some sessions
* @details Release some sessions and check the unreleased sessions count
*/
HInt32 count;
ret = HFDeBugGetUnreleasedSessionsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == 10);
auto createCount = count;
HFSession sessionsGet[createCount];
ret = HFDeBugGetUnreleasedSessions(sessionsGet, createCount);
REQUIRE(ret == HSUCCEED);
std::vector<int32_t> releaseIndex = {0, 2, 4, 6, 8};
for (int i = 0; i < releaseIndex.size(); ++i) {
ret = HFReleaseInspireFaceSession(sessionsGet[releaseIndex[i]]);
REQUIRE(ret == HSUCCEED);
}
ret = HFDeBugGetUnreleasedSessionsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == createCount - releaseIndex.size());
HFSession sessionsGet2[count];
ret = HFDeBugGetUnreleasedSessions(sessionsGet2, count);
REQUIRE(ret == HSUCCEED);
for (int i = 0; i < count; ++i) {
bool found = false;
for (int j = 0; j < releaseIndex.size(); ++j) {
if (sessionsGet2[i] == sessionsGet[releaseIndex[j]]) {
found = true;
break;
}
}
REQUIRE(!found);
}
}
SECTION("ReleaseAllSessions") {
/**
* @brief Release all sessions
* @details Release all sessions and check the unreleased sessions count
*/
HInt32 count;
ret = HFDeBugGetUnreleasedSessionsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == 5);
HFSession sessionsGet[count];
ret = HFDeBugGetUnreleasedSessions(sessionsGet, count);
REQUIRE(ret == HSUCCEED);
for (int i = 0; i < count; ++i) {
ret = HFReleaseInspireFaceSession(sessionsGet[i]);
REQUIRE(ret == HSUCCEED);
}
ret = HFDeBugGetUnreleasedSessionsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == 0);
}
}
TEST_CASE("test_SystemStreamReleaseCase", "[system]") {
/**
* @brief Test the release of streams
* @details Test the release of streams and check the unreleased streams count
*/
DRAW_SPLIT_LINE
TEST_PRINT_OUTPUT(true);
HResult ret;
SECTION("CreateStreams") {
/**
* @brief Create streams
* @details Create 10 streams and check the unreleased streams count
*/
HInt32 count;
ret = HFDeBugGetUnreleasedStreamsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == 0);
HInt32 createCount = 10;
HFImageStream streams[createCount];
for (int i = 0; i < createCount; ++i) {
HFImageStream imgHandle;
auto image = cv::imread(GET_DATA("data/bulk/pedestrian.png"));
ret = CVImageToImageStream(image, imgHandle);
REQUIRE(ret == HSUCCEED);
streams[i] = imgHandle;
}
ret = HFDeBugGetUnreleasedStreamsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == createCount);
HFImageStream streamsGet[createCount];
ret = HFDeBugGetUnreleasedStreams(streamsGet, createCount);
REQUIRE(ret == HSUCCEED);
for (int i = 0; i < createCount; ++i) {
bool found = false;
for (int j = 0; j < createCount; ++j) {
if (streams[i] == streamsGet[j]) {
found = true;
break;
}
}
REQUIRE(found);
}
}
SECTION("ReleaseSomeStreams") {
/**
* @brief Release some streams
* @details Release some streams and check the unreleased streams count
*/
HInt32 count;
ret = HFDeBugGetUnreleasedStreamsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == 10);
auto createCount = count;
HFImageStream streamsGet[count];
ret = HFDeBugGetUnreleasedStreams(streamsGet, count);
REQUIRE(ret == HSUCCEED);
std::vector<int32_t> releaseIndex = {0, 2, 4, 6, 8};
for (int i = 0; i < releaseIndex.size(); ++i) {
ret = HFReleaseImageStream(streamsGet[releaseIndex[i]]);
REQUIRE(ret == HSUCCEED);
}
ret = HFDeBugGetUnreleasedStreamsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == createCount - releaseIndex.size());
HFImageStream streamsGet2[count];
ret = HFDeBugGetUnreleasedStreams(streamsGet2, count);
REQUIRE(ret == HSUCCEED);
for (int i = 0; i < count; ++i) {
bool found = false;
for (int j = 0; j < releaseIndex.size(); ++j) {
if (streamsGet2[i] == streamsGet[releaseIndex[j]]) {
found = true;
break;
}
}
REQUIRE(!found);
}
}
SECTION("ReleaseAllStreams") {
/**
* @brief Release all streams
* @details Release all streams and check the unreleased streams count
*/
HInt32 count;
ret = HFDeBugGetUnreleasedStreamsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == 5);
HFImageStream streamsGet[count];
ret = HFDeBugGetUnreleasedStreams(streamsGet, count);
REQUIRE(ret == HSUCCEED);
for (int i = 0; i < count; ++i) {
ret = HFReleaseImageStream(streamsGet[i]);
REQUIRE(ret == HSUCCEED);
}
ret = HFDeBugGetUnreleasedStreamsCount(&count);
REQUIRE(ret == HSUCCEED);
REQUIRE(count == 0);
}
}