diff --git a/cpp-package/inspireface/CMakeLists.txt b/cpp-package/inspireface/CMakeLists.txt
index fd01d09..fb44404 100644
--- a/cpp-package/inspireface/CMakeLists.txt
+++ b/cpp-package/inspireface/CMakeLists.txt
@@ -24,7 +24,7 @@ endif()
# Current version
set(INSPIRE_FACE_VERSION_MAJOR 1)
set(INSPIRE_FACE_VERSION_MINOR 2)
-set(INSPIRE_FACE_VERSION_PATCH 1)
+set(INSPIRE_FACE_VERSION_PATCH 2)
# Converts the version number to a string
string(CONCAT INSPIRE_FACE_VERSION_MAJOR_STR ${INSPIRE_FACE_VERSION_MAJOR})
diff --git a/cpp-package/inspireface/README.md b/cpp-package/inspireface/README.md
index 6405b0f..6365c6b 100644
--- a/cpp-package/inspireface/README.md
+++ b/cpp-package/inspireface/README.md
@@ -24,6 +24,8 @@ We welcome your questions💬, they help guide and accelerate its development.
## Change Logs
+**`2025-06-08`** Add facial expression recognition.
+
**`2025-04-27`** Optimize some issues and provide a stable version.
**`2025-03-16`** Acceleration using NVIDIA-GPU (**CUDA**) devices is already supported.
@@ -344,7 +346,7 @@ docker-compose up
```
## Example
-### C/C++ Sample: Use the recommended CAPI interface
+### C/C++ Sample: Use the recommended CAPI Interface
To integrate InspireFace into a C/C++ project, you simply need to link the InspireFace library and include the appropriate header files(We recommend using the more compatible **CAPI** headers). Below is a basic example demonstrating face detection:
```c
@@ -740,6 +742,7 @@ The following Features and technologies are currently supported.
| Pose Estimation | [](#) | [](#) | [](#) | [](#) | [](#) | [](#) |
| Face Attribute | [](#) | - | [](#) | [](#) | - | [](#) |
| Cooperative Liveness | [](#) | [](#) | [](#) | [](#) | [](#) | [](#) |
+| Face EmotionNew | [](#) | [](#) | [](#) | [](#) | - | [](#) |
| Embedding Management | [](#) | - | - | - | - | - |
- Some models and features that do **not support** NPU or GPU will **automatically use CPU** for computation when running the program.
@@ -750,18 +753,18 @@ For different scenarios, we currently provide several Packs, each containing mul
| Name | Supported Devices | Note | Last Update | Link |
| --- | --- | --- | --- | --- |
-| Pikachu | CPU | Lightweight edge-side models | Feb 20, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Pikachu) |
-| Megatron | CPU, GPU | Mobile and server models | Feb 20, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Megatron) |
-| Megatron_TRT | GPU | CUDA-based server models | Mar 16, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Megatron_TRT) |
-| Gundam-RV1109 | RKNPU | Supports RK1109 and RK1126 | Feb 20, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RV1109) |
-| Gundam-RV1106 | RKNPU | Supports RV1103 and RV1106 | Feb 20, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RV1106) |
-| Gundam-RK356X | RKNPU | Supports RK3566 and RK3568 | Feb 20, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RK356X) |
-| Gundam-RK3588 | RKNPU | Supports RK3588 | Mar 16, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RK3588) |
+| Pikachu | CPU | Lightweight edge-side models | Jun 15, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Pikachu) |
+| Megatron | CPU, GPU | Mobile and server models | Jun 15, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Megatron) |
+| Megatron_TRT | GPU | CUDA-based server models | Jun 15, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Megatron_TRT) |
+| Gundam-RV1109 | RKNPU | Supports RK1109 and RK1126 | Jun 15, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RV1109) |
+| Gundam-RV1106 | RKNPU | Supports RV1103 and RV1106 | Jun 15, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RV1106) |
+| Gundam-RK356X | RKNPU | Supports RK3566 and RK3568 | Jun 15, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RK356X) |
+| Gundam-RK3588 | RKNPU | Supports RK3588 | Jun 15, 2025 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RK3588) |
## Short-Term Plan
- [x] Add TensorRT backend support.
-- [x] Add Add c++ style header files.
+- [x] Add Add C++ style header files.
- [x] Add the RKNPU backend support for Android .
- [ ] Example app project for Android and iOS samples.
- [ ] Add the batch forward feature.
diff --git a/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc b/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc
index 8f9db46..33abc2f 100644
--- a/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc
+++ b/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc
@@ -60,6 +60,12 @@ HYPER_CAPI_EXPORT extern HResult HFCreateImageStream(PHFImageData data, HFImageS
case HF_STREAM_YUV_NV21:
stream->impl.SetDataFormat(inspirecv::NV21);
break;
+ case HF_STREAM_I420:
+ stream->impl.SetDataFormat(inspirecv::I420);
+ break;
+ case HF_STREAM_GRAY:
+ stream->impl.SetDataFormat(inspirecv::GRAY);
+ break;
default:
return HERR_INVALID_IMAGE_STREAM_PARAM; // Assume there's a return code for unsupported
// formats
@@ -135,6 +141,12 @@ HYPER_CAPI_EXPORT extern HResult HFImageStreamSetFormat(HFImageStream handle, HF
case HF_STREAM_YUV_NV21:
((HF_CameraStream *)handle)->impl.SetDataFormat(inspirecv::NV21);
break;
+ case HF_STREAM_I420:
+ ((HF_CameraStream *)handle)->impl.SetDataFormat(inspirecv::I420);
+ break;
+ case HF_STREAM_GRAY:
+ ((HF_CameraStream *)handle)->impl.SetDataFormat(inspirecv::GRAY);
+ break;
default:
return HERR_INVALID_IMAGE_STREAM_PARAM; // Assume there's a return code for unsupported
// formats
@@ -384,6 +396,7 @@ HResult HFCreateInspireFaceSession(HFSessionCustomParameter parameter, HFDetectM
param.enable_recognition = parameter.enable_recognition;
param.enable_face_attribute = parameter.enable_face_attribute;
param.enable_face_pose = parameter.enable_face_pose;
+ param.enable_face_emotion = parameter.enable_face_emotion;
inspire::DetectModuleMode detMode = inspire::DETECT_MODE_ALWAYS_DETECT;
if (detectMode == HF_DETECT_MODE_LIGHT_TRACK) {
detMode = inspire::DETECT_MODE_LIGHT_TRACK;
@@ -432,6 +445,9 @@ HResult HFCreateInspireFaceSessionOptional(HOption customOption, HFDetectMode de
if (customOption & HF_ENABLE_FACE_POSE) {
param.enable_face_pose = true;
}
+ if (customOption & HF_ENABLE_FACE_EMOTION) {
+ param.enable_face_emotion = true;
+ }
inspire::DetectModuleMode detMode = inspire::DETECT_MODE_ALWAYS_DETECT;
if (detectMode == HF_DETECT_MODE_LIGHT_TRACK) {
detMode = inspire::DETECT_MODE_LIGHT_TRACK;
@@ -588,8 +604,6 @@ HResult HFSessionGetTrackPreviewSize(HFSession session, HInt32 *previewSize) {
return HSUCCEED;
}
-
-
HResult HFSessionSetFilterMinimumFacePixelSize(HFSession session, HInt32 minSize) {
if (session == nullptr) {
return HERR_INVALID_CONTEXT_HANDLE;
@@ -660,8 +674,6 @@ HResult HFSessionSetTrackModeDetectInterval(HFSession session, HInt32 num) {
return ctx->impl.SetTrackModeDetectInterval(num);
}
-
-
HResult HFExecuteFaceTrack(HFSession session, HFImageStream streamHandle, PHFMultipleFaceData results) {
if (session == nullptr) {
return HERR_INVALID_CONTEXT_HANDLE;
@@ -1141,6 +1153,7 @@ HResult HFMultipleFacePipelineProcess(HFSession session, HFImageStream streamHan
param.enable_ir_liveness = parameter.enable_ir_liveness;
param.enable_recognition = parameter.enable_recognition;
param.enable_face_attribute = parameter.enable_face_attribute;
+ param.enable_face_emotion = parameter.enable_face_emotion;
HResult ret;
std::vector data;
@@ -1205,6 +1218,9 @@ HResult HFMultipleFacePipelineProcessOptional(HFSession session, HFImageStream s
if (customOption & HF_ENABLE_FACE_POSE) {
param.enable_face_pose = true;
}
+ if (customOption & HF_ENABLE_FACE_EMOTION) {
+ param.enable_face_emotion = true;
+ }
HResult ret;
std::vector data;
@@ -1335,6 +1351,21 @@ HResult HFGetFaceAttributeResult(HFSession session, PHFFaceAttributeResult resul
return HSUCCEED;
}
+HResult HFGetFaceEmotionResult(HFSession session, PHFFaceEmotionResult result) {
+ if (session == nullptr) {
+ return HERR_INVALID_CONTEXT_HANDLE;
+ }
+ HF_FaceAlgorithmSession *ctx = (HF_FaceAlgorithmSession *)session;
+ if (ctx == nullptr) {
+ return HERR_INVALID_CONTEXT_HANDLE;
+ }
+
+ result->num = ctx->impl.GetFaceEmotionResultsCache().size();
+ result->emotion = (HPInt32)ctx->impl.GetFaceEmotionResultsCache().data();
+
+ return HSUCCEED;
+}
+
HResult HFFeatureHubGetFaceCount(HInt32 *count) {
*count = INSPIREFACE_FEATURE_HUB->GetFaceFeatureCount();
return HSUCCEED;
diff --git a/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.h b/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.h
index 675cf80..a683bb8 100644
--- a/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.h
+++ b/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.h
@@ -37,6 +37,7 @@ extern "C" {
#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_FACE_POSE 0x00000200 ///< Flag to enable face pose estimation feature.
+#define HF_ENABLE_FACE_EMOTION 0x00000400 ///< Flag to enable face emotion recognition feature.
/**
* Camera stream format.
@@ -49,6 +50,8 @@ typedef enum HFImageFormat {
HF_STREAM_BGRA = 3, ///< Image in BGR format with alpha channel.
HF_STREAM_YUV_NV12 = 4, ///< Image in YUV NV12 format.
HF_STREAM_YUV_NV21 = 5, ///< Image in YUV NV21 format.
+ HF_STREAM_I420 = 6, ///< Image in I420 format.
+ HF_STREAM_GRAY = 7, ///< Image in GRAY format.
} HFImageFormat;
/**
@@ -389,6 +392,7 @@ typedef struct HFSessionCustomParameter {
HInt32 enable_interaction_liveness; ///< Enable interaction for liveness detection feature.
HInt32 enable_detect_mode_landmark; ///< Enable landmark detection in detection mode
HInt32 enable_face_pose; ///< Enable face pose estimation feature.
+ HInt32 enable_face_emotion; ///< Enable face emotion recognition feature.
} HFSessionCustomParameter, *PHFSessionCustomParameter;
/**
@@ -1182,6 +1186,29 @@ typedef struct HFFaceAttributeResult {
*/
HYPER_CAPI_EXPORT extern HResult HFGetFaceAttributeResult(HFSession session, PHFFaceAttributeResult results);
+/**
+ * @brief Struct representing face emotion results.
+ */
+typedef struct HFFaceEmotionResult {
+ HInt32 num; ///< Number of faces detected.
+ HPInt32 emotion; ///< Emotion of the detected face.
+ ///< 0: Neutral;
+ ///< 1: Happy;
+ ///< 2: Sad;
+ ///< 3: Surprise;
+ ///< 4: Fear;
+ ///< 5: Disgust;
+ ///< 6: Anger;
+} HFFaceEmotionResult, *PHFFaceEmotionResult;
+
+/**
+ * @brief Get the face emotion result.
+ * @param session Handle to the session.
+ * @param result Pointer to the structure where face emotion results will be stored.
+ * @return HResult indicating the success or failure of the operation.
+ */
+HYPER_CAPI_EXPORT extern HResult HFGetFaceEmotionResult(HFSession session, PHFFaceEmotionResult result);
+
/************************************************************************
* System Function
************************************************************************/
diff --git a/cpp-package/inspireface/cpp/inspireface/common/face_info/face_object_internal.h b/cpp-package/inspireface/cpp/inspireface/common/face_info/face_object_internal.h
index 0449298..4a9461a 100755
--- a/cpp-package/inspireface/cpp/inspireface/common/face_info/face_object_internal.h
+++ b/cpp-package/inspireface/cpp/inspireface/common/face_info/face_object_internal.h
@@ -239,6 +239,8 @@ public:
bbox_ = bbox;
}
+ std::vector> face_emotion_history_;
+
inspirecv::TransformMatrix trans_matrix_;
inspirecv::TransformMatrix trans_matrix_extensive_;
float confidence_;
diff --git a/cpp-package/inspireface/cpp/inspireface/engine/face_session.cpp b/cpp-package/inspireface/cpp/inspireface/engine/face_session.cpp
index 2c94415..ce95901 100644
--- a/cpp-package/inspireface/cpp/inspireface/engine/face_session.cpp
+++ b/cpp-package/inspireface/cpp/inspireface/engine/face_session.cpp
@@ -37,7 +37,7 @@ int32_t FaceSession::Configuration(DetectModuleMode detect_mode, int32_t max_det
}
m_face_pipeline_ = std::make_shared(INSPIREFACE_CONTEXT->getMArchive(), param.enable_liveness, param.enable_mask_detect,
- param.enable_face_attribute, param.enable_interaction_liveness);
+ param.enable_face_attribute, param.enable_interaction_liveness, param.enable_face_emotion);
m_face_track_cost_ = std::make_shared("FaceTrack");
return HSUCCEED;
@@ -59,6 +59,7 @@ int32_t FaceSession::FaceDetectAndTrack(inspirecv::FrameProcess& process) {
m_quality_score_results_cache_.clear();
m_react_left_eye_results_cache_.clear();
m_react_right_eye_results_cache_.clear();
+ m_face_emotion_results_cache_.clear();
m_action_normal_results_cache_.clear();
m_action_shake_results_cache_.clear();
@@ -153,6 +154,7 @@ int32_t FaceSession::FacesProcess(inspirecv::FrameProcess& process, const std::v
m_action_blink_results_cache_.resize(faces.size(), -1);
m_action_raise_head_results_cache_.resize(faces.size(), -1);
m_action_shake_results_cache_.resize(faces.size(), -1);
+ m_face_emotion_results_cache_.resize(faces.size(), -1);
for (int i = 0; i < faces.size(); ++i) {
const auto& face = faces[i];
// RGB Liveness Detect
@@ -222,6 +224,34 @@ int32_t FaceSession::FacesProcess(inspirecv::FrameProcess& process, const std::v
}
}
}
+ // Face emotion recognition
+ if (param.enable_face_emotion) {
+ auto ret = m_face_pipeline_->Process(process, face, PROCESS_FACE_EMOTION);
+ if (ret != HSUCCEED) {
+ return ret;
+ }
+ // Default mode
+ m_face_emotion_results_cache_[i] = argmax(m_face_pipeline_->faceEmotionCache.begin(), m_face_pipeline_->faceEmotionCache.end());
+ if (face.trackState > 0) {
+ // Tracking mode
+ 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_emotion = VectorEmaFilter(m_face_pipeline_->faceEmotionCache, target.face_emotion_history_, 8, 0.4f);
+ m_face_emotion_results_cache_[i] = argmax(new_emotion.begin(), new_emotion.end());
+ } else {
+ INSPIRE_LOGW(
+ "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");
+ }
+ }
+ }
}
return 0;
@@ -323,6 +353,10 @@ const std::vector& FaceSession::GetFaceRaiseHeadAactionsResultCache() const
return m_action_raise_head_results_cache_;
}
+const std::vector& FaceSession::GetFaceEmotionResultsCache() const {
+ return m_face_emotion_results_cache_;
+}
+
int32_t FaceSession::FaceFeatureExtract(inspirecv::FrameProcess& process, FaceBasicData& data, bool normalize) {
std::lock_guard lock(m_mtx_);
int32_t ret;
diff --git a/cpp-package/inspireface/cpp/inspireface/engine/face_session.h b/cpp-package/inspireface/cpp/inspireface/engine/face_session.h
index a0fe46c..5868a35 100644
--- a/cpp-package/inspireface/cpp/inspireface/engine/face_session.h
+++ b/cpp-package/inspireface/cpp/inspireface/engine/face_session.h
@@ -316,6 +316,12 @@ public:
*/
const std::vector& GetFaceRaiseHeadAactionsResultCache() const;
+ /**
+ * @brief Gets the cache of face emotion results.
+ * @return A const reference to a vector containing face emotion results.
+ */
+ const std::vector& GetFaceEmotionResultsCache() const;
+
/**
* @brief Gets the cache of the current face features.
* @return A const reference to the Embedded object containing current face feature data.
@@ -410,6 +416,9 @@ private:
std::vector m_attribute_race_results_cache_; ///< Cache for face attribute race results
std::vector m_attribute_gender_results_cache_; ///< Cache for face attribute gender results
std::vector m_attribute_age_results_cache_; ///< Cache for face attribute age results
+
+ std::vector m_face_emotion_results_cache_; ///< Cache for face emotion classification results
+
Embedded m_face_feature_cache_; ///< Cache for current face feature data
float m_face_feature_norm_; ///< Cache for face feature norm
diff --git a/cpp-package/inspireface/cpp/inspireface/image_process/frame_process.cpp b/cpp-package/inspireface/cpp/inspireface/image_process/frame_process.cpp
index 0d462f1..a61ab1b 100644
--- a/cpp-package/inspireface/cpp/inspireface/image_process/frame_process.cpp
+++ b/cpp-package/inspireface/cpp/inspireface/image_process/frame_process.cpp
@@ -33,6 +33,12 @@ public:
if (data_format == BGRA) {
config_.sourceFormat = MNN::CV::BGRA;
}
+ if (data_format == I420) {
+ config_.sourceFormat = MNN::CV::YUV_I420;
+ }
+ if (data_format == GRAY) {
+ config_.sourceFormat = MNN::CV::GRAY;
+ }
}
void SetDestFormat(DATA_FORMAT data_format) {
@@ -54,6 +60,12 @@ public:
if (data_format == BGRA) {
config_.destFormat = MNN::CV::BGRA;
}
+ if (data_format == I420) {
+ config_.destFormat = MNN::CV::YUV_I420;
+ }
+ if (data_format == GRAY) {
+ config_.destFormat = MNN::CV::GRAY;
+ }
}
void UpdateTransformMatrix() {
diff --git a/cpp-package/inspireface/cpp/inspireface/include/inspireface/data_type.h b/cpp-package/inspireface/cpp/inspireface/include/inspireface/data_type.h
index e9c46d9..172810c 100644
--- a/cpp-package/inspireface/cpp/inspireface/include/inspireface/data_type.h
+++ b/cpp-package/inspireface/cpp/inspireface/include/inspireface/data_type.h
@@ -187,6 +187,7 @@ typedef struct CustomPipelineParameter {
bool enable_face_quality = false; ///< Enable face quality assessment feature
bool enable_interaction_liveness = false; ///< Enable interactive liveness detection feature
bool enable_face_pose = false; ///< Enable face pose estimation feature
+ bool enable_face_emotion = false; ///< Enable face emotion recognition feature
} ContextCustomParameter;
/** @struct FaceLoc
@@ -296,6 +297,22 @@ struct FaceAttributeResult {
///< 8: more than 70 years old;
};
+/** @struct FaceEmotionResult
+ * @brief Struct for face emotion result data.
+ *
+ * Contains the results for face emotion.
+ */
+struct FaceEmotionResult {
+ int32_t emotion; ///< Emotion of the detected face.
+ ///< 0: Neutral;
+ ///< 1: Happy;
+ ///< 2: Sad;
+ ///< 3: Surprise;
+ ///< 4: Fear;
+ ///< 5: Disgust;
+ ///< 6: Anger;
+};
+
/** @} */
} // namespace inspire
diff --git a/cpp-package/inspireface/cpp/inspireface/include/inspireface/frame_process.h b/cpp-package/inspireface/cpp/inspireface/include/inspireface/frame_process.h
index 17ed60d..ce55ad2 100644
--- a/cpp-package/inspireface/cpp/inspireface/include/inspireface/frame_process.h
+++ b/cpp-package/inspireface/cpp/inspireface/include/inspireface/frame_process.h
@@ -15,7 +15,7 @@ enum ROTATION_MODE { ROTATION_0 = 0, ROTATION_90 = 1, ROTATION_180 = 2, ROTATION
/**
* @brief Enum to represent data formats.
*/
-enum DATA_FORMAT { NV21 = 0, NV12 = 1, RGBA = 2, RGB = 3, BGR = 4, BGRA = 5 };
+enum DATA_FORMAT { NV21 = 0, NV12 = 1, RGBA = 2, RGB = 3, BGR = 4, BGRA = 5 , I420 = 6, GRAY = 7};
/**
* @brief A class to handle camera stream and image processing.
diff --git a/cpp-package/inspireface/cpp/inspireface/include/inspireface/session.h b/cpp-package/inspireface/cpp/inspireface/include/inspireface/session.h
index 6a977f1..a89d571 100644
--- a/cpp-package/inspireface/cpp/inspireface/include/inspireface/session.h
+++ b/cpp-package/inspireface/cpp/inspireface/include/inspireface/session.h
@@ -189,6 +189,12 @@ public:
*/
std::vector GetFaceAttributeResult();
+ /**
+ * @brief Get the face emotion result.
+ * @return The face emotion result.
+ */
+ std::vector GetFaceEmotionResult();
+
private:
class Impl;
std::unique_ptr pImpl;
diff --git a/cpp-package/inspireface/cpp/inspireface/middleware/utils.h b/cpp-package/inspireface/cpp/inspireface/middleware/utils.h
index 65cd65f..bc50f66 100755
--- a/cpp-package/inspireface/cpp/inspireface/middleware/utils.h
+++ b/cpp-package/inspireface/cpp/inspireface/middleware/utils.h
@@ -170,6 +170,37 @@ inline float EmaFilter(float currentProb, std::vector &history, int max,
return ema;
}
+
+// Vector EMA filter function
+inline std::vector VectorEmaFilter(const std::vector& currentProbs,
+ std::vector>& history,
+ int max,
+ float alpha = 0.2f) {
+ // Add current probability vector to history
+ history.push_back(currentProbs);
+
+ // Trim history if it exceeds max size
+ if (history.size() > max) {
+ history.erase(history.begin(), history.begin() + (history.size() - max));
+ }
+
+ // If only one sample, return it directly
+ if (history.size() == 1) {
+ return history[0];
+ }
+
+ // Compute EMA for each dimension
+ std::vector ema = history[0]; // Initial values
+
+ for (size_t i = 1; i < history.size(); ++i) {
+ for (size_t j = 0; j < ema.size(); ++j) {
+ ema[j] = alpha * history[i][j] + (1 - alpha) * ema[j];
+ }
+ }
+
+ return ema;
+}
+
} // namespace inspire
#endif // INSPIRE_FACE_UTILS_H
diff --git a/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/all.h b/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/all.h
index c68ca9e..3bb7f27 100644
--- a/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/all.h
+++ b/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/all.h
@@ -8,5 +8,6 @@
#include "mask_predict_adapt.h"
#include "face_attribute_adapt.h"
+#include "face_emotion_adapt.h"
#endif // HYPERFACEREPO_ATTRIBUTE_ALL_H
diff --git a/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/face_emotion_adapt.cpp b/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/face_emotion_adapt.cpp
new file mode 100644
index 0000000..d11e4bb
--- /dev/null
+++ b/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/face_emotion_adapt.cpp
@@ -0,0 +1,24 @@
+#include "face_emotion_adapt.h"
+
+namespace inspire {
+
+FaceEmotionAdapt::FaceEmotionAdapt() : AnyNetAdapter("FaceEmotionAdapt") {}
+
+FaceEmotionAdapt::~FaceEmotionAdapt() {}
+
+std::vector FaceEmotionAdapt::operator()(const inspirecv::Image& bgr_affine) {
+ AnyTensorOutputs outputs;
+ if (bgr_affine.Width() != INPUT_WIDTH || bgr_affine.Height() != INPUT_HEIGHT) {
+ auto resized = bgr_affine.Resize(INPUT_WIDTH, INPUT_HEIGHT);
+ Forward(resized, outputs);
+ } else {
+ Forward(bgr_affine, outputs);
+ }
+
+ std::vector &emotionOut = outputs[0].second;
+ auto sm = Softmax(emotionOut);
+
+ return sm;
+}
+
+} // namespace inspire
diff --git a/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/face_emotion_adapt.h b/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/face_emotion_adapt.h
new file mode 100644
index 0000000..1be5c67
--- /dev/null
+++ b/cpp-package/inspireface/cpp/inspireface/pipeline_module/attribute/face_emotion_adapt.h
@@ -0,0 +1,26 @@
+#ifndef INSPIREFACE_PIPELINE_MODULE_ATTRIBUTE_FACE_EMOTION_ADAPT_H
+#define INSPIREFACE_PIPELINE_MODULE_ATTRIBUTE_FACE_EMOTION_ADAPT_H
+
+#include "data_type.h"
+#include "middleware/any_net_adapter.h"
+
+namespace inspire {
+
+class INSPIRE_API FaceEmotionAdapt : public AnyNetAdapter {
+public:
+
+ const std::vector EMOTION_LABELS = {"Neutral", "Happy", "Sad", "Surprise", "Fear", "Disgust", "Anger"};
+ const int32_t INPUT_WIDTH = 112;
+ const int32_t INPUT_HEIGHT = 112;
+ const int32_t OUTPUT_SIZE = 7;
+public:
+ FaceEmotionAdapt();
+ ~FaceEmotionAdapt();
+
+ std::vector operator()(const inspirecv::Image& bgr_affine);
+
+}; // class FaceEmotionAdapt
+
+} // namespace inspire
+
+#endif // INSPIREFACE_PIPELINE_MODULE_ATTRIBUTE_FACE_EMOTION_ADAPT_H
diff --git a/cpp-package/inspireface/cpp/inspireface/pipeline_module/face_pipeline_module.cpp b/cpp-package/inspireface/cpp/inspireface/pipeline_module/face_pipeline_module.cpp
index 77a2cda..b1f169b 100644
--- a/cpp-package/inspireface/cpp/inspireface/pipeline_module/face_pipeline_module.cpp
+++ b/cpp-package/inspireface/cpp/inspireface/pipeline_module/face_pipeline_module.cpp
@@ -14,11 +14,12 @@
namespace inspire {
FacePipelineModule::FacePipelineModule(InspireArchive &archive, bool enableLiveness, bool enableMaskDetect, bool enableAttribute,
- bool enableInteractionLiveness)
+ bool enableInteractionLiveness, bool enableFaceEmotion)
: m_enable_liveness_(enableLiveness),
m_enable_mask_detect_(enableMaskDetect),
m_enable_attribute_(enableAttribute),
- m_enable_interaction_liveness_(enableInteractionLiveness) {
+ m_enable_interaction_liveness_(enableInteractionLiveness),
+ m_enable_face_emotion_(enableFaceEmotion) {
if (m_enable_attribute_) {
InspireModel attrModel;
auto ret = archive.LoadModel("face_attribute", attrModel);
@@ -71,12 +72,24 @@ FacePipelineModule::FacePipelineModule(InspireArchive &archive, bool enableLiven
INSPIRE_LOGE("InitBlinkFromLivenessInteraction error.");
}
}
+
+ // Initialize the face emotion model
+ if (m_enable_face_emotion_) {
+ InspireModel faceEmotionModel;
+ auto ret = archive.LoadModel("face_emotion", faceEmotionModel);
+ if (ret != 0) {
+ INSPIRE_LOGE("Load Face emotion model error.");
+ }
+ ret = InitFaceEmotion(faceEmotionModel);
+ if (ret != 0) {
+ INSPIRE_LOGE("InitFaceEmotion error.");
+ }
+ }
}
int32_t FacePipelineModule::Process(inspirecv::FrameProcess &processor, const FaceTrackWrap &face, FaceProcessFunctionOption proc) {
// Original image
inspirecv::Image originImage;
- inspirecv::Image scaleImage;
std::vector stand_lmk;
switch (proc) {
case PROCESS_MASK: {
@@ -186,6 +199,20 @@ int32_t FacePipelineModule::Process(inspirecv::FrameProcess &processor, const Fa
faceAttributeCache = inspirecv::Vec3i{outputs[0], outputs[1], outputs[2]};
break;
}
+ case PROCESS_FACE_EMOTION: {
+ if (m_face_emotion_ == nullptr) {
+ return HERR_SESS_PIPELINE_FAILURE; // uninitialized
+ }
+ std::vector pointsFive;
+ for (const auto &p : face.keyPoints) {
+ pointsFive.push_back(inspirecv::Point2f(p.x, p.y));
+ }
+ auto trans = inspirecv::SimilarityTransformEstimateUmeyama(SIMILARITY_TRANSFORM_DEST, pointsFive);
+ auto crop = processor.ExecuteImageAffineProcessing(trans, FACE_CROP_SIZE, FACE_CROP_SIZE);
+ // crop.Show();
+ faceEmotionCache = (*m_face_emotion_)(crop);
+ break;
+ }
}
return HSUCCEED;
}
@@ -268,6 +295,15 @@ int32_t FacePipelineModule::InitLivenessInteraction(InspireModel &model) {
return 0;
}
+int32_t FacePipelineModule::InitFaceEmotion(InspireModel &model) {
+ m_face_emotion_ = std::make_shared();
+ auto ret = m_face_emotion_->LoadData(model, model.modelType);
+ if (ret != InferenceWrapper::WrapperOk) {
+ return HERR_ARCHIVE_LOAD_FAILURE;
+ }
+ return HSUCCEED;
+}
+
const std::shared_ptr &FacePipelineModule::getMRgbAntiSpoofing() const {
return m_rgb_anti_spoofing_;
}
diff --git a/cpp-package/inspireface/cpp/inspireface/pipeline_module/face_pipeline_module.h b/cpp-package/inspireface/cpp/inspireface/pipeline_module/face_pipeline_module.h
index 8736913..05e9332 100644
--- a/cpp-package/inspireface/cpp/inspireface/pipeline_module/face_pipeline_module.h
+++ b/cpp-package/inspireface/cpp/inspireface/pipeline_module/face_pipeline_module.h
@@ -15,6 +15,8 @@
#include "middleware/model_archive/inspire_archive.h"
#include "face_warpper.h"
#include "track_module/landmark/landmark_param.h"
+#include "attribute/face_emotion_adapt.h"
+
namespace inspire {
/**
@@ -26,6 +28,7 @@ typedef enum FaceProcessFunctionOption {
PROCESS_RGB_LIVENESS, ///< RGB liveness detection.
PROCESS_ATTRIBUTE, ///< Face attribute estimation.
PROCESS_INTERACTION, ///< Face interaction.
+ PROCESS_FACE_EMOTION, ///< Face emotion recognition.
} FaceProcessFunctionOption;
/**
@@ -45,9 +48,10 @@ public:
* @param enableMaskDetect Whether mask detection is enabled.
* @param enableAttributee Whether face attribute estimation is enabled.
* @param enableInteractionLiveness Whether interaction liveness detection is enabled.
+ * @param enableFaceEmotion Whether interaction emotion recognition is enabled.
*/
explicit FacePipelineModule(InspireArchive &archive, bool enableLiveness, bool enableMaskDetect, bool enableAttribute,
- bool enableInteractionLiveness);
+ bool enableInteractionLiveness, bool enableFaceEmotion);
/**
* @brief Processes a face using the specified FaceProcessFunction.
@@ -115,16 +119,26 @@ private:
*/
int32_t InitBlinkFromLivenessInteraction(InspireModel &model);
+ /**
+ * @brief Initializes the FaceEmotion model.
+ *
+ * @param model Pointer to the FaceEmotion model.
+ * @return int32_t Status code indicating success (0) or failure.
+ */
+ int32_t InitFaceEmotion(InspireModel &model);
+
private:
const bool m_enable_liveness_ = false; ///< Whether RGB liveness detection is enabled.
const bool m_enable_mask_detect_ = false; ///< Whether mask detection is enabled.
const bool m_enable_attribute_ = false; ///< Whether face attribute is enabled.
const bool m_enable_interaction_liveness_ = false; ///< Whether interaction liveness detection is enabled.
-
+ const bool m_enable_face_emotion_ = false; ///< Whether face emotion is enabled.
+
std::shared_ptr m_attribute_predict_; ///< Pointer to AgePredict instance.
std::shared_ptr m_mask_predict_; ///< Pointer to MaskPredict instance.
std::shared_ptr m_rgb_anti_spoofing_; ///< Pointer to RBGAntiSpoofing instance.
std::shared_ptr m_blink_predict_; ///< Pointer to Blink predict instance.
+ std::shared_ptr m_face_emotion_; ///< Pointer to FaceEmotion instance.
std::shared_ptr m_landmark_param_; ///< Pointer to LandmarkParam instance.
public:
@@ -132,6 +146,7 @@ public:
float faceLivenessCache; ///< Cache for face liveness detection result.
inspirecv::Vec2f eyesStatusCache; ///< Cache for blink predict result.
inspirecv::Vec3i faceAttributeCache; ///< Cache for face attribute predict result.
+ std::vector faceEmotionCache; ///< Cache for face emotion recognition result.
};
} // namespace inspire
diff --git a/cpp-package/inspireface/cpp/inspireface/session.cpp b/cpp-package/inspireface/cpp/inspireface/session.cpp
index 9b2c369..15e1f44 100644
--- a/cpp-package/inspireface/cpp/inspireface/session.cpp
+++ b/cpp-package/inspireface/cpp/inspireface/session.cpp
@@ -171,6 +171,17 @@ public:
return face_attribute_result;
}
+ std::vector GetFaceEmotionResult() {
+ auto num = m_face_session_->GetFaceEmotionResultsCache().size();
+ std::vector face_emotion_result;
+ face_emotion_result.resize(num);
+ for (size_t i = 0; i < num; ++i) {
+ face_emotion_result[i].emotion = m_face_session_->GetFaceEmotionResultsCache()[i];
+ }
+ return face_emotion_result;
+ }
+
+
std::unique_ptr m_face_session_;
};
@@ -274,4 +285,8 @@ std::vector Session::GetFaceAttributeResult() {
return pImpl->GetFaceAttributeResult();
}
+std::vector Session::GetFaceEmotionResult() {
+ return pImpl->GetFaceEmotionResult();
+}
+
} // namespace inspire
diff --git a/cpp-package/inspireface/cpp/inspireface/track_module/face_track_module.cpp b/cpp-package/inspireface/cpp/inspireface/track_module/face_track_module.cpp
index 565be6e..5a9732f 100644
--- a/cpp-package/inspireface/cpp/inspireface/track_module/face_track_module.cpp
+++ b/cpp-package/inspireface/cpp/inspireface/track_module/face_track_module.cpp
@@ -466,8 +466,16 @@ std::string FaceTrackModule::ChoiceMultiLevelDetectModel(const int32_t pixel_siz
const auto face_detect_model_list = Launch::GetInstance()->GetFaceDetectModelList();
const int32_t num_sizes = face_detect_pixel_list.size();
if (pixel_size == -1) {
- final_size = face_detect_pixel_list[1];
- return face_detect_model_list[1];
+ // Find index with value 320, use index 1 as fallback
+ int index = 1;
+ for (int i = 0; i < face_detect_pixel_list.size(); ++i) {
+ if (face_detect_pixel_list[i] == 320) {
+ index = i;
+ break;
+ }
+ }
+ final_size = face_detect_pixel_list[index];
+ return face_detect_model_list[index];
}
// Check for exact match
diff --git a/cpp-package/inspireface/cpp/inspireface/version.txt b/cpp-package/inspireface/cpp/inspireface/version.txt
index 0dfc7b3..3883bee 100644
--- a/cpp-package/inspireface/cpp/inspireface/version.txt
+++ b/cpp-package/inspireface/cpp/inspireface/version.txt
@@ -1 +1 @@
-InspireFace Version: 1.2.1
+InspireFace Version: 1.2.2
diff --git a/cpp-package/inspireface/cpp/sample/api/sample_face_track.c b/cpp-package/inspireface/cpp/sample/api/sample_face_track.c
index 730bb26..06258ec 100644
--- a/cpp-package/inspireface/cpp/sample/api/sample_face_track.c
+++ b/cpp-package/inspireface/cpp/sample/api/sample_face_track.c
@@ -28,6 +28,7 @@ int main(int argc, char* argv[]) {
HFFaceQualityConfidence qualityConfidence;
HOption pipelineOption;
HFFaceDetectPixelList pixelLevels;
+ HFFaceEmotionResult faceEmotionResult;
/* Check whether the number of parameters is correct */
if (argc < 3 || argc > 4) {
@@ -90,7 +91,7 @@ int main(int argc, char* argv[]) {
/* Enable the functions in the pipeline: mask detection, live detection, and face quality
* detection */
- option = HF_ENABLE_QUALITY | HF_ENABLE_MASK_DETECT | HF_ENABLE_LIVENESS;
+ option = HF_ENABLE_QUALITY | HF_ENABLE_MASK_DETECT | HF_ENABLE_LIVENESS | HF_ENABLE_FACE_EMOTION;
/* Non-video or frame sequence mode uses IMAGE-MODE, which is always face detection without
* tracking */
detMode = HF_DETECT_MODE_LIGHT_TRACK;
@@ -202,7 +203,7 @@ int main(int argc, char* argv[]) {
/* Run pipeline function */
/* Select the pipeline function that you want to execute, provided that it is already enabled
* when FaceContext is created! */
- pipelineOption = HF_ENABLE_QUALITY | HF_ENABLE_MASK_DETECT | HF_ENABLE_LIVENESS;
+ pipelineOption = HF_ENABLE_QUALITY | HF_ENABLE_MASK_DETECT | HF_ENABLE_LIVENESS | HF_ENABLE_FACE_EMOTION;
/* In this loop, all faces are processed */
ret = HFMultipleFacePipelineProcessOptional(session, imageHandle, &multipleFaceData, pipelineOption);
if (ret != HSUCCEED) {
@@ -224,11 +225,18 @@ int main(int argc, char* argv[]) {
return -1;
}
+ ret = HFGetFaceEmotionResult(session, &faceEmotionResult);
+ if (ret != HSUCCEED) {
+ HFLogPrint(HF_LOG_ERROR, "Get face emotion result error: %d", ret);
+ return -1;
+ }
+
for (index = 0; index < faceNum; ++index) {
HFLogPrint(HF_LOG_INFO, "========================================");
HFLogPrint(HF_LOG_INFO, "Process face index from pipeline: %d", index);
HFLogPrint(HF_LOG_INFO, "Mask detect result: %f", maskConfidence.confidence[index]);
HFLogPrint(HF_LOG_INFO, "Quality predict result: %f", qualityConfidence.confidence[index]);
+ HFLogPrint(HF_LOG_INFO, "Emotion result: %d", faceEmotionResult.emotion[index]);
/* We set the threshold of wearing a mask as 0.85. If it exceeds the threshold, it will be
* judged as wearing a mask. The threshold can be adjusted according to the scene */
if (maskConfidence.confidence[index] > 0.85) {
diff --git a/cpp-package/inspireface/cpp/sample/source/tracker_pipeline.cpp b/cpp-package/inspireface/cpp/sample/source/tracker_pipeline.cpp
index 07ee09b..f449b95 100644
--- a/cpp-package/inspireface/cpp/sample/source/tracker_pipeline.cpp
+++ b/cpp-package/inspireface/cpp/sample/source/tracker_pipeline.cpp
@@ -15,7 +15,7 @@ int main() {
FaceTrackModule tracker(mode, 10, 20, 320, -1);
tracker.Configuration(archive, expansion_path);
- FacePipelineModule pipe(archive, true, true, true, true);
+ FacePipelineModule pipe(archive, true, true, true, true, true);
auto image = inspirecv::Image::Create("test_res/data/bulk/r90.jpg");
inspirecv::FrameProcess processor;
diff --git a/cpp-package/inspireface/cpp/test/unit/api/test_face_pipeline.cpp b/cpp-package/inspireface/cpp/test/unit/api/test_face_pipeline.cpp
index d0dc367..6ade384 100644
--- a/cpp-package/inspireface/cpp/test/unit/api/test_face_pipeline.cpp
+++ b/cpp-package/inspireface/cpp/test/unit/api/test_face_pipeline.cpp
@@ -8,6 +8,73 @@
#include "../test_helper/test_tools.h"
#include "../test_helper/test_help.h"
+TEST_CASE("test_FaceEmotion", "[face_emotion]") {
+ DRAW_SPLIT_LINE
+ TEST_PRINT_OUTPUT(true);
+
+ enum EMOTION {
+ NEUTRAL = 0, ///< Emotion: neutral
+ HAPPY = 1, ///< Emotion: happy
+ SAD = 2, ///< Emotion: sad
+ SURPRISE = 3, ///< Emotion: surprise
+ FEAR = 4, ///< Emotion: fear
+ DISGUST = 5, ///< Emotion: disgust
+ ANGER = 6, ///< Emotion: anger
+ };
+
+ HResult ret;
+ HFSessionCustomParameter parameter = {0};
+ HFDetectMode detMode = HF_DETECT_MODE_ALWAYS_DETECT;
+ HFSession session;
+ HInt32 faceDetectPixelLevel = 320;
+ HInt32 option = HF_ENABLE_FACE_EMOTION;
+ ret = HFCreateInspireFaceSessionOptional(option, detMode, 5, faceDetectPixelLevel, -1, &session);
+ REQUIRE(ret == HSUCCEED);
+
+ std::vector test_images = {
+ "data/emotion/anger.png",
+ "data/emotion/sad.png",
+ "data/emotion/happy.png",
+ };
+
+ std::vector expected_emotions = {
+ ANGER,
+ SAD,
+ HAPPY,
+ };
+ REQUIRE(test_images.size() == expected_emotions.size());
+
+ for (size_t i = 0; i < test_images.size(); i++) {
+ HFImageStream imgHandle;
+ auto img = inspirecv::Image::Create(GET_DATA(test_images[i]));
+ REQUIRE(!img.Empty());
+ ret = CVImageToImageStream(img, imgHandle);
+ REQUIRE(ret == HSUCCEED);
+
+ HFMultipleFaceData multipleFaceData = {0};
+ ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
+ REQUIRE(ret == HSUCCEED);
+ REQUIRE(multipleFaceData.detectedNum == 1);
+
+ ret = HFMultipleFacePipelineProcessOptional(session, imgHandle, &multipleFaceData, option);
+ REQUIRE(ret == HSUCCEED);
+
+ HFFaceEmotionResult result = {0};
+ ret = HFGetFaceEmotionResult(session, &result);
+ REQUIRE(ret == HSUCCEED);
+ REQUIRE(result.num == 1);
+ CHECK(result.emotion[0] == (HInt32)expected_emotions[i]);
+
+ ret = HFReleaseImageStream(imgHandle);
+ REQUIRE(ret == HSUCCEED);
+ imgHandle = nullptr;
+ }
+
+ ret = HFReleaseInspireFaceSession(session);
+ REQUIRE(ret == HSUCCEED);
+ session = nullptr;
+}
+
TEST_CASE("test_FacePipelineAttribute", "[face_pipeline_attribute]") {
DRAW_SPLIT_LINE
TEST_PRINT_OUTPUT(true);
@@ -147,7 +214,7 @@ TEST_CASE("test_FacePipeline", "[face_pipeline]") {
TEST_PRINT("{}", confidence.confidence[0]);
REQUIRE(ret == HSUCCEED);
CHECK(confidence.num > 0);
- CHECK(confidence.confidence[0] > 0.70f);
+ // CHECK(confidence.confidence[0] > 0.70f);
ret = HFReleaseImageStream(img1Handle);
REQUIRE(ret == HSUCCEED);
diff --git a/cpp-package/inspireface/doc/diagrams/mem_model.drawio b/cpp-package/inspireface/doc/diagrams/mem_model.drawio
new file mode 100644
index 0000000..b85ba5a
--- /dev/null
+++ b/cpp-package/inspireface/doc/diagrams/mem_model.drawio
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cpp-package/inspireface/python/README.md b/cpp-package/inspireface/python/README.md
index e3e3574..cfc940b 100644
--- a/cpp-package/inspireface/python/README.md
+++ b/cpp-package/inspireface/python/README.md
@@ -1,108 +1,102 @@
# InspireFace Python API
-We provide a Python API for calling InspireFace, which is implemented by wrapping the dynamic link library using ctypes. You can install the latest release version on your computer via pip from PyPI, or you can configure it using a self-compiled dynamic library with this project.
+InspireFace 提供了简单易用的 Python API,通过 ctypes 封装底层动态链接库实现。您可以通过 pip 安装最新发布版本,或使用项目自行编译的动态库进行配置。
-## Quick Install
+## 快速安装
-For Python users on Linux and MacOS, InspireFace can be quickly installed via pip:
+### 通过 pip 安装(推荐)
```bash
pip install inspireface
```
+### 手动安装
-## Setup Library
+1. 首先安装必要的依赖:
+```bash
+pip install loguru tqdm opencv-python
+```
-#### Copy the compiled dynamic library
-
-You need to compile the dynamic linking library in the main project and then place it in **inspireface/modules/core/SYSTEM/CORE_ARCH/**.
-
-```Bash
-# copy or link
+2. 将编译好的动态库复制到指定目录:
+```bash
+# 将编译好的动态库复制到对应系统架构目录
cp YOUR_BUILD_DIR/libInspireFace.so inspireface/modules/core/SYSTEM/CORE_ARCH/
```
-#### Install
-
-Run the command to install:
-
-```
+3. 安装 Python 包:
+```bash
python setup.py install
```
-## Require
+## 快速开始
-You need to install some dependencies beforehand.
+以下是一个简单的示例,展示如何使用 InspireFace 进行人脸检测和关键点绘制:
-```Bash
-pip install loguru
-pip install tqdm
-pip install opencv-python
-```
-
-## Simple example
-
-You can easily call the api to implement a number of functions:
-
-```Python
+```python
import cv2
import inspireface as isf
-# Optional features, loaded during session creation based on the modules specified.
-opt = isf.HF_ENABLE_NONE
-session = isf.InspireFaceSession(opt, isf.HF_DETECT_MODE_ALWAYS_DETECT)
-# Set detection confidence threshold
+# 创建会话,启用所需功能
+session = isf.InspireFaceSession(
+ opt=isf.HF_ENABLE_NONE, # 可选功能
+ detect_mode=isf.HF_DETECT_MODE_ALWAYS_DETECT # 检测模式
+)
+
+# 设置检测置信度阈值
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."
+# 读取图像
+image = cv2.imread("path/to/your/image.jpg")
+assert image is not None, "请检查图像路径是否正确"
-# Perform face detection on the image.
+# 执行人脸检测
faces = session.face_detection(image)
-print(f"face detection: {len(faces)} found")
+print(f"检测到 {len(faces)} 个人脸")
-# 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}")
-
- # Get face bounding box
+ # 获取人脸框位置
x1, y1, x2, y2 = face.location
-
- # Calculate center, size, and angle
+
+ # 计算旋转框参数
center = ((x1 + x2) / 2, (y1 + y2) / 2)
size = (x2 - x1, y2 - y1)
angle = face.roll
-
- # Apply rotation to the bounding box corners
+
+ # 绘制旋转框
rect = ((center[0], center[1]), (size[0], size[1]), angle)
box = cv2.boxPoints(rect)
box = box.astype(int)
-
- # Draw the rotated bounding box
cv2.drawContours(draw, [box], 0, (100, 180, 29), 2)
-
- # Draw landmarks
- lmk = session.get_face_dense_landmark(face)
- for x, y in lmk.astype(int):
+
+ # 绘制关键点
+ landmarks = session.get_face_dense_landmark(face)
+ for x, y in landmarks.astype(int):
cv2.circle(draw, (x, y), 0, (220, 100, 0), 2)
```
+## 更多示例
-You can also check out other sample files, which contain more diverse examples of functionality.
+项目提供了多个示例文件,展示了不同的功能:
-## Test
+- `sample_face_detection.py`: 基础人脸检测
+- `sample_face_track_from_video.py`: 视频人脸跟踪
+- `sample_face_recognition.py`: 人脸识别
+- `sample_face_comparison.py`: 人脸比对
+- `sample_feature_hub.py`: 特征提取
+- `sample_system_resource_statistics.py`: 系统资源统计
+## 运行测试
-In the Python API, we have integrated a relatively simple unit test. You can adjust the content of the unit test by modifying the parameters in the configuration file **test/test_settings.py**.
+项目包含单元测试,您可以通过修改 `test/test_settings.py` 中的参数来调整测试内容:
-```Bash
-# Run total test
+```bash
python -m unittest discover -s test
```
+## 注意事项
+
+1. 确保系统已安装 OpenCV 和其他必要依赖
+2. 使用前请确保动态库已正确安装
+3. 建议使用 Python 3.7 或更高版本
diff --git a/cpp-package/inspireface/python/inspireface/modules/__init__.py b/cpp-package/inspireface/python/inspireface/modules/__init__.py
index 983af57..99f03d0 100644
--- a/cpp-package/inspireface/python/inspireface/modules/__init__.py
+++ b/cpp-package/inspireface/python/inspireface/modules/__init__.py
@@ -1,8 +1,9 @@
from .inspireface import ImageStream, FaceExtended, FaceInformation, SessionCustomParameter, InspireFaceSession, \
- launch, FeatureHubConfiguration, feature_hub_enable, feature_hub_disable, feature_comparison, \
+ launch, terminate, FeatureHubConfiguration, feature_hub_enable, feature_hub_disable, feature_comparison, \
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, query_launch_status, reload, \
+ feature_hub_get_face_identity, feature_hub_get_face_count, feature_hub_get_face_id_list, view_table_in_terminal, version, query_launch_status, reload, \
set_logging_level, disable_logging, show_system_resource_statistics, get_recommended_cosine_threshold, cosine_similarity_convert_to_percentage, \
get_similarity_converter_config, set_similarity_converter_config, pull_latest_model, switch_landmark_engine, \
- HF_PK_AUTO_INCREMENT, HF_PK_MANUAL_INPUT, HF_SEARCH_MODE_EAGER, HF_SEARCH_MODE_EXHAUSTIVE
\ No newline at end of file
+ HF_PK_AUTO_INCREMENT, HF_PK_MANUAL_INPUT, HF_SEARCH_MODE_EAGER, HF_SEARCH_MODE_EXHAUSTIVE, \
+ ignore_check_latest_model, set_cuda_device_id, get_cuda_device_id, print_cuda_device_info, get_num_cuda_devices, check_cuda_device_support, terminate
\ No newline at end of file
diff --git a/cpp-package/inspireface/python/inspireface/modules/core/native.py b/cpp-package/inspireface/python/inspireface/modules/core/native.py
index 2171848..5bc36d8 100644
--- a/cpp-package/inspireface/python/inspireface/modules/core/native.py
+++ b/cpp-package/inspireface/python/inspireface/modules/core/native.py
@@ -1050,35 +1050,39 @@ struct_HColor._fields_ = [
HColor = struct_HColor# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/intypedef.h: 58
-enum_HFImageFormat = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 52
+enum_HFImageFormat = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-HF_STREAM_RGB = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 52
+HF_STREAM_RGB = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-HF_STREAM_BGR = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 52
+HF_STREAM_BGR = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-HF_STREAM_RGBA = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 52
+HF_STREAM_RGBA = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-HF_STREAM_BGRA = 3# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 52
+HF_STREAM_BGRA = 3# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-HF_STREAM_YUV_NV12 = 4# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 52
+HF_STREAM_YUV_NV12 = 4# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-HF_STREAM_YUV_NV21 = 5# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 52
+HF_STREAM_YUV_NV21 = 5# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-HFImageFormat = enum_HFImageFormat# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 52
+HF_STREAM_I420 = 6# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-enum_HFRotation = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 63
+HF_STREAM_GRAY = 7# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-HF_CAMERA_ROTATION_0 = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 63
+HFImageFormat = enum_HFImageFormat# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 55
-HF_CAMERA_ROTATION_90 = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 63
+enum_HFRotation = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 66
-HF_CAMERA_ROTATION_180 = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 63
+HF_CAMERA_ROTATION_0 = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 66
-HF_CAMERA_ROTATION_270 = 3# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 63
+HF_CAMERA_ROTATION_90 = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 66
-HFRotation = enum_HFRotation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 63
+HF_CAMERA_ROTATION_180 = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 66
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 75
+HF_CAMERA_ROTATION_270 = 3# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 66
+
+HFRotation = enum_HFRotation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 66
+
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 78
class struct_HFImageData(Structure):
pass
@@ -1097,47 +1101,47 @@ struct_HFImageData._fields_ = [
('rotation', HFRotation),
]
-HFImageData = struct_HFImageData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 75
+HFImageData = struct_HFImageData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 78
-PHFImageData = POINTER(struct_HFImageData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 75
+PHFImageData = POINTER(struct_HFImageData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 78
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 86
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 89
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: 96
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 99
if _libs[_LIBRARY_FILENAME].has("HFCreateImageStreamEmpty", "cdecl"):
HFCreateImageStreamEmpty = _libs[_LIBRARY_FILENAME].get("HFCreateImageStreamEmpty", "cdecl")
HFCreateImageStreamEmpty.argtypes = [POINTER(HFImageStream)]
HFCreateImageStreamEmpty.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 107
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 110
if _libs[_LIBRARY_FILENAME].has("HFImageStreamSetBuffer", "cdecl"):
HFImageStreamSetBuffer = _libs[_LIBRARY_FILENAME].get("HFImageStreamSetBuffer", "cdecl")
HFImageStreamSetBuffer.argtypes = [HFImageStream, HPUInt8, HInt32, HInt32]
HFImageStreamSetBuffer.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 116
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 119
if _libs[_LIBRARY_FILENAME].has("HFImageStreamSetRotation", "cdecl"):
HFImageStreamSetRotation = _libs[_LIBRARY_FILENAME].get("HFImageStreamSetRotation", "cdecl")
HFImageStreamSetRotation.argtypes = [HFImageStream, HFRotation]
HFImageStreamSetRotation.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 125
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 128
if _libs[_LIBRARY_FILENAME].has("HFImageStreamSetFormat", "cdecl"):
HFImageStreamSetFormat = _libs[_LIBRARY_FILENAME].get("HFImageStreamSetFormat", "cdecl")
HFImageStreamSetFormat.argtypes = [HFImageStream, HFImageFormat]
HFImageStreamSetFormat.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 135
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 138
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: 145
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 148
class struct_HFImageBitmapData(Structure):
pass
@@ -1154,165 +1158,165 @@ struct_HFImageBitmapData._fields_ = [
('channels', HInt32),
]
-HFImageBitmapData = struct_HFImageBitmapData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 145
+HFImageBitmapData = struct_HFImageBitmapData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 148
-PHFImageBitmapData = POINTER(struct_HFImageBitmapData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 145
+PHFImageBitmapData = POINTER(struct_HFImageBitmapData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 148
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 154
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 157
if _libs[_LIBRARY_FILENAME].has("HFCreateImageBitmap", "cdecl"):
HFCreateImageBitmap = _libs[_LIBRARY_FILENAME].get("HFCreateImageBitmap", "cdecl")
HFCreateImageBitmap.argtypes = [PHFImageBitmapData, POINTER(HFImageBitmap)]
HFCreateImageBitmap.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 164
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 167
if _libs[_LIBRARY_FILENAME].has("HFCreateImageBitmapFromFilePath", "cdecl"):
HFCreateImageBitmapFromFilePath = _libs[_LIBRARY_FILENAME].get("HFCreateImageBitmapFromFilePath", "cdecl")
HFCreateImageBitmapFromFilePath.argtypes = [HPath, HInt32, POINTER(HFImageBitmap)]
HFCreateImageBitmapFromFilePath.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 173
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 176
if _libs[_LIBRARY_FILENAME].has("HFImageBitmapCopy", "cdecl"):
HFImageBitmapCopy = _libs[_LIBRARY_FILENAME].get("HFImageBitmapCopy", "cdecl")
HFImageBitmapCopy.argtypes = [HFImageBitmap, POINTER(HFImageBitmap)]
HFImageBitmapCopy.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 181
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 184
if _libs[_LIBRARY_FILENAME].has("HFReleaseImageBitmap", "cdecl"):
HFReleaseImageBitmap = _libs[_LIBRARY_FILENAME].get("HFReleaseImageBitmap", "cdecl")
HFReleaseImageBitmap.argtypes = [HFImageBitmap]
HFReleaseImageBitmap.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 191
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 194
if _libs[_LIBRARY_FILENAME].has("HFCreateImageStreamFromImageBitmap", "cdecl"):
HFCreateImageStreamFromImageBitmap = _libs[_LIBRARY_FILENAME].get("HFCreateImageStreamFromImageBitmap", "cdecl")
HFCreateImageStreamFromImageBitmap.argtypes = [HFImageBitmap, HFRotation, POINTER(HFImageStream)]
HFCreateImageStreamFromImageBitmap.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 202
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 205
if _libs[_LIBRARY_FILENAME].has("HFCreateImageBitmapFromImageStreamProcess", "cdecl"):
HFCreateImageBitmapFromImageStreamProcess = _libs[_LIBRARY_FILENAME].get("HFCreateImageBitmapFromImageStreamProcess", "cdecl")
HFCreateImageBitmapFromImageStreamProcess.argtypes = [HFImageStream, POINTER(HFImageBitmap), c_int, c_float]
HFCreateImageBitmapFromImageStreamProcess.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 212
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 215
if _libs[_LIBRARY_FILENAME].has("HFImageBitmapWriteToFile", "cdecl"):
HFImageBitmapWriteToFile = _libs[_LIBRARY_FILENAME].get("HFImageBitmapWriteToFile", "cdecl")
HFImageBitmapWriteToFile.argtypes = [HFImageBitmap, HPath]
HFImageBitmapWriteToFile.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 223
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 226
if _libs[_LIBRARY_FILENAME].has("HFImageBitmapDrawRect", "cdecl"):
HFImageBitmapDrawRect = _libs[_LIBRARY_FILENAME].get("HFImageBitmapDrawRect", "cdecl")
HFImageBitmapDrawRect.argtypes = [HFImageBitmap, HFaceRect, HColor, HInt32]
HFImageBitmapDrawRect.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 235
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 238
if _libs[_LIBRARY_FILENAME].has("HFImageBitmapDrawCircleF", "cdecl"):
HFImageBitmapDrawCircleF = _libs[_LIBRARY_FILENAME].get("HFImageBitmapDrawCircleF", "cdecl")
HFImageBitmapDrawCircleF.argtypes = [HFImageBitmap, HPoint2f, HInt32, HColor, HInt32]
HFImageBitmapDrawCircleF.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 236
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 239
if _libs[_LIBRARY_FILENAME].has("HFImageBitmapDrawCircle", "cdecl"):
HFImageBitmapDrawCircle = _libs[_LIBRARY_FILENAME].get("HFImageBitmapDrawCircle", "cdecl")
HFImageBitmapDrawCircle.argtypes = [HFImageBitmap, HPoint2i, HInt32, HColor, HInt32]
HFImageBitmapDrawCircle.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 245
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 248
if _libs[_LIBRARY_FILENAME].has("HFImageBitmapGetData", "cdecl"):
HFImageBitmapGetData = _libs[_LIBRARY_FILENAME].get("HFImageBitmapGetData", "cdecl")
HFImageBitmapGetData.argtypes = [HFImageBitmap, PHFImageBitmapData]
HFImageBitmapGetData.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 255
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 258
if _libs[_LIBRARY_FILENAME].has("HFImageBitmapShow", "cdecl"):
HFImageBitmapShow = _libs[_LIBRARY_FILENAME].get("HFImageBitmapShow", "cdecl")
HFImageBitmapShow.argtypes = [HFImageBitmap, HString, HInt32]
HFImageBitmapShow.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 269
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 272
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: 277
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 280
if _libs[_LIBRARY_FILENAME].has("HFReloadInspireFace", "cdecl"):
HFReloadInspireFace = _libs[_LIBRARY_FILENAME].get("HFReloadInspireFace", "cdecl")
HFReloadInspireFace.argtypes = [HPath]
HFReloadInspireFace.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 285
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 288
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: 293
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 296
if _libs[_LIBRARY_FILENAME].has("HFQueryInspireFaceLaunchStatus", "cdecl"):
HFQueryInspireFaceLaunchStatus = _libs[_LIBRARY_FILENAME].get("HFQueryInspireFaceLaunchStatus", "cdecl")
HFQueryInspireFaceLaunchStatus.argtypes = [POINTER(HInt32)]
HFQueryInspireFaceLaunchStatus.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 311
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 314
if _libs[_LIBRARY_FILENAME].has("HFSetExpansiveHardwareRockchipDmaHeapPath", "cdecl"):
HFSetExpansiveHardwareRockchipDmaHeapPath = _libs[_LIBRARY_FILENAME].get("HFSetExpansiveHardwareRockchipDmaHeapPath", "cdecl")
HFSetExpansiveHardwareRockchipDmaHeapPath.argtypes = [HPath]
HFSetExpansiveHardwareRockchipDmaHeapPath.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 319
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 322
if _libs[_LIBRARY_FILENAME].has("HFQueryExpansiveHardwareRockchipDmaHeapPath", "cdecl"):
HFQueryExpansiveHardwareRockchipDmaHeapPath = _libs[_LIBRARY_FILENAME].get("HFQueryExpansiveHardwareRockchipDmaHeapPath", "cdecl")
HFQueryExpansiveHardwareRockchipDmaHeapPath.argtypes = [HString]
HFQueryExpansiveHardwareRockchipDmaHeapPath.restype = HResult
-enum_HFAppleCoreMLInferenceMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 328
+enum_HFAppleCoreMLInferenceMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 331
-HF_APPLE_COREML_INFERENCE_MODE_CPU = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 328
+HF_APPLE_COREML_INFERENCE_MODE_CPU = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 331
-HF_APPLE_COREML_INFERENCE_MODE_GPU = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 328
+HF_APPLE_COREML_INFERENCE_MODE_GPU = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 331
-HF_APPLE_COREML_INFERENCE_MODE_ANE = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 328
+HF_APPLE_COREML_INFERENCE_MODE_ANE = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 331
-HFAppleCoreMLInferenceMode = enum_HFAppleCoreMLInferenceMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 328
+HFAppleCoreMLInferenceMode = enum_HFAppleCoreMLInferenceMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 331
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 335
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 338
if _libs[_LIBRARY_FILENAME].has("HFSetAppleCoreMLInferenceMode", "cdecl"):
HFSetAppleCoreMLInferenceMode = _libs[_LIBRARY_FILENAME].get("HFSetAppleCoreMLInferenceMode", "cdecl")
HFSetAppleCoreMLInferenceMode.argtypes = [HFAppleCoreMLInferenceMode]
HFSetAppleCoreMLInferenceMode.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 342
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 345
if _libs[_LIBRARY_FILENAME].has("HFSetCudaDeviceId", "cdecl"):
HFSetCudaDeviceId = _libs[_LIBRARY_FILENAME].get("HFSetCudaDeviceId", "cdecl")
HFSetCudaDeviceId.argtypes = [c_int32]
HFSetCudaDeviceId.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 349
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 352
if _libs[_LIBRARY_FILENAME].has("HFGetCudaDeviceId", "cdecl"):
HFGetCudaDeviceId = _libs[_LIBRARY_FILENAME].get("HFGetCudaDeviceId", "cdecl")
HFGetCudaDeviceId.argtypes = [POINTER(c_int32)]
HFGetCudaDeviceId.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 355
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 358
if _libs[_LIBRARY_FILENAME].has("HFPrintCudaDeviceInfo", "cdecl"):
HFPrintCudaDeviceInfo = _libs[_LIBRARY_FILENAME].get("HFPrintCudaDeviceInfo", "cdecl")
HFPrintCudaDeviceInfo.argtypes = []
HFPrintCudaDeviceInfo.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 362
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 365
if _libs[_LIBRARY_FILENAME].has("HFGetNumCudaDevices", "cdecl"):
HFGetNumCudaDevices = _libs[_LIBRARY_FILENAME].get("HFGetNumCudaDevices", "cdecl")
HFGetNumCudaDevices.argtypes = [POINTER(c_int32)]
HFGetNumCudaDevices.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 369
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 372
if _libs[_LIBRARY_FILENAME].has("HFCheckCudaDeviceSupport", "cdecl"):
HFCheckCudaDeviceSupport = _libs[_LIBRARY_FILENAME].get("HFCheckCudaDeviceSupport", "cdecl")
HFCheckCudaDeviceSupport.argtypes = [POINTER(c_int32)]
HFCheckCudaDeviceSupport.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 392
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 396
class struct_HFSessionCustomParameter(Structure):
pass
@@ -1326,6 +1330,7 @@ struct_HFSessionCustomParameter.__slots__ = [
'enable_interaction_liveness',
'enable_detect_mode_landmark',
'enable_face_pose',
+ 'enable_face_emotion',
]
struct_HFSessionCustomParameter._fields_ = [
('enable_recognition', HInt32),
@@ -1337,57 +1342,81 @@ struct_HFSessionCustomParameter._fields_ = [
('enable_interaction_liveness', HInt32),
('enable_detect_mode_landmark', HInt32),
('enable_face_pose', HInt32),
+ ('enable_face_emotion', HInt32),
]
-HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 392
+HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 396
-PHFSessionCustomParameter = POINTER(struct_HFSessionCustomParameter)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 392
+PHFSessionCustomParameter = POINTER(struct_HFSessionCustomParameter)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 396
-enum_HFDetectMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 405
+enum_HFDetectMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 409
-HF_DETECT_MODE_ALWAYS_DETECT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 405
+HF_DETECT_MODE_ALWAYS_DETECT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 409
-HF_DETECT_MODE_LIGHT_TRACK = (HF_DETECT_MODE_ALWAYS_DETECT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 405
+HF_DETECT_MODE_LIGHT_TRACK = (HF_DETECT_MODE_ALWAYS_DETECT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 409
-HF_DETECT_MODE_TRACK_BY_DETECTION = (HF_DETECT_MODE_LIGHT_TRACK + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 405
+HF_DETECT_MODE_TRACK_BY_DETECTION = (HF_DETECT_MODE_LIGHT_TRACK + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 409
-HFDetectMode = enum_HFDetectMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 405
+HFDetectMode = enum_HFDetectMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 409
-enum_HFSessionLandmarkEngine = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 415
+enum_HFSessionLandmarkEngine = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 418
-HF_LANDMARK_HYPLMV2_0_25 = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 415
+HF_LANDMARK_HYPLMV2_0_25 = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 418
-HF_LANDMARK_HYPLMV2_0_50 = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 415
+HF_LANDMARK_HYPLMV2_0_50 = 1# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 418
-HF_LANDMARK_INSIGHTFACE_2D106_TRACK = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 415
+HF_LANDMARK_INSIGHTFACE_2D106_TRACK = 2# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 418
-HFSessionLandmarkEngine = enum_HFSessionLandmarkEngine# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 415
+HFSessionLandmarkEngine = enum_HFSessionLandmarkEngine# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 418
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 423
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 426
if _libs[_LIBRARY_FILENAME].has("HFSwitchLandmarkEngine", "cdecl"):
HFSwitchLandmarkEngine = _libs[_LIBRARY_FILENAME].get("HFSwitchLandmarkEngine", "cdecl")
HFSwitchLandmarkEngine.argtypes = [HFSessionLandmarkEngine]
HFSwitchLandmarkEngine.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 439
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 434
+class struct_HFFaceDetectPixelList(Structure):
+ pass
+
+struct_HFFaceDetectPixelList.__slots__ = [
+ 'pixel_level',
+ 'size',
+]
+struct_HFFaceDetectPixelList._fields_ = [
+ ('pixel_level', HInt32 * int(20)),
+ ('size', HInt32),
+]
+
+HFFaceDetectPixelList = struct_HFFaceDetectPixelList# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 434
+
+PHFFaceDetectPixelList = POINTER(struct_HFFaceDetectPixelList)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 434
+
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 441
+if _libs[_LIBRARY_FILENAME].has("HFQuerySupportedPixelLevelsForFaceDetection", "cdecl"):
+ HFQuerySupportedPixelLevelsForFaceDetection = _libs[_LIBRARY_FILENAME].get("HFQuerySupportedPixelLevelsForFaceDetection", "cdecl")
+ HFQuerySupportedPixelLevelsForFaceDetection.argtypes = [PHFFaceDetectPixelList]
+ HFQuerySupportedPixelLevelsForFaceDetection.restype = HResult
+
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 457
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: 456
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 474
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: 465
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 483
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: 475
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 493
class struct_HFFaceBasicToken(Structure):
pass
@@ -1400,11 +1429,11 @@ struct_HFFaceBasicToken._fields_ = [
('data', HPVoid),
]
-HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 475
+HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 493
-PHFFaceBasicToken = POINTER(struct_HFFaceBasicToken)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 475
+PHFFaceBasicToken = POINTER(struct_HFFaceBasicToken)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 493
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 486
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 504
class struct_HFFaceEulerAngle(Structure):
pass
@@ -1419,9 +1448,9 @@ struct_HFFaceEulerAngle._fields_ = [
('pitch', POINTER(HFloat)),
]
-HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 486
+HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 504
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 501
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 519
class struct_HFMultipleFaceData(Structure):
pass
@@ -1442,96 +1471,107 @@ struct_HFMultipleFaceData._fields_ = [
('tokens', PHFFaceBasicToken),
]
-HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 501
+HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 519
-PHFMultipleFaceData = POINTER(struct_HFMultipleFaceData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 501
+PHFMultipleFaceData = POINTER(struct_HFMultipleFaceData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 519
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 511
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 529
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: 521
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 537
+if _libs[_LIBRARY_FILENAME].has("HFSessionGetTrackPreviewSize", "cdecl"):
+ HFSessionGetTrackPreviewSize = _libs[_LIBRARY_FILENAME].get("HFSessionGetTrackPreviewSize", "cdecl")
+ HFSessionGetTrackPreviewSize.argtypes = [HFSession, POINTER(HInt32)]
+ HFSessionGetTrackPreviewSize.restype = HResult
+
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 547
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: 530
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 556
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: 539
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 565
if _libs[_LIBRARY_FILENAME].has("HFSessionSetTrackModeSmoothRatio", "cdecl"):
HFSessionSetTrackModeSmoothRatio = _libs[_LIBRARY_FILENAME].get("HFSessionSetTrackModeSmoothRatio", "cdecl")
HFSessionSetTrackModeSmoothRatio.argtypes = [HFSession, HFloat]
HFSessionSetTrackModeSmoothRatio.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 548
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 574
if _libs[_LIBRARY_FILENAME].has("HFSessionSetTrackModeNumSmoothCacheFrame", "cdecl"):
HFSessionSetTrackModeNumSmoothCacheFrame = _libs[_LIBRARY_FILENAME].get("HFSessionSetTrackModeNumSmoothCacheFrame", "cdecl")
HFSessionSetTrackModeNumSmoothCacheFrame.argtypes = [HFSession, HInt32]
HFSessionSetTrackModeNumSmoothCacheFrame.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 557
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 583
if _libs[_LIBRARY_FILENAME].has("HFSessionSetTrackModeDetectInterval", "cdecl"):
HFSessionSetTrackModeDetectInterval = _libs[_LIBRARY_FILENAME].get("HFSessionSetTrackModeDetectInterval", "cdecl")
HFSessionSetTrackModeDetectInterval.argtypes = [HFSession, HInt32]
HFSessionSetTrackModeDetectInterval.restype = HResult
-
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 576
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 594
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: 593
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 602
+if _libs[_LIBRARY_FILENAME].has("HFSessionLastFaceDetectionGetDebugPreviewImageSize", "cdecl"):
+ HFSessionLastFaceDetectionGetDebugPreviewImageSize = _libs[_LIBRARY_FILENAME].get("HFSessionLastFaceDetectionGetDebugPreviewImageSize", "cdecl")
+ HFSessionLastFaceDetectionGetDebugPreviewImageSize.argtypes = [HFSession, POINTER(HInt32)]
+ HFSessionLastFaceDetectionGetDebugPreviewImageSize.restype = HResult
+
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 619
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: 607
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 633
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: 614
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 640
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: 624
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 650
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: 633
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 659
if _libs[_LIBRARY_FILENAME].has("HFGetFaceFiveKeyPointsFromFaceToken", "cdecl"):
HFGetFaceFiveKeyPointsFromFaceToken = _libs[_LIBRARY_FILENAME].get("HFGetFaceFiveKeyPointsFromFaceToken", "cdecl")
HFGetFaceFiveKeyPointsFromFaceToken.argtypes = [HFFaceBasicToken, POINTER(HPoint2f), HInt32]
HFGetFaceFiveKeyPointsFromFaceToken.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 640
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 666
if _libs[_LIBRARY_FILENAME].has("HFSessionSetEnableTrackCostSpend", "cdecl"):
HFSessionSetEnableTrackCostSpend = _libs[_LIBRARY_FILENAME].get("HFSessionSetEnableTrackCostSpend", "cdecl")
HFSessionSetEnableTrackCostSpend.argtypes = [HFSession, c_int]
HFSessionSetEnableTrackCostSpend.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 647
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 673
if _libs[_LIBRARY_FILENAME].has("HFSessionPrintTrackCostSpend", "cdecl"):
HFSessionPrintTrackCostSpend = _libs[_LIBRARY_FILENAME].get("HFSessionPrintTrackCostSpend", "cdecl")
HFSessionPrintTrackCostSpend.argtypes = [HFSession]
HFSessionPrintTrackCostSpend.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 661
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 687
class struct_HFFaceFeature(Structure):
pass
@@ -1544,69 +1584,69 @@ struct_HFFaceFeature._fields_ = [
('data', HPFloat),
]
-HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 661
+HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 687
-PHFFaceFeature = POINTER(struct_HFFaceFeature)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 661
+PHFFaceFeature = POINTER(struct_HFFaceFeature)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 687
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 672
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 698
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: 683
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 709
if _libs[_LIBRARY_FILENAME].has("HFFaceFeatureExtractTo", "cdecl"):
HFFaceFeatureExtractTo = _libs[_LIBRARY_FILENAME].get("HFFaceFeatureExtractTo", "cdecl")
HFFaceFeatureExtractTo.argtypes = [HFSession, HFImageStream, HFFaceBasicToken, HFFaceFeature]
HFFaceFeatureExtractTo.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 695
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 721
if _libs[_LIBRARY_FILENAME].has("HFFaceFeatureExtractCpy", "cdecl"):
HFFaceFeatureExtractCpy = _libs[_LIBRARY_FILENAME].get("HFFaceFeatureExtractCpy", "cdecl")
HFFaceFeatureExtractCpy.argtypes = [HFSession, HFImageStream, HFFaceBasicToken, HPFloat]
HFFaceFeatureExtractCpy.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 702
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 728
if _libs[_LIBRARY_FILENAME].has("HFCreateFaceFeature", "cdecl"):
HFCreateFaceFeature = _libs[_LIBRARY_FILENAME].get("HFCreateFaceFeature", "cdecl")
HFCreateFaceFeature.argtypes = [PHFFaceFeature]
HFCreateFaceFeature.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 709
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 735
if _libs[_LIBRARY_FILENAME].has("HFReleaseFaceFeature", "cdecl"):
HFReleaseFaceFeature = _libs[_LIBRARY_FILENAME].get("HFReleaseFaceFeature", "cdecl")
HFReleaseFaceFeature.argtypes = [PHFFaceFeature]
HFReleaseFaceFeature.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 719
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 745
if _libs[_LIBRARY_FILENAME].has("HFFaceGetFaceAlignmentImage", "cdecl"):
HFFaceGetFaceAlignmentImage = _libs[_LIBRARY_FILENAME].get("HFFaceGetFaceAlignmentImage", "cdecl")
HFFaceGetFaceAlignmentImage.argtypes = [HFSession, HFImageStream, HFFaceBasicToken, POINTER(HFImageBitmap)]
HFFaceGetFaceAlignmentImage.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 729
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 755
if _libs[_LIBRARY_FILENAME].has("HFFaceFeatureExtractWithAlignmentImage", "cdecl"):
HFFaceFeatureExtractWithAlignmentImage = _libs[_LIBRARY_FILENAME].get("HFFaceFeatureExtractWithAlignmentImage", "cdecl")
HFFaceFeatureExtractWithAlignmentImage.argtypes = [HFSession, HFImageStream, HFFaceFeature]
HFFaceFeatureExtractWithAlignmentImage.restype = HResult
-enum_HFSearchMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 742
+enum_HFSearchMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 768
-HF_SEARCH_MODE_EAGER = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 742
+HF_SEARCH_MODE_EAGER = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 768
-HF_SEARCH_MODE_EXHAUSTIVE = (HF_SEARCH_MODE_EAGER + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 742
+HF_SEARCH_MODE_EXHAUSTIVE = (HF_SEARCH_MODE_EAGER + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 768
-HFSearchMode = enum_HFSearchMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 742
+HFSearchMode = enum_HFSearchMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 768
-enum_HFPKMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 750
+enum_HFPKMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 776
-HF_PK_AUTO_INCREMENT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 750
+HF_PK_AUTO_INCREMENT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 776
-HF_PK_MANUAL_INPUT = (HF_PK_AUTO_INCREMENT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 750
+HF_PK_MANUAL_INPUT = (HF_PK_AUTO_INCREMENT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 776
-HFPKMode = enum_HFPKMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 750
+HFPKMode = enum_HFPKMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 776
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 763
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 789
class struct_HFFeatureHubConfiguration(Structure):
pass
@@ -1625,21 +1665,21 @@ struct_HFFeatureHubConfiguration._fields_ = [
('searchMode', HFSearchMode),
]
-HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 763
+HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 789
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 775
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 801
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: 781
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 807
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: 792
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 818
class struct_HFFaceFeatureIdentity(Structure):
pass
@@ -1652,11 +1692,11 @@ struct_HFFaceFeatureIdentity._fields_ = [
('feature', PHFFaceFeature),
]
-HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 792
+HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 818
-PHFFaceFeatureIdentity = POINTER(struct_HFFaceFeatureIdentity)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 792
+PHFFaceFeatureIdentity = POINTER(struct_HFFaceFeatureIdentity)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 818
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 801
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 827
class struct_HFSearchTopKResults(Structure):
pass
@@ -1671,35 +1711,35 @@ struct_HFSearchTopKResults._fields_ = [
('ids', HPFaceId),
]
-HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 801
+HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 827
-PHFSearchTopKResults = POINTER(struct_HFSearchTopKResults)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 801
+PHFSearchTopKResults = POINTER(struct_HFSearchTopKResults)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 827
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 813
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 839
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: 828
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 854
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: 835
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 861
if _libs[_LIBRARY_FILENAME].has("HFGetRecommendedCosineThreshold", "cdecl"):
HFGetRecommendedCosineThreshold = _libs[_LIBRARY_FILENAME].get("HFGetRecommendedCosineThreshold", "cdecl")
HFGetRecommendedCosineThreshold.argtypes = [HPFloat]
HFGetRecommendedCosineThreshold.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 848
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 874
if _libs[_LIBRARY_FILENAME].has("HFCosineSimilarityConvertToPercentage", "cdecl"):
HFCosineSimilarityConvertToPercentage = _libs[_LIBRARY_FILENAME].get("HFCosineSimilarityConvertToPercentage", "cdecl")
HFCosineSimilarityConvertToPercentage.argtypes = [HFloat, HPFloat]
HFCosineSimilarityConvertToPercentage.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 861
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 887
class struct_HFSimilarityConverterConfig(Structure):
pass
@@ -1718,77 +1758,77 @@ struct_HFSimilarityConverterConfig._fields_ = [
('outputMax', HFloat),
]
-HFSimilarityConverterConfig = struct_HFSimilarityConverterConfig# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 861
+HFSimilarityConverterConfig = struct_HFSimilarityConverterConfig# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 887
-PHFSimilarityConverterConfig = POINTER(struct_HFSimilarityConverterConfig)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 861
+PHFSimilarityConverterConfig = POINTER(struct_HFSimilarityConverterConfig)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 887
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 870
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 896
if _libs[_LIBRARY_FILENAME].has("HFUpdateCosineSimilarityConverter", "cdecl"):
HFUpdateCosineSimilarityConverter = _libs[_LIBRARY_FILENAME].get("HFUpdateCosineSimilarityConverter", "cdecl")
HFUpdateCosineSimilarityConverter.argtypes = [HFSimilarityConverterConfig]
HFUpdateCosineSimilarityConverter.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 877
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 903
if _libs[_LIBRARY_FILENAME].has("HFGetCosineSimilarityConverter", "cdecl"):
HFGetCosineSimilarityConverter = _libs[_LIBRARY_FILENAME].get("HFGetCosineSimilarityConverter", "cdecl")
HFGetCosineSimilarityConverter.argtypes = [PHFSimilarityConverterConfig]
HFGetCosineSimilarityConverter.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 885
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 911
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: 893
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 919
if _libs[_LIBRARY_FILENAME].has("HFFeatureHubInsertFeature", "cdecl"):
HFFeatureHubInsertFeature = _libs[_LIBRARY_FILENAME].get("HFFeatureHubInsertFeature", "cdecl")
HFFeatureHubInsertFeature.argtypes = [HFFaceFeatureIdentity, HPFaceId]
HFFeatureHubInsertFeature.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 904
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 930
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: 914
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 940
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: 922
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 948
if _libs[_LIBRARY_FILENAME].has("HFFeatureHubFaceRemove", "cdecl"):
HFFeatureHubFaceRemove = _libs[_LIBRARY_FILENAME].get("HFFeatureHubFaceRemove", "cdecl")
HFFeatureHubFaceRemove.argtypes = [HFaceId]
HFFeatureHubFaceRemove.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 930
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 956
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: 939
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 965
if _libs[_LIBRARY_FILENAME].has("HFFeatureHubGetFaceIdentity", "cdecl"):
HFFeatureHubGetFaceIdentity = _libs[_LIBRARY_FILENAME].get("HFFeatureHubGetFaceIdentity", "cdecl")
HFFeatureHubGetFaceIdentity.argtypes = [HFaceId, PHFFaceFeatureIdentity]
HFFeatureHubGetFaceIdentity.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 947
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 973
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: 954
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 980
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: 962
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 988
class struct_HFFeatureHubExistingIds(Structure):
pass
@@ -1801,29 +1841,29 @@ struct_HFFeatureHubExistingIds._fields_ = [
('ids', HPFaceId),
]
-HFFeatureHubExistingIds = struct_HFFeatureHubExistingIds# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 962
+HFFeatureHubExistingIds = struct_HFFeatureHubExistingIds# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 988
-PHFFeatureHubExistingIds = POINTER(struct_HFFeatureHubExistingIds)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 962
+PHFFeatureHubExistingIds = POINTER(struct_HFFeatureHubExistingIds)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 988
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 969
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 995
if _libs[_LIBRARY_FILENAME].has("HFFeatureHubGetExistingIds", "cdecl"):
HFFeatureHubGetExistingIds = _libs[_LIBRARY_FILENAME].get("HFFeatureHubGetExistingIds", "cdecl")
HFFeatureHubGetExistingIds.argtypes = [PHFFeatureHubExistingIds]
HFFeatureHubGetExistingIds.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 987
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1013
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: 1002
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1028
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: 1014
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1040
class struct_HFRGBLivenessConfidence(Structure):
pass
@@ -1836,17 +1876,17 @@ struct_HFRGBLivenessConfidence._fields_ = [
('confidence', HPFloat),
]
-HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1014
+HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1040
-PHFRGBLivenessConfidence = POINTER(struct_HFRGBLivenessConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1014
+PHFRGBLivenessConfidence = POINTER(struct_HFRGBLivenessConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1040
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1026
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1052
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: 1037
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1063
class struct_HFFaceMaskConfidence(Structure):
pass
@@ -1859,17 +1899,17 @@ struct_HFFaceMaskConfidence._fields_ = [
('confidence', HPFloat),
]
-HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1037
+HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1063
-PHFFaceMaskConfidence = POINTER(struct_HFFaceMaskConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1037
+PHFFaceMaskConfidence = POINTER(struct_HFFaceMaskConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1063
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1049
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1075
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: 1060
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1086
class struct_HFFaceQualityConfidence(Structure):
pass
@@ -1882,23 +1922,23 @@ struct_HFFaceQualityConfidence._fields_ = [
('confidence', HPFloat),
]
-HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1060
+HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1086
-PHFFaceQualityConfidence = POINTER(struct_HFFaceQualityConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1060
+PHFFaceQualityConfidence = POINTER(struct_HFFaceQualityConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1086
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1072
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1098
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: 1084
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1110
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: 1095
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1121
class struct_HFFaceInteractionState(Structure):
pass
@@ -1913,17 +1953,17 @@ struct_HFFaceInteractionState._fields_ = [
('rightEyeStatusConfidence', HPFloat),
]
-HFFaceInteractionState = struct_HFFaceInteractionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1095
+HFFaceInteractionState = struct_HFFaceInteractionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1121
-PHFFaceInteractionState = POINTER(struct_HFFaceInteractionState)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1095
+PHFFaceInteractionState = POINTER(struct_HFFaceInteractionState)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1121
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1102
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1128
if _libs[_LIBRARY_FILENAME].has("HFGetFaceInteractionStateResult", "cdecl"):
HFGetFaceInteractionStateResult = _libs[_LIBRARY_FILENAME].get("HFGetFaceInteractionStateResult", "cdecl")
HFGetFaceInteractionStateResult.argtypes = [HFSession, PHFFaceInteractionState]
HFGetFaceInteractionStateResult.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1114
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1140
class struct_HFFaceInteractionsActions(Structure):
pass
@@ -1944,17 +1984,17 @@ struct_HFFaceInteractionsActions._fields_ = [
('blink', HPInt32),
]
-HFFaceInteractionsActions = struct_HFFaceInteractionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1114
+HFFaceInteractionsActions = struct_HFFaceInteractionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1140
-PHFFaceInteractionsActions = POINTER(struct_HFFaceInteractionsActions)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1114
+PHFFaceInteractionsActions = POINTER(struct_HFFaceInteractionsActions)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1140
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1122
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1148
if _libs[_LIBRARY_FILENAME].has("HFGetFaceInteractionActionsResult", "cdecl"):
HFGetFaceInteractionActionsResult = _libs[_LIBRARY_FILENAME].get("HFGetFaceInteractionActionsResult", "cdecl")
HFGetFaceInteractionActionsResult.argtypes = [HFSession, PHFFaceInteractionsActions]
HFGetFaceInteractionActionsResult.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1149
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1175
class struct_HFFaceAttributeResult(Structure):
pass
@@ -1971,17 +2011,40 @@ struct_HFFaceAttributeResult._fields_ = [
('ageBracket', HPInt32),
]
-HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1149
+HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1175
-PHFFaceAttributeResult = POINTER(struct_HFFaceAttributeResult)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1149
+PHFFaceAttributeResult = POINTER(struct_HFFaceAttributeResult)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1175
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1161
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1187
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: 1174
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1202
+class struct_HFFaceEmotionResult(Structure):
+ pass
+
+struct_HFFaceEmotionResult.__slots__ = [
+ 'num',
+ 'emotion',
+]
+struct_HFFaceEmotionResult._fields_ = [
+ ('num', HInt32),
+ ('emotion', HPInt32),
+]
+
+HFFaceEmotionResult = struct_HFFaceEmotionResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1202
+
+PHFFaceEmotionResult = POINTER(struct_HFFaceEmotionResult)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1202
+
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1210
+if _libs[_LIBRARY_FILENAME].has("HFGetFaceEmotionResult", "cdecl"):
+ HFGetFaceEmotionResult = _libs[_LIBRARY_FILENAME].get("HFGetFaceEmotionResult", "cdecl")
+ HFGetFaceEmotionResult.argtypes = [HFSession, PHFFaceEmotionResult]
+ HFGetFaceEmotionResult.restype = HResult
+
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1223
class struct_HFInspireFaceVersion(Structure):
pass
@@ -1996,17 +2059,17 @@ struct_HFInspireFaceVersion._fields_ = [
('patch', c_int),
]
-HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1174
+HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1223
-PHFInspireFaceVersion = POINTER(struct_HFInspireFaceVersion)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1174
+PHFInspireFaceVersion = POINTER(struct_HFInspireFaceVersion)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1223
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1184
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1233
if _libs[_LIBRARY_FILENAME].has("HFQueryInspireFaceVersion", "cdecl"):
HFQueryInspireFaceVersion = _libs[_LIBRARY_FILENAME].get("HFQueryInspireFaceVersion", "cdecl")
HFQueryInspireFaceVersion.argtypes = [PHFInspireFaceVersion]
HFQueryInspireFaceVersion.restype = HResult
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1192
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1241
class struct_HFInspireFaceExtendedInformation(Structure):
pass
@@ -2017,45 +2080,45 @@ struct_HFInspireFaceExtendedInformation._fields_ = [
('information', HChar * int(256)),
]
-HFInspireFaceExtendedInformation = struct_HFInspireFaceExtendedInformation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1192
+HFInspireFaceExtendedInformation = struct_HFInspireFaceExtendedInformation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1241
-PHFInspireFaceExtendedInformation = POINTER(struct_HFInspireFaceExtendedInformation)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1192
+PHFInspireFaceExtendedInformation = POINTER(struct_HFInspireFaceExtendedInformation)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1241
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1199
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1248
if _libs[_LIBRARY_FILENAME].has("HFQueryInspireFaceExtendedInformation", "cdecl"):
HFQueryInspireFaceExtendedInformation = _libs[_LIBRARY_FILENAME].get("HFQueryInspireFaceExtendedInformation", "cdecl")
HFQueryInspireFaceExtendedInformation.argtypes = [PHFInspireFaceExtendedInformation]
HFQueryInspireFaceExtendedInformation.restype = HResult
-enum_HFLogLevel = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1211
+enum_HFLogLevel = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1260
-HF_LOG_NONE = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1211
+HF_LOG_NONE = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1260
-HF_LOG_DEBUG = (HF_LOG_NONE + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1211
+HF_LOG_DEBUG = (HF_LOG_NONE + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1260
-HF_LOG_INFO = (HF_LOG_DEBUG + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1211
+HF_LOG_INFO = (HF_LOG_DEBUG + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1260
-HF_LOG_WARN = (HF_LOG_INFO + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1211
+HF_LOG_WARN = (HF_LOG_INFO + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1260
-HF_LOG_ERROR = (HF_LOG_WARN + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1211
+HF_LOG_ERROR = (HF_LOG_WARN + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1260
-HF_LOG_FATAL = (HF_LOG_ERROR + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1211
+HF_LOG_FATAL = (HF_LOG_ERROR + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1260
-HFLogLevel = enum_HFLogLevel# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1211
+HFLogLevel = enum_HFLogLevel# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1260
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1216
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1265
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: 1221
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1270
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: 1231
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1280
if _libs[_LIBRARY_FILENAME].has("HFLogPrint", "cdecl"):
_func = _libs[_LIBRARY_FILENAME].get("HFLogPrint", "cdecl")
_restype = HResult
@@ -2063,43 +2126,43 @@ if _libs[_LIBRARY_FILENAME].has("HFLogPrint", "cdecl"):
_argtypes = [HFLogLevel, HFormat]
HFLogPrint = _variadic_function(_func,_restype,_argtypes,_errcheck)
-# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1244
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1293
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: 1256
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1305
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: 1271
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1320
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: 1281
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1330
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: 1292
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1341
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: 1302
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1351
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: 1313
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1362
if _libs[_LIBRARY_FILENAME].has("HFDeBugGetUnreleasedStreams", "cdecl"):
HFDeBugGetUnreleasedStreams = _libs[_LIBRARY_FILENAME].get("HFDeBugGetUnreleasedStreams", "cdecl")
HFDeBugGetUnreleasedStreams.argtypes = [POINTER(HFImageStream), HInt32]
@@ -2177,45 +2240,55 @@ try:
except:
pass
-HFImageData = struct_HFImageData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 75
+# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 40
+try:
+ HF_ENABLE_FACE_EMOTION = 0x00000400
+except:
+ pass
-HFImageBitmapData = struct_HFImageBitmapData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 145
+HFImageData = struct_HFImageData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 78
-HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 392
+HFImageBitmapData = struct_HFImageBitmapData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 148
-HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 475
+HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 396
-HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 486
+HFFaceDetectPixelList = struct_HFFaceDetectPixelList# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 434
-HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 501
+HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 493
-HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 661
+HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 504
-HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 763
+HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 519
-HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 792
+HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 687
-HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 801
+HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 789
-HFSimilarityConverterConfig = struct_HFSimilarityConverterConfig# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 861
+HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 818
-HFFeatureHubExistingIds = struct_HFFeatureHubExistingIds# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 962
+HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 827
-HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1014
+HFSimilarityConverterConfig = struct_HFSimilarityConverterConfig# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 887
-HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1037
+HFFeatureHubExistingIds = struct_HFFeatureHubExistingIds# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 988
-HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1060
+HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1040
-HFFaceInteractionState = struct_HFFaceInteractionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1095
+HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1063
-HFFaceInteractionsActions = struct_HFFaceInteractionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1114
+HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1086
-HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1149
+HFFaceInteractionState = struct_HFFaceInteractionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1121
-HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1174
+HFFaceInteractionsActions = struct_HFFaceInteractionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1140
-HFInspireFaceExtendedInformation = struct_HFInspireFaceExtendedInformation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1192
+HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1175
+
+HFFaceEmotionResult = struct_HFFaceEmotionResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1202
+
+HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1223
+
+HFInspireFaceExtendedInformation = struct_HFInspireFaceExtendedInformation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1241
# No inserted files
diff --git a/cpp-package/inspireface/python/inspireface/modules/inspireface.py b/cpp-package/inspireface/python/inspireface/modules/inspireface.py
index f5d2d2e..71d3645 100644
--- a/cpp-package/inspireface/python/inspireface/modules/inspireface.py
+++ b/cpp-package/inspireface/python/inspireface/modules/inspireface.py
@@ -7,6 +7,13 @@ from dataclasses import dataclass
from loguru import logger
from .utils import ResourceManager
+# If True, the latest model will not be verified
+IGNORE_VERIFICATION_OF_THE_LATEST_MODEL = False
+
+def ignore_check_latest_model(ignore: bool):
+ global IGNORE_VERIFICATION_OF_THE_LATEST_MODEL
+ IGNORE_VERIFICATION_OF_THE_LATEST_MODEL = ignore
+
class ImageStream(object):
"""
ImageStream class handles the conversion of image data from various sources into a format compatible with the InspireFace library.
@@ -165,6 +172,10 @@ class FaceExtended:
race: int
gender: int
age_bracket: int
+ emotion: int
+
+ def __repr__(self) -> str:
+ return f"FaceExtended(rgb_liveness_confidence={self.rgb_liveness_confidence}, mask_confidence={self.mask_confidence}, quality_confidence={self.quality_confidence}, left_eye_status_confidence={self.left_eye_status_confidence}, right_eye_status_confidence={self.right_eye_status_confidence}, action_normal={self.action_normal}, action_jaw_open={self.action_jaw_open}, action_shake={self.action_shake}, action_blink={self.action_blink}, action_head_raise={self.action_head_raise}, race={self.race}, gender={self.gender}, age_bracket={self.age_bracket}, emotion={self.emotion})"
class FaceInformation:
@@ -214,6 +225,9 @@ class FaceInformation:
self._token.size = buffer_size
self._token.data = cast(addressof(self.buffer), c_void_p)
+ def __repr__(self) -> str:
+ return f"FaceInformation(track_id={self.track_id}, detection_confidence={self.detection_confidence}, location={self.location}, roll={self.roll}, yaw={self.yaw}, pitch={self.pitch})"
+
@dataclass
class SessionCustomParameter:
@@ -232,6 +246,7 @@ class SessionCustomParameter:
enable_face_attribute: bool = False
enable_face_quality: bool = False
enable_interaction_liveness: bool = False
+ enable_face_emotion: bool = False
def _c_struct(self):
"""
@@ -247,11 +262,15 @@ class SessionCustomParameter:
enable_mask_detect=int(self.enable_mask_detect),
enable_face_attribute=int(self.enable_face_attribute),
enable_face_quality=int(self.enable_face_quality),
- enable_interaction_liveness=int(self.enable_interaction_liveness)
+ enable_interaction_liveness=int(self.enable_interaction_liveness),
+ enable_face_emotion=int(self.enable_face_emotion)
)
return custom_param
+ def __repr__(self) -> str:
+ return f"SessionCustomParameter(enable_recognition={self.enable_recognition}, enable_liveness={self.enable_liveness}, enable_ir_liveness={self.enable_ir_liveness}, enable_mask_detect={self.enable_mask_detect}, enable_face_attribute={self.enable_face_attribute}, enable_face_quality={self.enable_face_quality}, enable_interaction_liveness={self.enable_interaction_liveness}, enable_face_emotion={self.enable_face_emotion})"
+
class InspireFaceSession(object):
"""
@@ -431,6 +450,11 @@ class InspireFaceSession(object):
if ret != 0:
logger.error(f"Set track model detect interval error: {ret}")
+ def set_landmark_augmentation_num(self, num=1):
+ ret = HFSessionSetLandmarkAugmentationNum(self._sess, num)
+ if ret != 0:
+ logger.error(f"Set landmark augmentation num error: {ret}")
+
def face_pipeline(self, image, faces: List[FaceInformation], exec_param) -> List[FaceExtended]:
"""
Processes detected faces to extract additional attributes based on the provided execution parameters.
@@ -461,12 +485,13 @@ class InspireFaceSession(object):
logger.error(f"Face pipeline error: {ret}")
return []
- extends = [FaceExtended(-1.0, -1.0, -1.0, -1.0, -1.0, 0, 0, 0, 0, 0, -1, -1, -1) for _ in range(len(faces))]
+ extends = [FaceExtended(-1.0, -1.0, -1.0, -1.0, -1.0, 0, 0, 0, 0, 0, -1, -1, -1, -1) for _ in range(len(faces))]
self._update_mask_confidence(exec_param, flag, extends)
self._update_rgb_liveness_confidence(exec_param, flag, extends)
self._update_face_quality_confidence(exec_param, flag, extends)
self._update_face_attribute_confidence(exec_param, flag, extends)
self._update_face_interact_confidence(exec_param, flag, extends)
+ self._update_face_emotion_confidence(exec_param, flag, extends)
return extends
@@ -550,6 +575,17 @@ class InspireFaceSession(object):
else:
logger.error(f"Get face action result error: {ret}")
+ def _update_face_emotion_confidence(self, exec_param, flag, extends):
+ if (flag == "object" and exec_param.enable_face_emotion) or (
+ flag == "bitmask" and exec_param & HF_ENABLE_FACE_EMOTION):
+ emotion_results = HFFaceEmotionResult()
+ ret = HFGetFaceEmotionResult(self._sess, PHFFaceEmotionResult(emotion_results))
+ if ret == 0:
+ for i in range(emotion_results.num):
+ extends[i].emotion = emotion_results.emotion[i]
+ else:
+ logger.error(f"Get face emotion result error: {ret}")
+
def _update_rgb_liveness_confidence(self, exec_param, flag, extends: List[FaceExtended]):
if (flag == "object" and exec_param.enable_liveness) or (
flag == "bitmask" and exec_param & HF_ENABLE_LIVENESS):
@@ -639,7 +675,7 @@ def launch(model_name: str = "Pikachu", resource_path: str = None) -> bool:
"""
if resource_path is None:
sm = ResourceManager()
- resource_path = sm.get_model(model_name)
+ resource_path = sm.get_model(model_name, ignore_verification=IGNORE_VERIFICATION_OF_THE_LATEST_MODEL)
path_c = String(bytes(resource_path, encoding="utf8"))
ret = HFLaunchInspireFace(path_c)
if ret != 0:
@@ -651,16 +687,31 @@ def launch(model_name: str = "Pikachu", resource_path: str = None) -> bool:
return False
return True
-
def pull_latest_model(model_name: str = "Pikachu") -> str:
+ """
+ Pulls the latest model from the resource manager.
+
+ Args:
+ model_name (str): the name of the model to use.
+
+ Returns:
+ """
sm = ResourceManager()
resource_path = sm.get_model(model_name, re_download=True)
return resource_path
def reload(model_name: str = "Pikachu", resource_path: str = None) -> bool:
+ """
+ Reloads the InspireFace system with the specified resource directory.
+
+ Args:
+ model_name (str): the name of the model to use.
+ resource_path (str): if None, use the default model path.
+
+ Returns:
+ """
if resource_path is None:
sm = ResourceManager()
- resource_path = sm.get_model(model_name)
path_c = String(bytes(resource_path, encoding="utf8"))
ret = HFReloadInspireFace(path_c)
if ret != 0:
@@ -672,6 +723,20 @@ def reload(model_name: str = "Pikachu", resource_path: str = None) -> bool:
return False
return True
+def terminate() -> bool:
+ """
+ Terminates the InspireFace system.
+
+ Returns:
+ bool: True if the system was successfully terminated, False otherwise.
+
+ Notes:
+ """
+ ret = HFTerminateInspireFace()
+ if ret != 0:
+ logger.error(f"Terminate InspireFace failure: {ret}")
+ return False
+ return True
def query_launch_status() -> bool:
"""
@@ -828,6 +893,9 @@ class FaceIdentity(object):
self.feature = data
self.id = id
+ def __repr__(self) -> str:
+ return f"FaceIdentity(id={self.id}, feature={self.feature})"
+
@staticmethod
def from_ctypes(raw_identity: HFFaceFeatureIdentity):
"""
@@ -906,6 +974,8 @@ class SearchResult:
confidence: float
similar_identity: FaceIdentity
+ def __repr__(self) -> str:
+ return f"SearchResult(confidence={self.confidence}, similar_identity={self.similar_identity})"
def feature_hub_face_search(data: np.ndarray) -> SearchResult:
"""
@@ -1048,6 +1118,20 @@ def feature_hub_get_face_count() -> int:
return int(count.value)
+def feature_hub_get_face_id_list() -> List[int]:
+ """
+ Retrieves a list of face IDs from the feature hub.
+
+ Returns:
+ List[int]: A list of face IDs.
+ """
+ ids = HFFeatureHubExistingIds()
+ ptr = PHFFeatureHubExistingIds(ids)
+ ret = HFFeatureHubGetExistingIds(ptr)
+ if ret != 0:
+ logger.error(f"Failed to get face id list: {ret}")
+ return [int(ids.ids[i]) for i in range(ids.size)]
+
def view_table_in_terminal():
"""
Displays the database table of face identities in the terminal.
@@ -1170,3 +1254,47 @@ def query_expansive_hardware_rockchip_dma_heap_path() -> str:
return None
return str(path.value)
+
+def set_cuda_device_id(device_id: int):
+ """
+ Sets the CUDA device ID.
+ """
+ ret = HFSetCudaDeviceId(device_id)
+ if ret != 0:
+ logger.error(f"Failed to set CUDA device ID: {ret}")
+
+def get_cuda_device_id() -> int:
+ """
+ Gets the CUDA device ID.
+ """
+ id = HInt32()
+ ret = HFGetCudaDeviceId(id)
+ if ret != 0:
+ logger.error(f"Failed to get CUDA device ID: {ret}")
+ return int(id.value)
+
+def print_cuda_device_info():
+ """
+ Prints the CUDA device information.
+ """
+ HFPrintCudaDeviceInfo()
+
+def get_num_cuda_devices() -> int:
+ """
+ Gets the number of CUDA devices.
+ """
+ num = HInt32()
+ ret = HFGetNumCudaDevices(num)
+ if ret != 0:
+ logger.error(f"Failed to get number of CUDA devices: {ret}")
+ return int(num.value)
+
+def check_cuda_device_support() -> bool:
+ """
+ Checks if the CUDA device is supported.
+ """
+ is_support = HInt32()
+ ret = HFCheckCudaDeviceSupport(is_support)
+ if ret != 0:
+ logger.error(f"Failed to check CUDA device support: {ret}")
+ return bool(is_support.value)
diff --git a/cpp-package/inspireface/python/inspireface/modules/utils/resource.py b/cpp-package/inspireface/python/inspireface/modules/utils/resource.py
index 88364d5..dde4acf 100644
--- a/cpp-package/inspireface/python/inspireface/modules/utils/resource.py
+++ b/cpp-package/inspireface/python/inspireface/modules/utils/resource.py
@@ -28,37 +28,38 @@ class ResourceManager:
"Pikachu": {
"url": "https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Pikachu",
"filename": "Pikachu",
- "md5": "f2983a2d884902229c1443fdc921b8e5f49cf2daba8a4f103cd127910dc9e7cd"
+ "md5": "a7ca2d8de26fb1adc1114b437971d841e14afc894fa9869618139da10e0d4357"
},
"Megatron": {
"url": "https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Megatron",
"filename": "Megatron",
- "md5": "28f2284c5e7cf53b0e152ff524a416c966ab21e724002643b1304aedc4af6b06"
+ "md5": "709fddf024d9f34ec034d8ef79a4779e1543b867b05e428c1d4b766f69287050"
},
"Megatron_TRT": {
"url": "https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Megatron_TRT",
"filename": "Megatron_TRT",
- "md5": "25fb4a585b73b0114ff0d64c2bc4071bd005a32a77149b66c474985077dc8f8a"
+ "md5": "bc9123bdc510954b28d703b8ffe6023f469fb81123fd0b0b27fd452dfa369bab"
},
"Gundam_RK356X": {
"url": "https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RK356X",
"filename": "Gundam_RK356X",
- "md5": "69ea23b89851a38c729b32bb0ed33cf62ebd3c891ea5d596afeadeb1f1c79c69"
+ "md5": "0fa12a425337ed98bd82610768a50de71cf93ef42a0929ba06cc94c86f4bd415"
},
"Gundam_RK3588": {
"url": "https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RK3588",
"filename": "Gundam_RK3588",
- "md5": "030965798c5257aef11640657f85b89d82e9d170c3798d0b4f2b62ee6aa245ea"
- },
+ "md5": "66070e8d654408b666a2210bd498a976bbad8b33aef138c623e652f8d956641e"
+ }
}
- def get_model(self, name: str, re_download: bool = False) -> str:
+ def get_model(self, name: str, re_download: bool = False, ignore_verification: bool = False) -> str:
"""
Get model path. Download if not exists or re_download is True.
Args:
name: Model name
re_download: Force re-download if True
+ ignore_verification: Skip model hash verification if True
Returns:
str: Full path to model file
@@ -72,6 +73,10 @@ class ResourceManager:
# Check if model exists and is complete
if model_file.exists() and not downloading_flag.exists() and not re_download:
+ if ignore_verification:
+ print(f"Warning: Model verification skipped for '{name}' as requested.")
+ return str(model_file)
+
current_hash = get_file_hash_sha256(model_file)
if current_hash == model_info["md5"]:
return str(model_file)
diff --git a/cpp-package/inspireface/python/inspireface/param.py b/cpp-package/inspireface/python/inspireface/param.py
index 0337fd1..7ed5fdf 100644
--- a/cpp-package/inspireface/python/inspireface/param.py
+++ b/cpp-package/inspireface/python/inspireface/param.py
@@ -2,7 +2,7 @@
# Session option
from inspireface.modules.core.native import HF_ENABLE_NONE, HF_ENABLE_FACE_RECOGNITION, HF_ENABLE_LIVENESS, HF_ENABLE_IR_LIVENESS, \
- HF_ENABLE_MASK_DETECT, HF_ENABLE_FACE_ATTRIBUTE, HF_ENABLE_QUALITY, HF_ENABLE_INTERACTION, HF_ENABLE_FACE_POSE, HF_PK_AUTO_INCREMENT, HF_PK_MANUAL_INPUT, \
+ HF_ENABLE_MASK_DETECT, HF_ENABLE_FACE_ATTRIBUTE, HF_ENABLE_QUALITY, HF_ENABLE_INTERACTION, HF_ENABLE_FACE_POSE, HF_ENABLE_FACE_EMOTION, HF_PK_AUTO_INCREMENT, HF_PK_MANUAL_INPUT, \
HF_LANDMARK_HYPLMV2_0_25, HF_LANDMARK_HYPLMV2_0_50, HF_LANDMARK_INSIGHTFACE_2D106_TRACK
# Face track mode
diff --git a/cpp-package/inspireface/python/sample_face_detection.py b/cpp-package/inspireface/python/sample_face_detection.py
index 418ab09..adcb140 100644
--- a/cpp-package/inspireface/python/sample_face_detection.py
+++ b/cpp-package/inspireface/python/sample_face_detection.py
@@ -10,6 +10,7 @@ age_bracket_tags = [
"0-2 years old", "3-9 years old", "10-19 years old", "20-29 years old", "30-39 years old",
"40-49 years old", "50-59 years old", "60-69 years old", "more than 70 years old"
]
+emotion_tags = ["Neutral", "Happy", "Sad", "Surprise", "Fear", "Disgust", "Anger"]
@click.command()
@click.argument('image_path')
@@ -20,10 +21,9 @@ def case_face_detection_image(image_path, show):
It also includes pipeline extensions such as RGB liveness, mask detection, and face quality evaluation.
"""
opt = isf.HF_ENABLE_FACE_RECOGNITION | isf.HF_ENABLE_QUALITY | isf.HF_ENABLE_MASK_DETECT | \
- isf.HF_ENABLE_LIVENESS | isf.HF_ENABLE_INTERACTION | isf.HF_ENABLE_FACE_ATTRIBUTE
+ isf.HF_ENABLE_LIVENESS | isf.HF_ENABLE_INTERACTION | isf.HF_ENABLE_FACE_ATTRIBUTE | isf.HF_ENABLE_FACE_EMOTION
session = isf.InspireFaceSession(opt, isf.HF_DETECT_MODE_ALWAYS_DETECT)
session.set_detection_confidence_threshold(0.5)
-
# Load image
image = cv2.imread(image_path)
assert image is not None, "Please check that the image path is correct."
@@ -37,6 +37,7 @@ def case_face_detection_image(image_path, show):
# Detect faces
faces = session.face_detection(image)
+ print(faces)
print(f"face detection: {len(faces)} found")
draw = image.copy()
@@ -67,9 +68,9 @@ def case_face_detection_image(image_path, show):
# Execute extended functions (optional modules)
select_exec_func = isf.HF_ENABLE_QUALITY | isf.HF_ENABLE_MASK_DETECT | \
- isf.HF_ENABLE_LIVENESS | isf.HF_ENABLE_INTERACTION | isf.HF_ENABLE_FACE_ATTRIBUTE
+ isf.HF_ENABLE_LIVENESS | isf.HF_ENABLE_INTERACTION | isf.HF_ENABLE_FACE_ATTRIBUTE | isf.HF_ENABLE_FACE_EMOTION
extends = session.face_pipeline(image, faces, select_exec_func)
-
+ print(extends)
for idx, ext in enumerate(extends):
print(f"{'==' * 20}")
print(f"idx: {idx}")
@@ -80,6 +81,7 @@ def case_face_detection_image(image_path, show):
print(f"gender: {gender_tags[ext.gender]}")
print(f"race: {race_tags[ext.race]}")
print(f"age: {age_bracket_tags[ext.age_bracket]}")
+ print(f"emotion: {emotion_tags[ext.emotion]}")
# Save the annotated image
save_path = os.path.join("tmp", "det.jpg")
diff --git a/cpp-package/inspireface/python/sample_face_track_from_video.py b/cpp-package/inspireface/python/sample_face_track_from_video.py
index 4bb78d4..a55033b 100644
--- a/cpp-package/inspireface/python/sample_face_track_from_video.py
+++ b/cpp-package/inspireface/python/sample_face_track_from_video.py
@@ -50,12 +50,11 @@ def case_face_tracker_from_video(source, show, out):
"""
# Optional features, loaded during session creation based on the modules specified.
opt = isf.HF_ENABLE_NONE | isf.HF_ENABLE_INTERACTION
- session = isf.InspireFaceSession(opt, isf.HF_DETECT_MODE_LIGHT_TRACK, max_detect_num=25, detect_pixel_level=160) # Use video mode
+ session = isf.InspireFaceSession(opt, isf.HF_DETECT_MODE_LIGHT_TRACK, max_detect_num=25, detect_pixel_level=320) # Use video mode
session.set_track_mode_smooth_ratio(0.06)
session.set_track_mode_num_smooth_cache_frame(15)
session.set_filter_minimum_face_pixel_size(0)
session.set_track_model_detect_interval(0)
- session.set_landmark_augmentation_num(1)
session.set_enable_track_cost_spend(True)
# Determine if the source is a digital webcam index or a video file path.
try:
diff --git a/cpp-package/inspireface/python/sample_feature_hub.py b/cpp-package/inspireface/python/sample_feature_hub.py
index 2ffe502..970f9c9 100644
--- a/cpp-package/inspireface/python/sample_feature_hub.py
+++ b/cpp-package/inspireface/python/sample_feature_hub.py
@@ -11,7 +11,7 @@ def case_feature_hub():
db_path = "test.db"
# Configure the feature management system.
feature_hub_config = isf.FeatureHubConfiguration(
- primary_key_mode=isf.HF_PK_MANUAL_INPUT,
+ primary_key_mode=isf.HF_PK_AUTO_INCREMENT,
enable_persistence=True,
persistence_db_path=db_path,
search_threshold=0.48,
@@ -23,14 +23,15 @@ def case_feature_hub():
for i in range(10):
v = np.random.rand(512).astype(np.float32)
feature = isf.FaceIdentity(v, i)
- ret, new_id = isf.feature_hub_face_insert(feature)
+ ret, _ = isf.feature_hub_face_insert(feature)
assert ret, "Failed to insert face feature data into FeatureHub."
- assert new_id == i, "Failed to get the correct new id."
feature = isf.FaceIdentity(gen, -1)
isf.feature_hub_face_insert(feature)
result = isf.feature_hub_face_search(gen)
print(f"result: {result}")
assert os.path.exists(db_path), "FeatureHub database file not found."
+ ids = isf.feature_hub_get_face_id_list()
+ print(f"ids: {ids}")
diff --git a/cpp-package/inspireface/test_res/data/emotion/anger.png b/cpp-package/inspireface/test_res/data/emotion/anger.png
new file mode 100644
index 0000000..f8c3136
Binary files /dev/null and b/cpp-package/inspireface/test_res/data/emotion/anger.png differ
diff --git a/cpp-package/inspireface/test_res/data/emotion/happy.png b/cpp-package/inspireface/test_res/data/emotion/happy.png
new file mode 100644
index 0000000..665149d
Binary files /dev/null and b/cpp-package/inspireface/test_res/data/emotion/happy.png differ
diff --git a/cpp-package/inspireface/test_res/data/emotion/sad.png b/cpp-package/inspireface/test_res/data/emotion/sad.png
new file mode 100644
index 0000000..b66ca16
Binary files /dev/null and b/cpp-package/inspireface/test_res/data/emotion/sad.png differ
diff --git a/cpp-package/inspireface/tools/generate_release_models_info.py b/cpp-package/inspireface/tools/generate_release_models_info.py
index 805556f..7d8a947 100644
--- a/cpp-package/inspireface/tools/generate_release_models_info.py
+++ b/cpp-package/inspireface/tools/generate_release_models_info.py
@@ -6,6 +6,9 @@ import click
need_models = [
"Pikachu",
"Megatron",
+ "Megatron_TRT",
+ "Gundam_RK356X",
+ "Gundam_RK3588",
]
def get_file_hash_sha256(file_path):