1 SDK 简介
本SDK适用于统信Linux X86平台下的人脸识别系统,为支持C++语言开发的SDK,开发者可在统信Linux X86平台下面进行开发(该版本为统信X86平台)。SDK采用导出动态库so的方式提供接口,SDK附带一个示例工程face_offline_sdk,提供了SDK的各种能力及调用示例。
cpu芯片支持:支持主流国产cpu如、飞腾,海光,兆芯,鲲鹏等。
1.1 功能架构
SDK具有人脸检测、追踪、特征值、静默活体、人脸库、镜头模组集成等诸多功能。架构如下:

- 业务层:1:1比对、1:N识别、活体&镜头模组、视频集成、人脸库
- SDK能力层:人脸检测、人脸追踪、人脸特征值、人脸属性、人脸质量(遮挡、光照、模糊)、人脸注意力、人脸关键点、静默活体
- 底层:鉴权、模型、算法、依赖库(paddle、opencv等)
1.2 版本及兼容性
本SDK支持统信Linux X86平台,推荐使用Linux X86平台上直接编译。
1.3 直接编译和运行
SDK支持在开发板上直接编译运行,步骤如下:
- 安装gcc、g++,可自行百度参考,也可命令如下:
1 - sudo apt update #更新
2 - sudo apt install cmake #安装cmake
3 - sudo apt install gcc #安装gcc
4 - sudo apt install g++ #安装g++
若安装正确,可:
1 gcc --version
2 g++ --version
能看见输出正确的gcc版本号表示安装正确。
- SDK支持登录设备上命令行直接编译,可参考SDK中的编译txt文件,具体命令如下:
1 - 在SDK工程目录:
2 - mkdir build #新建build目录
3 - cd build #进入build目录
4 - cd ..
5 - cmake ..
6 - make -j4 #或 make 编译、根据开发板是否支持多核
7 - ./run.sh #回退到sdk工程目录、执行脚本运行
2 SDK 工程结构

