Linux-ARM-SDK
概述
- 百度人脸离线识别SDK Linux arm 版本,主要支持RK3288、3399芯片ubuntu平台,可登陆百度智能云控制台console后台获取SDK部署包
- 针对海思3516DV300、RV1109/1126、晶视CV1825等Linux芯片平台,有单独的专版SDK,请线下联系商务咨询获取专版SDK
-海思3516DV300 官网地址:https://ai.baidu.com/tech/face/offline-sdk/hisilicon
-RV1109/RV1126 官网地址:https://ai.baidu.com/tech/face/offline-sdk/rv1109
版本日志
| 版本 | 日期 | 更新说明 |
|---|---|---|
| v8.0 | 2025.11.14 | 1、8.0 新模型 2、人脸识别返回多个数据(根据配置) 3、抠图优化 4、支持小人脸图片检测 5、增加交叉编译说明 |
| v7.3 | 2023.06.12 | 1、更新 rgb 和 depth 等活体模型 2、优化口罩检测模型 3、支持多实例多线程 4、支持在线激活 5、新增三分类表情识别能力 |
| v7.2 | 2022.12.20 | 1、修改人脸注册不支持中文的问题 2、检测人脸姿态角可通过 head_pose 实现 |
| v7.1 | 2021.12.28 | 添加人脸库、业务层封装等 |
| v7.0 | 2021.08.30 | 模型能力升级到7.0,修改设备指纹的小部分bug等 |
| v5.0 | 2021.04.30 | 1、升级了人脸检测模型,重点优化了复杂光线场景下的人脸检测能力; 2、升级了RGB、NIR和Depth三种模态的活体检测模型,优化后2D照片攻击防御能力和复杂光线场景真人活体检测能力提升明显; 3、升级了最新的人脸特征抽取与比对模型(人脸识别模型),升级后识别模型对老人、儿童等极端年龄群体的泛化行提升明显; 4、在RK3288主板上,端到端全流程耗时缩短到<300ms; 5、增加了最优图像帧功能,提升识别准确率; 6、修复跨平台第三方依赖缺失问题; 7、兼容性拓展:兼容三星4418、6818开发板,同时在支持ubuntu系统的RK3288验证开发; 注:由于该版本的SDK更换了特征抽取与比对的模型,因此从旧版本升级到该版本的用户需要重新注册人脸底库进行刷库 |
| v4.1 | 2020.07.20 | 1、升级Paddle Lite版本,降低端到端全流程人脸识别耗时; 2、增加口罩检测功能,支持对用户是否佩戴口罩这个属性进行检测; 3、新增激活工具,该工具支持在连网状态下通过授权序列号完成激活 |
| v4.0 | 2020.02.27 | 1、全面升级人脸检测、关键点检测模型,提升人脸检测和追踪的准确率,解决部分场景下的人脸漏检问题; 2、全面升级三模态活体检测模型,提升RGB、NIR、Depth三模态活体检测的准确率; 3、全面优化人脸特征抽取和特征比对模型,提升人脸识别模型的准确率和泛化性; 4、全面重构SDK的接口设计,降低二次开发难度的同时提升了二次开发的灵活性 |
1. 设计背景
- 场景特点:
-- 网络:对于无网、局域网等情况,无法连接公网,API 方式无法运作。如政府单
位、金融保险、教育机构等,其中内网情况最为常见,私有化部署是项目开展的前提条件。
-- 安全:即使可以连接外网,因为人脸数据的敏感性,许多客户不希望将人脸数据传入百度服务器,如大学学生照片、部分企业员工数据等,API 形式也往往不被接受。
-- 速度:由于各地网络线路、机房部署、图片采集方式等诸多原因,API 形式往往耗时较高,容易存在部分请求耗时过长的情况,容易影响业务正常运转。
-- 稳定:API 形式容易受网络抖动、机房故障、线上连带 bug 等影响,存在一定的不稳定因素,可用性保障,往往成为在线调用最容易出现问题的地方。
- 客户特点:
-- 1:N-小型人脸库检索:多为通道通行、固定区域人群验证等需求,如写字楼闸机
门禁、企业考勤打卡等,人脸库范围较小,且不易经常变动。
-- 1:1-自有数据源对比:将当前采集的人脸,与其他数据源中的人脸进行对比,如
身份证芯片照、教务系统图片、档案图片等,进行快速的 1:1 对比验证。
- 核心需求:
-- 基础的人脸采集:包含人脸检测、跟踪、捕获、质量校验等基础功能,获取符合识 别条件的人脸。为之前的客户端 SDK 的标准功能,离线版本 SDK 保留以上所有能力。
-- 本地特征抽取:所有在 SDK 中运行的人脸图片,都可以完成本地特征抽取,以便进行对比或识别操作。
-- 1:1 对比:支持两张图片的相似度对比,可直接传入图片,也可调用本地某个人脸特征;
-- 1:N 搜索:支持一定库大小的人脸查找,在指定的人脸集合中查找最相似的人脸,并返回相似度分值;
2. 名词解释
| 名词 | 定义 |
|---|---|
| SDK | linux arm C++离线人脸识别 sdk |
| g++ | linux c++编译工具,如 rk3288、3399 等系统一般自带 |
| license | 人脸识别激活所需要的激活文件,文档介绍了三种激活方式 |
| key | 人脸激活所需的序列号,可从百度 AI 官网申请(ai.baidu.com) |
| feature | 人脸特征值,用来表示人脸特征的 128 个 float 浮点值 |
| landmark | 人脸关键点(72 个关键点) |
| face_token | 对应人脸图片的唯一编码,若一个人上传了 2 张不同图片,则可能有 2 个不同 的 face_token,它和图片一一对应 |
3. SDK 简介
本 SDK 适应于 Linux arm 平台下的人脸识别系统,为支持 c++语言开发的 SDK,开发 者可在 Linux arm 平台下面进行开发(支持 armv7hf、armv8 平台)。SDK 采用导出动 态库 so 的方式提供接口,SDK 附带一个示例工程 face_offline_sdk,提供了 SDK 的各种能力及调用示例。
3.1 功能架构
sdk 具有人脸检测、追踪、特征值、静默活体、人脸库、镜头模组集成等诸多功能。架构如下图所示:

