mirror of
https://github.com/deepinsight/insightface.git
synced 2026-07-12 07:07:51 +00:00
Added the system resource management and monitoring functions
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user