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 7b298fd..0000000 Binary files a/cpp-package/inspireface/python/tmp/det.jpg and /dev/null differ