mirror of
https://github.com/deepinsight/insightface.git
synced 2026-01-13 03:20:17 +00:00
Update inspireface to 1.2.0
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
//
|
||||
// Created by tunm on 2023/10/12.
|
||||
//
|
||||
|
||||
/**
|
||||
* Created by Jingyu Yan
|
||||
* @date 2024-10-01
|
||||
*/
|
||||
#include <iostream>
|
||||
#include "settings/test_settings.h"
|
||||
#include "inspireface/c_api/inspireface.h"
|
||||
#include "../test_helper/test_tools.h"
|
||||
#include "../test_helper/test_help.h"
|
||||
|
||||
TEST_CASE("test_FacePipelineAttribute", "[face_pipeline_attribute]") {
|
||||
DRAW_SPLIT_LINE
|
||||
@@ -39,14 +40,14 @@ TEST_CASE("test_FacePipelineAttribute", "[face_pipeline_attribute]") {
|
||||
parameter.enable_face_attribute = 1;
|
||||
HFDetectMode detMode = HF_DETECT_MODE_ALWAYS_DETECT;
|
||||
HFSession session;
|
||||
HInt32 faceDetectPixelLevel = 160;
|
||||
HInt32 faceDetectPixelLevel = 320;
|
||||
ret = HFCreateInspireFaceSession(parameter, detMode, 5, faceDetectPixelLevel, -1, &session);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
SECTION("a black girl") {
|
||||
HFImageStream imgHandle;
|
||||
auto img = cv::imread(GET_DATA("data/attribute/1423.jpg"));
|
||||
REQUIRE(!img.empty());
|
||||
auto img = inspirecv::Image::Create(GET_DATA("data/attribute/1423.jpg"));
|
||||
REQUIRE(!img.Empty());
|
||||
ret = CVImageToImageStream(img, imgHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -56,8 +57,7 @@ TEST_CASE("test_FacePipelineAttribute", "[face_pipeline_attribute]") {
|
||||
REQUIRE(multipleFaceData.detectedNum == 1);
|
||||
|
||||
// Run pipeline
|
||||
ret = HFMultipleFacePipelineProcessOptional(session, imgHandle, &multipleFaceData,
|
||||
HF_ENABLE_FACE_ATTRIBUTE);
|
||||
ret = HFMultipleFacePipelineProcessOptional(session, imgHandle, &multipleFaceData, HF_ENABLE_FACE_ATTRIBUTE);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
HFFaceAttributeResult result = {0};
|
||||
@@ -77,8 +77,8 @@ TEST_CASE("test_FacePipelineAttribute", "[face_pipeline_attribute]") {
|
||||
|
||||
SECTION("two young white women") {
|
||||
HFImageStream imgHandle;
|
||||
auto img = cv::imread(GET_DATA("data/attribute/7242.jpg"));
|
||||
REQUIRE(!img.empty());
|
||||
auto img = inspirecv::Image::Create(GET_DATA("data/attribute/7242.jpg"));
|
||||
REQUIRE(!img.Empty());
|
||||
ret = CVImageToImageStream(img, imgHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -88,8 +88,7 @@ TEST_CASE("test_FacePipelineAttribute", "[face_pipeline_attribute]") {
|
||||
REQUIRE(multipleFaceData.detectedNum == 2);
|
||||
|
||||
// Run pipeline
|
||||
ret = HFMultipleFacePipelineProcessOptional(session, imgHandle, &multipleFaceData,
|
||||
HF_ENABLE_FACE_ATTRIBUTE);
|
||||
ret = HFMultipleFacePipelineProcessOptional(session, imgHandle, &multipleFaceData, HF_ENABLE_FACE_ATTRIBUTE);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
HFFaceAttributeResult result = {0};
|
||||
@@ -114,65 +113,24 @@ TEST_CASE("test_FacePipelineAttribute", "[face_pipeline_attribute]") {
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
}
|
||||
|
||||
TEST_CASE("test_FacePipelineRobustness", "[robustness]") {
|
||||
DRAW_SPLIT_LINE
|
||||
TEST_PRINT_OUTPUT(true);
|
||||
|
||||
SECTION("Exception") {
|
||||
HResult ret;
|
||||
HFSessionCustomParameter parameter = {0};
|
||||
HFDetectMode detMode = HF_DETECT_MODE_ALWAYS_DETECT;
|
||||
HFSession session;
|
||||
ret = HFCreateInspireFaceSession(parameter, detMode, 3, -1, -1, &session);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
// Input exception data
|
||||
HFImageStream nullHandle = {0};
|
||||
HFMultipleFaceData nullfaces = {0};
|
||||
ret =
|
||||
HFMultipleFacePipelineProcessOptional(session, nullHandle, &nullfaces, HF_ENABLE_NONE);
|
||||
REQUIRE(ret == HERR_INVALID_IMAGE_STREAM_HANDLE);
|
||||
|
||||
// Get a face picture
|
||||
HFImageStream img1Handle;
|
||||
auto img1 = cv::imread(GET_DATA("data/bulk/image_T1.jpeg"));
|
||||
ret = CVImageToImageStream(img1, img1Handle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
// Input correct Image and exception faces struct
|
||||
ret =
|
||||
HFMultipleFacePipelineProcessOptional(session, img1Handle, &nullfaces, HF_ENABLE_NONE);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
ret = HFReleaseImageStream(img1Handle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
ret = HFReleaseInspireFaceSession(session);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
// Multiple release
|
||||
ret = HFReleaseInspireFaceSession(session);
|
||||
REQUIRE(ret == HERR_INVALID_CONTEXT_HANDLE);
|
||||
|
||||
HFDeBugShowResourceStatistics();
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("test_FacePipeline", "[face_pipeline]") {
|
||||
DRAW_SPLIT_LINE
|
||||
TEST_PRINT_OUTPUT(true);
|
||||
|
||||
SECTION("rgb liveness detect") {
|
||||
#ifndef INFERENCE_WRAPPER_ENABLE_RKNN2
|
||||
/** The anti spoofing model based on RGB faces seems to have some problems with quantization under RKNPU2, so it is not started yet */
|
||||
HResult ret;
|
||||
HFSessionCustomParameter parameter = {0};
|
||||
parameter.enable_liveness = 1;
|
||||
HFDetectMode detMode = HF_DETECT_MODE_ALWAYS_DETECT;
|
||||
HFSession session;
|
||||
ret = HFCreateInspireFaceSession(parameter, detMode, 3, -1, -1, &session);
|
||||
ret = HFCreateInspireFaceSession(parameter, detMode, 3, 320, -1, &session);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
// Get a face picture
|
||||
HFImageStream img1Handle;
|
||||
auto img1 = cv::imread(GET_DATA("data/bulk/image_T1.jpeg"));
|
||||
auto img1 = inspirecv::Image::Create(GET_DATA("data/bulk/image_T1.jpeg"));
|
||||
ret = CVImageToImageStream(img1, img1Handle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -189,7 +147,7 @@ TEST_CASE("test_FacePipeline", "[face_pipeline]") {
|
||||
TEST_PRINT("{}", confidence.confidence[0]);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
CHECK(confidence.num > 0);
|
||||
CHECK(confidence.confidence[0] > 0.9);
|
||||
CHECK(confidence.confidence[0] > 0.8);
|
||||
|
||||
ret = HFReleaseImageStream(img1Handle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
@@ -197,7 +155,7 @@ TEST_CASE("test_FacePipeline", "[face_pipeline]") {
|
||||
|
||||
// fake face
|
||||
HFImageStream img2Handle;
|
||||
auto img2 = cv::imread(GET_DATA("data/bulk/rgb_fake.jpg"));
|
||||
auto img2 = inspirecv::Image::Create(GET_DATA("data/bulk/rgb_fake.jpg"));
|
||||
ret = CVImageToImageStream(img2, img2Handle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
ret = HFExecuteFaceTrack(session, img2Handle, &multipleFaceData);
|
||||
@@ -216,6 +174,9 @@ TEST_CASE("test_FacePipeline", "[face_pipeline]") {
|
||||
ret = HFReleaseInspireFaceSession(session);
|
||||
session = nullptr;
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
#else
|
||||
TEST_PRINT("The anti spoofing model based on RGB faces seems to have some problems with quantization under RKNPU2, so we skip this test.");
|
||||
#endif
|
||||
}
|
||||
|
||||
SECTION("face mask detect") {
|
||||
@@ -229,7 +190,7 @@ TEST_CASE("test_FacePipeline", "[face_pipeline]") {
|
||||
|
||||
// Get a face picture
|
||||
HFImageStream img1Handle;
|
||||
auto img1 = cv::imread(GET_DATA("data/bulk/mask2.jpg"));
|
||||
auto img1 = inspirecv::Image::Create(GET_DATA("data/bulk/mask2.jpg"));
|
||||
ret = CVImageToImageStream(img1, img1Handle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -253,7 +214,7 @@ TEST_CASE("test_FacePipeline", "[face_pipeline]") {
|
||||
|
||||
// no mask face
|
||||
HFImageStream img2Handle;
|
||||
auto img2 = cv::imread(GET_DATA("data/bulk/face_sample.png"));
|
||||
auto img2 = inspirecv::Image::Create(GET_DATA("data/bulk/face_sample.png"));
|
||||
ret = CVImageToImageStream(img2, img2Handle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
ret = HFExecuteFaceTrack(session, img2Handle, &multipleFaceData);
|
||||
@@ -280,12 +241,12 @@ TEST_CASE("test_FacePipeline", "[face_pipeline]") {
|
||||
HFDetectMode detMode = HF_DETECT_MODE_ALWAYS_DETECT;
|
||||
HInt32 option = HF_ENABLE_QUALITY;
|
||||
HFSession session;
|
||||
ret = HFCreateInspireFaceSessionOptional(option, detMode, 3, -1, -1, &session);
|
||||
ret = HFCreateInspireFaceSessionOptional(option, detMode, 3, 320, -1, &session);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
// Get a face picture
|
||||
HFImageStream superiorHandle;
|
||||
auto superior = cv::imread(GET_DATA("data/bulk/yifei.jpg"));
|
||||
auto superior = inspirecv::Image::Create(GET_DATA("data/bulk/yifei.jpg"));
|
||||
ret = CVImageToImageStream(superior, superiorHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -295,18 +256,17 @@ TEST_CASE("test_FacePipeline", "[face_pipeline]") {
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
REQUIRE(multipleFaceData.detectedNum > 0);
|
||||
|
||||
ret =
|
||||
HFMultipleFacePipelineProcessOptional(session, superiorHandle, &multipleFaceData, option);
|
||||
ret = HFMultipleFacePipelineProcessOptional(session, superiorHandle, &multipleFaceData, option);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
HFloat quality;
|
||||
ret = HFFaceQualityDetect(session, multipleFaceData.tokens[0], &quality);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
CHECK(quality > 0.85);
|
||||
CHECK(quality > 0.8);
|
||||
|
||||
// blur image
|
||||
HFImageStream blurHandle;
|
||||
auto blur = cv::imread(GET_DATA("data/bulk/blur.jpg"));
|
||||
auto blur = inspirecv::Image::Create(GET_DATA("data/bulk/blur.jpg"));
|
||||
ret = CVImageToImageStream(blur, blurHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -349,7 +309,7 @@ TEST_CASE("test_FaceReaction", "[face_reaction]") {
|
||||
SECTION("open eyes") {
|
||||
// Get a face picture
|
||||
HFImageStream imgHandle;
|
||||
auto img = cv::imread(GET_DATA("data/reaction/open_eyes.png"));
|
||||
auto img = inspirecv::Image::Create(GET_DATA("data/reaction/open_eyes.png"));
|
||||
ret = CVImageToImageStream(img, imgHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -364,8 +324,8 @@ TEST_CASE("test_FaceReaction", "[face_reaction]") {
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
// Get results
|
||||
HFFaceIntereactionState result;
|
||||
ret = HFGetFaceIntereactionStateResult(session, &result);
|
||||
HFFaceInteractionState result;
|
||||
ret = HFGetFaceInteractionStateResult(session, &result);
|
||||
REQUIRE(multipleFaceData.detectedNum == result.num);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -380,7 +340,7 @@ TEST_CASE("test_FaceReaction", "[face_reaction]") {
|
||||
SECTION("close eyes") {
|
||||
// Get a face picture
|
||||
HFImageStream imgHandle;
|
||||
auto img = cv::imread(GET_DATA("data/reaction/close_eyes.jpeg"));
|
||||
auto img = inspirecv::Image::Create(GET_DATA("data/reaction/close_eyes.jpeg"));
|
||||
ret = CVImageToImageStream(img, imgHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -395,8 +355,8 @@ TEST_CASE("test_FaceReaction", "[face_reaction]") {
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
// Get results
|
||||
HFFaceIntereactionState result;
|
||||
ret = HFGetFaceIntereactionStateResult(session, &result);
|
||||
HFFaceInteractionState result;
|
||||
ret = HFGetFaceInteractionStateResult(session, &result);
|
||||
REQUIRE(multipleFaceData.detectedNum == result.num);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -411,7 +371,7 @@ TEST_CASE("test_FaceReaction", "[face_reaction]") {
|
||||
SECTION("Close one eye and open the other") {
|
||||
// Get a face picture
|
||||
HFImageStream imgHandle;
|
||||
auto img = cv::imread(GET_DATA("data/reaction/close_open_eyes.jpeg"));
|
||||
auto img = inspirecv::Image::Create(GET_DATA("data/reaction/close_open_eyes.jpeg"));
|
||||
ret = CVImageToImageStream(img, imgHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -426,8 +386,8 @@ TEST_CASE("test_FaceReaction", "[face_reaction]") {
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
// Get results
|
||||
HFFaceIntereactionState result;
|
||||
ret = HFGetFaceIntereactionStateResult(session, &result);
|
||||
HFFaceInteractionState result;
|
||||
ret = HFGetFaceInteractionStateResult(session, &result);
|
||||
REQUIRE(multipleFaceData.detectedNum == result.num);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
@@ -441,4 +401,87 @@ TEST_CASE("test_FaceReaction", "[face_reaction]") {
|
||||
|
||||
ret = HFReleaseInspireFaceSession(session);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("test_TrackModeFaceAction", "[face_action]") {
|
||||
DRAW_SPLIT_LINE
|
||||
TEST_PRINT_OUTPUT(true);
|
||||
|
||||
HResult ret;
|
||||
HFSessionCustomParameter parameter = {0};
|
||||
parameter.enable_interaction_liveness = 1;
|
||||
HFDetectMode detMode = HF_DETECT_MODE_LIGHT_TRACK;
|
||||
HFSession session;
|
||||
ret = HFCreateInspireFaceSession(parameter, detMode, 3, -1, -1, &session);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
#if 0
|
||||
SECTION("Action Blink") {
|
||||
auto start = 130, end = 150;
|
||||
std::vector<std::string> filenames = generateFilenames("frame-%04d.jpg", start, end);
|
||||
int count = 0;
|
||||
for (size_t i = 0; i < filenames.size(); i++) {
|
||||
auto filename = filenames[i];
|
||||
HFImageStream imgHandle;
|
||||
auto image = inspirecv::Image::Create(GET_DATA("data/video_frames/" + filename));
|
||||
ret = CVImageToImageStream(image, imgHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
HFMultipleFaceData multipleFaceData = {0};
|
||||
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
REQUIRE(multipleFaceData.detectedNum > 0);
|
||||
|
||||
ret = HFMultipleFacePipelineProcessOptional(session, imgHandle, &multipleFaceData, HF_ENABLE_INTERACTION);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
HFFaceInteractionsActions result;
|
||||
ret = HFGetFaceInteractionActionsResult(session, &result);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
REQUIRE(multipleFaceData.detectedNum == result.num);
|
||||
|
||||
count += result.blink[0];
|
||||
ret = HFReleaseImageStream(imgHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
}
|
||||
// Blink at least once
|
||||
REQUIRE(count > 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
SECTION("Action Jaw Open") {
|
||||
auto start = 110, end = 150;
|
||||
std::vector<std::string> filenames = generateFilenames("frame-%04d.jpg", start, end);
|
||||
int count = 0;
|
||||
for (size_t i = 0; i < filenames.size(); i++) {
|
||||
auto filename = filenames[i];
|
||||
HFImageStream imgHandle;
|
||||
auto image = inspirecv::Image::Create(GET_DATA("data/video_frames/" + filename));
|
||||
ret = CVImageToImageStream(image, imgHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
HFMultipleFaceData multipleFaceData = {0};
|
||||
ret = HFExecuteFaceTrack(session, imgHandle, &multipleFaceData);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
REQUIRE(multipleFaceData.detectedNum > 0);
|
||||
|
||||
ret = HFMultipleFacePipelineProcessOptional(session, imgHandle, &multipleFaceData, HF_ENABLE_INTERACTION);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
|
||||
HFFaceInteractionsActions result;
|
||||
ret = HFGetFaceInteractionActionsResult(session, &result);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
REQUIRE(multipleFaceData.detectedNum == result.num);
|
||||
|
||||
count += result.jawOpen[0];
|
||||
ret = HFReleaseImageStream(imgHandle);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
}
|
||||
// Jaw open at least once
|
||||
REQUIRE(count > 0);
|
||||
}
|
||||
#endif
|
||||
ret = HFReleaseInspireFaceSession(session);
|
||||
REQUIRE(ret == HSUCCEED);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user