From 4b6acd0bd47c33bf33d2333c42e976f992263ad5 Mon Sep 17 00:00:00 2001 From: tunm Date: Wed, 9 Oct 2024 16:42:10 +0800 Subject: [PATCH] Added the system resource management and monitoring functions --- cpp-package/inspireface/CMakeLists.txt | 13 +- cpp-package/inspireface/README.md | 2 + .../Initialization_module/launch.cpp | 10 +- .../Initialization_module/resource_manage.h | 48 ++- .../cpp/inspireface/c_api/inspireface.cc | 75 ++-- .../cpp/inspireface/c_api/inspireface.h | 153 ++++---- .../inspireface/cpp/inspireface/cost_time.h | 31 +- .../cpp/inspireface/face_context.cpp | 86 +++-- .../cpp/inspireface/face_context.h | 101 +++--- .../inspireface/cpp/inspireface/information.h | 2 +- cpp-package/inspireface/cpp/inspireface/log.h | 54 +-- .../inspireface/track_module/face_track.cpp | 206 +++++------ .../track_module/tracker_optional/README.md | 10 + .../inspireface/cpp/inspireface/version.txt | 2 +- .../cpp/sample/cpp/sample_face_track.cpp | 18 +- .../inspireface/cpp/test/CMakeLists.txt | 7 +- .../inspireface/cpp/test/settings/enviro.h | 48 ++- .../cpp/test/settings/test_settings.h | 55 ++- cpp-package/inspireface/cpp/test/test.cpp | 13 +- .../cpp/test/unit/api/test_face_track.cpp | 157 ++++++-- .../cpp/test/unit/api/test_system.cpp | 228 ++++++++++++ cpp-package/inspireface/python/README.md | 2 + .../python/inspireface/modules/__init__.py | 3 +- .../python/inspireface/modules/core/native.py | 343 ++++++++++-------- .../inspireface/modules/inspire_face.py | 24 ++ .../python/sample_face_detection.py | 6 +- .../sample_system_resource_statistics.py | 37 ++ cpp-package/inspireface/python/tmp/det.jpg | Bin 248241 -> 0 bytes 28 files changed, 1144 insertions(+), 590 deletions(-) create mode 100644 cpp-package/inspireface/python/sample_system_resource_statistics.py delete mode 100644 cpp-package/inspireface/python/tmp/det.jpg diff --git a/cpp-package/inspireface/CMakeLists.txt b/cpp-package/inspireface/CMakeLists.txt index 23c3a63..1acdf8d 100644 --- a/cpp-package/inspireface/CMakeLists.txt +++ b/cpp-package/inspireface/CMakeLists.txt @@ -69,7 +69,7 @@ if (ISF_ENABLE_RKNN) message(STATUS "Use ${ISF_RKNPU_MAJOR}") endif () - +# Platform configuration option(ISF_BUILD_LINUX_ARM7 "Platform Armv7." OFF) option(ISF_BUILD_LINUX_AARCH64 "Platform Armv8." OFF) option(ISF_GLOBAL_INFERENCE_BACKEND_USE_MNN_CUDA "The global inference backend uses MNN CUDA." OFF) @@ -82,7 +82,10 @@ if (ISF_BUILD_LINUX_AARCH64) set(CPU_ARCH "aarch64") endif() +# If you want to build the unit-test, you need to set this to ON option(ISF_BUILD_WITH_TEST "Open Build Unit-Test." ON) + +# If you want to build the sample, you need to set this to ON option(ISF_BUILD_WITH_SAMPLE "Open Build Sample Exec." ON) set(SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cpp/) @@ -143,6 +146,7 @@ else() find_package(OpenCV REQUIRED) endif () +# If you need using CUDA-enabled MNN, you need to manually configure the pre-compiled CUDA-enabled MNN library path set(ISF_LINUX_MNN_CUDA "" CACHE STRING "Path to CUDA directory") if (ISF_GLOBAL_INFERENCE_BACKEND_USE_MNN_CUDA) @@ -181,16 +185,19 @@ else () endif () -# Set install path +# Set the installation directory to the build directory set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install") -add_subdirectory(cpp/inspireface) # Add a child project: InspireFace Source +# Add a child project: InspireFace Source +add_subdirectory(cpp/inspireface) get_property(InspireFace TARGET InspireFace PROPERTY InspireFace) +# Add a child project: Samples if (ISF_BUILD_WITH_SAMPLE) add_subdirectory(cpp/sample) # Add a child project: Samples endif () +# Add a child project: Unit-Test if (ISF_BUILD_WITH_TEST) add_subdirectory(cpp/test) # Add a child project: Unit-Test endif () diff --git a/cpp-package/inspireface/README.md b/cpp-package/inspireface/README.md index d6977b8..f7418f7 100644 --- a/cpp-package/inspireface/README.md +++ b/cpp-package/inspireface/README.md @@ -13,6 +13,8 @@ Please contact [contact@insightface.ai](mailto:contact@insightface.ai?subject=In ## Change Logs +**`2024-10-09`** Enhanced system-level resource monitoring, added statistical information for session and image stream creation. + **`2024-09-30`** Fixed some bugs in the feature hub. **`2024-08-18`** Updating [Benchmark](doc/Benchmark-Remark(Updating).md): Using CoreML with Apple's Neural Engine (ANE) on the iPhone 13, the combined processes of **Face Detection** + **Alignment** + **Feature Extraction** take less than **2ms**. diff --git a/cpp-package/inspireface/cpp/inspireface/Initialization_module/launch.cpp b/cpp-package/inspireface/cpp/inspireface/Initialization_module/launch.cpp index 1e4323c..160fd02 100644 --- a/cpp-package/inspireface/cpp/inspireface/Initialization_module/launch.cpp +++ b/cpp-package/inspireface/cpp/inspireface/Initialization_module/launch.cpp @@ -6,7 +6,6 @@ #include "log.h" #include "herror.h" - namespace inspire { std::mutex Launch::mutex_; @@ -24,7 +23,7 @@ std::shared_ptr Launch::GetInstance() { return instance_; } -int32_t Launch::Load(const std::string &path) { +int32_t Launch::Load(const std::string& path) { if (!m_load_) { m_archive_.ReLoad(path); if (m_archive_.QueryStatus() == SARC_SUCCESS) { @@ -34,7 +33,8 @@ int32_t Launch::Load(const std::string &path) { return HERR_ARCHIVE_LOAD_MODEL_FAILURE; } } else { - INSPIRE_LOGW("There is no need to call launch more than once, as subsequent calls will not affect the initialization."); + INSPIRE_LOGW( + "There is no need to call launch more than once, as subsequent calls will not affect the initialization."); return HSUCCEED; } } @@ -47,7 +47,7 @@ void Launch::Unload() { std::lock_guard lock(mutex_); if (m_load_) { // Assuming InspireArchive has a method to clear its resources - m_archive_.Release(); + m_archive_.Release(); m_load_ = false; INSPIRE_LOGI("All resources have been successfully unloaded and system is reset."); } else { @@ -55,4 +55,4 @@ void Launch::Unload() { } } -} // namespace inspire \ No newline at end of file +} // namespace inspire \ No newline at end of file diff --git a/cpp-package/inspireface/cpp/inspireface/Initialization_module/resource_manage.h b/cpp-package/inspireface/cpp/inspireface/Initialization_module/resource_manage.h index c03741b..38c6e9f 100644 --- a/cpp-package/inspireface/cpp/inspireface/Initialization_module/resource_manage.h +++ b/cpp-package/inspireface/cpp/inspireface/Initialization_module/resource_manage.h @@ -7,7 +7,7 @@ #include #include #include // For std::setw and std::left - +#include #ifndef INSPIRE_API #define INSPIRE_API #endif @@ -16,7 +16,12 @@ namespace inspire { -class ResourceManager { +/** + * @brief ResourceManager is a singleton class that manages the creation and release of sessions and image streams. + * It uses hash tables to store session and image stream handles, and provides methods to create, release, and query these resources. + * The ResourceManager class is designed to be used in a multi-threaded environment, and it uses a mutex to synchronize access to its data structures. + */ +class INSPIRE_API ResourceManager { private: // Private static instance pointer static std::unique_ptr instance; @@ -79,12 +84,35 @@ public: // released } + // Gets a list of unreleased session handles + std::vector getUnreleasedSessions() { + std::lock_guard lock(mutex); + std::vector unreleasedSessions; + for (const auto& entry : sessionMap) { + if (!entry.second) { + unreleasedSessions.push_back(entry.first); + } + } + return unreleasedSessions; + } + + // Gets a list of unreleased image stream handles + std::vector getUnreleasedStreams() { + std::lock_guard lock(mutex); + std::vector unreleasedStreams; + for (const auto& entry : streamMap) { + if (!entry.second) { + unreleasedStreams.push_back(entry.first); + } + } + return unreleasedStreams; + } + // Method to print resource management statistics void printResourceStatistics() { std::lock_guard lock(mutex); - std::cout << std::left << std::setw(15) << "Resource Name" << std::setw(15) - << "Total Created" << std::setw(15) << "Total Released" << std::setw(15) - << "Not Released" << std::endl; + std::cout << std::left << std::setw(15) << "Resource Name" << std::setw(15) << "Total Created" << std::setw(15) << "Total Released" + << std::setw(15) << "Not Released" << std::endl; // Print session statistics int totalSessionsCreated = sessionMap.size(); @@ -96,9 +124,8 @@ public: if (!entry.second) ++sessionsNotReleased; } - std::cout << std::left << std::setw(15) << "Session" << std::setw(15) - << totalSessionsCreated << std::setw(15) << totalSessionsReleased << std::setw(15) - << sessionsNotReleased << std::endl; + std::cout << std::left << std::setw(15) << "Session" << std::setw(15) << totalSessionsCreated << std::setw(15) << totalSessionsReleased + << std::setw(15) << sessionsNotReleased << std::endl; // Print stream statistics int totalStreamsCreated = streamMap.size(); @@ -110,9 +137,8 @@ public: if (!entry.second) ++streamsNotReleased; } - std::cout << std::left << std::setw(15) << "Stream" << std::setw(15) << totalStreamsCreated - << std::setw(15) << totalStreamsReleased << std::setw(15) << streamsNotReleased - << std::endl; + std::cout << std::left << std::setw(15) << "Stream" << std::setw(15) << totalStreamsCreated << std::setw(15) << totalStreamsReleased + << std::setw(15) << streamsNotReleased << std::endl; } }; diff --git a/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc b/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc index 6edd2c1..348b8ba 100644 --- a/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc +++ b/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc @@ -128,8 +128,7 @@ HResult HFReleaseInspireFaceSession(HFSession handle) { return HSUCCEED; } -HResult HFCreateInspireFaceSession(HFSessionCustomParameter parameter, HFDetectMode detectMode, - HInt32 maxDetectFaceNum, HInt32 detectPixelLevel, +HResult HFCreateInspireFaceSession(HFSessionCustomParameter parameter, HFDetectMode detectMode, HInt32 maxDetectFaceNum, HInt32 detectPixelLevel, HInt32 trackByDetectModeFPS, HFSession *handle) { inspire::ContextCustomParameter param; param.enable_mask_detect = parameter.enable_mask_detect; @@ -147,8 +146,7 @@ HResult HFCreateInspireFaceSession(HFSessionCustomParameter parameter, HFDetectM } HF_FaceAlgorithmSession *ctx = new HF_FaceAlgorithmSession(); - auto ret = ctx->impl.Configuration(detMode, maxDetectFaceNum, param, detectPixelLevel, - trackByDetectModeFPS); + auto ret = ctx->impl.Configuration(detMode, maxDetectFaceNum, param, detectPixelLevel, trackByDetectModeFPS); if (ret != HSUCCEED) { delete ctx; *handle = nullptr; @@ -161,8 +159,7 @@ HResult HFCreateInspireFaceSession(HFSessionCustomParameter parameter, HFDetectM return ret; } -HResult HFCreateInspireFaceSessionOptional(HOption customOption, HFDetectMode detectMode, - HInt32 maxDetectFaceNum, HInt32 detectPixelLevel, +HResult HFCreateInspireFaceSessionOptional(HOption customOption, HFDetectMode detectMode, HInt32 maxDetectFaceNum, HInt32 detectPixelLevel, HInt32 trackByDetectModeFPS, HFSession *handle) { inspire::ContextCustomParameter param; if (customOption & HF_ENABLE_FACE_RECOGNITION) { @@ -194,8 +191,7 @@ HResult HFCreateInspireFaceSessionOptional(HOption customOption, HFDetectMode de } HF_FaceAlgorithmSession *ctx = new HF_FaceAlgorithmSession(); - auto ret = ctx->impl.Configuration(detMode, maxDetectFaceNum, param, detectPixelLevel, - trackByDetectModeFPS); + auto ret = ctx->impl.Configuration(detMode, maxDetectFaceNum, param, detectPixelLevel, trackByDetectModeFPS); if (ret != HSUCCEED) { delete ctx; *handle = nullptr; @@ -224,8 +220,7 @@ HResult HFFeatureHubDataDisable() { HResult HFFeatureHubDataEnable(HFFeatureHubConfiguration configuration) { inspire::DatabaseConfiguration param; - param.db_path = - (configuration.dbPath != nullptr) ? std::string(configuration.dbPath) : std::string(); + param.db_path = (configuration.dbPath != nullptr) ? std::string(configuration.dbPath) : std::string(); param.enable_use_db = configuration.enablePersistence; param.feature_block_num = configuration.featureBlockNum; param.recognition_threshold = configuration.searchThreshold; @@ -283,8 +278,7 @@ HResult HFSessionSetFaceDetectThreshold(HFSession session, HFloat threshold) { return ctx->impl.SetFaceDetectThreshold(threshold); } -HResult HFExecuteFaceTrack(HFSession session, HFImageStream streamHandle, - PHFMultipleFaceData results) { +HResult HFExecuteFaceTrack(HFSession session, HFImageStream streamHandle, PHFMultipleFaceData results) { if (session == nullptr) { return HERR_INVALID_CONTEXT_HANDLE; } @@ -303,6 +297,7 @@ HResult HFExecuteFaceTrack(HFSession session, HFImageStream streamHandle, results->detectedNum = ctx->impl.GetNumberOfFacesCurrentlyDetected(); results->rects = (HFaceRect *)ctx->impl.GetFaceRectsCache().data(); results->trackIds = (HInt32 *)ctx->impl.GetTrackIDCache().data(); + results->detConfidence = (HFloat *)ctx->impl.GetDetConfidenceCache().data(); results->angles.pitch = (HFloat *)ctx->impl.GetPitchResultsCache().data(); results->angles.roll = (HFloat *)ctx->impl.GetRollResultsCache().data(); results->angles.yaw = (HFloat *)ctx->impl.GetYawResultsCache().data(); @@ -329,8 +324,7 @@ HResult HFGetNumOfFaceDenseLandmark(HPInt32 num) { return HSUCCEED; } -HResult HFGetFaceDenseLandmarkFromFaceToken(HFFaceBasicToken singleFace, HPoint2f *landmarks, - HInt32 num) { +HResult HFGetFaceDenseLandmarkFromFaceToken(HFFaceBasicToken singleFace, HPoint2f *landmarks, HInt32 num) { if (num != 106) { return HERR_SESS_LANDMARK_NUM_NOT_MATCH; } @@ -356,8 +350,7 @@ HResult HFFeatureHubFaceSearchThresholdSetting(float threshold) { return HSUCCEED; } -HResult HFFaceFeatureExtract(HFSession session, HFImageStream streamHandle, - HFFaceBasicToken singleFace, PHFFaceFeature feature) { +HResult HFFaceFeatureExtract(HFSession session, HFImageStream streamHandle, HFFaceBasicToken singleFace, PHFFaceFeature feature) { if (session == nullptr) { return HERR_INVALID_CONTEXT_HANDLE; } @@ -385,8 +378,7 @@ HResult HFFaceFeatureExtract(HFSession session, HFImageStream streamHandle, return ret; } -HResult HFFaceFeatureExtractCpy(HFSession session, HFImageStream streamHandle, - HFFaceBasicToken singleFace, HPFloat feature) { +HResult HFFaceFeatureExtractCpy(HFSession session, HFImageStream streamHandle, HFFaceBasicToken singleFace, HPFloat feature) { if (session == nullptr) { return HERR_INVALID_CONTEXT_HANDLE; } @@ -452,8 +444,7 @@ HResult HFFeatureHubInsertFeature(HFFaceFeatureIdentity featureIdentity) { return ret; } -HResult HFFeatureHubFaceSearch(HFFaceFeature searchFeature, HPFloat confidence, - PHFFaceFeatureIdentity mostSimilar) { +HResult HFFeatureHubFaceSearch(HFFaceFeature searchFeature, HPFloat confidence, PHFFaceFeatureIdentity mostSimilar) { if (searchFeature.data == nullptr) { return HERR_INVALID_FACE_FEATURE; } @@ -474,8 +465,7 @@ HResult HFFeatureHubFaceSearch(HFFaceFeature searchFeature, HPFloat confidence, return ret; } -HResult HFFeatureHubFaceSearchTopK(HFFaceFeature searchFeature, HInt32 topK, - PHFSearchTopKResults results) { +HResult HFFeatureHubFaceSearchTopK(HFFaceFeature searchFeature, HInt32 topK, PHFSearchTopKResults results) { if (searchFeature.data == nullptr) { return HERR_INVALID_FACE_FEATURE; } @@ -530,9 +520,7 @@ HResult HFFeatureHubGetFaceIdentity(HInt32 customId, PHFFaceFeatureIdentity iden return ret; } -HResult HFMultipleFacePipelineProcess(HFSession session, HFImageStream streamHandle, - PHFMultipleFaceData faces, - HFSessionCustomParameter parameter) { +HResult HFMultipleFacePipelineProcess(HFSession session, HFImageStream streamHandle, PHFMultipleFaceData faces, HFSessionCustomParameter parameter) { if (session == nullptr) { return HERR_INVALID_CONTEXT_HANDLE; } @@ -580,8 +568,7 @@ HResult HFMultipleFacePipelineProcess(HFSession session, HFImageStream streamHan return ret; } -HResult HFMultipleFacePipelineProcessOptional(HFSession session, HFImageStream streamHandle, - PHFMultipleFaceData faces, HInt32 customOption) { +HResult HFMultipleFacePipelineProcessOptional(HFSession session, HFImageStream streamHandle, PHFMultipleFaceData faces, HInt32 customOption) { if (session == nullptr) { return HERR_INVALID_CONTEXT_HANDLE; } @@ -714,10 +701,8 @@ HResult HFGetFaceIntereactionStateResult(HFSession session, PHFFaceIntereactionS return HERR_INVALID_CONTEXT_HANDLE; } result->num = ctx->impl.GetFaceInteractionLeftEyeStatusCache().size(); - result->leftEyeStatusConfidence = - (HFloat *)ctx->impl.GetFaceInteractionLeftEyeStatusCache().data(); - result->rightEyeStatusConfidence = - (HFloat *)ctx->impl.GetFaceInteractionRightEyeStatusCache().data(); + result->leftEyeStatusConfidence = (HFloat *)ctx->impl.GetFaceInteractionLeftEyeStatusCache().data(); + result->rightEyeStatusConfidence = (HFloat *)ctx->impl.GetFaceInteractionRightEyeStatusCache().data(); return HSUCCEED; } @@ -787,4 +772,30 @@ HResult HFLogDisable() { HResult HFDeBugShowResourceStatistics() { RESOURCE_MANAGE->printResourceStatistics(); return HSUCCEED; -} \ No newline at end of file +} + +HResult HFDeBugGetUnreleasedSessionsCount(HInt32 *count) { + *count = RESOURCE_MANAGE->getUnreleasedSessions().size(); + return HSUCCEED; +} + +HResult HFDeBugGetUnreleasedSessions(HFSession *sessions, HInt32 count) { + std::vector unreleasedSessions = RESOURCE_MANAGE->getUnreleasedSessions(); + for (int i = 0; i < count; ++i) { + sessions[i] = (HFSession)unreleasedSessions[i]; + } + return HSUCCEED; +} + +HResult HFDeBugGetUnreleasedStreamsCount(HInt32 *count) { + *count = RESOURCE_MANAGE->getUnreleasedStreams().size(); + return HSUCCEED; +} + +HResult HFDeBugGetUnreleasedStreams(HFImageStream *streams, HInt32 count) { + std::vector unreleasedStreams = RESOURCE_MANAGE->getUnreleasedStreams(); + for (int i = 0; i < count; ++i) { + streams[i] = (HFImageStream)unreleasedStreams[i]; + } + return HSUCCEED; +} diff --git a/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.h b/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.h index 446d485..d0ad0d9 100644 --- a/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.h +++ b/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.h @@ -26,13 +26,12 @@ extern "C" { #define HF_ENABLE_NONE 0x00000000 ///< Flag to enable no features. #define HF_ENABLE_FACE_RECOGNITION 0x00000002 ///< Flag to enable face recognition feature. #define HF_ENABLE_LIVENESS 0x00000004 ///< Flag to enable RGB liveness detection feature. -#define HF_ENABLE_IR_LIVENESS \ - 0x00000008 ///< Flag to enable IR (Infrared) liveness detection feature. -#define HF_ENABLE_MASK_DETECT 0x00000010 ///< Flag to enable mask detection feature. -#define HF_ENABLE_FACE_ATTRIBUTE 0x00000020 ///< Flag to enable face attribute prediction feature. -#define HF_ENABLE_PLACEHOLDER_ 0x00000040 ///< - -#define HF_ENABLE_QUALITY 0x00000080 ///< Flag to enable face quality assessment feature. -#define HF_ENABLE_INTERACTION 0x00000100 ///< Flag to enable interaction feature. +#define HF_ENABLE_IR_LIVENESS 0x00000008 ///< Flag to enable IR (Infrared) liveness detection feature. +#define HF_ENABLE_MASK_DETECT 0x00000010 ///< Flag to enable mask detection feature. +#define HF_ENABLE_FACE_ATTRIBUTE 0x00000020 ///< Flag to enable face attribute prediction feature. +#define HF_ENABLE_PLACEHOLDER_ 0x00000040 ///< - +#define HF_ENABLE_QUALITY 0x00000080 ///< Flag to enable face quality assessment feature. +#define HF_ENABLE_INTERACTION 0x00000100 ///< Flag to enable interaction feature. /** * Camera stream format. @@ -138,9 +137,9 @@ typedef struct HFSessionCustomParameter { * @brief Enumeration for face detection modes. */ typedef enum HFDetectMode { - HF_DETECT_MODE_ALWAYS_DETECT, ///< Image detection mode, always detect, applicable to images. - HF_DETECT_MODE_LIGHT_TRACK, ///< Video detection mode, face tracking, applicable to video - ///< streaming, front camera. + HF_DETECT_MODE_ALWAYS_DETECT, ///< Image detection mode, always detect, applicable to images. + HF_DETECT_MODE_LIGHT_TRACK, ///< Video detection mode, face tracking, applicable to video + ///< streaming, front camera. HF_DETECT_MODE_TRACK_BY_DETECTION, ///< Video detection mode, face tracking, applicable to high ///< resolution, monitoring, capturing // (You need a specific option turned on at compile time @@ -161,9 +160,8 @@ typedef enum HFDetectMode { * @param handle Pointer to the context handle that will be returned. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFCreateInspireFaceSession( - HFSessionCustomParameter parameter, HFDetectMode detectMode, HInt32 maxDetectFaceNum, - HInt32 detectPixelLevel, HInt32 trackByDetectModeFPS, HFSession *handle); +HYPER_CAPI_EXPORT extern HResult HFCreateInspireFaceSession(HFSessionCustomParameter parameter, HFDetectMode detectMode, HInt32 maxDetectFaceNum, + HInt32 detectPixelLevel, HInt32 trackByDetectModeFPS, HFSession *handle); /** * @brief Create a session from a resource file with additional options. @@ -179,9 +177,8 @@ HYPER_CAPI_EXPORT extern HResult HFCreateInspireFaceSession( * @param handle Pointer to the context handle that will be returned. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFCreateInspireFaceSessionOptional( - HOption customOption, HFDetectMode detectMode, HInt32 maxDetectFaceNum, HInt32 detectPixelLevel, - HInt32 trackByDetectModeFPS, HFSession *handle); +HYPER_CAPI_EXPORT extern HResult HFCreateInspireFaceSessionOptional(HOption customOption, HFDetectMode detectMode, HInt32 maxDetectFaceNum, + HInt32 detectPixelLevel, HInt32 trackByDetectModeFPS, HFSession *handle); /** * @brief Release the session. @@ -222,6 +219,7 @@ typedef struct HFMultipleFaceData { HInt32 detectedNum; ///< Number of faces detected. HFaceRect *rects; ///< Array of bounding rectangles for each face. HInt32 *trackIds; ///< Array of track IDs for each face. + HFloat *detConfidence; ///< Array of detection confidence for each face. HFFaceEulerAngle angles; ///< Euler angles for each face. PHFFaceBasicToken tokens; ///< Tokens associated with each face. } HFMultipleFaceData, *PHFMultipleFaceData; @@ -234,8 +232,7 @@ typedef struct HFMultipleFaceData { * @param previewSize The size of the preview for tracking. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFSessionSetTrackPreviewSize(HFSession session, - HInt32 previewSize); +HYPER_CAPI_EXPORT extern HResult HFSessionSetTrackPreviewSize(HFSession session, HInt32 previewSize); /** * @brief Set the minimum number of face pixels that the face detector can capture, and people below @@ -245,8 +242,7 @@ HYPER_CAPI_EXPORT extern HResult HFSessionSetTrackPreviewSize(HFSession session, * @param minSize The minimum pixel value, default value is 0. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFSessionSetFilterMinimumFacePixelSize(HFSession session, - HInt32 minSize); +HYPER_CAPI_EXPORT extern HResult HFSessionSetFilterMinimumFacePixelSize(HFSession session, HInt32 minSize); /** * @brief Set the face detect threshold in the session. @@ -255,8 +251,7 @@ HYPER_CAPI_EXPORT extern HResult HFSessionSetFilterMinimumFacePixelSize(HFSessio * @param detectMode The mode of the detection mode for tracking. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFSessionSetFaceDetectThreshold(HFSession session, - HFloat threshold); +HYPER_CAPI_EXPORT extern HResult HFSessionSetFaceDetectThreshold(HFSession session, HFloat threshold); /** * @brief Run face tracking in the session. @@ -266,8 +261,7 @@ HYPER_CAPI_EXPORT extern HResult HFSessionSetFaceDetectThreshold(HFSession sessi * @param results Pointer to the structure where the results will be stored. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFExecuteFaceTrack(HFSession session, HFImageStream streamHandle, - PHFMultipleFaceData results); +HYPER_CAPI_EXPORT extern HResult HFExecuteFaceTrack(HFSession session, HFImageStream streamHandle, PHFMultipleFaceData results); /** * @brief Copies the data from a HF_FaceBasicToken to a specified buffer. @@ -284,8 +278,7 @@ HYPER_CAPI_EXPORT extern HResult HFExecuteFaceTrack(HFSession session, HFImageSt * if the operation was successful, or an error code if the buffer was too small * or if any other error occurred. */ -HYPER_CAPI_EXPORT extern HResult HFCopyFaceBasicToken(HFFaceBasicToken token, HPBuffer buffer, - HInt32 bufferSize); +HYPER_CAPI_EXPORT extern HResult HFCopyFaceBasicToken(HFFaceBasicToken token, HPBuffer buffer, HInt32 bufferSize); /** * @brief Retrieves the size of the data contained in a HF_FaceBasicToken. @@ -316,9 +309,7 @@ HYPER_CAPI_EXPORT extern HResult HFGetNumOfFaceDenseLandmark(HPInt32 num); * @param num Number of landmark points * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFGetFaceDenseLandmarkFromFaceToken(HFFaceBasicToken singleFace, - HPoint2f *landmarks, - HInt32 num); +HYPER_CAPI_EXPORT extern HResult HFGetFaceDenseLandmarkFromFaceToken(HFFaceBasicToken singleFace, HPoint2f *landmarks, HInt32 num); /************************************************************************ * Face Recognition @@ -343,8 +334,7 @@ typedef struct HFFaceFeature { * @param feature Pointer to the extracted face feature. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFFaceFeatureExtract(HFSession session, HFImageStream streamHandle, - HFFaceBasicToken singleFace, +HYPER_CAPI_EXPORT extern HResult HFFaceFeatureExtract(HFSession session, HFImageStream streamHandle, HFFaceBasicToken singleFace, PHFFaceFeature feature); /** @@ -356,10 +346,7 @@ HYPER_CAPI_EXPORT extern HResult HFFaceFeatureExtract(HFSession session, HFImage * @param feature Pointer to the buffer where the extracted feature will be copied. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFFaceFeatureExtractCpy(HFSession session, - HFImageStream streamHandle, - HFFaceBasicToken singleFace, - HPFloat feature); +HYPER_CAPI_EXPORT extern HResult HFFaceFeatureExtractCpy(HFSession session, HFImageStream streamHandle, HFFaceBasicToken singleFace, HPFloat feature); /************************************************************************ * Feature Hub @@ -381,8 +368,8 @@ typedef enum HFSearchMode { * context. */ typedef struct HFFeatureHubConfiguration { - HInt32 featureBlockNum; ///< The order of magnitude of face feature database is N * 512, and 20 - ///< is recommended by default + HInt32 featureBlockNum; ///< The order of magnitude of face feature database is N * 512, and 20 + ///< is recommended by default HInt32 enablePersistence; ///< Flag to enable or disable the use of the database. HString dbPath; ///< Path to the database file. float searchThreshold; ///< Threshold for face search @@ -448,8 +435,7 @@ HYPER_CAPI_EXPORT extern HResult HFFeatureHubFaceSearchThresholdSetting(float th * @param result Pointer to the floating-point value where the comparison result will be stored. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFFaceComparison(HFFaceFeature feature1, HFFaceFeature feature2, - HPFloat result); +HYPER_CAPI_EXPORT extern HResult HFFaceComparison(HFFaceFeature feature1, HFFaceFeature feature2, HPFloat result); /** * @brief Get the length of the face feature. @@ -476,9 +462,7 @@ HYPER_CAPI_EXPORT extern HResult HFFeatureHubInsertFeature(HFFaceFeatureIdentity * @param mostSimilar Pointer to the most similar face feature identity found. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFFeatureHubFaceSearch(HFFaceFeature searchFeature, - HPFloat confidence, - PHFFaceFeatureIdentity mostSimilar); +HYPER_CAPI_EXPORT extern HResult HFFeatureHubFaceSearch(HFFaceFeature searchFeature, HPFloat confidence, PHFFaceFeatureIdentity mostSimilar); /** * @brief Search for the most similar k facial features in the feature group @@ -488,9 +472,7 @@ HYPER_CAPI_EXPORT extern HResult HFFeatureHubFaceSearch(HFFaceFeature searchFeat * @param PHFSearchTopKResults Output search result * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFFeatureHubFaceSearchTopK(HFFaceFeature searchFeature, - HInt32 topK, - PHFSearchTopKResults results); +HYPER_CAPI_EXPORT extern HResult HFFeatureHubFaceSearchTopK(HFFaceFeature searchFeature, HInt32 topK, PHFSearchTopKResults results); /** * @brief Remove a face feature from the features group based on custom ID. @@ -515,8 +497,7 @@ HYPER_CAPI_EXPORT extern HResult HFFeatureHubFaceUpdate(HFFaceFeatureIdentity fe * @param identity Pointer to the face feature identity to be retrieved. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFFeatureHubGetFaceIdentity(HInt32 customId, - PHFFaceFeatureIdentity identity); +HYPER_CAPI_EXPORT extern HResult HFFeatureHubGetFaceIdentity(HInt32 customId, PHFFaceFeatureIdentity identity); /** * @brief Get the count of face features in the features group. @@ -549,9 +530,7 @@ HYPER_CAPI_EXPORT extern HResult HFFeatureHubViewDBTable(); * @param parameter Custom parameters for processing the faces. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFMultipleFacePipelineProcess(HFSession session, - HFImageStream streamHandle, - PHFMultipleFaceData faces, +HYPER_CAPI_EXPORT extern HResult HFMultipleFacePipelineProcess(HFSession session, HFImageStream streamHandle, PHFMultipleFaceData faces, HFSessionCustomParameter parameter); /** @@ -566,9 +545,7 @@ HYPER_CAPI_EXPORT extern HResult HFMultipleFacePipelineProcess(HFSession session * @param customOption An integer representing a custom option for processing. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFMultipleFacePipelineProcessOptional(HFSession session, - HFImageStream streamHandle, - PHFMultipleFaceData faces, +HYPER_CAPI_EXPORT extern HResult HFMultipleFacePipelineProcessOptional(HFSession session, HFImageStream streamHandle, PHFMultipleFaceData faces, HInt32 customOption); /** @@ -592,8 +569,7 @@ typedef struct HFRGBLivenessConfidence { * @param confidence Pointer to the structure where RGB liveness confidence data will be stored. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFGetRGBLivenessConfidence(HFSession session, - PHFRGBLivenessConfidence confidence); +HYPER_CAPI_EXPORT extern HResult HFGetRGBLivenessConfidence(HFSession session, PHFRGBLivenessConfidence confidence); /** * @brief Struct representing face mask confidence. @@ -616,8 +592,7 @@ typedef struct HFFaceMaskConfidence { * @param confidence Pointer to the structure where face mask confidence data will be stored. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFGetFaceMaskConfidence(HFSession session, - PHFFaceMaskConfidence confidence); +HYPER_CAPI_EXPORT extern HResult HFGetFaceMaskConfidence(HFSession session, PHFFaceMaskConfidence confidence); /** * @brief Struct representing face quality predict confidence. @@ -640,8 +615,7 @@ typedef struct HFFaceQualityConfidence { * @param confidence Pointer to the structure where face mask confidence data will be stored. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFGetFaceQualityConfidence(HFSession session, - PHFFaceQualityConfidence confidence); +HYPER_CAPI_EXPORT extern HResult HFGetFaceQualityConfidence(HFSession session, PHFFaceQualityConfidence confidence); /** * @brief Detect the quality of a face in an image. @@ -653,8 +627,7 @@ HYPER_CAPI_EXPORT extern HResult HFGetFaceQualityConfidence(HFSession session, * @param confidence Pointer to a floating-point value where the quality confidence will be stored. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFFaceQualityDetect(HFSession session, HFFaceBasicToken singleFace, - HFloat *confidence); +HYPER_CAPI_EXPORT extern HResult HFFaceQualityDetect(HFSession session, HFFaceBasicToken singleFace, HFloat *confidence); /** * @brief Facial states in the face interaction module. @@ -672,8 +645,7 @@ typedef struct HFFaceIntereactionState { * @param session Handle to the session. * @param result Facial state prediction results in the face interaction module. */ -HYPER_CAPI_EXPORT extern HResult HFGetFaceIntereactionStateResult(HFSession session, - PHFFaceIntereactionState result); +HYPER_CAPI_EXPORT extern HResult HFGetFaceIntereactionStateResult(HFSession session, PHFFaceIntereactionState result); /** * @brief Actions detected in the face interaction module. @@ -693,8 +665,7 @@ typedef struct HFFaceIntereactionsActions { * @param actions Facial action prediction results in the face interaction module. * @return HResult indicating success or failure of the function call. */ -HYPER_CAPI_EXPORT extern HResult HFGetFaceIntereactionActionsResult( - HFSession session, PHFFaceIntereactionsActions actions); +HYPER_CAPI_EXPORT extern HResult HFGetFaceIntereactionActionsResult(HFSession session, PHFFaceIntereactionsActions actions); /** * @brief Struct representing face attribute results. * @@ -733,8 +704,7 @@ typedef struct HFFaceAttributeResult { * @param results Pointer to the structure where face attribute results will be stored. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFGetFaceAttributeResult(HFSession session, - PHFFaceAttributeResult results); +HYPER_CAPI_EXPORT extern HResult HFGetFaceAttributeResult(HFSession session, PHFFaceAttributeResult results); /************************************************************************ * System Function @@ -769,8 +739,8 @@ typedef enum HFLogLevel { HF_LOG_WARN, // Warning level for non-critical issues that might need attention HF_LOG_ERROR, // Error level for error events that might still allow the application to // continue running - HF_LOG_FATAL // Fatal level for severe error events that will presumably lead the application - // to abort + HF_LOG_FATAL // Fatal level for severe error events that will presumably lead the application + // to abort } HFLogLevel; /** @@ -806,8 +776,7 @@ HYPER_CAPI_EXPORT extern void HFDeBugImageStreamImShow(HFImageStream streamHandl * @param savePath The path to which the image is written. * @return HResult indicating the success or failure of the operation. */ -HYPER_CAPI_EXPORT extern HResult HFDeBugImageStreamDecodeSave(HFImageStream streamHandle, - HPath savePath); +HYPER_CAPI_EXPORT extern HResult HFDeBugImageStreamDecodeSave(HFImageStream streamHandle, HPath savePath); /** * @brief Display current resource management statistics. @@ -824,6 +793,48 @@ HYPER_CAPI_EXPORT extern HResult HFDeBugImageStreamDecodeSave(HFImageStream stre */ HYPER_CAPI_EXPORT extern HResult HFDeBugShowResourceStatistics(); +/** + * @brief Get the count of unreleased sessions. + * + * This function retrieves the count of sessions that have not been released yet. + * + * @param count Pointer to an integer where the count of unreleased sessions will be stored. + * @return HResult indicating the success or failure of the operation. + */ +HYPER_CAPI_EXPORT extern HResult HFDeBugGetUnreleasedSessionsCount(HInt32 *count); + +/** + * @brief Get the list of unreleased sessions. + * + * This function retrieves the list of sessions that have not been released yet. + * + * @param sessions Pointer to an array where the unreleased sessions will be stored. + * @param count The number of sessions to retrieve. + * @return HResult indicating the success or failure of the operation. + */ +HYPER_CAPI_EXPORT extern HResult HFDeBugGetUnreleasedSessions(HFSession *sessions, HInt32 count); + +/** + * @brief Get the count of unreleased image streams. + * + * This function retrieves the count of image streams that have not been released yet. + * + * @param count Pointer to an integer where the count of unreleased image streams will be stored. + * @return HResult indicating the success or failure of the operation. + */ +HYPER_CAPI_EXPORT extern HResult HFDeBugGetUnreleasedStreamsCount(HInt32 *count); + +/** + * @brief Get the list of unreleased image streams. + * + * This function retrieves the list of image streams that have not been released yet. + * + * @param streams Pointer to an array where the unreleased image streams will be stored. + * @param count The number of image streams to retrieve. + * @return HResult indicating the success or failure of the operation. + */ +HYPER_CAPI_EXPORT extern HResult HFDeBugGetUnreleasedStreams(HFImageStream *streams, HInt32 count); + #ifdef __cplusplus } #endif diff --git a/cpp-package/inspireface/cpp/inspireface/cost_time.h b/cpp-package/inspireface/cpp/inspireface/cost_time.h index bb1ca27..4192c3f 100644 --- a/cpp-package/inspireface/cpp/inspireface/cost_time.h +++ b/cpp-package/inspireface/cpp/inspireface/cost_time.h @@ -6,26 +6,43 @@ #include #include "log.h" // Assume log.h includes the INSPIRE_LOGI macro +#ifndef INSPIRE_API +#define INSPIRE_API +#endif + // Macro definition to control whether time cost calculations are enabled #ifdef ISF_ENABLE_COST_TIME +// define the macro to calculate the time cost #define COST_TIME(id, precision) inspire::CostTime cost_time_##id(#id, __FILENAME__, __FUNCTION__, __LINE__, precision) + +// define the macro to calculate the time cost without precision #define COST_TIME_SIMPLE(id) inspire::CostTime cost_time_##id(#id, __FILENAME__, __FUNCTION__, __LINE__) #else -#define COST_TIME(id, precision) // No operation, when ISF_ENABLE_COST_TIME is not defined -#define COST_TIME_SIMPLE(id) // No operation, when ISF_ENABLE_COST_TIME is not defined + +// No operation, when ISF_ENABLE_COST_TIME is not defined +#define COST_TIME(id, precision) + +// No operation, when ISF_ENABLE_COST_TIME is not defined +#define COST_TIME_SIMPLE(id) #endif namespace inspire { -class CostTime { +/** + * @class CostTime + * @brief A class for measuring and logging the time taken by a block of code. + * + * This class is used to measure the time taken by a block of code and log the result. + * It uses the std::chrono library to measure the time taken. + */ +class INSPIRE_API CostTime { public: // Constructor, records the start time explicit CostTime(const char* id, const char* filename, const char* function, int line, int precision = 5) - : id_(id), filename_(filename), function_(function), line_(line), precision_(precision), - start_time_(std::chrono::steady_clock::now()) {} + : id_(id), filename_(filename), function_(function), line_(line), precision_(precision), start_time_(std::chrono::steady_clock::now()) {} // Destructor, calculates and logs the time taken ~CostTime() { @@ -49,6 +66,6 @@ private: std::chrono::time_point start_time_; }; -} // namespace inspire +} // namespace inspire -#endif // COST_TIME_HPP \ No newline at end of file +#endif // COST_TIME_HPP \ No newline at end of file diff --git a/cpp-package/inspireface/cpp/inspireface/face_context.cpp b/cpp-package/inspireface/cpp/inspireface/face_context.cpp index 9ef1eef..69edafd 100644 --- a/cpp-package/inspireface/cpp/inspireface/face_context.cpp +++ b/cpp-package/inspireface/cpp/inspireface/face_context.cpp @@ -11,14 +11,10 @@ namespace inspire { - FaceContext::FaceContext() = default; -int32_t FaceContext::Configuration(DetectMode detect_mode, - int32_t max_detect_face, - CustomPipelineParameter param, - int32_t detect_level_px, - int32_t track_by_detect_mode_fps) { +int32_t FaceContext::Configuration(DetectMode detect_mode, int32_t max_detect_face, CustomPipelineParameter param, + int32_t detect_level_px, int32_t track_by_detect_mode_fps) { m_detect_mode_ = detect_mode; m_max_detect_face_ = max_detect_face; m_parameter_ = param; @@ -29,28 +25,25 @@ int32_t FaceContext::Configuration(DetectMode detect_mode, return HERR_ARCHIVE_LOAD_FAILURE; } - m_face_track_ = std::make_shared(m_detect_mode_, m_max_detect_face_, 20, 192, detect_level_px, track_by_detect_mode_fps); + m_face_track_ = std::make_shared(m_detect_mode_, m_max_detect_face_, 20, 192, detect_level_px, + track_by_detect_mode_fps); m_face_track_->Configuration(INSPIRE_LAUNCH->getMArchive()); // SetDetectMode(m_detect_mode_); - m_face_recognition_ = std::make_shared(INSPIRE_LAUNCH->getMArchive(), m_parameter_.enable_recognition); + m_face_recognition_ = + std::make_shared(INSPIRE_LAUNCH->getMArchive(), m_parameter_.enable_recognition); if (m_face_recognition_->QueryStatus() != HSUCCEED) { return m_face_recognition_->QueryStatus(); } - m_face_pipeline_ = std::make_shared( - INSPIRE_LAUNCH->getMArchive(), - param.enable_liveness, - param.enable_mask_detect, - param.enable_face_attribute, - param.enable_interaction_liveness - ); + m_face_pipeline_ = + std::make_shared(INSPIRE_LAUNCH->getMArchive(), param.enable_liveness, param.enable_mask_detect, + param.enable_face_attribute, param.enable_interaction_liveness); return HSUCCEED; } - -int32_t FaceContext::FaceDetectAndTrack(CameraStream &image) { +int32_t FaceContext::FaceDetectAndTrack(CameraStream& image) { std::lock_guard lock(m_mtx_); m_detect_cache_.clear(); m_face_basic_data_cache_.clear(); @@ -73,18 +66,20 @@ int32_t FaceContext::FaceDetectAndTrack(CameraStream &image) { m_quality_score_results_cache_.clear(); m_attribute_race_results_cache_.clear(); m_attribute_gender_results_cache_.clear(); + m_det_confidence_cache_.clear(); if (m_face_track_ == nullptr) { return HERR_SESS_TRACKER_FAILURE; } m_face_track_->UpdateStream(image); for (int i = 0; i < m_face_track_->trackingFace.size(); ++i) { - auto &face = m_face_track_->trackingFace[i]; + auto& face = m_face_track_->trackingFace[i]; HyperFaceData data = FaceObjectToHyperFaceData(face, i); ByteArray byteArray; auto ret = SerializeHyperFaceData(data, byteArray); if (ret != HSUCCEED) { return HERR_INVALID_SERIALIZATION_FAILED; } + m_det_confidence_cache_.push_back(face.GetConfidence()); m_detect_cache_.push_back(byteArray); m_track_id_cache_.push_back(face.GetTrackingId()); m_face_rects_cache_.push_back(data.rect); @@ -98,19 +93,18 @@ int32_t FaceContext::FaceDetectAndTrack(CameraStream &image) { avg += data.quality[j]; } avg /= 5.0f; - float quality_score = 1.0f - avg; // reversal + float quality_score = 1.0f - avg; // reversal m_quality_score_results_cache_.push_back(quality_score); } // ptr face_basic m_face_basic_data_cache_.resize(m_face_track_->trackingFace.size()); for (int i = 0; i < m_face_basic_data_cache_.size(); ++i) { - auto &basic = m_face_basic_data_cache_[i]; + auto& basic = m_face_basic_data_cache_[i]; basic.dataSize = m_detect_cache_[i].size(); basic.data = m_detect_cache_[i].data(); } - -// LOGD("Track COST: %f", m_face_track_->GetTrackTotalUseTime()); + // LOGD("Track COST: %f", m_face_track_->GetTrackTotalUseTime()); return HSUCCEED; } @@ -131,12 +125,12 @@ const std::shared_ptr& FaceContext::FacePipelineModule() { return m_face_pipeline_; } - const int32_t FaceContext::GetNumberOfFacesCurrentlyDetected() const { return m_face_track_->trackingFace.size(); } -int32_t FaceContext::FacesProcess(CameraStream &image, const std::vector &faces, const CustomPipelineParameter ¶m) { +int32_t FaceContext::FacesProcess(CameraStream& image, const std::vector& faces, + const CustomPipelineParameter& param) { std::lock_guard lock(m_mtx_); m_mask_results_cache_.resize(faces.size(), -1.0f); m_rgb_liveness_results_cache_.resize(faces.size(), -1.0f); @@ -151,7 +145,7 @@ int32_t FaceContext::FacesProcess(CameraStream &image, const std::vectorProcess(image, face, PROCESS_RGB_LIVENESS); @@ -189,14 +183,15 @@ int32_t FaceContext::FacesProcess(CameraStream &image, const std::vectoreyesStatusCache[0]; m_react_right_eye_results_cache_[i] = m_face_pipeline_->eyesStatusCache[1]; // Special handling: ff it is a tracking state, it needs to be filtered - if (face.trackState > 0) - { + if (face.trackState > 0) { auto idx = face.inGroupIndex; if (idx < m_face_track_->trackingFace.size()) { auto& target = m_face_track_->trackingFace[idx]; if (target.GetTrackingId() == face.trackId) { - auto new_eye_left = EmaFilter(m_face_pipeline_->eyesStatusCache[0], target.left_eye_status_, 8, 0.2f); - auto new_eye_right = EmaFilter(m_face_pipeline_->eyesStatusCache[1], target.right_eye_status_, 8, 0.2f); + auto new_eye_left = + EmaFilter(m_face_pipeline_->eyesStatusCache[0], target.left_eye_status_, 8, 0.2f); + auto new_eye_right = + EmaFilter(m_face_pipeline_->eyesStatusCache[1], target.right_eye_status_, 8, 0.2f); if (face.trackState > 1) { // The filtered value can be obtained only in the tracking state m_react_left_eye_results_cache_[i] = new_eye_left; @@ -209,20 +204,22 @@ int32_t FaceContext::FacesProcess(CameraStream &image, const std::vector& FaceContext::GetDetectCache() const { return m_detect_cache_; } @@ -279,6 +276,10 @@ const Embedded& FaceContext::GetFaceFeatureCache() const { return m_face_feature_cache_; } +const std::vector& FaceContext::GetDetConfidenceCache() const { + return m_det_confidence_cache_; +} + const std::vector& FaceContext::GetFaceRaceResultsCache() const { return m_attribute_race_results_cache_; } @@ -311,11 +312,11 @@ const std::vector& FaceContext::GetFaceRaiseHeadAactionsResultCache() const return m_action_raise_head_results_cache_; } -int32_t FaceContext::FaceFeatureExtract(CameraStream &image, FaceBasicData& data) { +int32_t FaceContext::FaceFeatureExtract(CameraStream& image, FaceBasicData& data) { std::lock_guard lock(m_mtx_); int32_t ret; HyperFaceData face = {0}; - ret = DeserializeHyperFaceData((char* )data.data, data.dataSize, face); + ret = DeserializeHyperFaceData((char*)data.data, data.dataSize, face); if (ret != HSUCCEED) { return ret; } @@ -325,17 +326,15 @@ int32_t FaceContext::FaceFeatureExtract(CameraStream &image, FaceBasicData& data return ret; } - -const CustomPipelineParameter &FaceContext::getMParameter() const { +const CustomPipelineParameter& FaceContext::getMParameter() const { return m_parameter_; } - -int32_t FaceContext::FaceQualityDetect(FaceBasicData& data, float &result) { +int32_t FaceContext::FaceQualityDetect(FaceBasicData& data, float& result) { int32_t ret; HyperFaceData face = {0}; - ret = DeserializeHyperFaceData((char* )data.data, data.dataSize, face); -// PrintHyperFaceData(face); + ret = DeserializeHyperFaceData((char*)data.data, data.dataSize, face); + // PrintHyperFaceData(face); if (ret != HSUCCEED) { return ret; } @@ -344,12 +343,11 @@ int32_t FaceContext::FaceQualityDetect(FaceBasicData& data, float &result) { avg += face.quality[i]; } avg /= 5.0f; - result = 1.0f - avg; // reversal + result = 1.0f - avg; // reversal return ret; } - int32_t FaceContext::SetDetectMode(DetectMode mode) { m_detect_mode_ = mode; if (m_detect_mode_ == DetectMode::DETECT_MODE_ALWAYS_DETECT) { @@ -370,4 +368,4 @@ int32_t FaceContext::SetTrackFaceMinimumSize(int32_t minSize) { return HSUCCEED; } -} // namespace hyper \ No newline at end of file +} // namespace inspire \ No newline at end of file diff --git a/cpp-package/inspireface/cpp/inspireface/face_context.h b/cpp-package/inspireface/cpp/inspireface/face_context.h index 831a5c5..0853ef0 100644 --- a/cpp-package/inspireface/cpp/inspireface/face_context.h +++ b/cpp-package/inspireface/cpp/inspireface/face_context.h @@ -34,13 +34,13 @@ namespace inspire { * Includes options for enabling various features such as recognition, liveness detection, and quality assessment. */ typedef struct CustomPipelineParameter { - bool enable_recognition = false; ///< Enable face recognition feature - bool enable_liveness = false; ///< Enable RGB liveness detection feature - bool enable_ir_liveness = false; ///< Enable IR (Infrared) liveness detection feature - bool enable_mask_detect = false; ///< Enable mask detection feature - bool enable_face_attribute = false; ///< Enable face attribute prediction feature - bool enable_face_quality = false; ///< Enable face quality assessment feature - bool enable_interaction_liveness = false; ///< Enable interactive liveness detection feature + bool enable_recognition = false; ///< Enable face recognition feature + bool enable_liveness = false; ///< Enable RGB liveness detection feature + bool enable_ir_liveness = false; ///< Enable IR (Infrared) liveness detection feature + bool enable_mask_detect = false; ///< Enable mask detection feature + bool enable_face_attribute = false; ///< Enable face attribute prediction feature + bool enable_face_quality = false; ///< Enable face quality assessment feature + bool enable_interaction_liveness = false; ///< Enable interactive liveness detection feature } ContextCustomParameter; @@ -49,11 +49,11 @@ typedef struct CustomPipelineParameter { * @brief Manages the context for face detection, tracking, and feature extraction in the HyperFaceRepo project. * * Provides interfaces to configure face detection modes, manage face tracking, perform recognition, - * and handle other face-related features. Integrates with various modules such as FaceTrack, FaceRecognition, and FacePipeline. + * and handle other face-related features. Integrates with various modules such as FaceTrack, FaceRecognition, and + * FacePipeline. */ class INSPIRE_API FaceContext { public: - /** * @brief Constructor for the FaceContext class. */ @@ -67,18 +67,15 @@ public: * @param param Custom parameters for the face pipeline. * @return int32_t Returns 0 on success, non-zero for any error. */ - int32_t Configuration(DetectMode detect_mode, - int32_t max_detect_face, - CustomPipelineParameter param, - int32_t detect_level_px = -1, - int32_t track_by_detect_mode_fps = -1); + int32_t Configuration(DetectMode detect_mode, int32_t max_detect_face, CustomPipelineParameter param, int32_t detect_level_px = -1, + int32_t track_by_detect_mode_fps = -1); /** * @brief Performs face detection and tracking on a given image stream. * @param image The camera stream to process for face detection and tracking. * @return int32_t Returns the number of faces detected and tracked. */// Method for face detection and tracking - int32_t FaceDetectAndTrack(CameraStream &image); + int32_t FaceDetectAndTrack(CameraStream& image); /** * @brief Set the threshold of face detection function, which only acts on the detection model @@ -100,7 +97,7 @@ public: * @param param Custom pipeline parameters. * @return int32_t Status code of the processing. */ - int32_t FacesProcess(CameraStream &image, const std::vector &faces, const CustomPipelineParameter& param); + int32_t FacesProcess(CameraStream& image, const std::vector& faces, const CustomPipelineParameter& param); /** * @brief Retrieves the face recognition module. @@ -126,13 +123,13 @@ public: * @param data FaceBasicData to store extracted features. * @return int32_t Status code of the feature extraction. */ - int32_t FaceFeatureExtract(CameraStream &image, FaceBasicData& data); + int32_t FaceFeatureExtract(CameraStream& image, FaceBasicData& data); /** * @brief Retrieves the custom pipeline parameters. * @return CustomPipelineParameter Current custom pipeline parameters. */ - const CustomPipelineParameter &getMParameter() const; + const CustomPipelineParameter& getMParameter() const; /** * @brief Static method for detecting face quality. @@ -140,7 +137,7 @@ public: * @param result Float to store the face quality result. * @return int32_t Status code of the quality detection. */ - static int32_t FaceQualityDetect(FaceBasicData& data, float &result); + static int32_t FaceQualityDetect(FaceBasicData& data, float& result); /** * @brief Sets the preview size for face tracking. @@ -201,7 +198,6 @@ public: */ const std::vector& GetYawResultsCache() const; - /** * @brief Gets the cache of pitch results from face pose estimation. * @return A const reference to a vector containing pitch results. @@ -267,7 +263,7 @@ public: * @return A const reference to a vector containing face action normal results. */ const std::vector& GetFaceNormalAactionsResultCache() const; - + /** * @brief Gets the cache of face action jaw open results. * @return A const reference to a vector containing face action jaw open results. @@ -298,49 +294,54 @@ public: */ const Embedded& GetFaceFeatureCache() const; + /** + * @brief Gets the cache of face detection confidence. + * @return A const reference to a vector containing face detection confidence. + */ + const std::vector& GetDetConfidenceCache() const; private: // Private member variables - CustomPipelineParameter m_parameter_; ///< Stores custom parameters for the pipeline - int32_t m_max_detect_face_{}; ///< Maximum number of faces that can be detected - DetectMode m_detect_mode_; ///< Current detection mode (image or video) - bool m_always_detect_{}; ///< Flag to determine if detection should always occur + CustomPipelineParameter m_parameter_; ///< Stores custom parameters for the pipeline + int32_t m_max_detect_face_{}; ///< Maximum number of faces that can be detected + DetectMode m_detect_mode_; ///< Current detection mode (image or video) + bool m_always_detect_{}; ///< Flag to determine if detection should always occur - std::shared_ptr m_face_track_; ///< Shared pointer to the FaceTrack object + std::shared_ptr m_face_track_; ///< Shared pointer to the FaceTrack object std::shared_ptr m_face_recognition_; ///< Shared pointer to the FaceRecognition object - std::shared_ptr m_face_pipeline_; ///< Shared pointer to the FacePipeline object + std::shared_ptr m_face_pipeline_; ///< Shared pointer to the FacePipeline object private: // Cache data - std::vector m_detect_cache_; ///< Cache for storing serialized detected face data - std::vector m_face_basic_data_cache_; ///< Cache for basic face data extracted from detection - std::vector m_face_rects_cache_; ///< Cache for face rectangle data from detection - std::vector m_track_id_cache_; ///< Cache for tracking IDs of detected faces - std::vector m_roll_results_cache_; ///< Cache for storing roll results from face pose estimation - std::vector m_yaw_results_cache_; ///< Cache for storing yaw results from face pose estimation - std::vector m_pitch_results_cache_; ///< Cache for storing pitch results from face pose estimation - std::vector m_quality_results_cache_; ///< Cache for face pose quality results - std::vector m_mask_results_cache_; ///< Cache for mask detection results - std::vector m_rgb_liveness_results_cache_; ///< Cache for RGB liveness detection results - std::vector m_quality_score_results_cache_; ///< Cache for RGB face quality score results - std::vector m_react_left_eye_results_cache_; ///< Cache for Left eye state in face interaction - std::vector m_react_right_eye_results_cache_; ///< Cache for Right eye state in face interaction + std::vector m_detect_cache_; ///< Cache for storing serialized detected face data + std::vector m_face_basic_data_cache_; ///< Cache for basic face data extracted from detection + std::vector m_face_rects_cache_; ///< Cache for face rectangle data from detection + std::vector m_track_id_cache_; ///< Cache for tracking IDs of detected faces + std::vector m_det_confidence_cache_; ///< Cache for face detection confidence of detected faces + std::vector m_roll_results_cache_; ///< Cache for storing roll results from face pose estimation + std::vector m_yaw_results_cache_; ///< Cache for storing yaw results from face pose estimation + std::vector m_pitch_results_cache_; ///< Cache for storing pitch results from face pose estimation + std::vector m_quality_results_cache_; ///< Cache for face pose quality results + std::vector m_mask_results_cache_; ///< Cache for mask detection results + std::vector m_rgb_liveness_results_cache_; ///< Cache for RGB liveness detection results + std::vector m_quality_score_results_cache_; ///< Cache for RGB face quality score results + std::vector m_react_left_eye_results_cache_; ///< Cache for Left eye state in face interaction + std::vector m_react_right_eye_results_cache_; ///< Cache for Right eye state in face interaction - std::vector m_action_normal_results_cache_; ///< Cache for normal action in face interaction - std::vector m_action_shake_results_cache_; ///< Cache for shake action in face interaction - std::vector m_action_blink_results_cache_; ///< Cache for blink action in face interaction - std::vector m_action_jaw_open_results_cache_; ///< Cache for jaw open action in face interaction - std::vector m_action_raise_head_results_cache_; ///< Cache for raise head action in face interaction + std::vector m_action_normal_results_cache_; ///< Cache for normal action in face interaction + std::vector m_action_shake_results_cache_; ///< Cache for shake action in face interaction + std::vector m_action_blink_results_cache_; ///< Cache for blink action in face interaction + std::vector m_action_jaw_open_results_cache_; ///< Cache for jaw open action in face interaction + std::vector m_action_raise_head_results_cache_; ///< Cache for raise head action in face interaction std::vector m_attribute_race_results_cache_; std::vector m_attribute_gender_results_cache_; std::vector m_attribute_age_results_cache_; - Embedded m_face_feature_cache_; ///< Cache for current face feature data - - std::mutex m_mtx_; ///< Mutex for thread safety. + Embedded m_face_feature_cache_; ///< Cache for current face feature data + std::mutex m_mtx_; ///< Mutex for thread safety. }; -} // namespace hyper +} // namespace inspire -#endif //HYPERFACEREPO_FACE_CONTEXT_H +#endif // HYPERFACEREPO_FACE_CONTEXT_H diff --git a/cpp-package/inspireface/cpp/inspireface/information.h b/cpp-package/inspireface/cpp/inspireface/information.h index b1383e1..f5c8b69 100644 --- a/cpp-package/inspireface/cpp/inspireface/information.h +++ b/cpp-package/inspireface/cpp/inspireface/information.h @@ -7,6 +7,6 @@ #define INSPIRE_FACE_VERSION_MAJOR_STR "1" #define INSPIRE_FACE_VERSION_MINOR_STR "1" -#define INSPIRE_FACE_VERSION_PATCH_STR "6" +#define INSPIRE_FACE_VERSION_PATCH_STR "7" #endif //HYPERFACEREPO_INFORMATION_H diff --git a/cpp-package/inspireface/cpp/inspireface/log.h b/cpp-package/inspireface/cpp/inspireface/log.h index 76e41e2..db98fb3 100755 --- a/cpp-package/inspireface/cpp/inspireface/log.h +++ b/cpp-package/inspireface/cpp/inspireface/log.h @@ -32,22 +32,21 @@ #define INSPIRE_LOGF(...) inspire::LogManager::getInstance()->logStandard(inspire::ISF_LOG_FATAL, __FILENAME__, __FUNCTION__, __LINE__, __VA_ARGS__) #endif - // Macro to set the global log level #define INSPIRE_SET_LOG_LEVEL(level) inspire::LogManager::getInstance()->setLogLevel(level) namespace inspire { // Log levels -enum LogLevel { - ISF_LOG_NONE = 0, - ISF_LOG_DEBUG, - ISF_LOG_INFO, - ISF_LOG_WARN, - ISF_LOG_ERROR, - ISF_LOG_FATAL -}; +enum LogLevel { ISF_LOG_NONE = 0, ISF_LOG_DEBUG, ISF_LOG_INFO, ISF_LOG_WARN, ISF_LOG_ERROR, ISF_LOG_FATAL }; +/** + * @class LogManager + * @brief A singleton class for logging messages to the console or Android logcat. + * + * This class provides methods to log messages of different severity levels (DEBUG, INFO, WARN, ERROR, FATAL) + * to the console or Android logcat based on the current log level setting. + */ class INSPIRE_API LogManager { private: LogLevel currentLevel; @@ -84,16 +83,28 @@ public: #ifdef ANDROID // Method for logging on the Android platform void logAndroid(LogLevel level, const char* tag, const char* format, ...) const { - if (currentLevel == ISF_LOG_NONE || level < currentLevel) return; + if (currentLevel == ISF_LOG_NONE || level < currentLevel) + return; int androidLevel; switch (level) { - case ISF_LOG_DEBUG: androidLevel = ANDROID_LOG_DEBUG; break; - case ISF_LOG_INFO: androidLevel = ANDROID_LOG_INFO; break; - case ISF_LOG_WARN: androidLevel = ANDROID_LOG_WARN; break; - case ISF_LOG_ERROR: androidLevel = ANDROID_LOG_ERROR; break; - case ISF_LOG_FATAL: androidLevel = ANDROID_LOG_FATAL; break; - default: androidLevel = ANDROID_LOG_DEFAULT; + case ISF_LOG_DEBUG: + androidLevel = ANDROID_LOG_DEBUG; + break; + case ISF_LOG_INFO: + androidLevel = ANDROID_LOG_INFO; + break; + case ISF_LOG_WARN: + androidLevel = ANDROID_LOG_WARN; + break; + case ISF_LOG_ERROR: + androidLevel = ANDROID_LOG_ERROR; + break; + case ISF_LOG_FATAL: + androidLevel = ANDROID_LOG_FATAL; + break; + default: + androidLevel = ANDROID_LOG_DEFAULT; } va_list args; @@ -105,7 +116,8 @@ public: // Method for standard platform logging void logStandard(LogLevel level, const char* filename, const char* function, int line, const char* format, ...) const { // Check whether the current level is LOG NONE or the log level is not enough to log - if (currentLevel == ISF_LOG_NONE || level < currentLevel) return; + if (currentLevel == ISF_LOG_NONE || level < currentLevel) + return; // Build log prefix dynamically based on available data bool hasPrintedPrefix = false; @@ -145,14 +157,12 @@ public: printf("\033[0m"); // Reset color } - printf("\n"); // New line after log message + printf("\n"); // New line after log message } - #endif - }; -} // namespace inspire +} // namespace inspire -#endif // LOG_MANAGER_H +#endif // LOG_MANAGER_H diff --git a/cpp-package/inspireface/cpp/inspireface/track_module/face_track.cpp b/cpp-package/inspireface/cpp/inspireface/track_module/face_track.cpp index c7b40cb..9abdea1 100644 --- a/cpp-package/inspireface/cpp/inspireface/track_module/face_track.cpp +++ b/cpp-package/inspireface/cpp/inspireface/track_module/face_track.cpp @@ -15,17 +15,13 @@ namespace inspire { -FaceTrack::FaceTrack(DetectMode mode, - int max_detected_faces, - int detection_interval, - int track_preview_size, - int dynamic_detection_input_level, - int TbD_mode_fps) : - m_mode_(mode), - max_detected_faces_(max_detected_faces), - detection_interval_(detection_interval), - track_preview_size_(track_preview_size), - m_dynamic_detection_input_level_(dynamic_detection_input_level){ +FaceTrack::FaceTrack(DetectMode mode, int max_detected_faces, int detection_interval, + int track_preview_size, int dynamic_detection_input_level, int TbD_mode_fps) +: m_mode_(mode), + max_detected_faces_(max_detected_faces), + detection_interval_(detection_interval), + track_preview_size_(track_preview_size), + m_dynamic_detection_input_level_(dynamic_detection_input_level) { detection_index_ = -1; tracking_idx_ = 0; if (TbD_mode_fps < 0) { @@ -35,18 +31,19 @@ FaceTrack::FaceTrack(DetectMode mode, if (m_mode_ == DETECT_MODE_TRACK_BY_DETECT) { #ifdef ISF_ENABLE_TRACKING_BY_DETECTION m_TbD_tracker_ = std::make_shared(TbD_mode_fps, 30); -#else +#else m_mode_ = DETECT_MODE_ALWAYS_DETECT; - INSPIRE_LOGW("If you want to use tracking-by-detection in this release, you must turn on the option symbol ISF_ENABLE_TRACKING_BY_DETECTION at compile time"); + INSPIRE_LOGW( + "If you want to use tracking-by-detection in this release, you must turn on the option " + "symbol ISF_ENABLE_TRACKING_BY_DETECTION at compile time"); #endif } - } - -void FaceTrack::SparseLandmarkPredict(const cv::Mat &raw_face_crop, std::vector &landmarks_output, - float &score, float size) { -// LOGD("ready to landmark predict"); +void FaceTrack::SparseLandmarkPredict(const cv::Mat &raw_face_crop, + std::vector &landmarks_output, float &score, + float size) { + // LOGD("ready to landmark predict"); landmarks_output.resize(FaceLandmark::NUM_OF_LANDMARK); std::vector lmk_out = (*m_landmark_predictor_)(raw_face_crop); for (int i = 0; i < FaceLandmark::NUM_OF_LANDMARK; ++i) { @@ -56,17 +53,16 @@ void FaceTrack::SparseLandmarkPredict(const cv::Mat &raw_face_crop, std::vector< } score = (*m_refine_net_)(raw_face_crop); -// LOGD("predict ok ,score: %f", score); - + // LOGD("predict ok ,score: %f", score); } bool FaceTrack::TrackFace(CameraStream &image, FaceObject &face) { if (face.GetConfidence() < 0.1) { face.DisableTracking(); -// LOGD("flag disable TrackFace: %f", face.GetConfidence()); + // LOGD("flag disable TrackFace: %f", face.GetConfidence()); return false; } -// LOGD("start track one"); + // LOGD("start track one"); cv::Mat affine; std::vector landmark_back; @@ -83,11 +79,9 @@ bool FaceTrack::TrackFace(CameraStream &image, FaceObject &face) { cv::invertAffineTransform(rotation_mode_affine, rotation_mode_affine_inv); rotation_mode_affine_inv = rotation_mode_affine; std::vector camera_pts = - ApplyTransformToPoints(rect_pts, rotation_mode_affine_inv); + ApplyTransformToPoints(rect_pts, rotation_mode_affine_inv); camera_pts.erase(camera_pts.end() - 1); - std::vector dst_pts = {{0, 0}, - {112, 0}, - {112, 112}}; + std::vector dst_pts = {{0, 0}, {112, 0}, {112, 112}}; assert(dst_pts.size() == camera_pts.size()); affine = cv::getAffineTransform(camera_pts, dst_pts); // affine = GetRectSquareAffine(rect_square); @@ -95,22 +89,21 @@ bool FaceTrack::TrackFace(CameraStream &image, FaceObject &face) { } affine = face.getTransMatrix(); -// cout << affine << endl; + // cout << affine << endl; cv::Mat crop; -// LOGD("get affine crop ok"); - double time1 = (double) cv::getTickCount(); + // LOGD("get affine crop ok"); + double time1 = (double)cv::getTickCount(); crop = image.GetAffineRGBImage(affine, 112, 112); -// cv::imshow("w", crop); -// cv::waitKey(0); + // cv::imshow("w", crop); + // cv::waitKey(0); cv::Mat affine_inv; cv::invertAffineTransform(affine, affine_inv); - double _diff = - (((double) cv::getTickCount() - time1) / cv::getTickFrequency()) * 1000; -// LOGD("affine cost %f", _diff); + double _diff = (((double)cv::getTickCount() - time1) / cv::getTickFrequency()) * 1000; + // LOGD("affine cost %f", _diff); std::vector landmark_rawout; std::vector bbox; - auto timeStart = (double) cv::getTickCount(); + auto timeStart = (double)cv::getTickCount(); SparseLandmarkPredict(crop, landmark_rawout, score, 112); std::vector lmk_5 = {landmark_rawout[FaceLandmark::LEFT_EYE_CENTER], landmark_rawout[FaceLandmark::RIGHT_EYE_CENTER], @@ -118,21 +111,17 @@ bool FaceTrack::TrackFace(CameraStream &image, FaceObject &face) { landmark_rawout[FaceLandmark::MOUTH_LEFT_CORNER], landmark_rawout[FaceLandmark::MOUTH_RIGHT_CORNER]}; face.setAlignMeanSquareError(lmk_5); - double nTime = - (((double) cv::getTickCount() - timeStart) / cv::getTickFrequency()) * - 1000; -// LOGD("sparse cost %f", nTime); + double nTime = (((double)cv::getTickCount() - timeStart) / cv::getTickFrequency()) * 1000; + // LOGD("sparse cost %f", nTime); landmark_back.resize(landmark_rawout.size()); landmark_back = ApplyTransformToPoints(landmark_rawout, affine_inv); int MODE = 1; - if (MODE > 0) { if (face.TrackingState() == DETECT) { face.ReadyTracking(); - } else if (face.TrackingState() == READY || - face.TrackingState() == TRACKING) { + } else if (face.TrackingState() == READY || face.TrackingState() == TRACKING) { cv::Mat trans_m(2, 3, CV_64F); cv::Mat tmp = face.getTransMatrix(); std::vector inside_points = landmark_rawout; @@ -162,24 +151,24 @@ bool FaceTrack::TrackFace(CameraStream &image, FaceObject &face) { SimilarityTransformEstimate(landmark_back, inside_points, trans_m); face.setTransMatrix(trans_m); face.EnableTracking(); -// LOGD("ready face TrackFace state %d ", face.TrackingState()); + // LOGD("ready face TrackFace state %d ", face.TrackingState()); } } - // realloc many times face.SetLandmark(landmark_back, true); if (m_face_quality_ != nullptr) { // pose and quality - BUG auto rect = face.bbox_; -// std::cout << rect << std::endl; - auto affine_scale = ComputeCropMatrix(rect, FacePoseQuality::INPUT_WIDTH, FacePoseQuality::INPUT_HEIGHT); + // std::cout << rect << std::endl; + auto affine_scale = + ComputeCropMatrix(rect, FacePoseQuality::INPUT_WIDTH, FacePoseQuality::INPUT_HEIGHT); affine_scale.convertTo(affine_scale, CV_64F); auto pre_crop = image.GetAffineRGBImage(affine_scale, FacePoseQuality::INPUT_WIDTH, FacePoseQuality::INPUT_HEIGHT); -// cv::imshow("crop", crop); -// cv::imshow("pre_crop", pre_crop); + // cv::imshow("crop", crop); + // cv::imshow("pre_crop", pre_crop); cv::Mat rotationMatrix; if (image.getRotationMode() != ROTATION_0) { cv::Point2f center(pre_crop.cols / 2.0, pre_crop.rows / 2.0); @@ -192,77 +181,78 @@ bool FaceTrack::TrackFace(CameraStream &image, FaceObject &face) { cv::Mat invRotationMatrix; cv::invertAffineTransform(rotationMatrix, invRotationMatrix); invRotationMatrix.convertTo(invRotationMatrix, CV_32F); - for (auto &p: res.lmk) { + for (auto &p : res.lmk) { cv::Vec3f tmp = {p.x, p.y, 1}; cv::Mat result; cv::gemm(invRotationMatrix, tmp, 1.0, cv::Mat(), 0.0, result); p.x = result.at(0); p.y = result.at(1); -// cv::circle(pre_crop, p, 0, cv::Scalar(0, 0, 255), 2); + // cv::circle(pre_crop, p, 0, cv::Scalar(0, 0, 255), 2); } } cv::Mat inv_affine_scale; cv::invertAffineTransform(affine_scale, inv_affine_scale); inv_affine_scale.convertTo(inv_affine_scale, CV_32F); - for (auto &p: res.lmk) { + for (auto &p : res.lmk) { cv::Vec3f tmp = {p.x, p.y, 1}; cv::Mat result; cv::gemm(inv_affine_scale, tmp, 1.0, cv::Mat(), 0.0, result); p.x = result.at(0); p.y = result.at(1); -// cv::circle(pre_crop, p, 0, cv::Scalar(0, 0, 255), 2); + // cv::circle(pre_crop, p, 0, cv::Scalar(0, 0, 255), 2); } -// -// auto img = image.GetScaledImage(1.0f, true); -// for (int i = 0; i < 5; ++i) { -// auto &p = res.lmk[i]; -// cv::circle(img, p, 0, cv::Scalar(0, 0, 255), 5); -// } -// cv::imshow("AAAA", img); -// cv::waitKey(0); + // + // auto img = image.GetScaledImage(1.0f, true); + // for (int i = 0; i < 5; ++i) { + // auto &p = res.lmk[i]; + // cv::circle(img, p, 0, cv::Scalar(0, 0, 255), 5); + // } + // cv::imshow("AAAA", img); + // cv::waitKey(0); - -// cv::imshow("pre_crop_w", pre_crop); -// cv::waitKey(0); + // cv::imshow("pre_crop_w", pre_crop); + // cv::waitKey(0); face.high_result = res; } - - face.SetConfidence(score); + // If the face is already tracked, replace the confidence with the tracking result + if (face.TrackingState() == TRACKING) { + face.SetConfidence(score); + } return true; } void FaceTrack::UpdateStream(CameraStream &image) { - auto timeStart = (double) cv::getTickCount(); + auto timeStart = (double)cv::getTickCount(); detection_index_ += 1; if (m_mode_ == DETECT_MODE_ALWAYS_DETECT || m_mode_ == DETECT_MODE_TRACK_BY_DETECT) trackingFace.clear(); -// LOGD("%d, %d", detection_index_, detection_interval_); - if (detection_index_ % detection_interval_ == 0 || m_mode_ == DETECT_MODE_ALWAYS_DETECT || m_mode_ == DETECT_MODE_TRACK_BY_DETECT) { -// Timer t_blacking; + // LOGD("%d, %d", detection_index_, detection_interval_); + if (detection_index_ % detection_interval_ == 0 || m_mode_ == DETECT_MODE_ALWAYS_DETECT || + m_mode_ == DETECT_MODE_TRACK_BY_DETECT) { + // Timer t_blacking; image.SetPreviewSize(track_preview_size_); cv::Mat image_detect = image.GetPreviewImage(true); - - for (auto const &face: trackingFace) { + for (auto const &face : trackingFace) { cv::Rect m_mask_rect = face.GetRectSquare(); std::vector pts = Rect2Points(m_mask_rect); cv::Mat rotation_mode_affine = image.GetAffineMatrix(); cv::Mat rotation_mode_affine_inv; cv::invertAffineTransform(rotation_mode_affine, rotation_mode_affine_inv); std::vector affine_pts = - ApplyTransformToPoints(pts, rotation_mode_affine_inv); + ApplyTransformToPoints(pts, rotation_mode_affine_inv); cv::Rect mask_rect = cv::boundingRect(affine_pts); BlackingTrackingRegion(image_detect, mask_rect); } -// LOGD("Blacking Cost %f", t_blacking.GetCostTimeUpdate()); + // LOGD("Blacking Cost %f", t_blacking.GetCostTimeUpdate()); // do detection in thread -// LOGD("detect scaled rows: %d cols: %d", image_detect.rows, -// image_detect.cols); - auto timeStart = (double) cv::getTickCount(); + // LOGD("detect scaled rows: %d cols: %d", image_detect.rows, + // image_detect.cols); + auto timeStart = (double)cv::getTickCount(); DetectFace(image_detect, image.GetPreviewScale()); - det_use_time_ = ((double) cv::getTickCount() - timeStart) / cv::getTickFrequency() * 1000; + det_use_time_ = ((double)cv::getTickCount() - timeStart) / cv::getTickFrequency() * 1000; } if (!candidate_faces_.empty()) { @@ -273,18 +263,18 @@ void FaceTrack::UpdateStream(CameraStream &image) { } for (std::vector::iterator iter = trackingFace.begin(); - iter != trackingFace.end();) { + iter != trackingFace.end();) { if (!TrackFace(image, *iter)) { iter = trackingFace.erase(iter); } else { iter++; } } - - nms(); -// LOGD("Track Cost %f", t_track.GetCostTimeUpdate()); - track_total_use_time_ = ((double) cv::getTickCount() - timeStart) / cv::getTickFrequency() * 1000; + nms(); + // LOGD("Track Cost %f", t_track.GetCostTimeUpdate()); + track_total_use_time_ = + ((double)cv::getTickCount() - timeStart) / cv::getTickFrequency() * 1000; } void FaceTrack::nms(float th) { @@ -325,7 +315,6 @@ void FaceTrack::nms(float th) { } } - void FaceTrack::BlackingTrackingRegion(cv::Mat &image, cv::Rect &rect_mask) { int height = image.rows; int width = image.cols; @@ -336,17 +325,16 @@ void FaceTrack::BlackingTrackingRegion(cv::Mat &image, cv::Rect &rect_mask) { void FaceTrack::DetectFace(const cv::Mat &input, float scale) { std::vector boxes = (*m_face_detector_)(input); -// for (auto box: boxes) { -// cv::Rect r(cv::Point2f(box.x1, box.y1), cv::Point2f(box.x2, box.y2)); -// cv::rectangle(input, r, cv::Scalar(255, 0, 0), 3); -// } -// cv::imshow("w", input); -// cv::waitKey(0); + // for (auto box: boxes) { + // cv::Rect r(cv::Point2f(box.x1, box.y1), cv::Point2f(box.x2, box.y2)); + // cv::rectangle(input, r, cv::Scalar(255, 0, 0), 3); + // } + // cv::imshow("w", input); + // cv::waitKey(0); if (m_mode_ == DETECT_MODE_TRACK_BY_DETECT) { - #ifdef ISF_ENABLE_TRACKING_BY_DETECTION std::vector objects; - auto num_of_effective = std::min(boxes.size(), (size_t )max_detected_faces_); + auto num_of_effective = std::min(boxes.size(), (size_t)max_detected_faces_); for (size_t i = 0; i < num_of_effective; i++) { Object obj; const auto box = boxes[i]; @@ -355,13 +343,14 @@ void FaceTrack::DetectFace(const cv::Mat &input, float scale) { // Filter too small face detection box continue; } - obj.label = 0; // assuming all detections are faces + obj.label = 0; // assuming all detections are faces obj.prob = box.score; objects.push_back(obj); } vector output_stracks = m_TbD_tracker_->update(objects); for (const auto &st_track : output_stracks) { - cv::Rect rect = cv::Rect_(st_track.tlwh[0], st_track.tlwh[1], st_track.tlwh[2], st_track.tlwh[3]); + cv::Rect rect = cv::Rect_(st_track.tlwh[0], st_track.tlwh[1], st_track.tlwh[2], + st_track.tlwh[3]); FaceObject faceinfo(st_track.track_id, rect, FaceLandmark::NUM_OF_LANDMARK); faceinfo.detect_bbox_ = rect; candidate_faces_.push_back(faceinfo); @@ -371,9 +360,10 @@ void FaceTrack::DetectFace(const cv::Mat &input, float scale) { std::vector bbox; bbox.resize(boxes.size()); for (int i = 0; i < boxes.size(); i++) { - bbox[i] = cv::Rect(cv::Point(static_cast(boxes[i].x1), static_cast(boxes[i].y1)), - cv::Point(static_cast(boxes[i].x2), static_cast(boxes[i].y2))); - + bbox[i] = + cv::Rect(cv::Point(static_cast(boxes[i].x1), static_cast(boxes[i].y1)), + cv::Point(static_cast(boxes[i].x2), static_cast(boxes[i].y2))); + if (!isShortestSideGreaterThan(bbox[i], filter_minimum_face_px_size, scale)) { // Filter too small face detection box continue; @@ -384,20 +374,19 @@ void FaceTrack::DetectFace(const cv::Mat &input, float scale) { } else { tracking_idx_ = tracking_idx_ + 1; } - + FaceObject faceinfo(tracking_idx_, bbox[i], FaceLandmark::NUM_OF_LANDMARK); faceinfo.detect_bbox_ = bbox[i]; - + faceinfo.SetConfidence(boxes[i].score); + // Control that the number of faces detected does not exceed the maximum limit - if (candidate_faces_.size() >= max_detected_faces_) - { + if (candidate_faces_.size() >= max_detected_faces_) { continue; } - + candidate_faces_.push_back(faceinfo); } } - } int FaceTrack::Configuration(inspire::InspireArchive &archive) { @@ -492,7 +481,7 @@ double FaceTrack::GetTrackTotalUseTime() const { } void FaceTrack::SetTrackPreviewSize(int preview_size) { - track_preview_size_ = preview_size; + track_preview_size_ = preview_size; } std::string FaceTrack::ChoiceMultiLevelDetectModel(const int32_t pixel_size) { @@ -500,8 +489,7 @@ std::string FaceTrack::ChoiceMultiLevelDetectModel(const int32_t pixel_size) { const std::string scheme_names[] = {"face_detect_160", "face_detect_320", "face_detect_640"}; const int32_t num_sizes = sizeof(supported_sizes) / sizeof(supported_sizes[0]); - if (pixel_size == -1) - { + if (pixel_size == -1) { return scheme_names[1]; } @@ -526,10 +514,12 @@ std::string FaceTrack::ChoiceMultiLevelDetectModel(const int32_t pixel_size) { } } - INSPIRE_LOGW("Input pixel size %d is not supported. Choosing the closest scheme: %s closest_scheme for size %d.", - pixel_size, closest_scheme.c_str(), closest_size); + INSPIRE_LOGW( + "Input pixel size %d is not supported. Choosing the closest scheme: %s closest_scheme for " + "size %d.", + pixel_size, closest_scheme.c_str(), closest_size); return closest_scheme; } -} // namespace hyper +} // namespace inspire diff --git a/cpp-package/inspireface/cpp/inspireface/track_module/tracker_optional/README.md b/cpp-package/inspireface/cpp/inspireface/track_module/tracker_optional/README.md index e69de29..17b8dbe 100644 --- a/cpp-package/inspireface/cpp/inspireface/track_module/tracker_optional/README.md +++ b/cpp-package/inspireface/cpp/inspireface/track_module/tracker_optional/README.md @@ -0,0 +1,10 @@ +## Tracker Optional + +### Tracking by Landmark + +Tracking by Landmark is a basic tracking mode with high speed but average accuracy. It is recommended to be used in the portrait mode of the front camera of the mobile phone, which is suitable for the case of tracking 1-5 faces. + +### Tracking by Detection + +Tracking by Detection has high accuracy but slow speed. Currently, only bytetrack is implemented. Source code is in [DeepSORT](https://github.com/shaoshengsong/DeepSORT/tree/master/tracker/bytetrack/). + diff --git a/cpp-package/inspireface/cpp/inspireface/version.txt b/cpp-package/inspireface/cpp/inspireface/version.txt index f861324..2125889 100644 --- a/cpp-package/inspireface/cpp/inspireface/version.txt +++ b/cpp-package/inspireface/cpp/inspireface/version.txt @@ -1 +1 @@ -InspireFace Version: 1.1.6 +InspireFace Version: 1.1.7 diff --git a/cpp-package/inspireface/cpp/sample/cpp/sample_face_track.cpp b/cpp-package/inspireface/cpp/sample/cpp/sample_face_track.cpp index f3c92f2..ea8e603 100644 --- a/cpp-package/inspireface/cpp/sample/cpp/sample_face_track.cpp +++ b/cpp-package/inspireface/cpp/sample/cpp/sample_face_track.cpp @@ -49,8 +49,7 @@ int main(int argc, char* argv[]) { HInt32 detectPixelLevel = 160; // Handle of the current face SDK algorithm context HFSession session = {0}; - ret = HFCreateInspireFaceSessionOptional(option, detMode, maxDetectNum, detectPixelLevel, -1, - &session); + ret = HFCreateInspireFaceSessionOptional(option, detMode, maxDetectNum, detectPixelLevel, -1, &session); if (ret != HSUCCEED) { std::cout << "Create FaceContext error: " << ret << std::endl; return ret; @@ -115,10 +114,10 @@ int main(int argc, char* argv[]) { std::cout << "========================================" << std::endl; std::cout << "Token size: " << multipleFaceData.tokens[index].size << std::endl; std::cout << "Process face index: " << index << std::endl; + std::cout << "DetConfidence: " << multipleFaceData.detConfidence[index] << std::endl; // Use OpenCV's Rect to receive face bounding boxes - auto rect = - cv::Rect(multipleFaceData.rects[index].x, multipleFaceData.rects[index].y, - multipleFaceData.rects[index].width, multipleFaceData.rects[index].height); + auto rect = cv::Rect(multipleFaceData.rects[index].x, multipleFaceData.rects[index].y, + multipleFaceData.rects[index].width, multipleFaceData.rects[index].height); cv::rectangle(draw, rect, cv::Scalar(0, 100, 255), 4); // Print FaceID, In IMAGE-MODE it is changing, in VIDEO-MODE it is fixed, but it may be lost @@ -126,15 +125,13 @@ int main(int argc, char* argv[]) { // Print Head euler angle, It can often be used to judge the quality of a face by the Angle // of the head - std::cout << "Roll: " << multipleFaceData.angles.roll[index] - << ", Yaw: " << multipleFaceData.angles.yaw[index] + std::cout << "Roll: " << multipleFaceData.angles.roll[index] << ", Yaw: " << multipleFaceData.angles.yaw[index] << ", Pitch: " << multipleFaceData.angles.pitch[index] << std::endl; HInt32 numOfLmk; HFGetNumOfFaceDenseLandmark(&numOfLmk); HPoint2f denseLandmarkPoints[numOfLmk]; - ret = HFGetFaceDenseLandmarkFromFaceToken(multipleFaceData.tokens[index], - denseLandmarkPoints, numOfLmk); + ret = HFGetFaceDenseLandmarkFromFaceToken(multipleFaceData.tokens[index], denseLandmarkPoints, numOfLmk); if (ret != HSUCCEED) { std::cerr << "HFGetFaceDenseLandmarkFromFaceToken error!!" << std::endl; return -1; @@ -154,8 +151,7 @@ int main(int argc, char* argv[]) { // when FaceContext is created! auto pipelineOption = HF_ENABLE_QUALITY | HF_ENABLE_MASK_DETECT | HF_ENABLE_LIVENESS; // In this loop, all faces are processed - ret = HFMultipleFacePipelineProcessOptional(session, imageHandle, &multipleFaceData, - pipelineOption); + ret = HFMultipleFacePipelineProcessOptional(session, imageHandle, &multipleFaceData, pipelineOption); if (ret != HSUCCEED) { std::cout << "Execute Pipeline error: " << ret << std::endl; return ret; diff --git a/cpp-package/inspireface/cpp/test/CMakeLists.txt b/cpp-package/inspireface/cpp/test/CMakeLists.txt index fe56c5b..8d8d5af 100644 --- a/cpp-package/inspireface/cpp/test/CMakeLists.txt +++ b/cpp-package/inspireface/cpp/test/CMakeLists.txt @@ -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") diff --git a/cpp-package/inspireface/cpp/test/settings/enviro.h b/cpp-package/inspireface/cpp/test/settings/enviro.h index 06d64e4..be218ec 100644 --- a/cpp-package/inspireface/cpp/test/settings/enviro.h +++ b/cpp-package/inspireface/cpp/test/settings/enviro.h @@ -7,35 +7,53 @@ #include +/** + * @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 diff --git a/cpp-package/inspireface/cpp/test/settings/test_settings.h b/cpp-package/inspireface/cpp/test/settings/test_settings.h index 823b7a3..ba56f9a 100644 --- a/cpp-package/inspireface/cpp/test/settings/test_settings.h +++ b/cpp-package/inspireface/cpp/test/settings/test_settings.h @@ -9,31 +9,56 @@ #include #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 diff --git a/cpp-package/inspireface/cpp/test/test.cpp b/cpp-package/inspireface/cpp/test/test.cpp index 2c1db89..15a30d2 100644 --- a/cpp-package/inspireface/cpp/test/test.cpp +++ b/cpp-package/inspireface/cpp/test/test.cpp @@ -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; } diff --git a/cpp-package/inspireface/cpp/test/unit/api/test_face_track.cpp b/cpp-package/inspireface/cpp/test/unit/api/test_face_track.cpp index f12ec23..841715c 100644 --- a/cpp-package/inspireface/cpp/test/unit/api/test_face_track.cpp +++ b/cpp-package/inspireface/cpp/test/unit/api/test_face_track.cpp @@ -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(" 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(" 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(" 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(" 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 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); + } } \ No newline at end of file diff --git a/cpp-package/inspireface/cpp/test/unit/api/test_system.cpp b/cpp-package/inspireface/cpp/test/unit/api/test_system.cpp index d35e710..7fbf9c0 100644 --- a/cpp-package/inspireface/cpp/test/unit/api/test_system.cpp +++ b/cpp-package/inspireface/cpp/test/unit/api/test_system.cpp @@ -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 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 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 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); + } } \ No newline at end of file diff --git a/cpp-package/inspireface/python/README.md b/cpp-package/inspireface/python/README.md index eae984e..403289d 100644 --- a/cpp-package/inspireface/python/README.md +++ b/cpp-package/inspireface/python/README.md @@ -50,6 +50,8 @@ draw = image.copy() for idx, face in enumerate(faces): print(f"{'==' * 20}") print(f"idx: {idx}") + # Print detection confidence. + print(f"detection confidence: {face.detection_confidence}") # Print Euler angles of the face. print(f"roll: {face.roll}, yaw: {face.yaw}, pitch: {face.pitch}") # Draw bounding box around the detected face. diff --git a/cpp-package/inspireface/python/inspireface/modules/__init__.py b/cpp-package/inspireface/python/inspireface/modules/__init__.py index 0d8d26d..5bce85b 100644 --- a/cpp-package/inspireface/python/inspireface/modules/__init__.py +++ b/cpp-package/inspireface/python/inspireface/modules/__init__.py @@ -3,5 +3,4 @@ from .inspire_face import ImageStream, FaceExtended, FaceInformation, SessionCus FaceIdentity, feature_hub_set_search_threshold, feature_hub_face_insert, SearchResult, \ feature_hub_face_search, feature_hub_face_search_top_k, feature_hub_face_update, feature_hub_face_remove, \ feature_hub_get_face_identity, feature_hub_get_face_count, view_table_in_terminal, version, \ - set_logging_level, disable_logging - + set_logging_level, disable_logging, show_system_resource_statistics \ No newline at end of file diff --git a/cpp-package/inspireface/python/inspireface/modules/core/native.py b/cpp-package/inspireface/python/inspireface/modules/core/native.py index ea0a54f..c3d4dfc 100644 --- a/cpp-package/inspireface/python/inspireface/modules/core/native.py +++ b/cpp-package/inspireface/python/inspireface/modules/core/native.py @@ -875,6 +875,8 @@ _libs[_LIBRARY_FILENAME] = load_library(_LIBRARY_FILENAME) # No modules +uint8_t = c_ubyte# /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/_types/_uint8_t.h: 31 + HPVoid = POINTER(None)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/intypedef.h: 8 HFImageStream = POINTER(None)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/intypedef.h: 9 @@ -933,35 +935,35 @@ struct_HPoint2f._fields_ = [ HPoint2f = struct_HPoint2f# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/intypedef.h: 37 -enum_HFImageFormat = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 49 +enum_HFImageFormat = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 47 -HF_STREAM_RGB = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 49 +HF_STREAM_RGB = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 47 -HF_STREAM_BGR = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 49 +HF_STREAM_BGR = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 47 -HF_STREAM_RGBA = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 49 +HF_STREAM_RGBA = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 47 -HF_STREAM_BGRA = 3# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 49 +HF_STREAM_BGRA = 3# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 47 -HF_STREAM_YUV_NV12 = 4# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 49 +HF_STREAM_YUV_NV12 = 4# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 47 -HF_STREAM_YUV_NV21 = 5# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 49 +HF_STREAM_YUV_NV21 = 5# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 47 -HFImageFormat = enum_HFImageFormat# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 49 +HFImageFormat = enum_HFImageFormat# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 47 -enum_HFRotation = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 61 +enum_HFRotation = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 58 -HF_CAMERA_ROTATION_0 = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 61 +HF_CAMERA_ROTATION_0 = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 58 -HF_CAMERA_ROTATION_90 = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 61 +HF_CAMERA_ROTATION_90 = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 58 -HF_CAMERA_ROTATION_180 = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 61 +HF_CAMERA_ROTATION_180 = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 58 -HF_CAMERA_ROTATION_270 = 3# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 61 +HF_CAMERA_ROTATION_270 = 3# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 58 -HFRotation = enum_HFRotation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 61 +HFRotation = enum_HFRotation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 58 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 74 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 70 class struct_HFImageData(Structure): pass @@ -973,36 +975,42 @@ struct_HFImageData.__slots__ = [ 'rotation', ] struct_HFImageData._fields_ = [ - ('data', POINTER(c_uint8)), + ('data', POINTER(uint8_t)), ('width', HInt32), ('height', HInt32), ('format', HFImageFormat), ('rotation', HFRotation), ] -HFImageData = struct_HFImageData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 74 +HFImageData = struct_HFImageData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 70 -PHFImageData = POINTER(struct_HFImageData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 74 +PHFImageData = POINTER(struct_HFImageData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 70 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 86 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 81 if _libs[_LIBRARY_FILENAME].has("HFCreateImageStream", "cdecl"): HFCreateImageStream = _libs[_LIBRARY_FILENAME].get("HFCreateImageStream", "cdecl") HFCreateImageStream.argtypes = [PHFImageData, POINTER(HFImageStream)] HFCreateImageStream.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 97 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 91 if _libs[_LIBRARY_FILENAME].has("HFReleaseImageStream", "cdecl"): HFReleaseImageStream = _libs[_LIBRARY_FILENAME].get("HFReleaseImageStream", "cdecl") HFReleaseImageStream.argtypes = [HFImageStream] HFReleaseImageStream.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 110 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 105 if _libs[_LIBRARY_FILENAME].has("HFLaunchInspireFace", "cdecl"): HFLaunchInspireFace = _libs[_LIBRARY_FILENAME].get("HFLaunchInspireFace", "cdecl") HFLaunchInspireFace.argtypes = [HPath] HFLaunchInspireFace.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 131 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 113 +if _libs[_LIBRARY_FILENAME].has("HFTerminateInspireFace", "cdecl"): + HFTerminateInspireFace = _libs[_LIBRARY_FILENAME].get("HFTerminateInspireFace", "cdecl") + HFTerminateInspireFace.argtypes = [] + HFTerminateInspireFace.restype = HResult + +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 134 class struct_HFSessionCustomParameter(Structure): pass @@ -1025,39 +1033,39 @@ struct_HFSessionCustomParameter._fields_ = [ ('enable_interaction_liveness', HInt32), ] -HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 131 +HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 134 -PHFSessionCustomParameter = POINTER(struct_HFSessionCustomParameter)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 131 +PHFSessionCustomParameter = POINTER(struct_HFSessionCustomParameter)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 134 -enum_HFDetectMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 142 +enum_HFDetectMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 147 -HF_DETECT_MODE_ALWAYS_DETECT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 142 +HF_DETECT_MODE_ALWAYS_DETECT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 147 -HF_DETECT_MODE_LIGHT_TRACK = (HF_DETECT_MODE_ALWAYS_DETECT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 142 +HF_DETECT_MODE_LIGHT_TRACK = (HF_DETECT_MODE_ALWAYS_DETECT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 147 -HF_DETECT_MODE_TRACK_BY_DETECTION = (HF_DETECT_MODE_LIGHT_TRACK + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 142 +HF_DETECT_MODE_TRACK_BY_DETECTION = (HF_DETECT_MODE_LIGHT_TRACK + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 147 -HFDetectMode = enum_HFDetectMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 142 +HFDetectMode = enum_HFDetectMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 147 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 157 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 163 if _libs[_LIBRARY_FILENAME].has("HFCreateInspireFaceSession", "cdecl"): HFCreateInspireFaceSession = _libs[_LIBRARY_FILENAME].get("HFCreateInspireFaceSession", "cdecl") HFCreateInspireFaceSession.argtypes = [HFSessionCustomParameter, HFDetectMode, HInt32, HInt32, HInt32, POINTER(HFSession)] HFCreateInspireFaceSession.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 179 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 180 if _libs[_LIBRARY_FILENAME].has("HFCreateInspireFaceSessionOptional", "cdecl"): HFCreateInspireFaceSessionOptional = _libs[_LIBRARY_FILENAME].get("HFCreateInspireFaceSessionOptional", "cdecl") HFCreateInspireFaceSessionOptional.argtypes = [HOption, HFDetectMode, HInt32, HInt32, HInt32, POINTER(HFSession)] HFCreateInspireFaceSessionOptional.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 194 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 189 if _libs[_LIBRARY_FILENAME].has("HFReleaseInspireFaceSession", "cdecl"): HFReleaseInspireFaceSession = _libs[_LIBRARY_FILENAME].get("HFReleaseInspireFaceSession", "cdecl") HFReleaseInspireFaceSession.argtypes = [HFSession] HFReleaseInspireFaceSession.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 204 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 199 class struct_HFFaceBasicToken(Structure): pass @@ -1070,11 +1078,11 @@ struct_HFFaceBasicToken._fields_ = [ ('data', HPVoid), ] -HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 204 +HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 199 -PHFFaceBasicToken = POINTER(struct_HFFaceBasicToken)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 204 +PHFFaceBasicToken = POINTER(struct_HFFaceBasicToken)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 199 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 215 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 210 class struct_HFFaceEulerAngle(Structure): pass @@ -1089,9 +1097,9 @@ struct_HFFaceEulerAngle._fields_ = [ ('pitch', POINTER(HFloat)), ] -HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 215 +HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 210 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 229 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 225 class struct_HFMultipleFaceData(Structure): pass @@ -1099,6 +1107,7 @@ struct_HFMultipleFaceData.__slots__ = [ 'detectedNum', 'rects', 'trackIds', + 'detConfidence', 'angles', 'tokens', ] @@ -1106,63 +1115,64 @@ struct_HFMultipleFaceData._fields_ = [ ('detectedNum', HInt32), ('rects', POINTER(HFaceRect)), ('trackIds', POINTER(HInt32)), + ('detConfidence', POINTER(HFloat)), ('angles', HFFaceEulerAngle), ('tokens', PHFFaceBasicToken), ] -HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 229 +HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 225 -PHFMultipleFaceData = POINTER(struct_HFMultipleFaceData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 229 +PHFMultipleFaceData = POINTER(struct_HFMultipleFaceData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 225 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 239 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 235 if _libs[_LIBRARY_FILENAME].has("HFSessionSetTrackPreviewSize", "cdecl"): HFSessionSetTrackPreviewSize = _libs[_LIBRARY_FILENAME].get("HFSessionSetTrackPreviewSize", "cdecl") HFSessionSetTrackPreviewSize.argtypes = [HFSession, HInt32] HFSessionSetTrackPreviewSize.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 248 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 245 if _libs[_LIBRARY_FILENAME].has("HFSessionSetFilterMinimumFacePixelSize", "cdecl"): HFSessionSetFilterMinimumFacePixelSize = _libs[_LIBRARY_FILENAME].get("HFSessionSetFilterMinimumFacePixelSize", "cdecl") HFSessionSetFilterMinimumFacePixelSize.argtypes = [HFSession, HInt32] HFSessionSetFilterMinimumFacePixelSize.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 257 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 254 if _libs[_LIBRARY_FILENAME].has("HFSessionSetFaceDetectThreshold", "cdecl"): HFSessionSetFaceDetectThreshold = _libs[_LIBRARY_FILENAME].get("HFSessionSetFaceDetectThreshold", "cdecl") HFSessionSetFaceDetectThreshold.argtypes = [HFSession, HFloat] HFSessionSetFaceDetectThreshold.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 267 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 264 if _libs[_LIBRARY_FILENAME].has("HFExecuteFaceTrack", "cdecl"): HFExecuteFaceTrack = _libs[_LIBRARY_FILENAME].get("HFExecuteFaceTrack", "cdecl") HFExecuteFaceTrack.argtypes = [HFSession, HFImageStream, PHFMultipleFaceData] HFExecuteFaceTrack.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 284 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 281 if _libs[_LIBRARY_FILENAME].has("HFCopyFaceBasicToken", "cdecl"): HFCopyFaceBasicToken = _libs[_LIBRARY_FILENAME].get("HFCopyFaceBasicToken", "cdecl") HFCopyFaceBasicToken.argtypes = [HFFaceBasicToken, HPBuffer, HInt32] HFCopyFaceBasicToken.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 298 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 295 if _libs[_LIBRARY_FILENAME].has("HFGetFaceBasicTokenSize", "cdecl"): HFGetFaceBasicTokenSize = _libs[_LIBRARY_FILENAME].get("HFGetFaceBasicTokenSize", "cdecl") HFGetFaceBasicTokenSize.argtypes = [HPInt32] HFGetFaceBasicTokenSize.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 305 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 302 if _libs[_LIBRARY_FILENAME].has("HFGetNumOfFaceDenseLandmark", "cdecl"): HFGetNumOfFaceDenseLandmark = _libs[_LIBRARY_FILENAME].get("HFGetNumOfFaceDenseLandmark", "cdecl") HFGetNumOfFaceDenseLandmark.argtypes = [HPInt32] HFGetNumOfFaceDenseLandmark.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 315 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 312 if _libs[_LIBRARY_FILENAME].has("HFGetFaceDenseLandmarkFromFaceToken", "cdecl"): HFGetFaceDenseLandmarkFromFaceToken = _libs[_LIBRARY_FILENAME].get("HFGetFaceDenseLandmarkFromFaceToken", "cdecl") HFGetFaceDenseLandmarkFromFaceToken.argtypes = [HFFaceBasicToken, POINTER(HPoint2f), HInt32] HFGetFaceDenseLandmarkFromFaceToken.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 329 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 326 class struct_HFFaceFeature(Structure): pass @@ -1175,31 +1185,31 @@ struct_HFFaceFeature._fields_ = [ ('data', HPFloat), ] -HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 329 +HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 326 -PHFFaceFeature = POINTER(struct_HFFaceFeature)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 329 +PHFFaceFeature = POINTER(struct_HFFaceFeature)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 326 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 341 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 337 if _libs[_LIBRARY_FILENAME].has("HFFaceFeatureExtract", "cdecl"): HFFaceFeatureExtract = _libs[_LIBRARY_FILENAME].get("HFFaceFeatureExtract", "cdecl") HFFaceFeatureExtract.argtypes = [HFSession, HFImageStream, HFFaceBasicToken, PHFFaceFeature] HFFaceFeatureExtract.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 353 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 349 if _libs[_LIBRARY_FILENAME].has("HFFaceFeatureExtractCpy", "cdecl"): HFFaceFeatureExtractCpy = _libs[_LIBRARY_FILENAME].get("HFFaceFeatureExtractCpy", "cdecl") HFFaceFeatureExtractCpy.argtypes = [HFSession, HFImageStream, HFFaceBasicToken, HPFloat] HFFaceFeatureExtractCpy.restype = HResult -enum_HFSearchMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 366 +enum_HFSearchMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 362 -HF_SEARCH_MODE_EAGER = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 366 +HF_SEARCH_MODE_EAGER = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 362 -HF_SEARCH_MODE_EXHAUSTIVE = (HF_SEARCH_MODE_EAGER + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 366 +HF_SEARCH_MODE_EXHAUSTIVE = (HF_SEARCH_MODE_EAGER + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 362 -HFSearchMode = enum_HFSearchMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 366 +HFSearchMode = enum_HFSearchMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 362 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 379 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 377 class struct_HFFeatureHubConfiguration(Structure): pass @@ -1218,21 +1228,21 @@ struct_HFFeatureHubConfiguration._fields_ = [ ('searchMode', HFSearchMode), ] -HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 379 +HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 377 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 391 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 389 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubDataEnable", "cdecl"): HFFeatureHubDataEnable = _libs[_LIBRARY_FILENAME].get("HFFeatureHubDataEnable", "cdecl") HFFeatureHubDataEnable.argtypes = [HFFeatureHubConfiguration] HFFeatureHubDataEnable.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 397 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 395 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubDataDisable", "cdecl"): HFFeatureHubDataDisable = _libs[_LIBRARY_FILENAME].get("HFFeatureHubDataDisable", "cdecl") HFFeatureHubDataDisable.argtypes = [] HFFeatureHubDataDisable.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 409 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 406 class struct_HFFaceFeatureIdentity(Structure): pass @@ -1247,11 +1257,11 @@ struct_HFFaceFeatureIdentity._fields_ = [ ('feature', PHFFaceFeature), ] -HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 409 +HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 406 -PHFFaceFeatureIdentity = POINTER(struct_HFFaceFeatureIdentity)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 409 +PHFFaceFeatureIdentity = POINTER(struct_HFFaceFeatureIdentity)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 406 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 418 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 415 class struct_HFSearchTopKResults(Structure): pass @@ -1266,89 +1276,89 @@ struct_HFSearchTopKResults._fields_ = [ ('customIds', HPInt32), ] -HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 418 +HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 415 -PHFSearchTopKResults = POINTER(struct_HFSearchTopKResults)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 418 +PHFSearchTopKResults = POINTER(struct_HFSearchTopKResults)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 415 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 429 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 427 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubFaceSearchThresholdSetting", "cdecl"): HFFeatureHubFaceSearchThresholdSetting = _libs[_LIBRARY_FILENAME].get("HFFeatureHubFaceSearchThresholdSetting", "cdecl") HFFeatureHubFaceSearchThresholdSetting.argtypes = [c_float] HFFeatureHubFaceSearchThresholdSetting.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 440 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 438 if _libs[_LIBRARY_FILENAME].has("HFFaceComparison", "cdecl"): HFFaceComparison = _libs[_LIBRARY_FILENAME].get("HFFaceComparison", "cdecl") HFFaceComparison.argtypes = [HFFaceFeature, HFFaceFeature, HPFloat] HFFaceComparison.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 448 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 446 if _libs[_LIBRARY_FILENAME].has("HFGetFeatureLength", "cdecl"): HFGetFeatureLength = _libs[_LIBRARY_FILENAME].get("HFGetFeatureLength", "cdecl") HFGetFeatureLength.argtypes = [HPInt32] HFGetFeatureLength.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 457 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 454 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubInsertFeature", "cdecl"): HFFeatureHubInsertFeature = _libs[_LIBRARY_FILENAME].get("HFFeatureHubInsertFeature", "cdecl") HFFeatureHubInsertFeature.argtypes = [HFFaceFeatureIdentity] HFFeatureHubInsertFeature.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 467 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 465 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubFaceSearch", "cdecl"): HFFeatureHubFaceSearch = _libs[_LIBRARY_FILENAME].get("HFFeatureHubFaceSearch", "cdecl") HFFeatureHubFaceSearch.argtypes = [HFFaceFeature, HPFloat, PHFFaceFeatureIdentity] HFFeatureHubFaceSearch.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 477 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 475 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubFaceSearchTopK", "cdecl"): HFFeatureHubFaceSearchTopK = _libs[_LIBRARY_FILENAME].get("HFFeatureHubFaceSearchTopK", "cdecl") HFFeatureHubFaceSearchTopK.argtypes = [HFFaceFeature, HInt32, PHFSearchTopKResults] HFFeatureHubFaceSearchTopK.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 485 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 483 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubFaceRemove", "cdecl"): HFFeatureHubFaceRemove = _libs[_LIBRARY_FILENAME].get("HFFeatureHubFaceRemove", "cdecl") HFFeatureHubFaceRemove.argtypes = [HInt32] HFFeatureHubFaceRemove.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 493 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 491 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubFaceUpdate", "cdecl"): HFFeatureHubFaceUpdate = _libs[_LIBRARY_FILENAME].get("HFFeatureHubFaceUpdate", "cdecl") HFFeatureHubFaceUpdate.argtypes = [HFFaceFeatureIdentity] HFFeatureHubFaceUpdate.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 502 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 500 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubGetFaceIdentity", "cdecl"): HFFeatureHubGetFaceIdentity = _libs[_LIBRARY_FILENAME].get("HFFeatureHubGetFaceIdentity", "cdecl") HFFeatureHubGetFaceIdentity.argtypes = [HInt32, PHFFaceFeatureIdentity] HFFeatureHubGetFaceIdentity.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 510 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 508 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubGetFaceCount", "cdecl"): HFFeatureHubGetFaceCount = _libs[_LIBRARY_FILENAME].get("HFFeatureHubGetFaceCount", "cdecl") HFFeatureHubGetFaceCount.argtypes = [POINTER(HInt32)] HFFeatureHubGetFaceCount.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 517 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 515 if _libs[_LIBRARY_FILENAME].has("HFFeatureHubViewDBTable", "cdecl"): HFFeatureHubViewDBTable = _libs[_LIBRARY_FILENAME].get("HFFeatureHubViewDBTable", "cdecl") HFFeatureHubViewDBTable.argtypes = [] HFFeatureHubViewDBTable.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 536 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 533 if _libs[_LIBRARY_FILENAME].has("HFMultipleFacePipelineProcess", "cdecl"): HFMultipleFacePipelineProcess = _libs[_LIBRARY_FILENAME].get("HFMultipleFacePipelineProcess", "cdecl") HFMultipleFacePipelineProcess.argtypes = [HFSession, HFImageStream, PHFMultipleFaceData, HFSessionCustomParameter] HFMultipleFacePipelineProcess.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 552 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 548 if _libs[_LIBRARY_FILENAME].has("HFMultipleFacePipelineProcessOptional", "cdecl"): HFMultipleFacePipelineProcessOptional = _libs[_LIBRARY_FILENAME].get("HFMultipleFacePipelineProcessOptional", "cdecl") HFMultipleFacePipelineProcessOptional.argtypes = [HFSession, HFImageStream, PHFMultipleFaceData, HInt32] HFMultipleFacePipelineProcessOptional.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 564 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 560 class struct_HFRGBLivenessConfidence(Structure): pass @@ -1361,17 +1371,17 @@ struct_HFRGBLivenessConfidence._fields_ = [ ('confidence', HPFloat), ] -HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 564 +HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 560 -PHFRGBLivenessConfidence = POINTER(struct_HFRGBLivenessConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 564 +PHFRGBLivenessConfidence = POINTER(struct_HFRGBLivenessConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 560 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 577 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 572 if _libs[_LIBRARY_FILENAME].has("HFGetRGBLivenessConfidence", "cdecl"): HFGetRGBLivenessConfidence = _libs[_LIBRARY_FILENAME].get("HFGetRGBLivenessConfidence", "cdecl") HFGetRGBLivenessConfidence.argtypes = [HFSession, PHFRGBLivenessConfidence] HFGetRGBLivenessConfidence.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 588 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 583 class struct_HFFaceMaskConfidence(Structure): pass @@ -1384,17 +1394,17 @@ struct_HFFaceMaskConfidence._fields_ = [ ('confidence', HPFloat), ] -HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 588 +HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 583 -PHFFaceMaskConfidence = POINTER(struct_HFFaceMaskConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 588 +PHFFaceMaskConfidence = POINTER(struct_HFFaceMaskConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 583 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 600 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 595 if _libs[_LIBRARY_FILENAME].has("HFGetFaceMaskConfidence", "cdecl"): HFGetFaceMaskConfidence = _libs[_LIBRARY_FILENAME].get("HFGetFaceMaskConfidence", "cdecl") HFGetFaceMaskConfidence.argtypes = [HFSession, PHFFaceMaskConfidence] HFGetFaceMaskConfidence.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 611 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 606 class struct_HFFaceQualityConfidence(Structure): pass @@ -1407,23 +1417,23 @@ struct_HFFaceQualityConfidence._fields_ = [ ('confidence', HPFloat), ] -HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 611 +HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 606 -PHFFaceQualityConfidence = POINTER(struct_HFFaceQualityConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 611 +PHFFaceQualityConfidence = POINTER(struct_HFFaceQualityConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 606 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 623 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 618 if _libs[_LIBRARY_FILENAME].has("HFGetFaceQualityConfidence", "cdecl"): HFGetFaceQualityConfidence = _libs[_LIBRARY_FILENAME].get("HFGetFaceQualityConfidence", "cdecl") HFGetFaceQualityConfidence.argtypes = [HFSession, PHFFaceQualityConfidence] HFGetFaceQualityConfidence.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 635 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 630 if _libs[_LIBRARY_FILENAME].has("HFFaceQualityDetect", "cdecl"): HFFaceQualityDetect = _libs[_LIBRARY_FILENAME].get("HFFaceQualityDetect", "cdecl") HFFaceQualityDetect.argtypes = [HFSession, HFFaceBasicToken, POINTER(HFloat)] HFFaceQualityDetect.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 645 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 641 class struct_HFFaceIntereactionState(Structure): pass @@ -1438,17 +1448,17 @@ struct_HFFaceIntereactionState._fields_ = [ ('rightEyeStatusConfidence', HPFloat), ] -HFFaceIntereactionState = struct_HFFaceIntereactionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 645 +HFFaceIntereactionState = struct_HFFaceIntereactionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 641 -PHFFaceIntereactionState = POINTER(struct_HFFaceIntereactionState)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 645 +PHFFaceIntereactionState = POINTER(struct_HFFaceIntereactionState)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 641 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 652 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 648 if _libs[_LIBRARY_FILENAME].has("HFGetFaceIntereactionStateResult", "cdecl"): HFGetFaceIntereactionStateResult = _libs[_LIBRARY_FILENAME].get("HFGetFaceIntereactionStateResult", "cdecl") HFGetFaceIntereactionStateResult.argtypes = [HFSession, PHFFaceIntereactionState] HFGetFaceIntereactionStateResult.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 661 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 660 class struct_HFFaceIntereactionsActions(Structure): pass @@ -1469,17 +1479,17 @@ struct_HFFaceIntereactionsActions._fields_ = [ ('blink', HPInt32), ] -HFFaceIntereactionsActions = struct_HFFaceIntereactionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 661 +HFFaceIntereactionsActions = struct_HFFaceIntereactionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 660 -PHFFaceIntereactionsActions = POINTER(struct_HFFaceIntereactionsActions)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 661 +PHFFaceIntereactionsActions = POINTER(struct_HFFaceIntereactionsActions)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 660 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 663 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 668 if _libs[_LIBRARY_FILENAME].has("HFGetFaceIntereactionActionsResult", "cdecl"): HFGetFaceIntereactionActionsResult = _libs[_LIBRARY_FILENAME].get("HFGetFaceIntereactionActionsResult", "cdecl") HFGetFaceIntereactionActionsResult.argtypes = [HFSession, PHFFaceIntereactionsActions] HFGetFaceIntereactionActionsResult.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 691 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 695 class struct_HFFaceAttributeResult(Structure): pass @@ -1496,17 +1506,17 @@ struct_HFFaceAttributeResult._fields_ = [ ('ageBracket', HPInt32), ] -HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 691 +HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 695 -PHFFaceAttributeResult = POINTER(struct_HFFaceAttributeResult)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 691 +PHFFaceAttributeResult = POINTER(struct_HFFaceAttributeResult)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 695 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 703 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 707 if _libs[_LIBRARY_FILENAME].has("HFGetFaceAttributeResult", "cdecl"): HFGetFaceAttributeResult = _libs[_LIBRARY_FILENAME].get("HFGetFaceAttributeResult", "cdecl") HFGetFaceAttributeResult.argtypes = [HFSession, PHFFaceAttributeResult] HFGetFaceAttributeResult.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 717 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 720 class struct_HFInspireFaceVersion(Structure): pass @@ -1521,143 +1531,172 @@ struct_HFInspireFaceVersion._fields_ = [ ('patch', c_int), ] -HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 717 +HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 720 -PHFInspireFaceVersion = POINTER(struct_HFInspireFaceVersion)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 717 +PHFInspireFaceVersion = POINTER(struct_HFInspireFaceVersion)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 720 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 727 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 730 if _libs[_LIBRARY_FILENAME].has("HFQueryInspireFaceVersion", "cdecl"): HFQueryInspireFaceVersion = _libs[_LIBRARY_FILENAME].get("HFQueryInspireFaceVersion", "cdecl") HFQueryInspireFaceVersion.argtypes = [PHFInspireFaceVersion] HFQueryInspireFaceVersion.restype = HResult -enum_HFLogLevel = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 739 +enum_HFLogLevel = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 -HF_LOG_NONE = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 739 +HF_LOG_NONE = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 -HF_LOG_DEBUG = (HF_LOG_NONE + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 739 +HF_LOG_DEBUG = (HF_LOG_NONE + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 -HF_LOG_INFO = (HF_LOG_DEBUG + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 739 +HF_LOG_INFO = (HF_LOG_DEBUG + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 -HF_LOG_WARN = (HF_LOG_INFO + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 739 +HF_LOG_WARN = (HF_LOG_INFO + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 -HF_LOG_ERROR = (HF_LOG_WARN + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 739 +HF_LOG_ERROR = (HF_LOG_WARN + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 -HF_LOG_FATAL = (HF_LOG_ERROR + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 739 +HF_LOG_FATAL = (HF_LOG_ERROR + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 -HFLogLevel = enum_HFLogLevel# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 739 +HFLogLevel = enum_HFLogLevel# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 749 if _libs[_LIBRARY_FILENAME].has("HFSetLogLevel", "cdecl"): HFSetLogLevel = _libs[_LIBRARY_FILENAME].get("HFSetLogLevel", "cdecl") HFSetLogLevel.argtypes = [HFLogLevel] HFSetLogLevel.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 749 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 754 if _libs[_LIBRARY_FILENAME].has("HFLogDisable", "cdecl"): HFLogDisable = _libs[_LIBRARY_FILENAME].get("HFLogDisable", "cdecl") HFLogDisable.argtypes = [] HFLogDisable.restype = HResult -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 762 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 767 if _libs[_LIBRARY_FILENAME].has("HFDeBugImageStreamImShow", "cdecl"): HFDeBugImageStreamImShow = _libs[_LIBRARY_FILENAME].get("HFDeBugImageStreamImShow", "cdecl") HFDeBugImageStreamImShow.argtypes = [HFImageStream] HFDeBugImageStreamImShow.restype = None -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 773 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 779 if _libs[_LIBRARY_FILENAME].has("HFDeBugImageStreamDecodeSave", "cdecl"): HFDeBugImageStreamDecodeSave = _libs[_LIBRARY_FILENAME].get("HFDeBugImageStreamDecodeSave", "cdecl") HFDeBugImageStreamDecodeSave.argtypes = [HFImageStream, HPath] HFDeBugImageStreamDecodeSave.restype = HResult +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 794 +if _libs[_LIBRARY_FILENAME].has("HFDeBugShowResourceStatistics", "cdecl"): + HFDeBugShowResourceStatistics = _libs[_LIBRARY_FILENAME].get("HFDeBugShowResourceStatistics", "cdecl") + HFDeBugShowResourceStatistics.argtypes = [] + HFDeBugShowResourceStatistics.restype = HResult + +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 804 +if _libs[_LIBRARY_FILENAME].has("HFDeBugGetUnreleasedSessionsCount", "cdecl"): + HFDeBugGetUnreleasedSessionsCount = _libs[_LIBRARY_FILENAME].get("HFDeBugGetUnreleasedSessionsCount", "cdecl") + HFDeBugGetUnreleasedSessionsCount.argtypes = [POINTER(HInt32)] + HFDeBugGetUnreleasedSessionsCount.restype = HResult + +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 815 +if _libs[_LIBRARY_FILENAME].has("HFDeBugGetUnreleasedSessions", "cdecl"): + HFDeBugGetUnreleasedSessions = _libs[_LIBRARY_FILENAME].get("HFDeBugGetUnreleasedSessions", "cdecl") + HFDeBugGetUnreleasedSessions.argtypes = [POINTER(HFSession), HInt32] + HFDeBugGetUnreleasedSessions.restype = HResult + +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 825 +if _libs[_LIBRARY_FILENAME].has("HFDeBugGetUnreleasedStreamsCount", "cdecl"): + HFDeBugGetUnreleasedStreamsCount = _libs[_LIBRARY_FILENAME].get("HFDeBugGetUnreleasedStreamsCount", "cdecl") + HFDeBugGetUnreleasedStreamsCount.argtypes = [POINTER(HInt32)] + HFDeBugGetUnreleasedStreamsCount.restype = HResult + +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 836 +if _libs[_LIBRARY_FILENAME].has("HFDeBugGetUnreleasedStreams", "cdecl"): + HFDeBugGetUnreleasedStreams = _libs[_LIBRARY_FILENAME].get("HFDeBugGetUnreleasedStreams", "cdecl") + HFDeBugGetUnreleasedStreams.argtypes = [POINTER(HFImageStream), HInt32] + HFDeBugGetUnreleasedStreams.restype = HResult + +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 26 +try: + HF_ENABLE_NONE = 0x00000000 +except: + pass + # /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 27 try: - HF_ENABLE_NONE = 0 + HF_ENABLE_FACE_RECOGNITION = 0x00000002 except: pass # /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 28 try: - HF_ENABLE_FACE_RECOGNITION = 2 + HF_ENABLE_LIVENESS = 0x00000004 except: pass # /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 29 try: - HF_ENABLE_LIVENESS = 4 + HF_ENABLE_IR_LIVENESS = 0x00000008 except: pass # /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 30 try: - HF_ENABLE_IR_LIVENESS = 8 + HF_ENABLE_MASK_DETECT = 0x00000010 except: pass # /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 31 try: - HF_ENABLE_MASK_DETECT = 16 + HF_ENABLE_FACE_ATTRIBUTE = 0x00000020 except: pass # /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 32 try: - HF_ENABLE_FACE_ATTRIBUTE = 32 + HF_ENABLE_PLACEHOLDER_ = 0x00000040 except: pass # /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 33 try: - HF_ENABLE_PLACEHOLDER_ = 64 + HF_ENABLE_QUALITY = 0x00000080 except: pass # /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 34 try: - HF_ENABLE_QUALITY = 128 + HF_ENABLE_INTERACTION = 0x00000100 except: pass -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 35 -try: - HF_ENABLE_INTERACTION = 256 -except: - pass +HFImageData = struct_HFImageData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 70 -HFImageData = struct_HFImageData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 74 +HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 134 -HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 131 +HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 199 -HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 204 +HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 210 -HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 215 +HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 225 -HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 229 +HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 326 -HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 329 +HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 377 -HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 379 +HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 406 -HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 409 +HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 415 -HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 418 +HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 560 -HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 564 +HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 583 -HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 588 +HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 606 -HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 611 +HFFaceIntereactionState = struct_HFFaceIntereactionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 641 -HFFaceIntereactionState = struct_HFFaceIntereactionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 645 +HFFaceIntereactionsActions = struct_HFFaceIntereactionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 660 -HFFaceIntereactionsActions = struct_HFFaceIntereactionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 661 +HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 695 -HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 691 - -HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 717 +HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 720 # No inserted files # No prefix-stripping - diff --git a/cpp-package/inspireface/python/inspireface/modules/inspire_face.py b/cpp-package/inspireface/python/inspireface/modules/inspire_face.py index 2e50422..5cc8081 100644 --- a/cpp-package/inspireface/python/inspireface/modules/inspire_face.py +++ b/cpp-package/inspireface/python/inspireface/modules/inspire_face.py @@ -179,6 +179,7 @@ class FaceInformation: def __init__(self, track_id: int, + detection_confidence: float, location: Tuple, roll: float, yaw: float, @@ -186,6 +187,7 @@ class FaceInformation: _token: HFFaceBasicToken, _feature: np.array = None): self.track_id = track_id + self.detection_confidence = detection_confidence self.location = location self.roll = roll self.yaw = yaw @@ -312,6 +314,7 @@ class InspireFaceSession(object): pitch = euler_angle[idx][2] track_id = track_ids[idx] _token = tokens[idx] + detection_confidence = self.multiple_faces.detConfidence[idx] info = FaceInformation( location=(top_left[0], top_left[1], bottom_right[0], bottom_right[1]), @@ -320,6 +323,7 @@ class InspireFaceSession(object): pitch=pitch, track_id=track_id, _token=_token, + detection_confidence=detection_confidence, ) infos.append(info) @@ -341,6 +345,20 @@ class InspireFaceSession(object): landmark.append(point.y) return np.asarray(landmark).reshape(-1, 2) + + def set_detection_confidence_threshold(self, threshold: float): + """ + Sets the detection confidence threshold for the face detection session. + + Args: + threshold (float): The confidence threshold for face detection. + + Notes: + If setting the detection confidence threshold fails, an error is logged with the returned status code. + """ + ret = HFSessionSetFaceDetectThreshold(self._sess, threshold) + if ret != 0: + logger.error(f"Set detection confidence threshold error: {ret}") def set_track_preview_size(self, size=192): """ @@ -962,3 +980,9 @@ def disable_logging() -> None: Disables all logging from the InspireFace library. """ HFLogDisable() + +def show_system_resource_statistics(): + """ + Displays the system resource information. + """ + HFDeBugShowResourceStatistics() diff --git a/cpp-package/inspireface/python/sample_face_detection.py b/cpp-package/inspireface/python/sample_face_detection.py index f706337..de86bb3 100644 --- a/cpp-package/inspireface/python/sample_face_detection.py +++ b/cpp-package/inspireface/python/sample_face_detection.py @@ -26,6 +26,9 @@ def case_face_detection_image(resource_path, image_path): opt = HF_ENABLE_FACE_RECOGNITION | HF_ENABLE_QUALITY | HF_ENABLE_MASK_DETECT | HF_ENABLE_LIVENESS | HF_ENABLE_INTERACTION | HF_ENABLE_FACE_ATTRIBUTE session = ifac.InspireFaceSession(opt, HF_DETECT_MODE_ALWAYS_DETECT) + # Set detection confidence threshold + session.set_detection_confidence_threshold(0.5) + # Load the image using OpenCV. image = cv2.imread(image_path) assert image is not None, "Please check that the image path is correct." @@ -33,12 +36,13 @@ def case_face_detection_image(resource_path, image_path): # Perform face detection on the image. faces = session.face_detection(image) print(f"face detection: {len(faces)} found") - + # Copy the image for drawing the bounding boxes. draw = image.copy() for idx, face in enumerate(faces): print(f"{'==' * 20}") print(f"idx: {idx}") + print(f"detection confidence: {face.detection_confidence}") # Print Euler angles of the face. print(f"roll: {face.roll}, yaw: {face.yaw}, pitch: {face.pitch}") diff --git a/cpp-package/inspireface/python/sample_system_resource_statistics.py b/cpp-package/inspireface/python/sample_system_resource_statistics.py new file mode 100644 index 0000000..792b489 --- /dev/null +++ b/cpp-package/inspireface/python/sample_system_resource_statistics.py @@ -0,0 +1,37 @@ + +import inspireface as ifac +from inspireface.param import * +import click + +@click.command() +@click.argument("resource_path") +def case_show_system_resource_statistics(resource_path): + """ + This case is used to test the system resource statistics. + """ + ret = ifac.launch(resource_path) + assert ret, "Launch failure. Please ensure the resource path is correct." + print("-" * 100) + print("Initialization state") + print("-" * 100) + ifac.show_system_resource_statistics() + print("-" * 100) + print("Create 10 sessions") + print("-" * 100) + print("") + num_created_sessions = 10 + sessions = [] + for i in range(num_created_sessions): + session = ifac.InspireFaceSession(HF_ENABLE_FACE_RECOGNITION, HF_DETECT_MODE_ALWAYS_DETECT) + sessions.append(session) + ifac.show_system_resource_statistics() + print("-" * 100) + print("Release 10 sessions") + print("-" * 100) + print() + for session in sessions: + session.release() + ifac.show_system_resource_statistics() + +if __name__ == "__main__": + case_show_system_resource_statistics() diff --git a/cpp-package/inspireface/python/tmp/det.jpg b/cpp-package/inspireface/python/tmp/det.jpg deleted file mode 100644 index 7b298fd3c7e05d21a03b8dc0f9b87e28aed6fb8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248241 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 s}*8rv#cCx$KU@AVRQ3u^-LluoS7xW-5GsrHk& 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%0AN;R@*g)ip(_|}K2U&+ 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⋙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 VR>kCg0*al0C^9IluVOh-|Jk-%Xe0mt