diff --git a/.github/workflows/build_sdks.yaml b/.github/workflows/build_sdks.yaml index 98422897..338ba7ee 100644 --- a/.github/workflows/build_sdks.yaml +++ b/.github/workflows/build_sdks.yaml @@ -299,4 +299,41 @@ jobs: - name: Execute Docker Compose run: | docker-compose up build-manylinux2014-x86 + ls build + + build_armv7_rv1106_armhf_uclibc: + name: Compile Linux-armv7 rv1106 + runs-on: ubuntu-latest + + steps: + # Step 1: Checkout the repository + - name: Checkout Repository + uses: actions/checkout@v4 + + # Step 2: Synchronize and update submodules recursively + - name: Update submodules + run: | + git clone --recurse-submodules https://github.com/tunmx/inspireface-3rdparty.git 3rdparty + + # Step 3: Install wget and xz-utils + - name: Install wget and xz-utils + run: | + sudo apt-get update + sudo apt-get install -y wget xz-utils + + # Step 4: Download Toolchain + - name: Download and Extract Linaro Toolchain + run: | + git clone https://github.com/tunmx/arm-rockchip830-linux-uclibcgnueabihf.git + + # Step 5: Install Toolchain + - name: Set environment variables + run: | + echo "ARM_CROSS_COMPILE_TOOLCHAIN=${{ github.workspace }}/arm-rockchip830-linux-uclibcgnueabihf" >> $GITHUB_ENV + echo "PATH=${{ github.workspace }}/arm-rockchip830-linux-uclibcgnueabihf/bin:${PATH}" >> $GITHUB_ENV + + # Step 6: Start building the SDK + - name: Start Building the InspireFace-Linux-armv7-rv1106 + run: | + bash command/build_cross_rv1106_armhf_uclibc.sh ls build \ No newline at end of file diff --git a/.github/workflows/release-sdks.yaml b/.github/workflows/release-sdks.yaml index daee7e88..5732b336 100644 --- a/.github/workflows/release-sdks.yaml +++ b/.github/workflows/release-sdks.yaml @@ -376,10 +376,57 @@ jobs: zip -r inspireface-linux-x86-manylinux2014-${{ env.VERSION }}.zip build/inspireface-linux-x86-manylinux2014-${{ env.VERSION }} stat inspireface-linux-x86-manylinux2014-${{ env.VERSION }}.zip + build_armv7_rv1106_armhf_uclibc: + name: Compile Linux-armv7 rv1106 + runs-on: ubuntu-latest + + steps: + # Step 1: Checkout the repository + - name: Checkout Repository + uses: actions/checkout@v4 + + # Step 2: Extract the version number from the tag (e.g., "v1.2.3" becomes "1.2.3") + - name: Extract Version Number + id: extract_version + run: echo "VERSION=$(echo ${GITHUB_REF#refs/tags/} | sed 's/^v//')" >> $GITHUB_ENV + + # Step 3: Synchronize and update submodules recursively + - name: Update submodules + run: | + git clone --recurse-submodules https://github.com/tunmx/inspireface-3rdparty.git 3rdparty + + # Step 4: Install wget and xz-utils + - name: Install wget and xz-utils + run: | + sudo apt-get update + sudo apt-get install -y wget xz-utils + + # Step 5: Download Toolchain + - name: Download and Extract Linaro Toolchain + run: | + git clone https://github.com/tunmx/arm-rockchip830-linux-uclibcgnueabihf.git + + # Step 6: Install Toolchain + - name: Set environment variables + run: | + echo "ARM_CROSS_COMPILE_TOOLCHAIN=${{ github.workspace }}/arm-rockchip830-linux-uclibcgnueabihf" >> $GITHUB_ENV + echo "PATH=${{ github.workspace }}/arm-rockchip830-linux-uclibcgnueabihf/bin:${PATH}" >> $GITHUB_ENV + + # Step 7: Start building the SDK + - name: Start Building the InspireFace-Linux-armv7-rv1106 + run: | + bash command/build_cross_rv1106_armhf_uclibc.sh + ls build + + # Step 8: Zip SDK directory + - name: Zip SDK directory + run: | + zip -r inspireface-linux-armv7-rv1106-armhf-uclibc-${{ env.VERSION }}.zip build/inspireface-linux-armv7-rv1106-armhf-uclibc-${{ env.VERSION }} + stat inspireface-linux-armv7-rv1106-armhf-uclibc-${{ env.VERSION }}.zip release: name: Release SDKs to GitHub - needs: [ build_linux_x86, build_armv7_armhf, build_armv7_rv1109rv1126_armhf, build_linux_aarch64, build_android, build_ios, build_manylinux2014_x86] + needs: [ build_linux_x86, build_armv7_armhf, build_armv7_rv1109rv1126_armhf, build_linux_aarch64, build_android, build_ios, build_manylinux2014_x86, build_armv7_rv1106_armhf_uclibc] runs-on: ubuntu-latest steps: @@ -407,10 +454,11 @@ jobs: uses: softprops/action-gh-release@v1 with: files: | + sdk_artifacts/sdk_files_manylinux2014_x86/inspireface-linux-x86-manylinux2014-${{ env.VERSION }}.zip sdk_artifacts/sdk_files_linux_x86/inspireface-linux-x86-ubuntu18-${{ env.VERSION }}.zip sdk_artifacts/sdk_files_armv7_armhf/inspireface-linux-armv7-armhf-${{ env.VERSION }}.zip sdk_artifacts/sdk_files_armv7_rv1109rv1126_armhf/inspireface-linux-armv7-rv1109rv1126-armhf-${{ env.VERSION }}.zip + sdk_artifacts/sdk_files_armv7_rv1106_armhf_uclibc/inspireface-linux-armv7-rv1106-armhf-uclibc-${{ env.VERSION }}.zip sdk_artifacts/sdk_files_linux_aarch64/inspireface-linux-aarch64-${{ env.VERSION }}.zip sdk_artifacts/sdk_files_android/inspireface-android-${{ env.VERSION }}.zip - sdk_artifacts/sdk_files_ios/inspireface-ios-${{ env.VERSION }}.zip - sdk_artifacts/sdk_files_manylinux2014_x86/inspireface-linux-x86-manylinux2014-${{ env.VERSION }}.zip + sdk_artifacts/sdk_files_ios/inspireface-ios-${{ env.VERSION }}.zip \ No newline at end of file diff --git a/README.md b/README.md index 4c845a60..59cc0c44 100644 --- a/README.md +++ b/README.md @@ -58,10 +58,6 @@ After installation, you can use inspireface like this: import cv2 import inspireface as isf -# Global launching and automatic downloading of resource files -ret = isf.launch() -assert ret, "Launch failure. Please ensure the resource path is correct." - # Create a session with optional features opt = isf.HF_ENABLE_NONE session = isf.InspireFaceSession(opt, isf.HF_DETECT_MODE_IMAGE) @@ -128,10 +124,17 @@ You can download the model package files containing models and configurations ne You can use the **command/download_models_general.sh** command to download resource files, which will be downloaded to the **test_res/pack** directory. This way, when running the Test program, it can access and read the resource files from this path by default. ```bash -# Download lightweight resource files +# Download lightweight resource files for mobile device bash command/download_models_general.sh Pikachu -# Download resource files for PC/server +# Download resource files for mobile device or PC/server bash command/download_models_general.sh Megatron +# Download resource files for RV1109 +bash command/download_models_general.sh Gundam_RV1109 +# Download resource files for RV1106 +bash command/download_models_general.sh Gundam_RV1106 + +# Download all model files +bash command/download_models_general.sh ``` ### Installing OpenCV(Optional) @@ -186,14 +189,14 @@ inspireface-linux - **inspireface.h**:Header file definition. - **herror.h**:Reference error number definition. ### Cross Compilation -Cross compilation requires you to prepare the target platform's cross-compilation toolchain on the host machine in advance. Here, compiling for Rockchip's embedded devices RV1109/RV1126 is used as an example: +Cross compilation requires you to prepare the target platform's cross-compilation toolchain on the host machine in advance. Here, compiling for Rockchip's embedded devices RV1106 is used as an example: ```bash # Set the path for the cross-compilation toolchain -export ARM_CROSS_COMPILE_TOOLCHAIN=YOUR_DIR/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf -# Execute the cross-compilation script for RV1109/RV1126 -bash command/build_cross_rv1109rv1126_armhf.sh +export ARM_CROSS_COMPILE_TOOLCHAIN=YOUR_DIR/arm-rockchip830-linux-uclibcgnueabihf +# Execute the cross-compilation script for RV1106 +bash command/build_cross_rv1106_armhf_uclibc.sh ``` -After the compilation is complete, you can find the compiled results in the `build/inspireface-linux-armv7-rv1109rv1126-armhf` directory. +After the compilation is complete, you can find the compiled results in the `build/inspireface-linux-armv7-rv1106-armhf-uclibc` directory. ### iOS Compilation @@ -225,7 +228,7 @@ We have completed the adaptation and testing of the software across various oper | 2 | | ARMv8 | - | [![build](https://img.shields.io/github/actions/workflow/status/HyperInspire/InspireFace/release-sdks.yaml?&style=for-the-badge&label=build)](https://github.com/HyperInspire/InspireFace/actions/workflows/release-sdks.yaml) | ![test](https://img.shields.io/badge/OFFLINE-PASSING-blue?style=for-the-badge) | | 3 | | x86/x86_64 | - | [![build](https://img.shields.io/github/actions/workflow/status/HyperInspire/InspireFace/release-sdks.yaml?&style=for-the-badge&label=build)](https://github.com/HyperInspire/InspireFace/actions/workflows/release-sdks.yaml) | [![test](https://img.shields.io/github/actions/workflow/status/HyperInspire/InspireFace/test_ubuntu_x86_Pikachu.yaml?style=for-the-badge&label=Test&color=blue)](https://github.com/HyperInspire/InspireFace/actions/workflows/test_ubuntu_x86_Pikachu.yaml) | | 4 | **Linux-Rockchip** | ARMv7 | RV1109RV1126 | [![build](https://img.shields.io/github/actions/workflow/status/HyperInspire/InspireFace/release-sdks.yaml?&style=for-the-badge&label=build)](https://github.com/HyperInspire/InspireFace/actions/workflows/release-sdks.yaml) | ![test](https://img.shields.io/badge/OFFLINE-PASSING-blue?style=for-the-badge) | -| 5 | | ARMv7 | RV1106 | ![build](https://img.shields.io/badge/build-developing-yellow?style=for-the-badge) || +| 5 | | ARMv7 | RV1106 | [![build](https://img.shields.io/github/actions/workflow/status/HyperInspire/InspireFace/release-sdks.yaml?&style=for-the-badge&label=build)](https://github.com/HyperInspire/InspireFace/actions/workflows/release-sdks.yaml) |![test](https://img.shields.io/badge/OFFLINE-PASSING-blue?style=for-the-badge)| | 6 | | ARMv8 | RK3566/RK3568 | ![build](https://img.shields.io/badge/build-developing-yellow?style=for-the-badge) | | | 7 | | ARMv8 | RK3588 | ![build](https://img.shields.io/badge/build-developing-yellow?style=for-the-badge) | | | 8 | **Linux-CUDA** | x86/x86_64 | NVIDIA-GPU | ![build](https://img.shields.io/badge/OFFLINE-PASSING-green?style=for-the-badge) | ![test](https://img.shields.io/badge/OFFLINE-PASSING-blue?style=for-the-badge) | @@ -252,6 +255,9 @@ docker-compose up build-cross-armv7-armhf # Build armv7 with support RV1109RV1126 device NPU cross-complie docker-compose up build-cross-rv1109rv1126-armhf +# Build armv7 with support RV1106 device NPU cross-complie +docker-compose up build-cross-rv1106-armhf-uclibc + # Build Android with support arm64-v8a and armeabi-v7a docker-compose up build-cross-android @@ -374,8 +380,8 @@ Import inspireface for a quick facial detection example: import cv2 import inspireface as isf -# Step 1: Initialize the SDK and downloading resource files. -ret = isf.launch() +# Step 1: Initialize the SDK globally (only needs to be called once per application) +ret = isf.reload() assert ret, "Launch failure. Please ensure the resource path is correct." # Optional features, loaded during session creation based on the modules specified. @@ -524,6 +530,7 @@ For different scenarios, we currently provide several Packs, each containing mul | Pikachu | CPU | Lightweight edge-side models | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Pikachu) | | Megatron | CPU, GPU | Mobile and server models | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Megatron) | | Gundam-RV1109 | RKNPU | Supports RK1109 and RK1126 | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RV1109) | +| Gundam-RV1106 | RKNPU | Supports RK1106(RV1103 may be supported, but not verified) | [Download](https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RV1106) | ## Acknowledgement @@ -531,6 +538,8 @@ InspireFace is built on the following libraries: - [MNN](https://github.com/alibaba/MNN) - [RKNN](https://github.com/rockchip-linux/rknn-toolkit) +- [RKNN2](https://github.com/airockchip/rknn-toolkit2.git) +- [librga](https://github.com/airockchip/librga.git) - [Eigen](https://eigen.tuxfamily.org/index.php?title=Main_Page) - [sqlite](https://www.sqlite.org/index.html) - [sqlite-vec](https://github.com/asg017/sqlite-vec) diff --git a/command/build_cross_rv1106_armhf_uclibc.sh b/command/build_cross_rv1106_armhf_uclibc.sh index 2d6b9ccb..e1eaacbf 100644 --- a/command/build_cross_rv1106_armhf_uclibc.sh +++ b/command/build_cross_rv1106_armhf_uclibc.sh @@ -101,6 +101,6 @@ cmake -DCMAKE_SYSTEM_NAME=Linux \ -DISF_BUILD_SHARED_LIBS=ON ${SCRIPT_DIR} make -j4 -# make install +make install -# move_install_files "$(pwd)" \ No newline at end of file +move_install_files "$(pwd)" \ No newline at end of file diff --git a/command/download_models_general.sh b/command/download_models_general.sh index 17829c61..127965e7 100644 --- a/command/download_models_general.sh +++ b/command/download_models_general.sh @@ -6,6 +6,8 @@ DOWNLOAD_DIR="test_res/pack" # File URLs URL1="https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Megatron" URL2="https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Pikachu" +URL3="https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RV1109" +URL4="https://github.com/HyperInspire/InspireFace/releases/download/v1.x/Gundam_RV1106" # Color codes YELLOW='\033[1;33m' @@ -39,43 +41,42 @@ if [ $# -eq 0 ]; then echo "No argument provided, downloading all files..." download_file "$URL1" download_file "$URL2" - # Check both files - if [ -f "$DOWNLOAD_DIR/Megatron" ] && [ -f "$DOWNLOAD_DIR/Pikachu" ]; then + download_file "$URL3" + download_file "$URL4" + # Check all files + if [ -f "$DOWNLOAD_DIR/Megatron" ] && [ -f "$DOWNLOAD_DIR/Pikachu" ] && \ + [ -f "$DOWNLOAD_DIR/Gundam_RV1109" ] && [ -f "$DOWNLOAD_DIR/Gundam_RV1106" ]; then echo "All downloads completed successfully!" print_file_path "Megatron" print_file_path "Pikachu" + print_file_path "Gundam_RV1109" + print_file_path "Gundam_RV1106" else echo "Download failed!" exit 1 fi else case "$1" in - "Megatron") - echo "Downloading Megatron..." - download_file "$URL1" - # Check Megatron file - if [ -f "$DOWNLOAD_DIR/Megatron" ]; then - echo "Megatron download completed successfully!" - print_file_path "Megatron" + "Megatron"|"Pikachu"|"Gundam_RV1109"|"Gundam_RV1106") + echo "Downloading $1..." + case "$1" in + "Megatron") url="$URL1" ;; + "Pikachu") url="$URL2" ;; + "Gundam_RV1109") url="$URL3" ;; + "Gundam_RV1106") url="$URL4" ;; + esac + download_file "$url" + # Check file + if [ -f "$DOWNLOAD_DIR/$1" ]; then + echo "$1 download completed successfully!" + print_file_path "$1" else - echo "Megatron download failed!" - exit 1 - fi - ;; - "Pikachu") - echo "Downloading Pikachu..." - download_file "$URL2" - # Check Pikachu file - if [ -f "$DOWNLOAD_DIR/Pikachu" ]; then - echo "Pikachu download completed successfully!" - print_file_path "Pikachu" - else - echo "Pikachu download failed!" + echo "$1 download failed!" exit 1 fi ;; *) - echo "Invalid argument. Please use 'Megatron' or 'Pikachu'" + echo "Invalid argument. Please use 'Megatron', 'Pikachu', 'Gundam_RV1109' or 'Gundam_RV1106'" exit 1 ;; esac diff --git a/cpp/inspireface/c_api/inspireface.cc b/cpp/inspireface/c_api/inspireface.cc index b499d2c8..e901a011 100644 --- a/cpp/inspireface/c_api/inspireface.cc +++ b/cpp/inspireface/c_api/inspireface.cc @@ -339,11 +339,21 @@ HResult HFLaunchInspireFace(HPath resourcePath) { return INSPIRE_LAUNCH->Load(resourcePath); } +HResult HFReloadInspireFace(HPath resourcePath) { + std::string path(resourcePath); + return INSPIRE_LAUNCH->Reload(resourcePath); +} + HResult HFTerminateInspireFace() { INSPIRE_LAUNCH->Unload(); return HSUCCEED; } +HResult HFQueryInspireFaceLaunchStatus(HInt32 *status) { + *status = INSPIRE_LAUNCH->isMLoad(); + return HSUCCEED; +} + HResult HFFeatureHubDataDisable() { return FEATURE_HUB_DB->DisableHub(); } diff --git a/cpp/inspireface/c_api/inspireface.h b/cpp/inspireface/c_api/inspireface.h index 0f1d736a..83c33b37 100644 --- a/cpp/inspireface/c_api/inspireface.h +++ b/cpp/inspireface/c_api/inspireface.h @@ -213,6 +213,14 @@ HYPER_CAPI_EXPORT extern HResult HFImageBitmapShow(HFImageBitmap handle, HString * */ HYPER_CAPI_EXPORT extern HResult HFLaunchInspireFace(HPath resourcePath); +/** + * @brief Reload InspireFace SDK + * Reload the InspireFace SDK, releasing all allocated resources. + * @param resourcePath Initializes the path to the resource file that needs to be loaded + * @return HResult indicating the success or failure of the operation. + * */ +HYPER_CAPI_EXPORT extern HResult HFReloadInspireFace(HPath resourcePath); + /** * @brief Terminate InspireFace SDK * Terminate the InspireFace SDK, releasing all allocated resources. @@ -221,6 +229,14 @@ HYPER_CAPI_EXPORT extern HResult HFLaunchInspireFace(HPath resourcePath); * */ HYPER_CAPI_EXPORT extern HResult HFTerminateInspireFace(); +/** + * @brief Query InspireFace SDK launch status + * Query the launch status of the InspireFace SDK. + * @param status Pointer to the status variable that will be returned. + * @return HResult indicating the success or failure of the operation. + * */ +HYPER_CAPI_EXPORT extern HResult HFQueryInspireFaceLaunchStatus(HInt32 *status); + /************************************************************************ * FaceSession ************************************************************************/ diff --git a/cpp/inspireface/initialization_module/launch.cpp b/cpp/inspireface/initialization_module/launch.cpp index ea5a9736..9a744a35 100644 --- a/cpp/inspireface/initialization_module/launch.cpp +++ b/cpp/inspireface/initialization_module/launch.cpp @@ -13,7 +13,11 @@ std::mutex Launch::mutex_; std::shared_ptr Launch::instance_ = nullptr; InspireArchive& Launch::getMArchive() { - return m_archive_; + std::lock_guard lock(mutex_); + if (!m_archive_) { + throw std::runtime_error("Archive not initialized"); + } + return *m_archive_; } std::shared_ptr Launch::GetInstance() { @@ -25,12 +29,24 @@ std::shared_ptr Launch::GetInstance() { } int32_t Launch::Load(const std::string& path) { + std::lock_guard lock(mutex_); if (!m_load_) { - m_archive_.ReLoad(path); - if (m_archive_.QueryStatus() == SARC_SUCCESS) { - m_load_ = true; - return HSUCCEED; - } else { + try { + m_archive_ = std::make_unique(); + m_archive_->ReLoad(path); + + if (m_archive_->QueryStatus() == SARC_SUCCESS) { + m_load_ = true; + INSPIRE_LOGI("Successfully loaded resources"); + return HSUCCEED; + } else { + m_archive_.reset(); + INSPIRE_LOGE("Failed to load resources"); + return HERR_ARCHIVE_LOAD_MODEL_FAILURE; + } + } catch (const std::exception& e) { + m_archive_.reset(); + INSPIRE_LOGE("Exception during resource loading: %s", e.what()); return HERR_ARCHIVE_LOAD_MODEL_FAILURE; } } else { @@ -39,6 +55,35 @@ int32_t Launch::Load(const std::string& path) { } } +int32_t Launch::Reload(const std::string& path) { + std::lock_guard lock(mutex_); + try { + // Clean up existing archive if it exists + if (m_archive_) { + m_archive_.reset(); + m_load_ = false; + } + + // Create and load new archive + m_archive_ = std::make_unique(); + m_archive_->ReLoad(path); + + if (m_archive_->QueryStatus() == SARC_SUCCESS) { + m_load_ = true; + INSPIRE_LOGI("Successfully reloaded resources"); + return HSUCCEED; + } else { + m_archive_.reset(); + INSPIRE_LOGE("Failed to reload resources"); + return HERR_ARCHIVE_LOAD_MODEL_FAILURE; + } + } catch (const std::exception& e) { + m_archive_.reset(); + INSPIRE_LOGE("Exception during resource reloading: %s", e.what()); + return HERR_ARCHIVE_LOAD_MODEL_FAILURE; + } +} + bool Launch::isMLoad() const { return m_load_; } @@ -46,8 +91,7 @@ bool Launch::isMLoad() const { void Launch::Unload() { std::lock_guard lock(mutex_); if (m_load_) { - // Assuming InspireArchive has a method to clear its resources - m_archive_.Release(); + m_archive_.reset(); m_load_ = false; INSPIRE_LOGI("All resources have been successfully unloaded and system is reset."); } else { diff --git a/cpp/inspireface/initialization_module/launch.h b/cpp/inspireface/initialization_module/launch.h index f48edbcf..d70b8ed9 100644 --- a/cpp/inspireface/initialization_module/launch.h +++ b/cpp/inspireface/initialization_module/launch.h @@ -30,6 +30,10 @@ class INSPIRE_API Launch { // Returns an integer status code: 0 on success, non-zero on failure. int32_t Load(const std::string& path); + // Reloads the resources from a specified path. + // Returns an integer status code: 0 on success, non-zero on failure. + int32_t Reload(const std::string& path); + // Provides access to the loaded InspireArchive instance. InspireArchive& getMArchive(); @@ -40,13 +44,13 @@ class INSPIRE_API Launch { void Unload(); private: - Launch() : m_load_(false) {} ///< Private constructor for the singleton pattern. + Launch() : m_load_(false), m_archive_(nullptr) {} ///< Private constructor for the singleton pattern. static std::mutex mutex_; ///< Mutex for synchronizing access to the singleton instance. static std::shared_ptr instance_; ///< The singleton instance of Launch. - InspireArchive m_archive_; ///< The archive containing all necessary resources. - bool m_load_; ///< Flag indicating whether the resources have been successfully loaded. + std::unique_ptr m_archive_; ///< The archive containing all necessary resources. + bool m_load_; ///< Flag indicating whether the resources have been successfully loaded. }; } // namespace inspire diff --git a/cpp/inspireface/middleware/nexus_processor/image_processor.h b/cpp/inspireface/middleware/nexus_processor/image_processor.h index 7296b8d7..6deff3e1 100644 --- a/cpp/inspireface/middleware/nexus_processor/image_processor.h +++ b/cpp/inspireface/middleware/nexus_processor/image_processor.h @@ -10,6 +10,19 @@ namespace inspire { namespace nexus { +/** + * @brief Extensible image processing interface that supports hardware acceleration backends + * + * This interface provides common image processing operations like resize, color conversion, + * padding etc. It can be implemented by different backends based on compile options: + * - Default CPU-based implementation using InspireCV (always available) + * - Hardware accelerated implementation like Rockchip RGA (enabled with ISF_ENABLE_RGA) + * - Other potential hardware acceleration backends can be enabled via corresponding compile flags + * + * The backend implementation is selected at compile time based on which acceleration options + * are enabled. Only one backend will be active at runtime. + */ + class ImageProcessor { public: static std::unique_ptr Create(); diff --git a/cpp/inspireface/pipeline_module/face_pipeline_module.cpp b/cpp/inspireface/pipeline_module/face_pipeline_module.cpp index 9d58986e..f9f3779a 100644 --- a/cpp/inspireface/pipeline_module/face_pipeline_module.cpp +++ b/cpp/inspireface/pipeline_module/face_pipeline_module.cpp @@ -78,7 +78,6 @@ int32_t FacePipelineModule::Process(inspirecv::InspireImageProcess &processor, c inspirecv::Image scaleImage; switch (proc) { case PROCESS_MASK: { - std::cout << "Process mask" << std::endl; if (m_mask_predict_ == nullptr) { return HERR_SESS_PIPELINE_FAILURE; // uninitialized } @@ -95,7 +94,6 @@ int32_t FacePipelineModule::Process(inspirecv::InspireImageProcess &processor, c break; } case PROCESS_RGB_LIVENESS: { - std::cout << "Process rgb liveness" << std::endl; if (m_rgb_anti_spoofing_ == nullptr) { return HERR_SESS_PIPELINE_FAILURE; // uninitialized } @@ -112,7 +110,6 @@ int32_t FacePipelineModule::Process(inspirecv::InspireImageProcess &processor, c break; } case PROCESS_INTERACTION: { - std::cout << "Process interaction" << std::endl; if (m_blink_predict_ == nullptr) { return HERR_SESS_PIPELINE_FAILURE; // uninitialized } diff --git a/cpp/sample/CMakeLists.txt b/cpp/sample/CMakeLists.txt index b0cd3fc5..170785bb 100644 --- a/cpp/sample/CMakeLists.txt +++ b/cpp/sample/CMakeLists.txt @@ -39,6 +39,12 @@ set_target_properties(FaceFeatureHubSample PROPERTIES ) +add_executable(FaceLoadReloadSample api/sample_load_reload.cpp) +target_link_libraries(FaceLoadReloadSample InspireFace ${ext}) +set_target_properties(FaceLoadReloadSample PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/sample/" +) + add_executable(FaceTrackerSample source/tracker_sample.cpp) target_link_libraries(FaceTrackerSample InspireFace ${ext}) set_target_properties(FaceTrackerSample PROPERTIES diff --git a/cpp/sample/api/sample_load_reload.cpp b/cpp/sample/api/sample_load_reload.cpp new file mode 100644 index 00000000..ebce0e77 --- /dev/null +++ b/cpp/sample/api/sample_load_reload.cpp @@ -0,0 +1,20 @@ +#include +#include "inspireface/c_api/inspireface.h" + +int main() { + std::string resourcePath = "test_res/pack/Pikachu"; + HResult ret = HFReloadInspireFace(resourcePath.c_str()); + if (ret != HSUCCEED) { + std::cerr << "Failed to launch InspireFace: " << ret << std::endl; + return 1; + } + + // Switch to another resource + ret = HFReloadInspireFace("test_res/pack/Megatron"); + if (ret != HSUCCEED) { + std::cerr << "Failed to reload InspireFace: " << ret << std::endl; + return 1; + } + + return 0; +} diff --git a/doc/CMake-Option.md b/doc/CMake-Option.md index 2f080a62..7940c256 100644 --- a/doc/CMake-Option.md +++ b/doc/CMake-Option.md @@ -8,7 +8,9 @@ Here are the translation details for the compilation parameters as per your requ | ISF_SANITIZE_ADDRESS | OFF | Enable AddressSanitizer for memory error detection | | ISF_SANITIZE_LEAK | OFF | Enable LeakSanitizer to detect memory leaks | | ISF_ENABLE_RKNN | OFF | Enable RKNN for Rockchip embedded devices | -| ISF_RK_DEVICE_TYPE | RV1109RV1126 | Target device model for Rockchip (currently supports only RV1109 and RV1126) | +| ISF_RK_DEVICE_TYPE | RV1109RV1126 | Target device model for Rockchip(Supports RV1109RV1126 and RV1106) | +| ISF_RK_COMPILER_TYPE | armhf | The **armhf**、**armhf-uclibc** and aarch64 compilers are supported. Select one based on the actual situation | +| ISF_ENABLE_RGA | OFF | Enable **RGA** image acceleration on Rockchip devices (currently only supported on devices using **RKNPU2**) | | ISF_BUILD_LINUX_ARM7 | OFF | Compile for ARM7 architecture | | ISF_BUILD_LINUX_AARCH64 | OFF | Compile for AARCH64 architecture | | ISF_BUILD_WITH_TEST | OFF | Compile test case programs | @@ -19,4 +21,7 @@ Here are the translation details for the compilation parameters as per your requ | ISF_ENABLE_TEST_EVALUATION | OFF | Enable evaluation functionality for test cases, must be used together with ISF_ENABLE_USE_LFW_DATA | | ISF_GLOBAL_INFERENCE_BACKEND_USE_MNN_CUDA | OFF | Enable global MNN_CUDA inference mode, requires device support for CUDA | | ISF_LINUX_MNN_CUDA | "" | Specific MNN library path, requires pre-compiled MNN library supporting MNN_CUDA, only effective when ISF_GLOBAL_INFERENCE_BACKEND_USE_MNN_CUDA is enabled | +| MNN_CUSTOM_SOURCE | "" | Using this option to replace different versions of MNN, the input must be the root directory of the MNN source code. | | INSPIRECV_BACKEND_OPENCV | OFF | The image processing backend relies on OpenCV and is **not recommended** | +| ISF_ENABLE_COST_TIME | OFF | This parameter can be used to print the time of some important compute nodes in the Debug state | + diff --git a/docker-compose.yml b/docker-compose.yml index 053dfefc..fb445ef3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,16 @@ services: volumes: - .:/workspace # Mount the project root directory to the container command: bash command/build_cross_armv7_armhf.sh + build-cross-rv1106-armhf-uclibc: + build: + context: . + dockerfile: docker/Dockerfile.arm-linux-rockchip830-armhf-uclibc + environment: + - VERSION=${VERSION} + working_dir: /workspace + volumes: + - .:/workspace # Mount the project root directory to the container + command: bash command/build_cross_rv1106_armhf_uclibc.sh build-cross-aarch64: build: context: . diff --git a/docker/Dockerfile.arm-linux-rockchip830-armhf-uclibc b/docker/Dockerfile.arm-linux-rockchip830-armhf-uclibc new file mode 100644 index 00000000..1457ee9f --- /dev/null +++ b/docker/Dockerfile.arm-linux-rockchip830-armhf-uclibc @@ -0,0 +1,33 @@ +# Use Ubuntu 18.04 as the base image +FROM ubuntu:18.04 + +# Update the package list and install basic development tools +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + build-essential \ + software-properties-common \ + wget \ + curl \ + git \ + vim \ + unzip + +# Install CMake +RUN apt-get install -y --no-install-recommends cmake + +# Clone RV1106 toolchain repository +RUN git clone https://github.com/tunmx/arm-rockchip830-linux-uclibcgnueabihf.git /opt/toolchain + +# Set environment variables to point to the toolchain directory +ENV ARM_CROSS_COMPILE_TOOLCHAIN=/opt/toolchain +ENV PATH="/opt/toolchain/bin:${PATH}" + +# Clean temporary files to reduce image size +RUN apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Set the working directory +WORKDIR /workspace + +# Default to running Bash +CMD ["/bin/bash"] diff --git a/python/inspireface/modules/__init__.py b/python/inspireface/modules/__init__.py index 2f51b252..a0848f55 100644 --- a/python/inspireface/modules/__init__.py +++ b/python/inspireface/modules/__init__.py @@ -2,5 +2,5 @@ launch, 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, \ + feature_hub_get_face_identity, feature_hub_get_face_count, view_table_in_terminal, version, query_launch_status, reload, \ set_logging_level, disable_logging, show_system_resource_statistics, HF_PK_AUTO_INCREMENT, HF_PK_MANUAL_INPUT, HF_SEARCH_MODE_EAGER, HF_SEARCH_MODE_EXHAUSTIVE \ No newline at end of file diff --git a/python/inspireface/modules/core/native.py b/python/inspireface/modules/core/native.py index b5156202..cd8d777a 100644 --- a/python/inspireface/modules/core/native.py +++ b/python/inspireface/modules/core/native.py @@ -938,7 +938,6 @@ def add_library_search_dirs(other_dirs): # Begin libraries _libs[_LIBRARY_FILENAME] = load_library(_LIBRARY_FILENAME) - # 1 libraries # End libraries @@ -1201,12 +1200,24 @@ class struct_HFImageBitmapData(Structure): HFLaunchInspireFace.restype = HResult # /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 222 +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: 230 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: 243 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 238 +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: 259 class struct_HFSessionCustomParameter(Structure): pass @@ -1229,39 +1240,39 @@ class struct_HFSessionCustomParameter(Structure): ('enable_interaction_liveness', HInt32), ] -HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 243 +HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 259 -PHFSessionCustomParameter = POINTER(struct_HFSessionCustomParameter)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 243 +PHFSessionCustomParameter = POINTER(struct_HFSessionCustomParameter)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 259 -enum_HFDetectMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 256 +enum_HFDetectMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 272 -HF_DETECT_MODE_ALWAYS_DETECT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 256 +HF_DETECT_MODE_ALWAYS_DETECT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 272 -HF_DETECT_MODE_LIGHT_TRACK = (HF_DETECT_MODE_ALWAYS_DETECT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 256 +HF_DETECT_MODE_LIGHT_TRACK = (HF_DETECT_MODE_ALWAYS_DETECT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 272 -HF_DETECT_MODE_TRACK_BY_DETECTION = (HF_DETECT_MODE_LIGHT_TRACK + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 256 +HF_DETECT_MODE_TRACK_BY_DETECTION = (HF_DETECT_MODE_LIGHT_TRACK + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 272 -HFDetectMode = enum_HFDetectMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 256 +HFDetectMode = enum_HFDetectMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 272 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 272 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 288 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: 289 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 305 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: 298 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 314 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: 308 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 324 class struct_HFFaceBasicToken(Structure): pass @@ -1274,11 +1285,11 @@ class struct_HFFaceBasicToken(Structure): ('data', HPVoid), ] -HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 308 +HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 324 -PHFFaceBasicToken = POINTER(struct_HFFaceBasicToken)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 308 +PHFFaceBasicToken = POINTER(struct_HFFaceBasicToken)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 324 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 319 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 335 class struct_HFFaceEulerAngle(Structure): pass @@ -1293,9 +1304,9 @@ class struct_HFFaceEulerAngle(Structure): ('pitch', POINTER(HFloat)), ] -HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 319 +HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 335 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 334 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 350 class struct_HFMultipleFaceData(Structure): pass @@ -1316,59 +1327,59 @@ class struct_HFMultipleFaceData(Structure): ('tokens', PHFFaceBasicToken), ] -HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 334 +HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 350 -PHFMultipleFaceData = POINTER(struct_HFMultipleFaceData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 334 +PHFMultipleFaceData = POINTER(struct_HFMultipleFaceData)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 350 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 344 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 360 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: 354 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 370 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: 363 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 379 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: 373 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 389 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: 390 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 406 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: 404 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 420 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: 411 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 427 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: 421 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 437 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: 435 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 451 class struct_HFFaceFeature(Structure): pass @@ -1381,45 +1392,45 @@ class struct_HFFaceFeature(Structure): ('data', HPFloat), ] -HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 435 +HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 451 -PHFFaceFeature = POINTER(struct_HFFaceFeature)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 435 +PHFFaceFeature = POINTER(struct_HFFaceFeature)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 451 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 446 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 462 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: 458 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 474 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: 468 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 484 if _libs[_LIBRARY_FILENAME].has("HFFaceGetFaceAlignmentImage", "cdecl"): HFFaceGetFaceAlignmentImage = _libs[_LIBRARY_FILENAME].get("HFFaceGetFaceAlignmentImage", "cdecl") HFFaceGetFaceAlignmentImage.argtypes = [HFSession, HFImageStream, HFFaceBasicToken, POINTER(HFImageBitmap)] HFFaceGetFaceAlignmentImage.restype = HResult -enum_HFSearchMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 482 +enum_HFSearchMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 498 -HF_SEARCH_MODE_EAGER = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 482 +HF_SEARCH_MODE_EAGER = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 498 -HF_SEARCH_MODE_EXHAUSTIVE = (HF_SEARCH_MODE_EAGER + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 482 +HF_SEARCH_MODE_EXHAUSTIVE = (HF_SEARCH_MODE_EAGER + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 498 -HFSearchMode = enum_HFSearchMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 482 +HFSearchMode = enum_HFSearchMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 498 -enum_HFPKMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 490 +enum_HFPKMode = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 506 -HF_PK_AUTO_INCREMENT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 490 +HF_PK_AUTO_INCREMENT = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 506 -HF_PK_MANUAL_INPUT = (HF_PK_AUTO_INCREMENT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 490 +HF_PK_MANUAL_INPUT = (HF_PK_AUTO_INCREMENT + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 506 -HFPKMode = enum_HFPKMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 490 +HFPKMode = enum_HFPKMode# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 506 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 503 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 519 class struct_HFFeatureHubConfiguration(Structure): pass @@ -1438,21 +1449,21 @@ class struct_HFFeatureHubConfiguration(Structure): ('searchMode', HFSearchMode), ] -HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 503 +HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 519 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 515 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 531 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: 521 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 537 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: 532 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 548 class struct_HFFaceFeatureIdentity(Structure): pass @@ -1465,11 +1476,11 @@ class struct_HFFaceFeatureIdentity(Structure): ('feature', PHFFaceFeature), ] -HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 532 +HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 548 -PHFFaceFeatureIdentity = POINTER(struct_HFFaceFeatureIdentity)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 532 +PHFFaceFeatureIdentity = POINTER(struct_HFFaceFeatureIdentity)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 548 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 541 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 557 class struct_HFSearchTopKResults(Structure): pass @@ -1484,89 +1495,112 @@ class struct_HFSearchTopKResults(Structure): ('ids', HPFaceId), ] -HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 541 +HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 557 -PHFSearchTopKResults = POINTER(struct_HFSearchTopKResults)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 541 +PHFSearchTopKResults = POINTER(struct_HFSearchTopKResults)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 557 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 553 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 569 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: 564 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 580 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: 572 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 588 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: 580 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 596 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: 591 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 607 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: 601 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 617 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: 609 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 625 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: 617 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 633 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: 626 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 642 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: 634 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 650 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: 641 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 657 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: 659 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 665 +class struct_HFFeatureHubExistingIds(Structure): + pass + +struct_HFFeatureHubExistingIds.__slots__ = [ + 'size', + 'ids', +] +struct_HFFeatureHubExistingIds._fields_ = [ + ('size', HInt32), + ('ids', HPFaceId), +] + +HFFeatureHubExistingIds = struct_HFFeatureHubExistingIds# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 665 + +PHFFeatureHubExistingIds = POINTER(struct_HFFeatureHubExistingIds)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 665 + +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 672 +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: 690 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: 674 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 705 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: 686 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 717 class struct_HFRGBLivenessConfidence(Structure): pass @@ -1579,17 +1613,17 @@ class struct_HFRGBLivenessConfidence(Structure): ('confidence', HPFloat), ] -HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 686 +HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 717 -PHFRGBLivenessConfidence = POINTER(struct_HFRGBLivenessConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 686 +PHFRGBLivenessConfidence = POINTER(struct_HFRGBLivenessConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 717 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 698 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 729 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: 709 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 740 class struct_HFFaceMaskConfidence(Structure): pass @@ -1602,17 +1636,17 @@ class struct_HFFaceMaskConfidence(Structure): ('confidence', HPFloat), ] -HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 709 +HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 740 -PHFFaceMaskConfidence = POINTER(struct_HFFaceMaskConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 709 +PHFFaceMaskConfidence = POINTER(struct_HFFaceMaskConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 740 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 721 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 752 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: 732 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 763 class struct_HFFaceQualityConfidence(Structure): pass @@ -1625,23 +1659,23 @@ class struct_HFFaceQualityConfidence(Structure): ('confidence', HPFloat), ] -HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 732 +HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 763 -PHFFaceQualityConfidence = POINTER(struct_HFFaceQualityConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 732 +PHFFaceQualityConfidence = POINTER(struct_HFFaceQualityConfidence)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 763 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 744 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 775 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: 756 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 787 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: 767 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 798 class struct_HFFaceInteractionState(Structure): pass @@ -1656,17 +1690,17 @@ class struct_HFFaceInteractionState(Structure): ('rightEyeStatusConfidence', HPFloat), ] -HFFaceInteractionState = struct_HFFaceInteractionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 767 +HFFaceInteractionState = struct_HFFaceInteractionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 798 -PHFFaceInteractionState = POINTER(struct_HFFaceInteractionState)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 767 +PHFFaceInteractionState = POINTER(struct_HFFaceInteractionState)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 798 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 774 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 805 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: 786 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 817 class struct_HFFaceInteractionsActions(Structure): pass @@ -1687,17 +1721,17 @@ class struct_HFFaceInteractionsActions(Structure): ('blink', HPInt32), ] -HFFaceInteractionsActions = struct_HFFaceInteractionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 786 +HFFaceInteractionsActions = struct_HFFaceInteractionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 817 -PHFFaceInteractionsActions = POINTER(struct_HFFaceInteractionsActions)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 786 +PHFFaceInteractionsActions = POINTER(struct_HFFaceInteractionsActions)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 817 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 794 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 825 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: 821 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 852 class struct_HFFaceAttributeResult(Structure): pass @@ -1714,17 +1748,17 @@ class struct_HFFaceAttributeResult(Structure): ('ageBracket', HPInt32), ] -HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 821 +HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 852 -PHFFaceAttributeResult = POINTER(struct_HFFaceAttributeResult)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 821 +PHFFaceAttributeResult = POINTER(struct_HFFaceAttributeResult)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 852 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 833 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 864 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: 846 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 877 class struct_HFInspireFaceVersion(Structure): pass @@ -1739,17 +1773,17 @@ class struct_HFInspireFaceVersion(Structure): ('patch', c_int), ] -HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 846 +HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 877 -PHFInspireFaceVersion = POINTER(struct_HFInspireFaceVersion)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 846 +PHFInspireFaceVersion = POINTER(struct_HFInspireFaceVersion)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 877 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 856 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 887 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: 864 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 895 class struct_HFInspireFaceExtendedInformation(Structure): pass @@ -1760,81 +1794,81 @@ class struct_HFInspireFaceExtendedInformation(Structure): ('information', HChar * int(256)), ] -HFInspireFaceExtendedInformation = struct_HFInspireFaceExtendedInformation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 864 +HFInspireFaceExtendedInformation = struct_HFInspireFaceExtendedInformation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 895 -PHFInspireFaceExtendedInformation = POINTER(struct_HFInspireFaceExtendedInformation)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 864 +PHFInspireFaceExtendedInformation = POINTER(struct_HFInspireFaceExtendedInformation)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 895 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 871 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 902 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: 883 +enum_HFLogLevel = c_int# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 914 -HF_LOG_NONE = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 883 +HF_LOG_NONE = 0# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 914 -HF_LOG_DEBUG = (HF_LOG_NONE + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 883 +HF_LOG_DEBUG = (HF_LOG_NONE + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 914 -HF_LOG_INFO = (HF_LOG_DEBUG + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 883 +HF_LOG_INFO = (HF_LOG_DEBUG + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 914 -HF_LOG_WARN = (HF_LOG_INFO + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 883 +HF_LOG_WARN = (HF_LOG_INFO + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 914 -HF_LOG_ERROR = (HF_LOG_WARN + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 883 +HF_LOG_ERROR = (HF_LOG_WARN + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 914 -HF_LOG_FATAL = (HF_LOG_ERROR + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 883 +HF_LOG_FATAL = (HF_LOG_ERROR + 1)# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 914 -HFLogLevel = enum_HFLogLevel# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 883 +HFLogLevel = enum_HFLogLevel# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 914 -# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 888 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 919 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: 893 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 924 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: 906 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 937 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: 918 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 949 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: 933 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 964 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: 943 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 974 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: 954 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 985 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: 964 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 995 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: 975 +# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 1006 if _libs[_LIBRARY_FILENAME].has("HFDeBugGetUnreleasedStreams", "cdecl"): HFDeBugGetUnreleasedStreams = _libs[_LIBRARY_FILENAME].get("HFDeBugGetUnreleasedStreams", "cdecl") HFDeBugGetUnreleasedStreams.argtypes = [POINTER(HFImageStream), HInt32] @@ -1898,37 +1932,39 @@ class struct_HFInspireFaceExtendedInformation(Structure): HFImageBitmapData = struct_HFImageBitmapData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 102 -HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 243 +HFSessionCustomParameter = struct_HFSessionCustomParameter# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 259 + +HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 324 -HFFaceBasicToken = struct_HFFaceBasicToken# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 308 +HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 335 -HFFaceEulerAngle = struct_HFFaceEulerAngle# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 319 +HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 350 -HFMultipleFaceData = struct_HFMultipleFaceData# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 334 +HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 451 -HFFaceFeature = struct_HFFaceFeature# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 435 +HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 519 -HFFeatureHubConfiguration = struct_HFFeatureHubConfiguration# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 503 +HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 548 -HFFaceFeatureIdentity = struct_HFFaceFeatureIdentity# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 532 +HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 557 -HFSearchTopKResults = struct_HFSearchTopKResults# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 541 +HFFeatureHubExistingIds = struct_HFFeatureHubExistingIds# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 665 -HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 686 +HFRGBLivenessConfidence = struct_HFRGBLivenessConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 717 -HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 709 +HFFaceMaskConfidence = struct_HFFaceMaskConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 740 -HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 732 +HFFaceQualityConfidence = struct_HFFaceQualityConfidence# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 763 -HFFaceInteractionState = struct_HFFaceInteractionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 767 +HFFaceInteractionState = struct_HFFaceInteractionState# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 798 -HFFaceInteractionsActions = struct_HFFaceInteractionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 786 +HFFaceInteractionsActions = struct_HFFaceInteractionsActions# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 817 -HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 821 +HFFaceAttributeResult = struct_HFFaceAttributeResult# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 852 -HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 846 +HFInspireFaceVersion = struct_HFInspireFaceVersion# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 877 -HFInspireFaceExtendedInformation = struct_HFInspireFaceExtendedInformation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 864 +HFInspireFaceExtendedInformation = struct_HFInspireFaceExtendedInformation# /Users/tunm/work/InspireFace/cpp/inspireface/c_api/inspireface.h: 895 # No inserted files diff --git a/python/inspireface/modules/inspireface.py b/python/inspireface/modules/inspireface.py index 70912c53..e7a038b7 100644 --- a/python/inspireface/modules/inspireface.py +++ b/python/inspireface/modules/inspireface.py @@ -267,6 +267,12 @@ def __init__(self, param, detect_mode: int = HF_DETECT_MODE_ALWAYS_DETECT, Raises: Exception: If session creation fails. """ + # If InspireFace is not initialized, run launch() use Pikachu model + if not query_launch_status(): + ret = launch() + if not ret: + raise Exception("Launch InspireFace failure") + self.multiple_faces = None self._sess = HFSession() self.param = param @@ -598,6 +604,35 @@ def launch(model_name: str = "Pikachu", resource_path: str = None) -> bool: return False return True +def reload(model_name: str = "Pikachu", resource_path: str = None) -> bool: + 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: + if ret == 1363: + logger.warning("Duplicate loading was found") + return True + else: + logger.error(f"Launch InspireFace failure: {ret}") + return False + return True + + +def query_launch_status() -> bool: + """ + Queries the launch status of the InspireFace SDK. + + Returns: + bool: True if InspireFace is launched, False otherwise. + """ + status = HInt32() + ret = HFQueryInspireFaceLaunchStatus(byref(status)) + if ret != 0: + logger.error(f"Query launch status error: {ret}") + return False + return status.value == 1 @dataclass class FeatureHubConfiguration: diff --git a/python/sample_face_detection.py b/python/sample_face_detection.py index 8b122954..fd776601 100644 --- a/python/sample_face_detection.py +++ b/python/sample_face_detection.py @@ -16,10 +16,6 @@ def case_face_detection_image(image_path): This is a sample application for face detection and tracking using an image. It also includes pipeline extensions such as RGB liveness, mask detection, and face quality evaluation. """ - # Step 1: Initialize the SDK and load the algorithm resource files. - ret = isf.launch() - assert ret, "Launch failure. Please ensure the resource path is correct." - # Optional features, loaded during session creation based on the modules specified. 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 session = isf.InspireFaceSession(opt, isf.HF_DETECT_MODE_ALWAYS_DETECT) diff --git a/python/sample_face_recognition.py b/python/sample_face_recognition.py index 46b7c3a5..991b787f 100644 --- a/python/sample_face_recognition.py +++ b/python/sample_face_recognition.py @@ -12,8 +12,8 @@ def case_face_recognition(test_data_folder): resource_path (str): Path to the resource directory for face recognition algorithms. test_data_folder (str): Path to the test data containing images for insertion and recognition tests. """ - # Initialize the face recognition system with provided resources. - ret = isf.launch() + # If you need to switch from the default Pikachu model to another model like Megatron, you can use reload + ret = isf.reload("Megatron") assert ret, "Launch failure. Please ensure the resource path is correct." # Enable face recognition features. diff --git a/python/sample_face_track_from_video.py b/python/sample_face_track_from_video.py index 12a8bc40..1f3aac5d 100644 --- a/python/sample_face_track_from_video.py +++ b/python/sample_face_track_from_video.py @@ -33,7 +33,7 @@ def generate_color(id): @click.argument('source') @click.option('--show', is_flag=True, help='Display the video stream or video file in a window.') @click.option('--out', type=str, default=None, help='Path to save the processed video.') -def case_face_tracker_from_video(resource_path, source, show, out): +def case_face_tracker_from_video(source, show, out): """ Launch a face tracking process from a video source. The 'source' can either be a webcam index (0, 1, ...) or a path to a video file. Use the --show option to display the video. @@ -44,12 +44,6 @@ def case_face_tracker_from_video(resource_path, source, show, out): show (bool): If set, the video will be displayed in a window. out (str): Path to save the processed video. """ - # Initialize the face tracker or other resources. - print(f"Initializing with resources from: {resource_path}") - # Step 1: Initialize the SDK and load the algorithm resource files. - ret = isf.launch() - assert ret, "Launch failure. Please ensure the resource path is correct." - # 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_ALWAYS_DETECT, max_detect_num=25, detect_pixel_level=320) # Use video mode @@ -57,12 +51,12 @@ def case_face_tracker_from_video(resource_path, source, show, out): # Determine if the source is a digital webcam index or a video file path. try: source_index = int(source) # Try to convert source to an integer. - cap = cv2.VideoCapture(source_index) print(f"Using webcam at index {source_index}.") + cap = cv2.VideoCapture(source_index) except ValueError: # If conversion fails, treat source as a file path. - cap = cv2.VideoCapture(source) print(f"Opening video file at {source}.") + cap = cv2.VideoCapture(source) if not cap.isOpened(): print("Error: Could not open video source.") diff --git a/python/sample_video.py b/python/sample_video.py index eeebbf8a..fd34ca64 100644 --- a/python/sample_video.py +++ b/python/sample_video.py @@ -28,8 +28,6 @@ def get_quality(image, session: isf.InspireFaceSession) -> float: if __name__ == "__main__": - ret = isf.launch() - assert ret, "Launch failure. Please ensure the resource path is correct." register_exec_func = isf.HF_ENABLE_QUALITY | isf.HF_ENABLE_MASK_DETECT | isf.HF_ENABLE_LIVENESS | isf.HF_ENABLE_INTERACTION | isf.HF_ENABLE_FACE_ATTRIBUTE session = isf.InspireFaceSession(register_exec_func, isf.HF_DETECT_MODE_ALWAYS_DETECT) cam = cv2.VideoCapture(0)