3.2 版本及兼容性
本 SDK 支持 armv7hf、armv8 两种 Liunx arm 平台。各平台推荐代表如: armv7hf 架构的如 rk3288 系列。
armv8 架构的如 rk3399 系列。
推荐使用 Linux arm 平台上直接编译。
3.3 编译和运行
3.3.1 板子上编译和运行
SDK 支持在开发板上直接编译运行。首先要安装gcc和g++(可自行百度一下方法)。 利用命令如:
1sudo apt update #更新
2sudo apt install build-essential #安装
另外:若开发板还没有 cmake,也需要安装,并加入环境变量。安装后可命令行查看一下是否正常。
1gcc --version #查看gcc
2g++ --version #查看g++
3cmake --version #查看cmake
SDK 支持 ssh 网络登录开发板直接命令行编译。可参考 SDK 中的编译 txt 文件进行
编译运行。
在 SDK 工程目录:
1mkdir build #新建 build 目录
2cd build #进入 build 目录
3cmake-DARCH_ABI=armv8.. #根据平台分别用命令armv7hf或armv8
4make -j4 #或 make 编译、根据开发板是否支持多核
5cd .. #回退到 sdk 工程目录
6./run.sh armv8 #不同平台请分别修改为如 armv7hf 或 armv8。
3.3.2 交叉编译和运行(适应于 armv8, armv7hf 请自行参考实现)
SDK 也支持在 x86 宿主机 ubuntu18.04 及以上进行交叉编译。
交叉编译工具链: gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu 可去 arm 官网下载: https://developer.arm.com/downloads/-/gnu-a
下载后按如下步骤操作:
1)解压到指定路径 (请正确填写 tar 名称)
1mkdir -p /opt/gcc/linux-x86/arm/
2tar Jxvf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu -C /opt/gcc/linux-x86/arm/
2)加入环境变量
1sudo vim /etc/profile #编辑环境变量文件,加入下面一行
2export PATH=/opt/gcc/linux-x86/arm/gcc-arm-11.2-2022.02-x86_64-aarch64-
3none-linux-gnu/bin:$PATH
4source /etc/profile #保存让环境变量生效
3)检查工具链是否正常(64位)
1aarch64-none-linux-gnu-gcc --version
若看见正确的版本输出,表示工具链部署成功。
4)进行交叉编译
若宿主机没安装 cmake,请自行百度安装 cmake。 64 位的请把文件夹 cross_cmakelist 的 CMakeLists_v8.txt 文件拷贝出来,替换 CMakeLists.txt 文件。 替换后请参考:编译 readme.txt 进行编译操作。
4. SDK工程结构

5. 授权激活
SDK 需要授权激活后才能正常使用,在 SDK 初始化后,若报错误码-13(错误码参考文档最后定义),一般为没有通过授权。通常,SDK 分按设备授权和按应用授权两种方式,大部分采用按设备授权的方式,按应用授权可针对批量大规模客户使用(文档中 先只介绍按设备授权,按应用授权可工单或联系百度商务我们提供另外的文档或技术支持)。按设备授权的方式中,SDK 自动激活和激活工具激活需要设备能联网,若设备不能连外网,可采用官网离线激活的方式。
5.1 SDK 自动激活
在 SDK 的目录中有 license 文件夹,里面存放了 2 个文件,license.key 和 license.ini,分别是授权 key 和授权文件,若在百度官网申请了授权系列号 key(16 位),可按 sdk 中的 license 文件夹中 license.key 原格式样子覆盖填写您申请的 key。在设备能联网的情况下,运行 SDK 会自动授权激活并拉取新的授权文件 license.ini 覆盖 SDK 中的旧文件。
5.2 官网离线激活
若设备不能连外网、通过授权还有另外一种方法,即通过运行 SDK 的示例代码 face.cpp,可得到设备指纹 device id,获取到设备硬件指纹信息后,通过百度官网填 入指纹信息和申请到的系列号 key,可完成激活并下载获取到 license.ini 文件和 license.key 文件,把这 2 个文件拷贝到 face_offline_sdk 的 license 目录下,重新 运行 SDK 亦可通过授权激活。
6. SDK 集成及 demo 示例工程
6.1 SDK 的集成
sdk 集成的 include 需包含 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 |
6.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 示例工程 face_offline_sdk 展示了如何集成百度人脸识别离线SDK,并调用SDK的方法及使用场景化示例等。
在 face_offline_sdk 中的 face.cpp 的 main()方法中,有使用SDK的各个接口方法 示例。接入SDK及其简单,如下图及解释:
1// 入口函数
2int main()
3{
4 //api 实例指针
5 BaiduFaceApi *api = new BaiduFaceApi();
6 //初始化 sdk
7 std::cout << "before sdk_init" << std::endl; int res = api- >sdk_init(nullptr);
8 std::cout << "after sdk_init" << std::endl; if (res != 0)
9 {
10 std::cout << "sdk init result is:" << res << std::endl;
11 getchar();
12 return 0;
13 }
14 std::time_t time_begin = get_timestamp();
15 FaceDemo *demo = new FaceDemo(api);
16 demo->face_demo();
17 delete demo;
18 std::time_t time_end = get_timestamp();
19 std::cout << "time cost is :" << time_end - time_begin << "ms" << std::en dl;
20 std::cout << "before delete api" << std::endl; // 释放 sdk 实例指针,防止内存泄漏
21 delete api;
22 getchar();
23 std::cout << "end main" << std::endl;
24 return 0;
25}
SDK使用主要三步:
1)初始化实例指针
2)初始化 sdk
第 3 步即可调用示例 demo,实现需要的功能。末尾需要释放SDK实例化指针 api。
另外,可通过 is_auth()方法查看是否通过了授权,通常,需要通过授权,才可以使用SDK的各种能力。
示例工程中:分别有以下几个文件夹放置文件对应几个常用SDK的调用 demo。
解析如下:
| 文件夹或文件名 | 文件说明 |
|---|---|
| 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_attr | 人脸属性(年龄、性别、种族等) 接口及示例 |
| face_head_pose | 人脸姿态角接口及示例 |
| face_illumination | 人脸光照检测接口及示例 |
| face_occlusion | 人脸遮挡度检测接口及示例 |
| face_blur | 人脸模糊度检测接口及示例 |
| face_crop | 人脸扣图接口及示例 |
| face_gaze | 双眼注意力检测接口及示例 |
| face_eye_close | 眼睛闭合检测接口及示例 |
| face_mouth_close | 嘴巴闭合检测接口及示例 |
| face_mouth_mask | 是否佩戴口罩检测接口及示例 |
| face_scene | 原子接口综合示例(该示例亦展示了如何使用 sdk 原子接口等) |
| sdk_info | 实现如读取 sdk 版本号、设备指纹等接口示例 |
| driver_monitor | 驾驶行为检测示例,如打电话、吃东西等 |
| safety_belt | 安全带佩戴检测示例 |
| face_action_live | 动作活体检测示例 |
| face_emotion | 表情识别示例 |
7. 模型能力加载及模型说明
7.1 模型删减说明
SDK支持按需配置模型和加载能力,若SDK有某部分功能不需要使用,可尝试删除 一些模型,删除后模型即不会加载也不会占用内存。SDK中 models 文件夹里的模型及 是否可删减说明如下表:
| 模型文件夹名称 | 说明 | 是否可删减 | 删减说明 |
|---|---|---|---|
| detect | 人脸检测模型 | 否 | 该文件夹不能删减 |
| align | 人脸关键点模型 | 否 | 该文件夹不能删减 |
| attribute | 人脸属性 | 是 | 若不使用该功能,该文件夹可删除 |
| best_image | 最佳人脸 | 是 | 若不使用该功能,该文件夹可删除 |
| blur | 人脸质量模糊度检测 | 是 | 若不使用该功能,该文件夹可删除 |
| dark_enhance | 暗光恢复 | 是 | 若不使用该功能,该文件夹可删除 |
| eye_close | 眼睛闭合 | 是 | 若不使用眼睛闭合及动作活体功能,该 文件夹可删除 |
| feature | 人脸特征值 | 是 | 若不用nir近红外的人脸特征值,可删 除 feature_nir 开头的文件 |
| gaze | 人脸注意力检测 | 是 | 若不使用该功能,该文件夹可删除 |
| mouth_close | 嘴巴闭合检测 | 是 | 若不使用嘴巴闭合及动作活体功能,该 文件夹可删除 |
| mouth_mask | 口罩佩戴检测 | 是 | 若不使用该功能,该文件夹可删除 |
| occlusion | 人脸遮挡检测 | 是 | 若不使用该功能,该文件夹可删除 |
| silent_live | 静默活体检测 | 是 | 若只使用rgb可见光单目静默活体,则 除 liveness_rgb 开头的文件外其他皆可删除 |
| driver_monitor | 安全驾驶 | 是 | 若不使用驾驶行为检测和安全带佩戴 检测,该文件夹可删除 |
| emotion | 表情识别 | 是 | 表情识别(7 分表情),该文件夹可删除 |
7.2 模型路径的定制化
SDK支持模型文件夹 models 的路径自定义,当SDK初始化 api->sdk_init(nullptr)传 null 时候,为SDK支持模型文件夹路径在默认路径,即 models 在SDK现有位置。同时也支持 models 通过 sdk_init 中传入绝对路径。若把 models 文件夹拷贝到如/home/face 文件夹下面,则可定义:
api->sdk_init(“/home/face”);
此时,授权文件夹 license 也需要随之变为/home/face 文件夹下面。否则会出现授权 不通过的问题。
另外,若使用了能力自定义的 config 文件夹,也需要拷贝到/home/face 文件夹下面。 否则能力定制化也不会生效而是使用的系统默认。
7.3 SDK的配置文件
SDK 提供配置文件 face.ini,通过修改配置文件,可输出文件日志,定制化数据 库文件 db 路径等。可通过#注释字段,具体可参见 face.ini 示例。 同上 7.2,当 sdk_init 传 nullptr 的时候,face.ini 默认在 SDK 的 run.sh 同 目录夹中。若 sdk_init 传入了绝对路径,则 face.ini 文件需要放置在传入的绝对路 径上层目录中。
7.3.1 修改配置文件输出日志
人脸库路径 db 文件夹,也可以定制化,同样是通过修改 face.ini 文件。 若 face.ini 定义字段: DbDir = /home/face ,则表示人脸库路径会生成在 /home/face 路径的 face 文件夹中,若无需定制,则 face.ini 中删除 DbDir 字段即 可。 #号为注释或不启用该字段。
7.3.2 修改配置文件变更人脸识别输出结果数量
通常,进行 1:N 人脸识别的时候,只返回最高分的识别结果。若需要返回更多结 果,可通过修改 face.ini 文件的字段 IdentifyScore ,把字段的值,如设为 80,则 返 回识别分值大于 80 的结果(可能多个),若只想返回 1 个结果,把字段的值设置 为 101,则返回 1 个最高分的识别结果。 字段配置如:
1[IdentifyScore]
2IdentifyScore = 101
7.3.3 修改配置文件启用多因子模式提高静默防攻击能力
在进行 RGB 静默活体的时候,可以通过修改配置文件的字段,打开多因子模型能 力,该能力打开后,可提高静默活体防攻击能力(但同时,单帧耗时会有所增加)。 打开方法为去掉配置文件 face.ini 中的#字段(#为注释),使得字段如:
1[MultiFactor]
2MultiFactor = 1
3说明:其中值设为 1 为启用,设为 0 不启用,参数前加#为注释该参数,亦不启用。
7.3.4 修改配置检测小人脸图片
对于小人脸检测,需要把配置文件夹 conf 修改为 config(一定要修改,只认 config 这个文件夹),修改后,需要把 detect.json 中的字段 scale_ratio 修改为 1 或 2 才能生效。修改如下图:

