|
|
#pragma once
#include <string>
#include <vector>
#include <map>
//#if (defined HUMMINGBIRD) || (defined JASMINE)
//#include "zface_common.h"
//#endif
//10.1.90新增,给xmedia提供的算法服务会读取这个变量,如果在运行中,算法启动失败
static bool tg_algorithm_is_running;
enum ProductCode { // 默认原子产品
Default = 0, // 瓢虫
Ladybird = 1, };
enum ToygerAlgorithm{ Toyger_Algorithm_None = 0, Toyger_Algorithm_Face = 1 << 0, Toyger_Algorithm_Doc = 1 << 1 };
/**
* sdk算法能力 */ enum Capacity { /**
* 无效能力 */ CAPACITY_INVALID = 0, /**
* 检测,可与其它能力结合使用 */ CAPACITY_DETECTION = 1 << 0, /**
* 活体,可与其它能力结合使用 */ CAPACITY_LIVENESS = 1 << 1, /**
* 抽特征,可与其它能力结合使用 */ CAPACITY_FEATURE = 1 << 2, /**
* 比对,可与其它能力结合使用 */ CAPACITY_VERIFY = 1 << 3, /**
* 本地MTee环境比对 * 不可与其他类型结合使用 */ CAPACITY_VERIFY_TEE = 1 << 4, /**
* 嘴部模型 */ CAPACITY_MOUTH = 1 << 5 };
/**
* 人脸库加载失败的原因 */ enum FEATURE_STORE_ERROR_CODE { /**
* 成功 */ STORE_SUCCESS = 0, /**
* 失败:未知原因 */ STORE_FAILED_UNKNOWN = 1, /**
* 失败:feature版本错误 */ STORE_FAILED_VERSION_ERROR = 2, /**
* 失败:无效的feautre */ STORE_FAILED_INVALID_FEATURE = 3, /**
* 失败:人脸库过大 */ STORE_FAILED_OVERSIZE = 4 };
enum ToygerLog{ Toyger_Log_VERBOSE = 2, Toyger_Log_DEBUG = 3, Toyger_Log_INFO = 4, Toyger_Log_WARN = 5, Toyger_Log_ERROR = 6, Toyger_Log_ASSERT = 7, Toyger_Log_Performance = 8, }; struct TGIRect{ int left; int top; int right; int bottom; };
struct TGFRect { float left; float top; float right; float bottom; };
struct TGPoint { float x; float y; };
struct TGQualityConfig { int max_face_num = 3; #ifdef LADYBIRD_SELECTOR
int face_distance_threshold = 80; #endif
#ifdef DRAGONFLY_SELECTOR
int face_distance_threshold = 150; #endif
int max_face_distance = 700; float min_brightness = 0.3; float min_face_width = 0.25; float min_integrity = 0.9; float min_pitch = -0.2; float max_pitch = 0.2; float min_yaw = -0.2; float max_yaw = 0.2; float max_gaussian = 0.15; float max_motion = 0; float min_quality = 20; float min_iod = 0.18; float max_iod = 0.45; float stack_time = 2.f; float blink_openness = 0.1; float eye_openness = 0.25; float eye_occlusion = 0.8; float lip_motion = 0.15; float quality_depth_min_quality = 0.5; int depth_cache_num = 2; int detectImageFormat;//BGRA = 2, BGR= 4,GRAY = 0,
int detectMode = 0;//0是全检测模式,1是分阶段检测模式
bool detectImageLight = false; // 是否启用人脸亮度检查,打开后[img_light, 208]范围内的人脸才能够通过
int img_light = 82; //detectImageLight打开时有效,注意修改的只是人脸合法亮度范围的下限
int max_image_light = 208; //启用人脸亮度检查时,人脸合法亮度的上限
bool uploadMultiFace = false; //90版本需求,是否上传多人脸信息
bool enableAttrDetect = false; //是否检测人脸属性
};
struct TGCommonConfig{ int log_level; //0 - None, 1 - light, 2 - heavy
int product_code; int useXNN = 0; bool auto_complete = true; std::string xnn_engine_config = "common:cpunum=2,xnnnextgen=1|xNNSec:enginenames=xInt8$";// xnn init config for wallet
}; #ifdef ZDOC
struct TGDocConfig{ int algoType; int exposure; int blur; int card_detect_score; int rotate_times; int top_left_x; int top_left_y; int bottom_right_x; int bottom_right_y; int face_side_sharpness; int verso_side_sharpness; int papers_sharpness;
int face_side_exposure; int verso_side_exposure; int papers_stability; }; #endif
struct TGLivenessConfig { std::string liveness_combinations = "NoLiveness"; //`#` seperated liveness methods<fpp_blink#yunqi_blink#dragonfly#gemini>
std::string collection; //`#` seperated liveness methods<fpp_blink#yunqi_blink#dragonfly#gemini>
float bat_min_score; float dragonfly_min; float dragonfly_max = 0.5; float gemini_min; float gemini_max; float eye_occlusion_threshold = 0.8; float eye_blink_threshold = 0.2; float lip_motion_threshold = 0.15; bool fpp_pre_processed = false; int faceActionType; bool detect_before_nano; unsigned int dragonfly_retry_limit = 0; };
struct TGCameraConfig { float color_intrin[3 * 3]; float depth_intrin[3 * 3]; float color2depth_extrin[4 * 4]; TGIRect roiRect; bool isAligned; bool isMirror; };
struct TGConfig { TGQualityConfig quality_config; TGLivenessConfig liveness_config; TGCameraConfig camera_config; TGCommonConfig common_config; };
#ifdef ZDOC
enum TGDocType{ TG_Doc_Type_Common = 0, TG_Doc_Type_ID_Card, TG_Doc_Type_Driver_License, TG_Doc_Type_Vehicle_License, };
enum TGDocPageNo{ TG_Doc_Page_NO_ONE = 1, TG_Doc_Page_NO_TWO = 2, }; #endif
enum TGFrameFormat { TG_Frame_Format_YUV = 0, TG_Frame_Format_BGRA = 1, TG_Frame_Format_BGR = 2, TG_Frame_Format_RGBA = 3, TG_Frame_Format_RGB = 4, TG_Frame_Format_Gray_8 = 5, TG_Frame_Format_Gray_16 = 6, TG_Frame_Format_DEPTH = 1024, TG_Frame_Formate_Unknown = 9999, };
enum TGFrameType { TG_Frame_Light = 0, TG_Frame_Dark, TG_Frame_Depth, TG_Frame_IR, TG_Frame_Nano, TG_Frame_Gray_Nano, TG_Frame_Unknown = 9999, };
class TGFrame { public: TGFrame(); TGFrame(int w, int h, int angle, TGFrameFormat color_space, TGFrameType brightness); TGFrame(unsigned char *data, int w, int h, int angle, TGFrameFormat color_space, TGFrameType brightness, bool copy = true); ~TGFrame(); TGFrame(const TGFrame &src); TGFrame& operator=(const TGFrame &src); TGFrame clone() const; bool empty() const; unsigned char *image_data; long data_len; int width; int height; int rotation; TGFrameFormat format; TGFrameType frame_type; private: int getDataLen() const; void Ref(); int UnRef(); bool _own; int *_use = nullptr; // todo: not thread safe
};
#pragma mark - Face
struct TGFaceAttr { int face_id = -1; bool has_face; bool eye_blink; TGFRect face_region; float quality; float yaw; float pitch; float gaussian; float motion; float brightness; float integrity; // 左眼分数、最大最小值
float left_eye_blink_ratio; float left_eye_blink_ratio_min; float left_eye_blink_ratio_max; // 右眼分数、最大最小值
float right_eye_blink_ratio; float right_eye_blink_ratio_min; float right_eye_blink_ratio_max; short distance; float keypts[10];
//2018年03月31日 新增属性 - 守逸
bool eye_open; float confidence; float deepLiveness; float iodRatio; float roll; float depthQuality; float left_eye_occlusion_score; float right_eye_occlusion_score;
int gender; float age;
//人脸亮度 [82,208]区间内是可通过人脸,下限亮度可以通过ToygerQualityConfig.img_light参数控制
float light;
/* 在执行detect阶段时,同一张图片上发现的总的人脸个数,上传服务端供风控环节使用*/ int faceCount; /* 上传多人脸位置信息时,最多上传3张人脸的位置,首选的人脸在face_region中已存,这里再存最多2张人脸。
[left, top, right, bottom], [left, top, right, bottom]。如果四个位置都为0,说明该张人脸没有检出,不能上传 */ float otherFacePos[8]; /*
保存到otherFacePos中的人脸个数。可取值范围为[0,2] */ int otherFaceCount; bool yaw_left; bool yaw_right; bool mouth_open; bool lip_movement; };
enum TGMessage{ TG_Message_Image_Perfect = 0, TG_Message_No_Face, TG_Message_Distance_Too_Far, TG_Message_Distance_Too_Close, TG_Message_Face_Not_In_Center, TG_Message_Bad_Pitch, TG_Message_Bad_Yaw, TG_Message_Is_Moving, TG_Message_Bad_Brightness, TG_Message_Bad_Quality, TG_Message_Bad_Eye_Openness, TG_Message_Blink_Openness, TG_Message_Stack_Time, TG_Message_Depth_Damage, TG_Message_Left_Yaw_Guide, TG_Message_Right_Yaw_Guide, TG_Message_Mouth_Open_Guide, TG_Message_Lip_Move_Guide };
enum TGStaticMessage{ TGStaticMessage_NoLiveness = 0, TGStaticMessage_BlinkLiveness, TGStaticMessage_LeftYawLiveness, TGStaticMessage_RightYawLiveness, TGStaticMessage_MouthOpenLiveness, TGStaticMessage_LipMoveLiveness, };
enum TGActionLiveness{ TG_Action_None = 0, TG_Action_Blink, TG_Action_Left_YAW, TG_Action_Right_YAW, TG_Action_Mouth_Open, TG_Action_Lip_Move };
struct TGFaceState { TGMessage tip_message = TG_Message_No_Face; TGStaticMessage static_message; bool has_face; int brightness; int distance; bool face_in_center; bool is_moving; bool good_quality; int good_pitch; int good_yaw; /**
* 人脸图片的亮度是否在TGQualityConfig的配置范围内. 0表示当前人脸图片亮度合法,非0代表不合法。这种与一般习惯不同的用法是为了和其他good_xxx的判断方法保持一致! */ int good_img_light; bool eye_openness; bool blink_openness; float current_progress; };
enum TGEventCode{ TG_Event_Code_Monitor = 2, TG_Event_Code_Log = 1, TG_Event_Code_Dark_Screen = -1, TG_Event_Code_RGB_Frame_Corrupted = -2, TG_Event_Code_Depth_Frame_Corrupted = -3, TG_Event_Code_Nano_Generate_Failed = -13, TG_Event_Code_Nano_Generate_Success = -14, TG_Event_Code_Dragonfly_Liveness_Failed = -15, TG_Event_Code_Dragonfly_Liveness_Success = -16, TG_Event_Code_Select_Face_End = -17, TG_Event_Code_ReDetect_Face_Start = -30, TG_Event_Code_ReDetect_Face_End = -31, TG_Event_Code_Pegasus_Liveness_End = -32, TG_Event_Code_Action_Liveness_blink_End = -42, TG_Event_Code_Action_Liveness_Reset = -43, TG_Event_Code_Action_Liveness_End = -45, };
struct TGFaceInfo { TGFrame frame; TGFaceAttr attr; };
struct TGDepthFaceInfo { TGFrame frame; TGFaceAttr rgb_attr; TGFaceAttr depth_attr; };
enum TGDataType{ TG_DATA_TYPE_GYRO = 0, TG_DATA_TYPE_PEGASUS = 1, };
struct TGDataInfo { std::vector<unsigned char> rawData; TGDataType dataType; };
#ifdef ZDOC
#pragma mark - Doc
struct TGDocAttr {
};
struct TGDocState { bool has_doc; bool is_completed; bool is_reflected; bool is_blur; bool is_copy; };
struct TGDocInfo{ TGFrame frame; TGDocAttr attr; }; #endif
struct TGSDKInfo { std::string code_version; std::string model_version; int max_face_count; };
struct TGFeatureStoreResult { int error_code; std::vector<std::string> failed_face_id; }; struct ToygerCallback{ void (*handleCaptureCompleted)(void *cb_receiver, int result,const std::vector<TGFaceInfo>&info,const std::map<std::string, float> &ext); void (*handleBestImageUpdate)(void *cb_receiver, int result,const std::vector<TGFaceInfo>&info,const std::map<std::string, float> &ext); void (*handleFaceInfoReady)(void *cb_receiver, const std::vector<TGFaceInfo> &infos, const TGFaceAttr &attr); void (*handleFaceStateUpdated)(void *cb_receiver,const TGFaceState &state, const TGFaceAttr &attr); void (*handleEventTriggered)(void *cb_receiver, int event_code, const char *log, const unsigned char *buffer, int buffer_length); void (*handleLog)(void *cb_receiver,int logLevel, const std::map<std::string, std::string> &logInfo); bool (*handleModelLoad)(void *cb_receiver, Capacity capacity_mask); #if (defined IR) || (defined BAT)
void (*handleDepthInfoReady)(void *cb_receiver, const std::vector<uint8_t> &depthBlobInfo); void (*handleInfraRedInfoReady)(void *cb_receiver, const TGFrame &infraRedFrame); TGPoint (*handleAlignDepthPoint)(void *cb_receiver, TGPoint pt); #endif
#if (defined HUMMINGBIRD) || (defined JASMINE)
void (*handleFeatureGenerated)(void *cb_receiver,int status,std::vector<float> &featureData); void (*handleFeatureSave)(void *cb_receiver,int status,std::vector<float> &featureData); #endif
#ifdef ZDOC
void (*handleScanCompleted)(void *cb_receiver, int result,const std::vector<TGDocInfo>&info,const std::map<std::string, float> &ext); void (*handleDocStateUpdated)(void *cb_receiver, const TGDocState &state, const TGDocAttr &attr); #endif
};
struct DetectedFaceInfo{ TGFaceAttr face_attr; TGIRect rgb_face_rect; TGIRect depth_face_rect; };
/**
Toyger C++ 初始化接口
@param model 传入的模型 @param license 传入的license @param bundleid 传入的bundle id @param tg_instance 传入的需要被赋值的 tg_instance @param algorithm_mask 需要运行的算法 @param capacity_mask 启动的人脸算法能力 @return 初始化是否成功 */ bool tg_init(const std::vector<uint8_t> &model, std::vector<uint8_t> &moutModel, const std::string &license, const std::string &bundleid, void **tg_instance, ToygerAlgorithm algorithm_mask, int capacity_mask);
bool tg_load_model(void *tg_instance,const std::vector<uint8_t> &faceModel, std::vector<uint8_t> &moutModel, Capacity modelCapacity);
/**
配置Toyger算法
@param tg_instance 传入的算法实例 @param callback 回调 @param cb_receiver 接受回调的对象 @param config 传入的配置 */ void tg_config(void *tg_instance, ToygerCallback *callback, void *cb_receiver, const TGConfig &config);
#ifdef ZDOC
/**
配置Toyger 证件算法
@param tg_instance 传入的算法实例 @param callback 回调 @param cb_receiver 接受回调的对象 @param config 传入的配置 @return 配置是否成功 */ bool tg_config(void *tg_instance, ToygerCallback *callback, void *cb_receiver, const TGDocConfig &config); #endif
/**
处理每一帧数据
@param tg_instance 传入的算法对象 @param frames 需要处理的RGB 帧 @param depthFrame 需要处理的深度帧 @param fpp_attr 经过fpp算法检测后的人脸属性 @return 是否数据完整 */ bool tg_process_image(void *tg_instance, const std::vector<TGFrame> &frames, const TGFrame &depthFrame, const TGFaceAttr &fpp_attr);
#if defined JASMINE
/**
* 1:N 人脸比对 * @param tg_instance 传入的算法对象 * @param topN 取前N个满足阈值的人脸库 * @param threshold 比对阈值 * @param faceSearchResult * @return 成功或失败 */ bool tg_verify_feature(void *tg_instance, int topN, float threshold, std::vector<FaceSearchResult> &faceSearchResult); /**
* @param tg_instance 传入的算法对象 * @param faceDatabase 人脸库 * @return 成功或失败 */ bool tg_load_feature_database(void *tg_instance, const std::vector<FaceItem> &faceDatabase); /**
* @param tg_instance 传入的算法对象 * @return 成功或失败 */ bool tg_release_feature_database(void *tg_instance);
#endif
#ifdef HUMMINGBIRD
std::vector<float> tg_extract_feature(void *tg_instance);
std::vector<float> tg_detect_extra_feature(void *tg_instance);
void tg_verify_score(void *tg_instance, std::vector<float> tempFeature, float &score, double &far); #endif
/**
Toyger算法重置
@param tg_instance 传入的算法对象 */ void tg_reset(void *tg_instance);
/**
释放Toyger算法
@param tg_instance 传入的算法实例 */ void tg_release(void *tg_instance);
/**
* 获取sdk版本号 * @return TGSDKVersion */ TGSDKInfo tg_get_sdk_info();
std::map<std::string, std::string> tg_get_runtime_info(void *tg_instance);
void tg_set_xnn_handle(void *handle);
std::vector<TGDataInfo> tg_get_collection_data(void *tg_instance);
|