3 授权激活
SDK需要授权激活后才能正常使用,在SDK初始化后,若报错误码-13(错误码参考文档最后定义),一般为没有通过授权。通常,SDK分按设备授权和按应用授权两种方式,大部分采用按设备授权的方式,按应用授权可针对批量大规模客户使用(文档中先只介绍按设备授权,按应用授权可工单或联系百度商务获取另外的文档或技术支持)。按设备授权的方式中,SDK自动激活和激活工具激活需要设备能联网,若设备不能连外网,可采用官网离线激活的方式。
3.1 SDK 自动激活
- 在SDK的目录中有license文件夹,里面存放了2个文件:license.key和license.ini,分别是授权key和授权文件。
- 若在百度官网申请了授权系列号key(16位),可按SDK中的license文件夹中license.key原格式样子用申请的key覆盖填写旧的。
- 在设备能联网的情况下,运行SDK会自动授权激活并拉取新的授权文件license.ini覆盖SDK中的旧文件。
- 设备能联网的情况下,拉取了正确的授权文件后即可通过授权激活,若报错,可根据错误码定义进行激活失败的排查。
3.2 官网离线激活(适应于设备不能联网场景)
- 运行SDK的示例代码face.cpp,可获取设备指纹device id。请查看代码get_device_id部分。
- 通过百度官网填入指纹信息device id和申请到的系列号key,完成离线激活并下载license.zip文件解压后得到license.ini文件和license.key文件。
- 把这2个文件拷贝到face_offline_sdk的license目录下,重新运行SDK即可通过授权激活。
4 SDK 集成及DEMO 示例工程
4.1 SDK 的集成
- 需包含sdk的接口头文件:baidu_face_api.h、struct_info.h(定义sdk的结构体类)。若需要使用face_scene文件夹里面的原子方法,则需要引入整个sdk文件夹的include目录。
- 动态库文件在lib文件夹下,根据平台区分armv7hf或armv8文件夹,集成时需全部引入,各动态库文件说明如下:
| so 文件名称 |
so 文件说明 |
是否可删除 |
| libbaidu_face_api.so |
百度人脸库文件 |
否 |
| libface_sdk.lib |
百度人脸库文件 |
否 |
| libopencv_world.so |
opencv库文件,用来显示图片、视频等 |
否,与之一起的有so.4.1、so.4.1.0 |
| libcurl.so |
联网库文件 |
否,与之一起的有so.4、so.4.1 |
| libssl.so |
openssl库文件(https联网) |
否,与之一起的有so.1.1 |
| libcrypto.so |
openssl库文件(https联网) |
否,与之一起的有so.1.1 |
4.2 SDK 的使用示例
SDK工程face_offline_sdk包含了SDK接口及demo示例工程,其中:
- SDK接口头文件为include目录的baidu_face_api.h,提供了SDK的各接口方法。
- SDK接口的lib库文件为lib目录,根据平台分别放置在armv7hf/armv8目录,baidu_face_api.so和face_sdk.so为人脸sdk的lib库文件,其他为curl、opencv库文件等。
- demo示例工程展示了如何集成百度人脸识别离线SDK,并调用SDK的方法及使用场景化示例等。
在face_offline_sdk中的face.cpp的main()方法中,有使用SDK的各个接口方法示例,接入SDK步骤如下:
1
2int main() {
3
4 BaiduFaceApi *api = new BaiduFaceApi();
5
6 std::cout << "before sdk_init" << std::endl;
7 int res = api->sdk_init(nullptr);
8 std::cout << "after sdk_init" << std::endl;
9 if (res != 0)
10 {
11 std::cout << "sdk init result is:" << res << std::endl;
12 getchar();
13 return 0;
14 }
15 std::time_t time_begin = get_timestamp();
16 FaceDemo *demo = new FaceDemo(api);
17 demo->face_demo();
18 delete demo;
19 std::time_t time_end = get_timestamp();
20 std::cout << "time cost is :" << time_end - time_begin << "ms" << std::endl;
21 std::cout << "before delete api" << std::endl;
22
23 delete api;
24 getchar();
25 std::cout << "end main" << std::endl;
26 return 0;
27}
SDK使用主要三步:
- 初始化实例指针。
- 初始化SDK。
- 调用示例demo,实现需要的功能,末尾需要释放SDK实例化指针api。
另外,可通过is_auth()方法查看是否通过了授权,通常需要通过授权,才可以使用SDK的各种能力。
示例工程中各文件夹/文件说明如下:
| 文件夹或文件名 |
文件说明 |
| face.cpp |
sdk总入口,初始化、模型加载、销毁等,见main方法 |
| face_demo.cpp |
demo总入口,可打开注释运行各类demo示例 |
| face_detect |
人脸检测接口及示例demo |
| face_track |
人脸跟踪接口及示例demo |
| face_feature |
人脸特征值接口及示例demo |
| face_compare |
人脸1:1&1:N(1:N需要先人脸入库)比对、特征值比较等接口及示例demo |
| face_liveness |
可见光RGB、红外IR活体检测、RGB&IR双目摄像头静默活体检测、RGB&DEPTH双目摄像头静默活体检测等 |
| face_manager |
人脸库管理类,包括人脸注册、删除、更新、组管理、人脸信息查询等 |
| face_head_pose |
人脸姿态角接口及示例 |
| face_illumination |
人脸光照检测接口及示例 |
| face_occlusion |
人脸遮挡度检测接口及示例 |
| face_blur |
人脸模糊度检测接口及示例 |
| face_crop |
人脸扣图接口及示例 |
| sdk_info |
实现如读取 sdk 版本号、设备指纹等接口示例 |
5 模型能力加载及模型说明
5.1 模型删减说明
SDK支持按需配置模型和加载能力,不需要的功能可删除对应模型,删除后模型不会加载也不会占用内存。SDK中models文件夹里的模型及是否可删减说明如下:
| 模型文件夹/文件 |
说明 |
是否可删减 |
| detect |
人脸检测模型 |
否 |
| align |
人脸关键点模型 |
否 |
| attribute |
人脸属性 |
是,若不使用该功能可删除 |
| blur |
人脸质量模糊度检测 |
是,若不使用该功能可删除 |
| feature |
人脸特征值 |
是,若不用nir近红外的人脸特征值,可删除feature_nir开头的文件 |
| occlusion |
人脸遮挡检测 |
是,若不使用该功能可删除 |
5.2 模型路径的定制化
- SDK支持模型文件夹models的路径自定义,当SDK初始化api->sdk_init(nullptr)传null时,模型文件夹路径为默认路径(models在SDK现有位置)。
- 也可通过sdk_init中传入绝对路径自定义,例如把models文件夹拷贝到/home/face文件夹下面,可定义:api->sdk_init("/home/face")。
- 此时,授权文件夹license也需要随之放到/home/face文件夹下面,否则会出现授权不通过的问题。
- 另外,若使用了能力自定义的config文件夹,也需要拷贝到/home/face文件夹下面,否则能力定制化不会生效,将使用系统默认配置。
5.3 SDK 的配置文件
SDK提供配置文件face.ini,通过修改配置文件,可输出文件日志、定制化数据库文件db路径等,可通过#注释字段,具体可参见face.ini示例。当sdk_init传nullptr的时候,face.ini默认在SDK的run.sh同目录夹中;若sdk_init传入了绝对路径,则face.ini文件需要放置在传入的绝对路径上层目录中。
5.3.1 修改配置文件输出日志
人脸库路径db文件夹也可定制化,通过修改face.ini文件实现:
- 若face.ini定义字段:DbDir = /home/face,则表示人脸库路径会生成在/home/face路径的face文件夹中。
- 若无需定制,则在face.ini中删除DbDir字段即可,#号为注释或不启用该字段。
5.3.2 修改配置文件变更人脸识别输出结果数量
通常,进行1:N人脸识别的时候,只返回最高分的识别结果。若需要返回更多结果,可通过修改face.ini文件的IdentifyScore字段:
- 如设为80,则返回识别分值大于80的结果(可能多个)。
- 若只想返回1个结果,把字段的值设置为101,则返回1个最高分的识别结果。
- 字段配置如下:
1[IdentifyScore]
2IdentifyScore = 101
5.3.3 修改配置文件启用多因子模式提高静默防攻击能力
在进行RGB静默活体的时候,可通过修改配置文件的字段,打开多因子模型能力,该能力打开后,可提高静默活体防攻击能力(但同时,单帧耗时会有所增加)。打开方法为去掉配置文件face.ini中的#字段(#为注释),使得字段如下:
1[MultiFactor]
2MultiFactor = 1
说明:其中值设为1为启用,设为0不启用,参数前加#为注释该参数,亦不启用。
5.4 能力定制化说明
SDK支持能力自定义,通过读取配置文件的方式进行。SDK默认能力加载无需定制化,若需要定制化,请把SDK根目录里面的conf文件夹重命名为config文件夹,并且在SDK中,按如下说明修改里面的json配置,可起到定制化能力加载的效果(若需定制化修改,请参考示例json,修改json字段的值来达到定制化的目的)。
5.4.1 detect.json (人脸检测能力定制配置文件)
| 参数 |
类型 |
说明 |
| max_face_num |
int |
最大检测的人脸数量,最多支持50,最小1,默认5,可用来设置检测的最小人脸,比如可设为10 |
| scale_radio |
int |
默认-1,表示进行人脸检测时候的图片缩放比率,建议用-1表示传入原图sdk自己缩放(为保证检测效果,该参数建议用默认),若图中存在小人脸,可设为1或者2能检测出来 |
| not_face_thr |
float |
默认0.5,表示非人脸的阈值,取值范围0-1 |
5.4.2 track.json (人脸追踪能力定制配置文件)
| 配置文件名 |
track.json |
| 说明 |
人脸追踪自定义能力配置文件:{"detect_intv_before_track":0.02, "detect_intv_during_track":0.02} |
| 参数 |
类型 |
说明 |
| detect_intv_before_track |
float |
表示人脸追踪前进行人脸检测的时间间隔(单位毫秒) |
| detect_intv_during_track |
float |
表示人脸追踪时候进行人脸检测的时间间隔(单位毫秒) |
5.4.3 action_live.json (动作活体能力定制配置文件)
| 配置文件名 |
action_live.json |
| 说明 |
人脸动作活体自定义能力配置文件:{"eye_open_threshold":0.5,"eye_close_threshold":0.5,"mouth_open_threshold":0.5,"mouth_close_threshold":0.5,"look_up_threshold":0.5,"look_down_threshold":0.5,"turn_left_threshold":0.5,"turn_right_threshold":0.5,"nod_threshold":0.5,"shake_threshold":0.5,"max_cache_num":1} |
| 参数 |
类型 |
说明 |
| eye_open_threshold |
float |
表示人脸动作活体眼睛睁开的置信度阈值 |
| eye_close_threshold |
float |
表示人脸动作活体眼睛闭合的置信度阈值 |
| mouth_open_threshold |
float |
表示人脸动作活体嘴巴张开的置信度阈值 |
| mouth_close_threshold |
float |
表示人脸动作活体嘴巴闭合的置信度阈值 |
| look_up_threshold |
float |
表示人脸动作活体抬头的置信度阈值 |
| look_down_threshold |
float |
表示人脸动作活体低头的置信度阈值 |
| turn_left_threshold |
float |
表示人脸动作活体向左转头的置信度阈值 |
| turn_right_threshold |
float |
表示人脸动作活体向右转头的置信度阈值 |
| nod_threshold |
float |
表示人脸动作活体点头的置信度阈值 |
| shake_threshold |
float |
表示人脸动作活体摇头的置信度阈值 |
| max_cache_num |
float |
最大缓存数,推荐为1不做修改 |
6 功能接口
SDK功能接口的调用可参考各示例cpp文件,接口定义在baidu_face_api.h。SDK实现的主要功能有人脸实时跟踪检测、人脸特征值提取、动作活体、RGB&IR静默活体检测、RGB&DEPTH静默活体检测、人脸注册、人脸更新、组管理、用户管理以及1:1人脸对比、1:N人脸识别、特征值的比对和通过usb或笔记本自带摄像头检测视频帧,返回识别出的人脸信息、人脸属性等,另外支持对人脸检测进行能力加载设置,达到根据设置进行识别的目的。
6.1 人脸检测detect接口
| 方法名 |
detect |
| 说明 |
人脸检测,返回人脸信息 |
| 函数 |
int detect(std::vector &out, const cv::Mat* mat, int type = 0) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
通过引用返回的人脸结构体数组 |
是 |
std::vector |
人脸框信息结构体 |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
请参考示例 |
| type |
检测类型(传0表示rgb可见光人脸检测,1表示nir) |
否 |
int |
0或1,不传默认为0 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.2 人脸跟踪track接口
| 方法名 |
track |
| 说明 |
人脸跟踪,返回人脸信息 |
| 函数 |
int track(std::vector&out, const cv::Mat* mat, int type = 0) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
通过引用返回的人脸结构体数组 |
是 |
std::vector |
人脸跟踪结构体信息 |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
请参考示例 |
| type |
检测类型(传0表示rgb可见光人脸检测,1表示nir) |
否 |
int |
0或1,不传默认为0 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.3 清除人脸跟踪历史接口
| 方法名 |
clear_track_history |
| 说明 |
清除人脸跟踪的历史信息 |
| 函数 |
int clear_track_history(int type = 0) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| type |
检测类型(传0表示rgb可见光人脸检测,1表示nir) |
否 |
int |
0或1,不传默认为0 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
- |
void |
- |
6.4 人脸关键点接口
| 方法名 |
face_landmark |
| 说明 |
人脸关键点,返回人脸关键点信息 |
| 函数 |
int face_landmark(std::vector&out, const cv::Mat* mat, int type) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
通过引用返回的人脸关键点数组 |
是 |
std::vector |
人脸关键点信息结构体 |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
请参考示例 |
| type |
检测类型(传0可见光生活照,1表示近红外) |
是 |
int |
- |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.5 人脸扣图接口
| 方法名 |
face_crop |
| 说明 |
人脸扣图,返回人脸扣图(仅支持单人脸抠图) |
| 函数 |
int face_crop(cv::Mat&out, const cv::Mat* mat) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
抠图结果图片帧 |
是 |
Opencv mat |
- |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
- |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.12 人脸质量
人脸质量判断可由以下几个因素自由组合综合判断,如姿态角、光照、遮挡、模糊以及最佳人脸。人脸质量判断的推荐阈值:人脸检测置信度>0.63、遮挡度<0.75、人脸姿态角<20、人脸模糊度<0.8、最优人脸>50。
6.12.1 人脸姿态角接口
| 方法名 |
face_head_pose |
| 说明 |
人脸姿态角检测,返回人脸姿态角信息 |
| 函数 |
int face_head_pose(std::vector&out, const cv::Mat* mat) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
通过引用返回的人脸姿态角数组 |
是 |
std::vector |
人脸姿态角信息结构体 |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
请参考示例 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.12.2 人脸光照检测接口
| 方法名 |
face_illumination |
| 说明 |
人脸光照检测(光照分值0-255,分值越大光照越强) |
| 函数 |
int face_illumination(std::vector&out, const cv::Mat* mat) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
通过引用返回的人脸光照信息数组 |
是 |
std::vector |
光照置信度结构体 |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
请参考示例 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.12.3 人脸遮挡检测接口
| 方法名 |
face_occlusion |
| 说明 |
人脸遮挡检测(遮挡分值0-1,分值越大遮挡度越高) |
| 函数 |
int face_occlusion(std::vector& out, const cv::Mat* mat) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
通过引用返回的人脸遮挡结构体数组 |
是 |
std::vector |
遮挡置信度结构体 |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
请参考示例 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.12.4 人脸模糊度检测接口
| 方法名 |
face_blur |
| 说明 |
人脸模糊检测(模糊度分值0-1,分值越大模糊度越高) |
| 函数 |
int face_blur(std::vector &out, const cv::Mat *mat) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
通过引用返回的人脸模糊结构体数组 |
是 |
std::vector |
模糊度结构体 |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
请参考示例 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.13 特征值及人脸比对(1:1)
人脸比对的原理实际是特征值比对,通过提取图片中的人脸特征值,根据特征值调用compare_feature接口进行比对,推荐比对分值超过80分为同一人,可根据实际检测比对情况动态调整。
人脸1:1比对流程如下:

6.13.1 人脸特征值接口
| 方法名 |
face_feature |
| 说明 |
人脸特征值提取,并返回人脸信息 |
| 函数 |
int face_feature(std::vector &out_fea, std::vector &out_box, const cv::Mat *mat, int type = 0) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out_fea |
通过引用返回的人脸特征值结构体数组 |
是 |
std::vector |
人脸特征值结构体信息 |
| out_box |
通过引用返回的人脸框结构体数组 |
是 |
std::vector |
人脸框结构体信息 |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
请参考示例 |
| type |
检测类型(传0可见光生活照特征值,1近红外特征值) |
否 |
int |
0或1,未传默认为0 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.13.2 人脸活体特征值接口
| 方法名 |
liveness_feature |
| 说明 |
人脸特征值提取,同时有活体校验,并返回活体分值、人脸信息 |
| 函数 |
int liveness_feature(std::vector &out_fea, std::vector &out_box, float& score, const cv::Mat *mat, int type = 0) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| out_fea |
通过引用返回的人脸特征值结构体数组 |
是 |
std::vector |
人脸特征值结构体信息 |
| out_box |
通过引用返回的人脸框结构体数组 |
是 |
std::vector |
人脸框结构体信息 |
| mat |
传入的opencv视频帧 |
是 |
Opencv mat |
请参考示例 |
| score |
返回的活体分值 |
是 |
float |
- |
| type |
检测类型(传0可见光特征值,1表示近红外特征值) |
否 |
int |
0或1,未传默认为0 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
<=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 |
int |
- |
6.13.3 特征值比对接口
| 方法名 |
compare_feature |
| 说明 |
人脸特征值比对,返回比对分值 |
| 函数 |
float compare_feature(Feature f1, Feature f2, int type) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| f1 |
人脸特征值结构体 |
是 |
Feature* |
人脸特征值结构体信息(仅支持单个结构体的比对) |
| f2 |
人脸特征值结构体 |
是 |
Feature* |
人脸特征值结构体信息(仅支持单个结构体的比对) |
| type |
特征值类型(0,1) |
否 |
int |
0:生活照,1:近红外特征值,未传默认为0 |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
特征值比对分值 |
float |
- |
6.13.4 人脸1:1 比对接口
| 方法名 |
match |
| 说明 |
人脸比对,返回人脸比对分值 |
| 函数 |
int match(const cv::Mat& img1, const cv::Mat& img2, int type) |
| 请求参数 |
说明 |
必须 |
类型 |
示例描述 |
| img1 |
传入可见光的opencv图片帧 |
是 |
cv::Mat |
- |
| img2 |
传入可见光的opencv图片帧 |
是 |
cv::Mat |
- |
| type |
比对类型(0,1) |
否 |
int |
0:生活照模式,包含1寸照;1:近红外特征值,未传默认为0(1寸或2寸的证据照也推荐当作生活照模式) |
| 返回信息 |
说明 |
类型 |
示例描述 |
| 函数的返回 |
人脸比对分值(同特征值比对分值结果应该是float,这里返回int是做了四舍五入) |
int |
- |
6.14 静默活体
6.14.1 rgb 静默活体接口
| 方法名 |
rgb_liveness |
| 说明 |
rgb可见光单目静默活体(推荐rgb+nir或rgb+depth进行双目活体校验),活体推荐通过分值为0.8 |
| 函数 |
int rgb_liveness(std::vector& out, float &score, const cv::Mat* mat) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
返回的人脸框结构体数组 |
是 |
std::vector |
人脸框结构体(多人则返回最大人脸) |
| score |
返回的动作活体分值 |
是 |
float |
- |
| mat |
传入的opencv视频帧 |
是 |
Mat |
视频帧 |
| 返回字段描述 |
说明 |
类型 |
示例描述 |
| 返回字段 |
>=0返回人脸个数,<0时候为错误码 |
int |
- |
6.14.2 nir 静默活体接口
| 方法名 |
nir_liveness |
| 说明 |
Nir近红外单目静默活体(推荐rgb+nir或rgb+depth进行双目活体校验) |
| 函数 |
int nir_liveness(std::vector& out, float &score, const cv::Mat* mat) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
返回的人脸框结构体数组 |
是 |
std::vector |
人脸框结构体(多人则返回最大人脸) |
| score |
返回的动作活体分值 |
是 |
float |
- |
| mat |
传入的opencv视频帧 |
是 |
Mat |
视频帧 |
| 返回字段描述 |
说明 |
类型 |
示例描述 |
| 返回字段 |
>=0返回人脸个数,<0时候为错误码 |
int |
- |
6.14.3 rgb+depth 双目静默活体接口
| 方法名 |
rgb_depth_liveness |
| 说明 |
rgb+depth双目静默活体 |
| 函数 |
int rgb_depth_liveness(std::vector &out, float &rgbscore, float &depthcore, const cv::Mat rgb, char depth) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| out |
返回的人脸框结构体数组 |
是 |
std::vector |
人脸框结构体(多人则返回最大人脸) |
| rgbscore |
返回的rgb动作活体分值 |
是 |
float |
- |
| depthscore |
返回的depth动作活体分值 |
是 |
float |
- |
| rgb |
传入的opencv视频帧 |
是 |
Mat |
视频帧 |
| depth |
传入的二进制深度数据 |
是 |
Char* |
视频帧 |
| 返回字段描述 |
说明 |
类型 |
示例描述 |
| 返回字段 |
>=0返回人脸个数,<0时候为错误码 |
int |
- |
6.15 人脸库管理
SDK提供支持5万以下的人脸库管理,采用的是sqlite数据库,SDK启动后会自动生成db文件夹和face.db文件(人脸库数据文件)。db文件夹可手动删除,删除后人脸数据库即被整体删除,SDK重启后会自动重新创建新库。人脸库数据结构可采用sqlLiteExpert等可视化工具查看人脸库表结构。人脸库创建后有三张表,feature表(用来保存人脸特征值)、user表(用来保存人脸用户信息,如userid、groupid以及人脸图片信息、用户信息等)以及user_group表(用户组表)。
人脸库可按组(group_id)划分,组就好比一个集团的子公司,人脸注册或查找既可以按整个库查找,也可以按组(子公司)查找,按组查找速度更快(范围小)。用户id(user_id)是用来标识人脸用户的唯一id,组id(group_id)是用来标识组(子公司)的唯一id。用户信息(user_info)可作为用户id的说明,如标识用户名称、住址等信息,也可不填写。人脸的比对或识别,归根结底是人脸特征值的比对。人脸库的保存实际上是保存了对应用户user_id的特征值在人脸库上,同时保存了用户user_id和group_id及其对应关系(一个用户对应一张人脸、一个特征值数据)。除user_info字段(用户信息)支持中文外,user_id和group_id仅支持英文、数字和下划线的参数组合。人脸1:N识别返回识别的最高分和用户信息,推荐分值超过80为识别成功。
人脸库1:N识别流程图如下:

6.15.1 人脸注册接口(通过传入图片帧)
| 方法名 |
user_add |
| 说明 |
用户注册,该接口支持传入opencv图片帧(通常指生活照,1寸或2寸的证件照也可以用这种类型)(图片帧注册会把人脸图片缩略图入库) |
| 函数 |
void useradd(std::string& res, const cv::Mat img, const char userid, const char groupid, const char userinfo="") |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| img |
Opencv图片帧指针 |
是 |
cv::Mat * |
人脸图片opencv图片帧指针 |
| user_id |
用户id |
是 |
const char* |
用户id(由数字、字母、下划线组成),长度限制128B |
| group_id |
组id |
是 |
const char* |
用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| user_info |
用户资料 |
否 |
const char* |
256个字符以内 |
| 返回字段描述 (json) |
说明 |
| errno及msg映射 |
0:Success;<0:失败的原因 |
6.15.2 人脸注册接口(通过传入特征值)
| 方法名 |
user_add |
| 说明 |
用户注册,该接口通过传入提取的人脸图片特征值注册(特征值注册无法把人脸缩略图入库) |
| 函数 |
void user_add(std::string& res, Feature f1, const char user_id, const char group_id, const char user_info="") |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| f1 |
特征值结构体 |
是 |
Feature* |
人脸特征值结构体 |
| user_id |
用户id |
是 |
const char* |
用户id(由数字、字母、下划线组成),长度限制128B |
| group_id |
组id |
是 |
const char* |
用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| user_info |
用户资料 |
否 |
const char* |
256个字符以内(中文数减半) |
| 返回字段描述 (json) |
说明 |
| errno及msg映射 |
0:Success;<0:失败的原因 |
6.15.3 人脸更新接口
| 方法名 |
user_update |
| 说明 |
人脸更新 |
| 函数 |
void userupdate(std::string& res, const cv::Mat img, const char userid, const char groupid, const char userinfo="") |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| img |
opencv图片帧指针 |
是 |
cv::Mat* |
人脸图片opencv图片帧指针 |
| user_id |
用户id |
是 |
const char* |
用户id(由数字、字母、下划线组成),长度限制128B |
| group_id |
组id |
是 |
const char* |
用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| user_info |
用户信息 |
否 |
const char* |
用户资料,长度限制256B |
| 返回字段描述 (json) |
说明 |
| errno及message映射 |
0:Success;<0:失败的原因 |
6.15.4 用户删除接口
| 方法名 |
user_delete |
| 说明 |
用户删除 |
| 函数 |
void userdelete(std::string&res, const char userid, const char group_id) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| user_id |
用户id |
是 |
const char* |
用户id(由数字、字母、下划线组成),长度限制128B |
| group_id |
组id |
是 |
const char* |
用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| 返回字段描述 (json) |
说明 |
| errno及msg映射 |
0:Success;<0:失败的原因 |
| data字段 |
log_id:string,请求日志标识 |
6.15.5 创建用户组接口
| 方法名 |
group_add |
| 说明 |
创建用户组 |
| 函数 |
void group_add(std::string&res, const char* group_id) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| group_id |
用户组id |
是 |
const char* |
用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| 返回字段描述 (json) |
说明 |
| errno及msg映射 |
0:Success;<0:失败的原因 |
| data字段 |
log_id:string,请求日志标识 |
6.15.6 用户组删除接口
| 方法名 |
group_delete |
| 说明 |
用户组删除 |
| 函数 |
void group_delete(std::string&res, const char* group_id) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| group_id |
组id |
是 |
const char* |
用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| 返回字段描述 (json) |
说明 |
| errno及msg映射 |
0:Success;<0:失败的原因 |
| data字段 |
log_id:string,请求日志标识 |
6.15.7 用户信息查询接口
| 方法名 |
get_user_info |
| 说明 |
用户信息查询接口 |
| 函数 |
void getuserinfo(std::string&res, const char userid, const char groupid) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| user_id |
用户id |
是 |
const char* |
用户id(由数字、字母、下划线组成),长度限制128B |
| group_id |
组id |
是 |
const char* |
用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| 返回字段描述 (json) |
说明 |
| errno及msg映射 |
0:Success;<0:失败的原因 |
| data字段 |
log_id:string,请求日志标识;result:array,识别结果列表;group_id:string,组id;face_token:string,人脸特征的唯一标识;user_info:string,用户信息;create_time:string,人脸首次注册时间 |
6.15.8 用户人脸图片查询接口
| 方法名 |
get_user_image |
| 说明 |
用户人脸图片查询接口 |
| 函数 |
int get_user_image(cv::Mat & img, const char user_id, const char group_id) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| img |
通过引用返回的图片结果 |
是 |
cv::Mat & |
- |
| user_id |
用户id |
是 |
const char* |
用户id(由数字、字母、下划线组成),长度限制128B |
| group_id |
组id |
是 |
const char* |
用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| 返回字段描述 |
说明 |
类型 |
示例描述 |
| 返回值 |
0为成功,其他为错误码 |
int |
- |
6.15.9 用户组列表查询接口
| 方法名 |
get_user_list |
| 说明 |
用户组列表查询接口 |
| 函数 |
void get_user_list(std::string&res, const char* group_id, int start = 0, int length = 100) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| group_id |
用户组id |
是 |
const char* |
用户组id |
| start |
查询起始序号 |
否 |
int |
默认值为0 |
| length |
返回数量 |
否 |
int |
默认值100,最大值1000 |
| 返回字段描述 (json) |
说明 |
| errno及msg映射 |
0:Success;<0:失败的原因 |
| data字段 |
log_id:string,请求日志标识;user_id_list:array,user_id列表数组 |
6.15.10 人脸库人脸数量查询
| 方法名 |
db_face_count |
| 说明 |
查询数据库人脸数量(传入组id表示查询该组的人脸数量,null表示查整个库的人脸数量) |
| 函数 |
int db_face_count(const char* group_id = nullptr) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| group_id |
组id |
是 |
const char* |
人脸分组的组id(传null表示查询整个库的数量) |
| 返回示例 |
说明 |
类型 |
示例描述 |
| 返回值 |
>=0(返回的数量) |
int |
- |
6.15.11 群组列表查询接口
| 方法名 |
get_group_list |
| 说明 |
组列表查询 |
| 函数 |
void get_group_list(std::string& res, int start = 0, int length = 100) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| start |
起始序号 |
否 |
Int |
默认值为0,从0开始 |
| length |
返回数量 |
否 |
Int |
默认值为100,最大为1000 |
| 返回字段描述 (json) |
说明 |
| errno及msg映射 |
0:Success;<0:失败的原因 |
| data字段 |
log_id:string,请求日志标识;group_id_list:array,group_id列表数组 |
6.15.12 人脸识别接口
人脸识别(1:N)结果,通过传入人脸特征值或图片进行人脸的1:N识别,即传入的1和人脸库的N进行识别(人脸库自动创建,需要通过user_add等接口把人脸注册入库),人脸识别的返回默认大于80分的识别结果。可通过配置文件face.ini中的字段IdentifyScore的分值控制识别返回的结果,若该字段分值设为101,则默认返回1个识别结果(1:N的识别最高分结果)。
6.15.12.1 人脸识别接口(1:N) (传入opencv图片帧)
| 方法名 |
identify |
| 说明 |
人脸识别(1:N),可传入人脸组,比对某个组的所有人脸(人脸库可按单位分组,缩小组范围,减少识别比对时间),返回最高分的用户及信息 |
| 函数 |
void identify(std::string&res, const cv::Mat img, const char group_id_list, const char* user_id, int type = 0) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| group_id_list |
组列表 |
是 |
const char* |
组列表 |
| user_id |
用户id |
否 |
const char* |
用户id |
| type |
特征值类型 |
否 |
int |
特征值类型(0是生活照、1证件照、2近红外,参考特征值提取),未传默认为0 |
| 返回字段描述 |
说明 |
类型 |
示例描述 |
| 比对分值 |
- |
float |
- |
6.15.12.2 人脸识别接口(1:N)(传入特征值)
| 方法名 |
identify |
| 说明 |
人脸识别(1:N),可传入人脸组,比对某个组的所有人脸(人脸库可按单位分组,缩小组范围,减少识别比对时间),返回最高分的用户及信息 |
| 函数 |
void identify(std::string&res, Feature f1, const char group_id_list, const char* user_id, int type = 0) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| f1 |
特征值结构体 |
是 |
Feature* |
特征值结构体 |
| group_id_list |
组列表 |
是 |
const char* |
组列表 |
| user_id |
用户id |
否 |
const char* |
用户id |
| type |
特征值类型 |
否 |
int |
特征值类型(0是生活照、1证件照、2近红外,参考特征值提取),未传默认为0 |
| 返回字段描述 |
说明 |
类型 |
示例描述 |
| 比对分值 |
- |
float |
- |
6.15.12.3 人脸识别接口(1:N) (传入opencv图片帧)
| 方法名 |
identify_with_all |
| 说明 |
人脸识别(1:N),和整个人脸库比对,返回最高分的用户及信息 |
| 函数 |
void identify_with_all(std::string& res, const cv::Mat *img, int type = 0) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| img |
opencv图片帧 |
是 |
cv::Mat * |
人脸opencv图片帧 |
| type |
特征值类型 |
否 |
int |
特征值类型(0是生活照,包含1寸照、1网格证件照、2近红外,参考特征值提取),未传默认为0 |
| 返回字段描述 |
说明 |
类型 |
示例描述 |
| 比对分值 |
- |
float |
- |
6.15.12.4 人脸识别接口(1:N) (传入特征值)
| 方法名 |
identify_with_all |
| 说明 |
人脸识别(1:N),和整个人脸库比对,返回最高分的用户及信息 |
| 函数 |
void identify_with_all(std::string& res, Feature *f1, int type = 0) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| res |
返回的结果 |
是 |
string |
json数据 |
| f1 |
特征值结构体 |
是 |
Feature* |
特征值结构体 |
| type |
特征值类型 |
否 |
int |
特征值类型(0是生活照、1证件照、2近红外,参考特征值提取),未传默认为0 |
| 返回字段描述 |
说明 |
类型 |
示例描述 |
| 比对分值 |
- |
float |
- |
6.16 SDK 系统信息接口
6.16.1 获取SDK 版本号接口
| 方法名 |
sdk_version |
| 说明 |
通过引用返回sdk版本号 |
| 函数 |
void sdk_version(std::string& version) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| version |
返回的sdk版本号结果 |
是 |
string |
如:6.3.3 |
6.16.2 获取设备指纹接口
| 方法名 |
get_device_id |
| 说明 |
通过引用返回sdk的设备指纹信息(可用来标识sdk的唯一性) |
| 函数 |
void get_device_id(std::string& device_id) |
| 参数 |
说明 |
必须 |
类型 |
示例描述 |
| device_id |
返回的sdk设备指纹结果 |
是 |
string |
如:0BAF96961A8377AB74797B05F7F2C805 |
7 结构体描述
7.1 人脸跟踪信息结构体
| 结构体名 |
TrackFaceInfo |
| 说明 |
人脸跟踪信息结构体 |
1struct TrackFaceInfo {
2 long face_id;
3 FaceBox box;
4 Landmarks facelandmarks;
5 }
| 参数 |
类型 |
说明 |
| face_id |
long |
人脸id |
| box |
FaceBox |
人脸框结构体 |
| facelandmarks |
Landmarks |
人脸关键点结构体 |
7.2 人脸框信息结构体
1struct FaceBox
2{
3 int index;
4 float center_x;
5 float center_y;
6 float width;
7 float height;
8 float score;
9}
| 参数 |
类型 |
说明 |
| index |
int |
人脸索引值 |
| center_x |
float |
人脸中心点x坐标 |
| center_y |
float |
人脸中心点y坐标 |
| width |
float |
人脸宽度 |
| height |
float |
人脸高度 |
| score |
float |
人脸置信度 |
7.3 人脸关键点信息结构体
| 结构体名 |
Landmarks |
| 说明 |
人脸关键点信息结构体 |
1struct Landmarks {
2 int index;
3 int size;
4 float data[144];
5 float score;
6}
| 参数 |
类型 |
说明 |
| index |
int |
人脸关键点索引 |
| size |
int |
- |
| data[144] |
float |
人脸关键点数据 |
| score |
float |
人脸关键点置信度 |
7.4 人脸特征值结构体
1struct Feature {
2 int size;
3 float data[128];
4}
| 参数 |
类型 |
说明 |
| size |
int |
- |
| data[128] |
float[] |
128个浮点值数组 |
7.5 人脸姿态角结构体
| 结构体名 |
HeadPose |
| 说明 |
人脸姿态角结构体 |
1struct HeadPose {
2 float yaw;
3 float roll;
4 float pitch;
5}
| 参数 |
类型 |
说明 |
| yaw |
float |
左右偏转角 |
| roll |
float |
与人脸平行平面内的头部旋转角 |
| pitch |
float |
上下偏转角 |
7.6 人脸模糊度置信度结构体
1struct Blur {
2 float score;
3}
| 参数 |
类型 |
说明 |
| score |
float |
置信度分值 |
7.7 人脸光照置信度结构体
| 结构体名 |
Illumination |
| 说明 |
光照置信度结构体 |
1struct Illumination {
2 int score;
3}
7.8 人脸遮挡置信度结构体
| 结构体名 |
Illumination |
| 说明 |
人脸遮挡置信度结构体 |
1struct Illumination {
2 float left_eye;
3 float right_eye;
4 float nose;
5 float mouth;
6 float left_cheek;
7 float right_cheek;
8 float chin;
9}
| 参数 |
类型 |
说明 |
| left_eye |
float |
左眼遮挡置信度 |
| right_eye |
float |
右眼遮挡置信度 |
| nose |
float |
鼻子遮挡置信度 |
| mouth |
float |
嘴巴遮挡置信度 |
| left_cheek |
float |
左脸遮挡置信度 |
| right_cheek |
float |
右脸遮挡置信度 |
| chin |
float |
下巴遮挡置信度 |
7.9 静默活体置信度结构体
| 结构体名 |
LivenessScore |
| 说明 |
活体信度结构体 |
1struct LivenessScore {
2 float score;
3}
| 参数 |
类型 |
说明 |
| score |
float |
置信度分值 |
8 多端特征值对齐
- 统信 X86 SDK支持与安卓特征值对齐,仅对齐V8.X系列,如安卓V8.X, Linux Arm V8.x,Windows V8.X,且仅支持RGB可见光特征值对齐。
- 跟云端提取的特征值同步,可参考https://ai.baidu.com/ai-doc/FACE/Okg7edktq
,对齐V8.X系列即可。
- 在统信 ARM SDK中,提取的128个float特征值数组需保存为二进制数据,即可与安卓的512个byte字节流数据对齐。
- SDK提供float数组与二进制buffer互转的示例代码,可参考util文件夹中的FeatureAlign类。
9 多线程运行
- SDK支持多实例的多线程使用,具体示例可参考multi_thread文件夹。
- 单个实例不支持多线程同时调用人脸检测(detect)和特征值提取(face_feature)等接口。
- 多个实例可多线程调用不同接口,例如一个实例调用detect,另一个实例调用face_feature。
- 使用多个实例时,需new不同的BaiduFaceApi实例,调用多次sdk_init方法,销毁时需销毁所有实例,避免内存泄漏。
10 错误码及错误信息
| 错误码 |
错误内容 |
错误描述 |
| 0 |
SUCCESS |
成功 |
| -1 |
ILLEGAL_PARAMS |
失败或非法参数 |
| -2 |
MEMORY_ALLOCATION_FAILED |
内存分配失败 |
| -3 |
INSTANCE_IS_EMPTY |
实例对象为空 |
| -4 |
MODEL_IS_EMPTY |
模型内容为空 |
| -5 |
UNSUPPORT_ABILITY_TYPE |
不支持的能力类型 |
| -6 |
UNSUPPORT_INFER_TYPE |
不支持的预测库类型 |
| -7 |
NN_CREATE_FAILED |
预测库对象创建失败 |
| -8 |
NN_INIT_FAILED |
预测库对象初始化失败 |
| -9 |
IMAGE_IS_EMPTY |
图像数据为空 |
| -10 |
ABILITY_INIT_FAILED |
人脸能力初始化失败 |
| -11 |
ABILITY_UNLOAD |
人脸能力未加载 |
| -12 |
ABILITY_ALREADY_LOADED |
人脸能力已加载 |
| -13 |
NOT_AUTHORIZED |
未授权 |
| -14 |
ABILITY_RUN_EXCEPTION |
人脸能力运行异常 |
| -15 |
UNSUPPORT_IMAGE_TYPE |
不支持的图像类型 |
| -16 |
IMAGE_TRANSFORM_FAILED |
图像转换失败 |
| -1001 |
SYSTEM_ERROR |
系统错误 |
| -1002 |
PARARM_ERROR |
参数错误 |
| -1003 |
DB_OP_FAILED |
数据库操作失败 |
| -1004 |
NO_DATA |
没有数据 |
| -1005 |
RECORD_UNEXIST |
记录不存在 |
| -1006 |
RECORD_ALREADY_EXIST |
记录已经存在 |
| -1007 |
FILE_NOT_EXIST |
文件不存在 |
| -1008 |
GET_FEATURE_FAIL |
提取特征值失败 |
| -1009 |
FILE_TOO_BIG |
文件太大 |
| -1010 |
FACE_RESOURCE_NOT_EXIST |
人脸资源文件不存在 |
| -1011 |
FEATURE_LEN_ERROR |
特征值长度错误 |
| -1012 |
DETECT_NO_FACE |
未检测到人脸 |
| -1013 |
CAMERA_ERROR |
摄像头错误或不存在 |
| -1014 |
FACE_INSTANCE_ERROR |
人脸引擎初始化错误 |
| -1015 |
LICENSE_FILE_NOT_EXIST |
授权文件不存在 |
| -1016 |
LICENSE_KEY_EMPTY |
授权序列号为空 |
| -1017 |
LICENSE_KEY_INVALID |
授权序列号无效 |
| -1018 |
LICENSE_KEY_EXPIRE |
授权序列号过期 |
| -1019 |
LICENSE_ALREADY_USED |
授权序列号已被使用 |
| -1020 |
DEVICE_ID_EMPTY |
设备指纹为空 |
| -1021 |
NETWORK_TIMEOUT |
网络超时 |
| -1022 |
NETWORK_ERROR |
网络错误 |
| -1023 |
CONF_INI_UNEXIST |
配置文件face.ini不存在 |
11 常见问题
11.1 SDK推荐在统信X86设备上直接编译运行,需安装GCC/G++/CMAKE,也支持在Ubuntu等X86机器上交叉编译。
11.2 工程运行异常时,可在face.ini中设置LogType=1,开启SDK日志模式,通过输出的错误码日志定位问题。
11.3 模型文件可定制化:在main方法入口的sdk_init中传入模型文件夹绝对路径;不定制则传入NULL,默认使用SDK的models文件夹。
11.4 激活文件不可跨设备使用:离线SDK与设备绑定,每个设备对应唯一key和license文件;同一设备下可将Release目录的license.ini和license.key拷贝到其他SDK使用。
11.5 仅支持RELEASE模式,不支持DEBUG模式。
11.6 支持X86平台,需根据对应平台运行。
11.7 人脸库参数限制:用户信息user_info支持中文,其他管理参数仅支持英文、数字、下划线组合;工程路径建议避免中文,否则可能影响人脸库创建。
11.8 特征值多端对齐:人脸8.0系列SDK中,安卓和Linux端生活照模式特征值对齐;Linux端需将128个float数据转为二进制保存,即可与安卓512个byte二进制数据对齐;Linux人脸库数据采用BASE64编码保存。
11.9 多线程支持:支持多实例的多线程运行,具体参考multi_thread示例。
11.10 多人脸检测设置:SDK默认检测1个人脸,需修改detect.json配置文件实现多人脸检测。