Added the system resource management and monitoring functions

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

View File

@@ -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 ()

View File

@@ -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**.

View File

@@ -6,7 +6,6 @@
#include "log.h"
#include "herror.h"
namespace inspire {
std::mutex Launch::mutex_;
@@ -24,7 +23,7 @@ std::shared_ptr<Launch> 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<std::mutex> 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
} // namespace inspire

View File

@@ -7,7 +7,7 @@
#include <unordered_map>
#include <memory>
#include <iomanip> // For std::setw and std::left
#include <vector>
#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<ResourceManager> instance;
@@ -79,12 +84,35 @@ public:
// released
}
// Gets a list of unreleased session handles
std::vector<long> getUnreleasedSessions() {
std::lock_guard<std::mutex> lock(mutex);
std::vector<long> 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<long> getUnreleasedStreams() {
std::lock_guard<std::mutex> lock(mutex);
std::vector<long> 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<std::mutex> 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;
}
};

View File

@@ -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;
}
}
HResult HFDeBugGetUnreleasedSessionsCount(HInt32 *count) {
*count = RESOURCE_MANAGE->getUnreleasedSessions().size();
return HSUCCEED;
}
HResult HFDeBugGetUnreleasedSessions(HFSession *sessions, HInt32 count) {
std::vector<long> 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<long> unreleasedStreams = RESOURCE_MANAGE->getUnreleasedStreams();
for (int i = 0; i < count; ++i) {
streams[i] = (HFImageStream)unreleasedStreams[i];
}
return HSUCCEED;
}

View File

@@ -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

View File

@@ -6,26 +6,43 @@
#include <sstream>
#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<std::chrono::steady_clock> start_time_;
};
} // namespace inspire
} // namespace inspire
#endif // COST_TIME_HPP
#endif // COST_TIME_HPP

View File

@@ -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<FaceTrack>(m_detect_mode_, m_max_detect_face_, 20, 192, detect_level_px, track_by_detect_mode_fps);
m_face_track_ = std::make_shared<FaceTrack>(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<FeatureExtraction>(INSPIRE_LAUNCH->getMArchive(), m_parameter_.enable_recognition);
m_face_recognition_ =
std::make_shared<FeatureExtraction>(INSPIRE_LAUNCH->getMArchive(), m_parameter_.enable_recognition);
if (m_face_recognition_->QueryStatus() != HSUCCEED) {
return m_face_recognition_->QueryStatus();
}
m_face_pipeline_ = std::make_shared<FacePipeline>(
INSPIRE_LAUNCH->getMArchive(),
param.enable_liveness,
param.enable_mask_detect,
param.enable_face_attribute,
param.enable_interaction_liveness
);
m_face_pipeline_ =
std::make_shared<FacePipeline>(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<std::mutex> 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<FacePipeline>& 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<HyperFaceData> &faces, const CustomPipelineParameter &param) {
int32_t FaceContext::FacesProcess(CameraStream& image, const std::vector<HyperFaceData>& faces,
const CustomPipelineParameter& param) {
std::lock_guard<std::mutex> 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::vector<HyperFa
m_action_raise_head_results_cache_.resize(faces.size(), -1);
m_action_shake_results_cache_.resize(faces.size(), -1);
for (int i = 0; i < faces.size(); ++i) {
const auto &face = faces[i];
const auto& face = faces[i];
// RGB Liveness Detect
if (param.enable_liveness) {
auto ret = m_face_pipeline_->Process(image, face, PROCESS_RGB_LIVENESS);
@@ -189,14 +183,15 @@ int32_t FaceContext::FacesProcess(CameraStream &image, const std::vector<HyperFa
m_react_left_eye_results_cache_[i] = m_face_pipeline_->eyesStatusCache[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<HyperFa
m_action_raise_head_results_cache_[i] = actions.raiseHead;
m_action_shake_results_cache_[i] = actions.shake;
} else {
INSPIRE_LOGD("Serialized objects cannot connect to trace objects in memory, and there may be some problems");
INSPIRE_LOGD(
"Serialized objects cannot connect to trace objects in memory, and there may be some "
"problems");
}
} else {
INSPIRE_LOGW("The index of the trace object does not match the trace list in memory, and there may be some problems");
INSPIRE_LOGW(
"The index of the trace object does not match the trace list in memory, and there may be some "
"problems");
}
}
}
}
return 0;
}
const std::vector<ByteArray>& FaceContext::GetDetectCache() const {
return m_detect_cache_;
}
@@ -279,6 +276,10 @@ const Embedded& FaceContext::GetFaceFeatureCache() const {
return m_face_feature_cache_;
}
const std::vector<float>& FaceContext::GetDetConfidenceCache() const {
return m_det_confidence_cache_;
}
const std::vector<int>& FaceContext::GetFaceRaceResultsCache() const {
return m_attribute_race_results_cache_;
}
@@ -311,11 +312,11 @@ const std::vector<int>& 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<std::mutex> 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
} // namespace inspire