7.4 能力定制化说明
SDK 支持能力自定义、通过读取配置文件的方式进行能力定制化。SDK 默认能力加 载无需定制化,若需要定制化,请把 SDK 根目录里面的 conf 文件夹重命名为 config 文件夹。并且在 SDK 中,把里面的 json 配置按如下说明做修改,可起到定制化能力加 载的效果,配置文件简要说明如下(若需定制化修改,请参考示例 json,修改 json 字 段的值来达到定制化的目的)
7.4.1 detect.json (人脸检测能力定制配置文件)
| 配置文件名 | detect.json |
|---|---|
| 说明 | 人脸检测自定义能力配置文件 { "max_detect_num":5, "min_face_size":0, "scale_ratio":-1, "not_face_thr":0.5 } |
| 参数 | 类型 | 说明 |
|---|---|---|
| max_detect_num | int | 最大检测的人脸数量,最多支持 50,最小1,默认 5 |
| min_face_size | int | 默认 0,可用来设置检测的最小人脸,比如可设为 10,则 表示小于 10*10 的人脸,sdk 检测不到 |
| scale_radio | int | 默认-1,表示进行人脸检测时候的图片缩放比率。建议用-1 表示传入原图 sdk 自己缩放(为保证检测效果,该参数建议用默认, 小人脸图片可修改该值为 1 或 2 进行检测) |
| not_face_thr | float | 默认 0.5,表示非人脸的阈值,取值范围 0-1 |
7.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_duringtrack | float | 表示人脸追踪时候进行人脸检测的时间间隔(单位毫秒) |
7.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 不做修改 |
8. 功能接口
SDK 功能接口的调用可参考各示例 cpp 文件,接口定义在 baidu_face_api.h。
SDK 实现的主要功能有人脸实时跟踪检测、人脸特征值提取、动作活体、RGB&IR 静默 活体检测、RGB&DEPTH 静默活体检测、人脸注册、人脸更新、组管理、用户管理以及 1:1 人脸对比,1:N 人脸识别、特征值的比对和通过 usb 或笔记本自带摄像头检测视频 帧,返回识别出的人脸信息、人脸属性等,另外支持对人脸检测进行能力加载设置, 达到根据设置进行识别的目的。
各接口功能及传入参数和返回结果等定义如下:
8.1 人脸检测 detect 接口
| 方法名 | detect |
|---|---|
| 说明 | 人脸检测,返回人脸信息 |
| 函数 | int detect(std::vector<FaceBox> &out, const cv::Mat* mat, int type = 0) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸结构体数组 | 是 | std::vector<FaceBox> |
人脸框信息结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| type | 检测类型(传 0 表示 rgb 可见光人脸检测, 1 表示 nir) | int | 0 或 1,不传默认为0 | |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0 时候为检测到的人脸数量 |
8.2 人脸跟踪 track 接口
| 方法名 | track |
|---|---|
| 说明 | 人脸跟踪,返回人脸信息 |
| 函数 | int track(std::vector<TrackFaceInfo>&out, const cv::Mat* mat, int type = 0) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸结构体数组 | 是 | std::vector<Tra ckFaceInfo> |
人脸跟踪结构体信息 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| type | 检测类型(传 0 表示 rgb 可见光人脸检测,1 表示 nir) | 否 | int | 0 或 1,不传默认为0 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0 时候为检测到的人脸数量 |
8.3 清除人脸跟踪历史接口
| 方法名 | clear_track_history |
|---|---|
| 说明 | 清除人脸跟踪的历史信息 |
| 函数 | int clear_track_history(int type = 0) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| type | 检测类型(传 0 表示 rgb 可见光人脸检测,1 表示 nir) | 否 | int | 0 或 1,不传默认为0 |
| 返回信息 | 函数的返回 | 是 | void |
8.4 人脸关键点接口
| 方法名 | face_landmark |
|---|---|
| 说明 | 人脸关键点,返回人脸关键点信息 |
| 函数 | int face_landmark(std::vector<Landmarks>&out, const cv::Mat* mat, int type) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸关键点数组 | 是 | std::vector<Landmarks> |
人脸关键点信息结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| type | 检测类型(传 0 可见光生活照,1、表示近红外) | 是 | int | |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0时候为检测到的人脸数量 |
8.5 注意力检测接口
| 方法名 | face_gaze |
|---|---|
| 说明 | 人脸注意力检测,返回人脸注意力信息 |
| 函数 | int face_gaze(std::vector<GazeInfo>& out, const cv::Mat* mat) |
| 请求参数 | 说明 | 必须 | 类型 | |
|---|---|---|---|---|
| out | 通过引用返回的人脸注意力结构体数组 | 是 | std::vector<GazeInfo> |
注意力结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0时候为检测到的人脸数量 |
8.6 人脸属性检测接口
| 方法名 | face_attr |
|---|---|
| 说明 | 人脸属性检测,返回人脸属性信息 |
| 函数 | int face_attr(std::vector<Attribute>& out, const cv::Mat *mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸属性结构体数组 | 是 | std::vector<Attribute> |
人脸属性结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码 ; >0时候为检测到的人脸数量 |
8.7 人脸抠图接口
| 方法名 | face_crop |
|---|---|
| 说明 | 人脸扣图,返回人脸抠图(仅支持单人脸抠图) |
| 函数 | int face_crop(cv::Mat&out, const cv::Mat* mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 抠图结果图片帧 | 是 | Opencv mat | |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码 ; >0时候为检测到的人脸数量 |
8.8 暗光恢复接口
| 方法名 | dark_enhance |
|---|---|
| 说明 | 暗光恢复,用于图片比较暗的使之变量利于人类检测(仅支持单人脸抠 图) |
| 函数 | int dark_enhance(cv::Mat&out, const cv::Mat* mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 暗光恢复结果图片帧 | 是 | Opencv mat | |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | |
| 返回信息 | 函数的返回 | 是 | int | 返回:<0 为错误码; =0表示成功 |
8.9 眼部状态检测接口
| 方法名 | face_eye_close |
|---|---|
| 说明 | 人脸眼部状态检测,返回人脸眼部状态信息 |
| 函数 | int face_eye_close(std::vector<EyeClose> &out, const cv::Mat* mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸眼部状态结构体数组 | 是 | std::vector<EyeClose> |
眼部状态信息结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码 ; >0时候为检测到的人脸数量 |
8.10 嘴巴闭合检测接口
| 方法名 | face_mouth_close |
|---|---|
| 说明 | 人脸嘴巴闭合检测,返回人脸嘴巴闭合信息 |
| 函数 | int face_mouth_close(std::vector<MouthClose>& out, const cv::Mat* mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸嘴巴闭合结构体数组 | 是 | std::vector<M outhClose> |
嘴巴闭合结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0 时候为检测到的人脸数量 |
8.11 口罩佩戴检测接口
| 方法名 | face_mouth_mask |
|---|---|
| 说明 | 人脸口罩佩戴检测,返回人脸口罩佩戴信息 |
| 函数 | int face_mouth_mask(std::vector<MouthMask>& out, const cv::Mat* mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸口罩佩戴结构体数组 | 是 | std::vector<Mo uthMask> |
佩戴口罩结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0时候为检测到的人脸数量 |
8.12 人脸质量
人脸质量判断可由以下几个因素自由组合综合判断,如姿态角、光照、遮挡、模 糊以及最佳人脸。人脸质量判断的推荐阈值:人脸检测置信度>0.63、遮挡度 <0.75、 人脸姿态角 <20 、人脸模糊度 <0.8、最优人脸 >50。
8.12.1 人脸姿态角接口
| 方法名 | face_head_pose |
|---|---|
| 说明 | 人脸姿态角检测,返回人脸姿态角信息 |
| 函数 | int face_head_pose(std::vector<HeadPose>&out, const cv::Mat* mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸姿态角数组 | 是 | std::vector<HeadPose> |
人脸姿态角信息结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0 时候为检测到的人脸数量 |
8.12.2 人脸光照检测接口
| 方法名 | face_illumination |
|---|---|
| 说明 | 人脸光照检测、(光照分值 0-255、分值越大光照越强) |
| 函数 | int face_illumination(std::vector<Illumination>&out, const cv::Mat* mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸光照信息数组 | 是 | std::vector<Illum ination> |
光照置信度结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0时候为检测到的人脸数量 |
8.12.3 人脸遮挡检测接口
| 方法名 | face_occlusion |
|---|---|
| 说明 | 人脸遮挡检测(遮挡分值 0-1,分值越大遮挡度越高) |
| 函数 | int face_occlusion(std::vector<Occlusion>& out, const cv::Mat* mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸遮挡结构体数组 | 是 | std::vector<Occlusion> |
遮挡置信度结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0 时候为检测到的人脸数量 |
8.12.4 人脸模糊度检测接口
| 方法名 | face_blur |
|---|---|
| 说明 | 人脸模糊检测(模糊度分值 0-1,分值越大模糊度越高) |
| 函数 | int face_blur(std::vector<Blur> &out, const cv::Mat * mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的人脸模糊结构体数组 | 是 | std::vector<Blur> |
模糊度结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码 ; >0时候为检测到的人脸数量 |
8.12.5 最优人脸检测接口
| 方法名 | face_best |
|---|---|
| 说明 | 最佳人脸检测(最优人脸分值 0-100,分值越高,最佳人脸图片得分越高) |
| 函数 | int face_best(std::vector<Best> &out, const cv::Mat *mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的最佳人脸结构体数组 | 是 | std::vector<Best> |
最优人脸结构体 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码 ; >0时候为检测到的人脸数量 |
8.12.6 人脸表情接口
| 方法名 | face_emotion |
|---|---|
| 说明 | 人脸表情检测,返回人脸表情检测信息 |
| 函数 | int face_emotion(std::vector |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 通过引用返回的最佳人脸结构体数组 | 是 | std::vector<Emotion> |
表情结构体(三分表 |
| 情) | ||||
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码 ; >0时候为检测到的人脸数量 |
8.13 特征值及人脸比对(1:1)
人脸比对的原理实际是特征值比对,通过提取图片中的人脸特征值,根据特征值 调用 compare_feature 接口进行比对,推荐比对分值超过 80 分为同一人,可根据实际 检测比对情况动态调整。
人脸 1:1 比对流程可如下图,实现如人证比对功能。(人的照片和实时视频比对, 可根据使用情况选择是否启用质量检测)

8.13.1 人脸特征值接口
| 方法名 | face_feature |
|---|---|
| 说明 | 人脸特征值提取,并返回人脸信息 |
| 函数 | int face_feature(std::vector<Feature> &out_fea, std::vector<FaceBox> &out_box, const cv::Mat *mat , int type = 0) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out_fea | 通过引用返回的人脸特征值结构体数组 | 是 | std::vector<Feature> |
人脸特征值结构体信息 |
| out_box | 通过引用返回的人脸框结构体数组 | 是 | std::vector<FaceBox> |
人脸框结构体信息 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| type | 检测类型(传 0 可见光生活照特征值 1、近红外特征值) | 否 | int | 0或1,未传默认为0 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0 时候为检测到的人脸数量 |
8.13.2 人脸活体特征值接口
| 方法名 | liveness_feature |
|---|---|
| 说明 | 人脸特征值提取,同时有活体校验、并返回活体分值,人脸信息 |
| 函数 | int liveness_feature(std::vector<Feature> &out_fea, std::vector<FaceBox> &out_box, float& score, const cv::Mat *mat , int type = 0) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out_fea | 通过引用返回的人脸特征值结构体数组 | 是 | std::vector<Feature> |
人脸特征值结构体信息 |
| out_box | 通过引用返回的人脸框结构体数组 | 是 | std::vector<FaceBox> |
人脸框结构体信息 |
| mat | 传入的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| score | 返回的活体分值 | 是 | float | |
| type | 检测类型(传 0 可见光特征值,1 表示近红外特征值) | 否 | int | 0或1,未传默认为0 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0时候为检测到的人脸数量 |
8.13.3 深度人脸特征值接口
| 方法名 | rgbd_feature |
|---|---|
| 说明 | 人脸特征值提取,返回人脸信息 |
| 函数 | int rgbd_feature(std::vector<Feature> &out_fea, std::vector<Feature> &out_box, const cv::Mat rgb_mat, char depth_mat) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out_fea | 通过引用返回的人脸特征值结构体数组 | 是 | std::vector<Feature> |
人脸特征值结构体信息 |
| out_box | 通过引用返回的人脸框结构体数组 | 是 | std::vector<FaceBox> |
人脸框结构体信息 |
| rgb_mat | 传入可见光的 opencv 视频帧 | 是 | Opencv mat | 请参考示例 |
| depth_mat | 传入深度的二进制流数据 | 是 | char* | 请参考示例 |
| 返回信息 | 函数的返回 | 是 | int | <=0 为未检测到人脸或错误码; >0时候为检测到的人脸数量 |
8.13.4 特征值比对接口
| 方法名 | compare_feature |
|---|---|
| 说明 | 人脸跟踪,返回人脸信息 |
| 函数 | float compare_feature(Feature f1, Feature f2, int type) |
| 请求参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| f1 | 人脸特征值结构体 | 是 | Feature* | 人脸特征值结构体信息(仅支持单个结构体的比对) |
| f2 | 人脸特征值结构体 | 是 | Feature* | 人脸特征值结构体信息(仅支持单个结构体的比对) |
| type | 特征值类型(0,1) | 否 | int | 0:生活照 1:近红外特征值,未传默认为0 |
| 返回信息 | 函数的返回 | 是 | float | 特征值比对分值 |
8.13.5 人脸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寸的证据照也推荐当作生活照模式) |
| 返回信息 | 函数的返回 | 是 | int | 人脸比对分值(同特征值比对分值结果应该是float,这里返回int是做了四舍五入) |
8.14 动作活体和静默活体
8.14.1 动作活体接口
| 方法名 | face_action_live |
|---|---|
| 说明 | 动作活体(眨眨眼、张张嘴等动作校验活体) |
| 函数 | int face_action_live(std::vector |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 返回的人脸框结构体数组 | 是 | std::vector |
人脸框结构体 |
| action_type | 传入的活体动作 | 是 | int | 动作活体类型,如0表示眨眨眼,1表示张嘴等 |
| action_result | 动作活体的返回结果 | 是 | int | 返回结果为1表示存在该动作活体 |
| mat | 传入的opencv视频帧 | 是 | Mat | 视频帧 |
| 返回字段描述 | |
|---|---|
| 返回字段 | int,>=0返回人脸个数,<0时候为错误码 |
| 返回示例 |
8.14.2 清除动作活体历史接口
| 方法名 | action_live_clear_history |
|---|---|
| 说明 | 清除动作活体历史 |
| 函数 | int action_live_clear_history() |
| 返回字段描述 | |
|---|---|
| 返回字段 | 返回int , 0:表示成功,其他为错误码,参考文档后续 |
| 返回示例 |
8.14.3 rgb静默活体接口
| 方法名 | rgb_liveness |
|---|---|
| 说明 | rgb可见光单目静默活体(推荐rgb+nir或rgb+depth进行双目活体校验) |
| 函数 | int rgb_liveness(std::vector |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 返回的人脸框结构体数组 | 是 | std::vector |
人脸框结构体(多人则返回最大人脸) |
| score | 返回的动作活体分值 | 是 | float | |
| mat | 传入的opencv视频帧 | 是 | Mat | 视频帧 |
| 返回字段描述 | |
|---|---|
| 返回字段 | int,>=0返回人脸个数,<0时候为错误码 |
| 返回示例 |
8.14.4 nir静默活体接口
| 方法名 | nir_liveness |
|---|---|
| 说明 | Nir近红外单目静默活体(推荐rgb+nir或rgb+depth进行双目活体校验) |
| 函数 | int nir_liveness(std::vector |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 返回的人脸框结构体数组 | 是 | std::vector |
人脸框结构体(多人则返回最大人脸) |
| score | 返回的动作活体分值 | 是 | float | |
| mat | 传入的opencv视频帧 | 是 | Mat | 视频帧 |
| 返回字段描述 | |
|---|---|
| 返回字段 | int,>=0返回人脸个数,<0时候为错误码 |
| 返回示例 |
8.14.5 rgb+depth双目静默活体接口
| 方法名 | rgb_depth_liveness |
|---|---|
| 说明 | rgb+depth双目静默活体 |
| 函数 | int rgb_depth_liveness(std::vector |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 返回的人脸框结构体数组 | 是 | std::vector |
人脸框结构体(多人则返回最大人脸) |
| rgbscore | 返回的rgb动作活体分值 | 是 | float | |
| depthscore | 返回的depth动作活体分值 | 是 | float | |
| rgb | 传入的opencv视频帧 | 是 | Mat | 视频帧 |
| depth | 传入的二进制深度数据 | 是 | Char * | 视频帧 |
| 返回字段描述 | |
|---|---|
| 返回字段 | int,>=0返回人脸个数,<0时候为错误码 |
| 返回示例 |
8.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识别可如如下图所示流程:

8.15.1 人脸注册接口(通过传入图片帧)
| 方法名 | user_add |
|---|---|
| 说明 | 用户注册,该接口支持传入opencv图片帧(通常指生活照,1寸或2寸的证件照也可以用这种类型)(图片帧注册会把人脸图片缩略图入库) |
| 函数 | void user_add(std::string& res, const cv::Mat img, const char user_id, const char group_id, const char user_info=””) |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| 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映射 | errno Msg 0 Success <0 失败的原因 |
8.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映射 | errno Msg 0 Success <0 失败的原因 |
8.15.3 人脸更新接口
| 方法名 | user_update |
|---|---|
| 说明 | 人脸更新 |
| 函数 | void user_update(std::string& res, const cv::Mat img, const char user_id, const char group_id, const char user_info=””) |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| 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映射 | errno Msg 0 Success <0 失败的原因 |
8.15.4 用户删除接口
| 方法名 | user_delete |
|---|---|
| 说明 | 用户删除 |
| 函数 | void user_delete(std::string&res, const char user_id, const char group_id) |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| res | 返回的结果 | 是 | string | json 数据 |
| user_id | 用户id | 是 | const char* | 用户id(由数字、字母、下划线组成),长度限制128B |
| group_id | 组id | 是 | const char* | 用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| 返回字段描述(json) | |
|---|---|
| errno及msg映射 | errno Msg 0 Success <0 失败的原因 |
8.15.5 创建用户组接口
| 方法名 | group_add |
|---|---|
| 说明 | 创建用户组 |
| 函数 | void group_add(std::string&res, const char* gourp_id) |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| res | 返回的结果 | 是 | string | json 数据 |
| group_id | 用户组id | 是 | const char* | 用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| 返回字段描述(json) | |
|---|---|
| errno及msg映射 | errno msg 0 Success <0 失败的原因 |
8.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映射 | Errno Msg 0 Success <0 失败的原因 |
8.15.7 用户信息查询接口
| 方法名 | get_user_info |
|---|---|
| 说明 | 用户信息查询接口 |
| 函数 | void get_user_info(std::string&res, const char user_id, const char group_id) |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| res | 返回的结果 | 是 | string | json 数据 |
| user_id | 用户id | 是 | const char* | 用户id(由数字、字母、下划线组成),长度限制128B |
| group_id | 组id | 是 | const char* | 用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
| 返回字段描述(json) | |
|---|---|
| errno及msg映射 | errno Msg 0 Success <0 失败的原因 |
| data字段 | log_id string 请求日志标识 result array 识别结果列表 group_id string 组id face_token string 人脸特征的唯一标识 user_info string 用户信息 create_time string 人脸首次注册时间 |
8.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* | v用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B |
返回字段描述:返回int,0为成功,其他为错误码
8.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映射 | Errno Msg 0 Success <0 失败的原因 |
| data字段 | log_id string 请求日志表识 user_id_list array user_id列表数组 |
8.15.10 人脸库人脸数量查询
| 方法名 | db_face_count |
|---|---|
| 说明 | 查询数据库人脸数量 (传入组id表示查询该组都人脸数量,null表示查整个库的人脸数量) |
| 函数 | int db_face_count(const char* group_id = nullptr) |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| group_id | 组id | 是 | const char* | 人脸分组的组id(传null表示查询整个库的数量) |
返回示例:int >=0 (返回的数量)
8.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映射 | errno Msg 0 Success <0 失败的原因 |
| data字段 | log_id string 请求日志标识 group_id_list array group_id列表数组 |
8.15.12 人脸识别接口
人脸识别(1:N)结果,通过传入人脸特征值或图片进行人脸的 1:N 识别,即传 入的 1 和人脸库的 N 进行识别(人脸库自动创建,需要通过 user_add 等接口把人脸注 册入库),人脸识别的返回默认大于 80 分的识别结果。可通过配置文件 face.ini 中的 字段 IdentifyScore 的分值控制识别返回的结果,若该字段分值设为 101,则默认返回 1 个识别结果(1:N 的识别最高分结果)。
8.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 数据 |
| img | opencv图片帧指针 | 是 | cv::Mat * | 人脸opencv图片帧指针 |
| group_id_list | 组列表 | 是 | const char* | 组列表 |
| user_id | 用户id | 否 | const char* | 用户id |
| type | 特征值类型 | 否 | shi | 特征值类型(0、是生活照、1、证件照2、近红外,参考特征值提取),未传默认为0 |
| 返回字段描述 | |
|---|---|
| 返回字段 | 比对分值 float |
8.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 | 特征值类型 | 否 | shi | 特征值类型(0、是生活照、1、证件照2、近红外,参考特征值提取),未传默认为0 |
| 返回字段描述 | |
|---|---|
| 返回字段 | 比对分值 float |
8.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 |
8.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 |
8.16 SDK系统信息接口
8.16.1 获取SDK版本号接口
| 方法名 | sdk_version |
|---|---|
| 说明 | 通过引用返回sdk版本号 |
| 函数 | void sdk_version(std::string& version) |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| version | 返回的sdk版本号结果 | 是 | string | 如:6.3.3 |
8.16.2 获取设备指纹接口
| 方法名 | get_device_id |
|---|---|
| 说明 | 通过引用返回sdk的设备指纹信息(可用来标识sdk的唯一性) |
| 函数 | void get_device_id(std::string& version) |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| device_id | 返回的sdk设备指纹结果 | 是 | string | 如:0BAF96961A8377AB74797B05F7F2C805 |
8.17 安全驾驶接口
8.17.1 驾驶行为检测接口
| 方法名 | driver_monitor |
|---|---|
| 说明 | 驾驶行为检测接口,返回驾驶行为信息 |
| 函数 | int driver_monitor(std::vector |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 返回的驾驶行为结构体数组信息 | 是 | std::vector |
DriverMonitor结构体见后续结构体定义 |
| mat | 传入的opencv图片帧 | 是 | cv::Mat * |
返回字段描述: int,>=0返回人脸个数,<0时候为错误码
8.17.2 安全带佩戴检测接口
| 方法名 | safety_belt |
|---|---|
| 说明 | 安全带佩戴检测接口,返回佩戴置信度分值 |
| 函数 | int safety_belt(std::vector |
| 参数 | 说明 | 必须 | 类型 | 示例描述 |
|---|---|---|---|---|
| out | 返回的安全带佩戴结构体数组信息 | 是 | std::vector |
SafeBelt结构体见后续结构体定义 |
| mat | 传入的opencv图片帧 | 是 | cv::Mat * |
返回字段描述:int,>=0返回人脸个数,<0时候为错误码
9. 结构体描述
9.1 人脸跟踪信息结构体
| 结构体名 | TrackFaceInfo |
|---|---|
| 说明 | 人脸跟踪信息结构体 struct TrackFaceInfo { long face_id; FaceBox box; Landmarks facelandmarks; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| face_id | long | 人脸id |
| box | FaceBox | 人脸框结构体 |
| facelandmarks | Landmarks | 人脸关键点结构体 |
9.2 人脸框信息结构体
| 结构体名 | FaceBox |
|---|---|
| 说明 | 人脸框信息结构体 struct FaceBox { int index; float center_x; float center_y; float width; float height; float angle; float score; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| index | int | 人脸索引值 |
| center_x | float | 人脸中心点x坐标 |
| center_y | float | 人脸中心点y坐标 |
| width | float | 人脸宽度 |
| height | float | 人脸高度 |
| angle | float | 人脸角度 |
| score | float | 人脸置信度 |
9.3 人脸关键点信息结构体
| 结构体名 | Landmarks |
|---|---|
| 说明 | 人脸关键点信息结构体 struct Landmarks { int index; int size; float data[144]; float score; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| index | int | 人脸关键点索引 |
| size | int | 人脸关键点数量(size的值通常为144,72个x,y坐标) |
| data | float[144] | 人脸关键点坐标数组(144)(72个x,y坐标) |
| score | float | 人脸关键点置信度 |
9.4 人脸特征值结构体
| 结构体名 | Feature |
|---|---|
| 说明 | 人脸特征值结构体 struct Feature { int size; float data[128]; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| size | int | 特征值大小(通常为128个float浮点值数据) |
| data | float[] | 128个浮点值数组 |
9.5 人脸姿态角结构体
| 结构体名 | HeadPose |
|---|---|
| 说明 | 人脸姿态角结构体 struct HeadPose { float yaw; float roll; float pitch; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| yaw | float | 左右偏转角 |
| roll | float | 与人脸平行平面内的头部旋转角 |
| pitch | float | 上下偏转角 |
9.6 人脸属性信息结构体
| 结构体名 | Attribute |
|---|---|
| 说明 | 人脸属性信息结构体 struct Attribute { int age; Race race; AttributeEmotionType emotion; Glasses glasses; Gender gender; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| age | int | 年龄 |
| race | Race | 种族 enum Race { BDFace_RACE_YELLOW = 0, // 黄种人<brBDFace_RACE_WHITE = 1, //白种人 BDFace_RACE_BLACK = 2, // 黑种人 BDFace_RACE_INDIAN = 3, // 印第安人 } |
| emotion | AttributeEmotionType | 表情 enum AttributeEmotionType { BDFACE_ATTRIBUTE_EMOTION_FROWN = 0,//皱眉 BDFACE_ATTRIBUTE_EMOTION_SMILE = 1, //笑 BDFACE_ATTRIBUTE_EMOTION_CALM = 2, //平静 } |
| glasses | Glasses | 戴眼镜状态 enum Glasses { BDFACE_NO_GLASSES = 0 , // 无眼镜 BDFACE_GLASSES = 1, // 有眼镜 BDFACE_SUN_GLASSES = 2 //墨镜 } |
| gender | Gender | 性别 enum Gender { BDFACE_GENDER_FEMILE = 0, // 女性 BDFACE_GENDER_MALE = 1, // } |
9.7 嘴巴闭合结构体
| 结构体名 | MouthClose |
|---|---|
| 说明 | 嘴巴闭合置信度结构体 struct MouthClose { float score; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| score | float | 置信度分值 |
9.8 口罩佩戴结构体
| 结构体名 | MouthMask |
|---|---|
| 说明 | 口罩佩戴置信度结构体 struct MouthMask { float score; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| score | float | 置信度分值 |
9.9 最优人脸置信度结构体
| 结构体名 | Best |
|---|---|
| 说明 | 最优人脸置信度结构体 struct Best { float score; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| score | float | 置信度分值 |
9.10 人脸模糊度置信度结构体
| 结构体名 | Blur |
|---|---|
| 说明 | 人脸模糊度置信度结构体 struct Blur { float score; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| score | float | 置信度分值 |
9.11 人脸光照置信度结构体
| 结构体名 | Illumination |
|---|---|
| 说明 | 光照置信度结构体 struct Illumination { int score; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| score | int | 置信度分值 |
9.12 人脸遮挡置信度结构体
| 结构体名 | Illumination |
|---|---|
| 说明 | 人脸遮挡置信度结构体 struct Illumination { float left_eye; float right_eye; float nose; float mouth; float left_cheek; float right_cheek; float chin; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| left_eye | float | 左眼遮挡置信度 |
| right_eye | float | 右眼遮挡置信度 |
| nose | float | 鼻子遮挡置信度 |
| mouth | float | 嘴巴遮挡置信度 |
| left_cheek | float | 左脸遮挡置信度 |
| right_cheek | float | 右脸遮挡置信度 |
| chin | float | 下巴遮挡置信度 |
9.13 人眼闭合状态结构体
| 结构体名 | EyeClose |
|---|---|
| 说明 | 人眼闭合状态结构体 struct EyeClose { float left_eye_close_conf; float right_eye_close_conf; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| float left_eye_close_conf | float | 置信度分值 |
| float right_eye_close_conf | float | 置信度分值 |
9.14 注意力结构体
| 结构体名 | GazeInfo |
|---|---|
| 说明 | 注意力结构体 struct GazeInfo { Gaze left_eye; Gaze right_eye; } struct Gaze { GazeDirection direction; // 凝视方向 float confidence; // 置信度 } struct GazeDirection { BDFACE_GAZE_DIRECTION_UP = 0, // 向上看 BDFACE_GAZE_DIRECTION_DOWN = 1, // 向下看 BDFACE_GAZE_DIRECTION_RIGHT = 2, // 向右看 BDFACE_GZE_DIRECTION_LEFT = 3, // 向左看 BDFACE_GAZE_DIRECTION_FRONT = 4, // 向前看 BDFACE_GAZE_DIRECTION_EYE_CLOSE = 5, // 闭眼 } |
| 参数 | 类型 | 说明 |
|---|---|---|
| left_eye | Gaze | 左眼注意力 |
| right_eye | Gaze | 右眼注意力 |
9.15 静默活体置信度结构体
| 结构体名 | LivenessScore |
|---|---|
| 说明 | 活体信度结构体 struct LivenessScore { int score; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| score | float | 置信度分值 |
9.16 驾驶行为结构体
| 结构体名 | DriverMonitor |
|---|---|
| 说明 | 驾驶行为结构体 struct DriverMonitor { float normal; float calling; float drinking; float eating; float smoking; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| normal | float | 行为正常的置信度分值(置信度范围0-1) |
| calling | float | 打电话行为的置信度分值(置信度范围0-1) |
| drinking | float | 喝水的置信度分值(置信度范围0-1) |
| eating | float | 吃东西的置信度分值(置信度范围0-1) |
| smoking | float | 抽烟的置信度分值(置信度范围0-1) |
9.17 安全带佩戴结构体
| 结构体名 | SafetyBelt |
|---|---|
| 说明 | 安全带佩戴行为结构体 struct SafetyBelt { float score; } |
| 参数 | 类型 | 说明 |
|---|---|---|
| score | float | 安全带佩戴的置信度分值(置信度范围0-1) |
9.18 人脸表情结构体
| 结构体名 | Emotion |
|---|---|
| 说明 | 人脸表情结构体 struct Emotion { int expression; #情绪 float expression_conf; #对应的置信度 float expression_conf_list[7]; # 所有情绪的置信度 } |
| 参数 | 类型 | 说明 |
|---|---|---|
| expression | int | 情绪 (共 7 种情绪,分别是 0: 生气 1:厌恶 2:害怕 3:高兴 4:悲伤 5:惊奇 6:中性) |
| expression_conf | float | 情绪对应的置信度 |
| expression_ conf_list | float | 所有情绪的置信度 |
10. 多端特征值对齐(如和安卓&Windows 通用)
1)对于 Linux ARM SDK 来说,支持和安卓特征值对齐,Linux ARM SDK7.x 系列,特
征值对齐安卓 7.x 系列,但和如安卓 6.x 系列或 5.x 系列,则不对齐,且只支持 rgb可见光特征值对齐。
在 Linux ARM SDK 中,可通过提取的特征值 128 个 float 数组,保存成二进制数 据,即和安卓中的 512 个 byte 保存成字节流的数据对齐。
sdk 中提供了 float 数组转换为二进制 buffer 的示例代码以及二进制 buffer 数据转换 为特征值 float 数组的示例代码。可参考 util 文件夹中的 FeatureAlign 类。Linx 中 的特征值保存成二进制数据文件,可以直接在安卓中用 java 按二进制流方式读出来转 成安卓的特征值。
2)端云特征值同步或跟其他端特征值同步也可参考百度官网文档:
https://ai.baidu.com/ai-doc/FACE/Okg7edktq
11. 多线程运行
SDK 新增支持多实例的多线程使用。可参考 SDK 的示例代码 multi_thread 文件 夹,有具体使用例子。若单个实例,SDK 不支持多线程同时调用如人脸检测(detect)和 提取特征值(face_feature)。但支持多个实例中多线程调用,如可 new 一个实例中调 人脸检测方法(detect),另外一个实例中调特征值提取方法(face_feature)。同理, 若需要用 3 个功能,可分别使用 3 个实例,调用不同的功能接口。
另外,如示例所示,使用多个不同的实例的时候,需要 new 不同的 BaiduFaceApi 实例,同时,需要调多次 sdk_init 方法。销毁时候也一样,注意销毁多个实例,避免 内存泄漏。
12. SDK的版本升级
对 SDK 进行版本升级,分 2 种情况,第一种是大版本号不变,如 8.1 升级到 8.3 或 8.4,第二种是大版本号变化了的升级,如 6.1 升级到 8.1,第一种叫小版本 升级, 第二种叫大版本升级,以下分别说明。
12.1 SDK的小版本升级
SDK 的小版本升级,是指如 7.1 升级到 7.3(首位版本号不变),这种级别的版 本 升级,SDK 的模型,依赖库等都维持不变,提取的人脸特征值也不会发生变化,上个版本的特征值直接可平移到新版本。需要变更升级的文件是:baidu_face_api.so, 以及接口头文件 baidu_face_api.h(大部分情况下接口头文件也不会变化)。
12.2 SDK 的大版本升级
SDK 的大版本升级,是指如 7.1 升级到 8.0(首位版本号发生变化),这种级别的 版本升级,SDK 到模型,依赖库 so 文件都会发生变化,提取的人脸特征值也会发生 变 化,上个版本的特征值和新版本的特征值不能通用。需要变更升级到文件:模型文 件 夹,依赖库 so(所有),baidu_face_api.so 以及接口头文件 baidu_face_api.h 等。
13. 错误码及错误信息
各接口返回结果error_code及msg信息如下:
| 错误码 | 错误内容 | 错误描述 |
|---|---|---|
| 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 不存在 |
14. 常见问题:
14.1 SDK推荐使用交叉编译或在开发板如rk3399或rk3288上直接编译,注意需要安装gcc/g++/cmake。也支持在 ubuntu 等 x86 机器上进行交叉编译。
14.2 工程运行过程中,若不能正常运行功能,可在build目录下,生成face_conf.json文件,内容为{"log_open":true},通过这个json配置文件,可打开sdk的日志模式,运行后会输出及各接口返回的错误码日志等判断问题所在。
14.3 模型文件可定制化:在main方法入口,可在sdk_init方法中传入模型文件夹的绝对路径,达到模型文件定制化的目的。若不定制化路径,sdk_init中传入null即可,默认模型文件在sdk的models文件夹里面,无需更改。
14.4 激活后是否可以把激活文件license.ini和license.key拷贝到其他设备运行?
不能,离线sdk和设备绑定,每个设备对应一个key和一个license文件,换设备无法运行。但对同一台设备,可把Release下的license.ini和license.key拷贝到本电脑的另外sdk,该设备也等同于激活,可以使用。
14.5 是否支持debug模式?
只支持Release模式,不支持debug模式。
14.6 sdk支持armv7hf、armv8等平台,请根据对应平台运行。
14.7 人脸库不支持中文参数?
用户信息user_info支持中文,其他人脸管理参数目前暂只支持英文、数字下划线组合模式,工程所在的路径也建议不用放入中文路径中,可能影响人脸库创建。
14.8 特征值多端是否对齐?
在人脸7.0系列sdk中,安卓和linux端生活照模式下的特征值都是对齐的。linux中请把提取出来的128个float数据保存成二进制数据(float数组转二进制保存)即可和安卓的512个byte二进制数据对齐。linux中人脸库保存的数据是进行了base64编码保存的。
14.9 sdk是否支持多线程运行?
SDK 支持多实例的多线程运行,请参考文档有详 细说明,SDK 的示例 multi_thread 也是说明如何使用多线程。
14.10 海思等其他开发板是否支持?
sdk推荐用在rk3288开发板上,其他开发板是armv7hf或armv8平台,也可支持运行、部分第三库如opencv等,若报错,可推荐在对应开发板上编译产出库文件,opencv推荐使用4.1版本。
14.11 为什么 SDK 只能检测出 1 个人脸?
SDK 默认检测 1 个人脸,若需要检测多个 人脸,可通过修改如前述 7.6 的 detect.json 配置文件实现。
14.12 SDK 的人脸库是否可以和 Windows 端通用?
Linux SDK 的人脸库和 Windows 端通用,Linux 的人脸库 face.db 文件可以直接拷贝 到 Windows 端使用,反之亦然。和安卓的需要参考前面提到的特征值同步方式。