View File

@@ -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<HyperFaceData> &faces, const CustomPipelineParameter& param);
int32_t FacesProcess(CameraStream& image, const std::vector<HyperFaceData>& 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<float>& 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<int>& 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<float>& 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<FaceTrack> m_face_track_; ///< Shared pointer to the FaceTrack object
std::shared_ptr<FaceTrack> m_face_track_; ///< Shared pointer to the FaceTrack object
std::shared_ptr<FeatureExtraction> m_face_recognition_; ///< Shared pointer to the FaceRecognition object
std::shared_ptr<FacePipeline> m_face_pipeline_; ///< Shared pointer to the FacePipeline object
std::shared_ptr<FacePipeline> m_face_pipeline_; ///< Shared pointer to the FacePipeline object
private:
// Cache data
std::vector<ByteArray> m_detect_cache_; ///< Cache for storing serialized detected face data
std::vector<FaceBasicData> m_face_basic_data_cache_; ///< Cache for basic face data extracted from detection
std::vector<FaceRect> m_face_rects_cache_; ///< Cache for face rectangle data from detection
std::vector<int32_t> m_track_id_cache_; ///< Cache for tracking IDs of detected faces
std::vector<float> m_roll_results_cache_; ///< Cache for storing roll results from face pose estimation
std::vector<float> m_yaw_results_cache_; ///< Cache for storing yaw results from face pose estimation
std::vector<float> m_pitch_results_cache_; ///< Cache for storing pitch results from face pose estimation
std::vector<FacePoseQualityResult> m_quality_results_cache_; ///< Cache for face pose quality results
std::vector<float> m_mask_results_cache_; ///< Cache for mask detection results
std::vector<float> m_rgb_liveness_results_cache_; ///< Cache for RGB liveness detection results
std::vector<float> m_quality_score_results_cache_; ///< Cache for RGB face quality score results
std::vector<float> m_react_left_eye_results_cache_; ///< Cache for Left eye state in face interaction
std::vector<float> m_react_right_eye_results_cache_; ///< Cache for Right eye state in face interaction
std::vector<ByteArray> m_detect_cache_; ///< Cache for storing serialized detected face data
std::vector<FaceBasicData> m_face_basic_data_cache_; ///< Cache for basic face data extracted from detection
std::vector<FaceRect> m_face_rects_cache_; ///< Cache for face rectangle data from detection
std::vector<int32_t> m_track_id_cache_; ///< Cache for tracking IDs of detected faces
std::vector<float> m_det_confidence_cache_; ///< Cache for face detection confidence of detected faces
std::vector<float> m_roll_results_cache_; ///< Cache for storing roll results from face pose estimation
std::vector<float> m_yaw_results_cache_; ///< Cache for storing yaw results from face pose estimation
std::vector<float> m_pitch_results_cache_; ///< Cache for storing pitch results from face pose estimation
std::vector<FacePoseQualityResult> m_quality_results_cache_; ///< Cache for face pose quality results
std::vector<float> m_mask_results_cache_; ///< Cache for mask detection results
std::vector<float> m_rgb_liveness_results_cache_; ///< Cache for RGB liveness detection results
std::vector<float> m_quality_score_results_cache_; ///< Cache for RGB face quality score results
std::vector<float> m_react_left_eye_results_cache_; ///< Cache for Left eye state in face interaction
std::vector<float> m_react_right_eye_results_cache_; ///< Cache for Right eye state in face interaction
std::vector<int> m_action_normal_results_cache_; ///< Cache for normal action in face interaction
std::vector<int> m_action_shake_results_cache_; ///< Cache for shake action in face interaction
std::vector<int> m_action_blink_results_cache_; ///< Cache for blink action in face interaction
std::vector<int> m_action_jaw_open_results_cache_; ///< Cache for jaw open action in face interaction
std::vector<int> m_action_raise_head_results_cache_; ///< Cache for raise head action in face interaction
std::vector<int> m_action_normal_results_cache_; ///< Cache for normal action in face interaction
std::vector<int> m_action_shake_results_cache_; ///< Cache for shake action in face interaction
std::vector<int> m_action_blink_results_cache_; ///< Cache for blink action in face interaction
std::vector<int> m_action_jaw_open_results_cache_; ///< Cache for jaw open action in face interaction
std::vector<int> m_action_raise_head_results_cache_; ///< Cache for raise head action in face interaction
std::vector<int> m_attribute_race_results_cache_;
std::vector<int> m_attribute_gender_results_cache_;
std::vector<int> 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

View File

@@ -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

View File

@@ -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

View File

@@ -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<BYTETracker>(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<cv::Point2f> &landmarks_output,
float &score, float size) {
// LOGD("ready to landmark predict");
void FaceTrack::SparseLandmarkPredict(const cv::Mat &raw_face_crop,
std::vector<cv::Point2f> &landmarks_output, float &score,
float size) {
// LOGD("ready to landmark predict");
landmarks_output.resize(FaceLandmark::NUM_OF_LANDMARK);
std::vector<float> 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<cv::Point2f> 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<cv::Point2f> 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<cv::Point2f> dst_pts = {{0, 0},
{112, 0},
{112, 112}};
std::vector<cv::Point2f> 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<cv::Point2f> landmark_rawout;
std::vector<float> bbox;
auto timeStart = (double) cv::getTickCount();
auto timeStart = (double)cv::getTickCount();
SparseLandmarkPredict(crop, landmark_rawout, score, 112);
std::vector<cv::Point2f> 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<cv::Point2f> 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<float>(0);
p.y = result.at<float>(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<float>(0);
p.y = result.at<float>(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<cv::Point2f> 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<cv::Point2f> 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<FaceObject>::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<FaceLoc> 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<Object> 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<STrack> output_stracks = m_TbD_tracker_->update(objects);
for (const auto &st_track : output_stracks) {
cv::Rect rect = cv::Rect_<float>(st_track.tlwh[0], st_track.tlwh[1], st_track.tlwh[2], st_track.tlwh[3]);
cv::Rect rect = cv::Rect_<float>(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<cv::Rect> bbox;
bbox.resize(boxes.size());
for (int i = 0; i < boxes.size(); i++) {
bbox[i] = cv::Rect(cv::Point(static_cast<int>(boxes[i].x1), static_cast<int>(boxes[i].y1)),
cv::Point(static_cast<int>(boxes[i].x2), static_cast<int>(boxes[i].y2)));
bbox[i] =
cv::Rect(cv::Point(static_cast<int>(boxes[i].x1), static_cast<int>(boxes[i].y1)),
cv::Point(static_cast<int>(boxes[i].x2), static_cast<int>(boxes[i].y2)));
if (!isShortestSideGreaterThan<float>(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

View File

@@ -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/).

View File

@@ -1 +1 @@
InspireFace Version: 1.1.6
InspireFace Version: 1.1.7

View File

@@ -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;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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}")

View File

@@ -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()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB