资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

麒麟-ARM-SDK

1 SDK 简介

本SDK适用于麒麟Linux ARM平台下的人脸识别系统,为支持C++语言开发的SDK,开发者可在麒麟Linux ARM平台下面进行开发(该版本为麒麟armv8平台)。SDK采用导出动态库so的方式提供接口,SDK附带一个示例工程face_offline_sdk,提供了SDK的各种能力及调用示例。

cpu芯片支持:支持主流国产cpu如、飞腾,海光,兆芯,鲲鹏等。

1.1 功能架构

SDK具有人脸检测、追踪、特征值、静默活体、人脸库、镜头模组集成等诸多功能。架构如下: jgt.png

  • 业务层:1:1比对、1:N识别、活体&镜头模组、视频集成、人脸库
  • SDK能力层:人脸检测、人脸追踪、人脸特征值、人脸属性、人脸质量(遮挡、光照、模糊)、人脸注意力、人脸关键点、静默活体
  • 底层:鉴权、模型、算法、依赖库(paddle、opencv等)

1.2 版本及兼容性

本SDK支持麒麟armv8 Linux ARM平台,推荐使用Linux ARM平台上直接编译。

1.3 直接编译和运行

SDK支持在开发板上直接编译运行,步骤如下:

  1. 安装gcc、g++,可自行百度参考,也可命令如下:
     - sudo apt update (更新)
     - sudo apt install build-essential (安装)

若安装正确,可:

   gcc --version
   g++ --version

能看见输出正确的gcc版本号表示安装正确。

  1. 若开发板未安装cmake,需自行查找安装方法并安装和加入环境变量。
  2. SDK支持登录设备上命令行直接编译,可参考SDK中的编译txt文件,具体命令如下:
    - 在SDK工程目录:
    - mkdir build (新建build目录)
    - cd build (进入build目录)
    - cd ..
    - cmake -DARCH_ABI=armv8 .. 
    - make -j4 (或make编译,根据开发板是否支持多核)
    - 回退到sdk工程目录:./run.sh 

2 SDK 工程结构

image.png

3 授权激活

SDK需要授权激活后才能正常使用,在SDK初始化后,若报错误码-13(错误码参考文档最后定义),一般为没有通过授权。通常,SDK分按设备授权和按应用授权两种方式,大部分采用按设备授权的方式,按应用授权可针对批量大规模客户使用(文档中先只介绍按设备授权,按应用授权可工单或联系百度商务获取另外的文档或技术支持)。按设备授权的方式中,SDK自动激活和激活工具激活需要设备能联网,若设备不能连外网,可采用官网离线激活的方式。

3.1 SDK 自动激活

  1. 在SDK的目录中有license文件夹,里面存放了2个文件:license.key和license.ini,分别是授权key和授权文件。
  2. 若在百度官网申请了授权系列号key(16位),可按SDK中的license文件夹中license.key原格式样子用申请的key覆盖填写旧的。
  3. 在设备能联网的情况下,运行SDK会自动授权激活并拉取新的授权文件license.ini覆盖SDK中的旧文件。
  4. 设备能联网的情况下,拉取了正确的授权文件后即可通过授权激活,若报错,可根据错误码定义进行激活失败的排查。

3.2 官网离线激活(适应于设备不能联网场景)

  1. 运行SDK的示例代码face.cpp,可获取设备指纹device id。请查看代码get_device_id部分。
  2. 通过百度官网填入指纹信息device id和申请到的系列号key,完成离线激活并下载license.zip文件解压后得到license.ini文件和license.key文件。
  3. 把这2个文件拷贝到face_offline_sdk的license目录下,重新运行SDK即可通过授权激活。

4 SDK 集成及DEMO 示例工程

4.1 SDK 的集成

  1. 需包含sdk的接口头文件:baidu_face_api.h、struct_info.h(定义sdk的结构体类)。若需要使用face_scene文件夹里面的原子方法,则需要引入整个sdk文件夹的include目录。
  2. 动态库文件在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步骤如下:

// 入口函数
int main() {
    //api 实例指针
    BaiduFaceApi *api = new BaiduFaceApi();
    //初始化sdk 
    std::cout << "before sdk_init" << std::endl;
    int res = api->sdk_init(nullptr);
    std::cout << "after sdk_init" << std::endl;
    if (res != 0)
    {
        std::cout << "sdk init result is:" << res << std::endl;
        getchar();
        return 0;
    }
    std::time_t time_begin = get_timestamp();
    FaceDemo *demo = new FaceDemo(api);
    demo->face_demo();
    delete demo;
    std::time_t time_end = get_timestamp();
    std::cout << "time cost is :" << time_end - time_begin << "ms" <<    std::endl;
    std::cout << "before delete api" << std::endl;
    // 释放sdk 实例指针,防止内存泄漏
    delete api;
    getchar();
    std::cout << "end main" << std::endl;
    return 0;
}

SDK使用主要三步:

  1. 初始化实例指针。
  2. 初始化SDK。
  3. 调用示例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_attr 人脸属性(年龄、性别、种族等)接口及示例
face_head_pose 人脸姿态角接口及示例
face_illumination 人脸光照检测接口及示例
face_occlusion 人脸遮挡度检测接口及示例
face_blur 人脸模糊度检测接口及示例
face_crop 人脸扣图接口及示例
face_gaze 双眼注意力检测接口及示例
face_eye_close 眼睛闭合检测接口及示例
face_mouth_close 嘴巴闭合检测接口及示例
face_mouth_mask 是否佩戴口罩检测接口及示例
sdk_info 实现如读取sdk版本号、设备指纹等接口示例
driver_monitor 驾驶行为检测示例,如打电话、吃东西等
safety_belt 安全带佩戴检测示例
face_action_live 动作活体检测示例
face_emotion 表情识别示例

5 模型能力加载及模型说明

5.1 模型删减说明

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分表情)

5.2 模型路径的定制化

  1. SDK支持模型文件夹models的路径自定义,当SDK初始化api->sdk_init(nullptr)传null时,模型文件夹路径为默认路径(models在SDK现有位置)。
  2. 也可通过sdk_init中传入绝对路径自定义,例如把models文件夹拷贝到/home/face文件夹下面,可定义:api->sdk_init("/home/face")。
  3. 此时,授权文件夹license也需要随之放到/home/face文件夹下面,否则会出现授权不通过的问题。
  4. 另外,若使用了能力自定义的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个最高分的识别结果。
  • 字段配置如下:
[IdentifyScore]
IdentifyScore = 101

5.3.3 修改配置文件启用多因子模式提高静默防攻击能力

在进行RGB静默活体的时候,可通过修改配置文件的字段,打开多因子模型能力,该能力打开后,可提高静默活体防攻击能力(但同时,单帧耗时会有所增加)。打开方法为去掉配置文件face.ini中的#字段(#为注释),使得字段如下:

[MultiFactor] 
MultiFactor = 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_gaze
说明 人脸注意力检测,返回人脸注意力信息
函数 int face_gaze(std::vector& out, const cv::Mat* mat)
请求参数 说明 必须 类型 示例描述
out 通过引用返回的人脸注意力结构体数组 std::vector 注意力结构体
mat 传入的opencv视频帧 Opencv mat 请参考示例
返回信息 说明 类型 示例描述
函数的返回 <=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 int -

6.6 人脸属性检测接口

方法名 face_attr
说明 人脸属性检测,返回人脸属性信息
函数 int face_attr(std::vector& out, const cv::Mat *mat)
请求参数 说明 必须 类型 示例描述
out 通过引用返回的人脸属性结构体数组 std::vector 人脸属性结构体
mat 传入的opencv视频帧 Opencv mat 请参考示例
返回信息 说明 类型 示例描述
函数的返回 <=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 int -

6.7 人脸扣图接口

方法名 face_crop
说明 人脸扣图,返回人脸扣图(仅支持单人脸抠图)
函数 int face_crop(cv::Mat&out, const cv::Mat* mat)
请求参数 说明 必须 类型 示例描述
out 抠图结果图片帧 Opencv mat -
mat 传入的opencv视频帧 Opencv mat -
返回信息 说明 类型 示例描述
函数的返回 <=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 int -

6.8 暗光恢复接口

方法名 dark_enhance
说明 暗光恢复,用于图片比较暗的使之变亮利于人脸检测(仅支持单人脸抠图)
函数 int dark_enhance(cv::Mat&out, const cv::Mat* mat)
请求参数 说明 必须 类型 示例描述
out 暗光恢复结果图片帧 Opencv mat -
mat 传入的opencv视频帧 Opencv mat -
返回信息 说明 类型 示例描述
函数的返回 <0为错误码,=0表示成功 int -

6.9 眼部状态检测接口

方法名 face_eye_close
说明 人脸眼部状态检测,返回人脸眼部状态信息
函数 int face_eye_close(std::vector &out, const cv::Mat* mat)
请求参数 说明 必须 类型 示例描述
out 通过引用返回的人脸眼部状态结构体数组 std::vector 眼部状态信息结构体
mat 传入的opencv视频帧 Opencv mat 请参考示例
返回信息 说明 类型 示例描述
函数的返回 <=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 int -

6.10 嘴巴闭合检测接口

方法名 face_mouth_close
说明 人脸嘴巴闭合检测,返回人脸嘴巴闭合信息
函数 int face_mouth_close(std::vector& out, const cv::Mat* mat)
请求参数 说明 必须 类型 示例描述
out 通过引用返回的人脸嘴巴闭合结构体数组 std::vector 嘴巴闭合结构体
mat 传入的opencv视频帧 Opencv mat 请参考示例
返回信息 说明 类型 示例描述
函数的返回 <=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 int -

6.11 口罩佩戴检测接口

方法名 face_mouth_mask
说明 人脸口罩佩戴检测,返回人脸口罩佩戴信息
函数 int face_mouth_mask(std::vector& out, const cv::Mat* mat)
请求参数 说明 必须 类型 示例描述
out 通过引用返回的人脸口罩佩戴结构体数组 std::vector 佩戴口罩结构体
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.12.5 最优人脸检测接口

方法名 face_best
说明 最佳人脸检测(最优人脸分值0-100,分值越高,最佳人脸图片得分越高)
函数 int face_best(std::vector &out, const cv::Mat *mat)
请求参数 说明 必须 类型 示例描述
out 通过引用返回的最佳人脸结构体数组 std::vector 最优人脸结构体
mat 传入的opencv视频帧 Opencv mat 请参考示例
返回信息 说明 类型 示例描述
函数的返回 <=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 int -

6.12.6 人脸表情接口

方法名 face_emotion
说明 人脸表情检测,返回人脸表情检测信息
函数 int face_emotion(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比对流程如下:

7207885445c353506492db8d9737000b.png

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 深度人脸特征值接口

方法名 rgbd_feature
说明 人脸特征值提取,返回人脸信息
函数 int rgbd_feature(std::vector &out_fea, std::vector &out_box, const cv::Mat rgb_mat, char depth_mat)
请求参数 说明 必须 类型 示例描述
out_fea 通过引用返回的人脸特征值结构体数组 std::vector 人脸特征值结构体信息
out_box 通过引用返回的人脸框结构体数组 std::vector 人脸框结构体信息
rgb_mat 传入可见光的opencv视频帧 Opencv mat 请参考示例
depth_mat 传入深度的二进制流数据 char* 请参考示例
返回信息 说明 类型 示例描述
函数的返回 <=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 int -

6.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 -

6.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寸的证据照也推荐当作生活照模式)
返回信息 说明 类型 示例描述
函数的返回 人脸比对分值(同特征值比对分值结果应该是float,这里返回int是做了四舍五入) int -

6.14 动作活体和静默活体

6.14.1 动作活体接口

方法名 face_action_live
说明 动作活体(眨眨眼、张张嘴等动作校验活体)
函数 int face_action_live(std::vector& out, int action_type, int& action_result, const cv::Mat* mat)
参数 说明 必须 类型 示例描述
out 返回的人脸框结构体数组 std::vector 人脸框结构体
action_type 传入的活体动作 int 动作活体类型,如0表示眨眨眼,1表示张嘴等
action_result 动作活体的返回结果 int 返回结果为1表示存在该动作活体
mat 传入的opencv视频帧 Mat 视频帧
返回字段描述 说明 类型 示例描述
返回字段 >=0返回人脸个数,<0时候为错误码 int -

6.14.2 清除动作活体历史接口

方法名 action_live_clear_history
说明 清除动作活体历史(判断是否有一个动作需要累积多次图片帧的检测,可用来表示如做某动作,执行该接口后,前置在算法中的图片帧检测清零,算法按执行该接口后重新累积图片帧进行计算)
函数 int action_live_clear_history()
返回字段描述 说明 类型 示例描述
返回字段 0表示成功,其他为错误码 int -

6.14.3 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.4 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.5 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识别流程图如下: image.png

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

6.17 安全驾驶接口

6.17.1 驾驶行为检测接口

方法名 driver_monitor
说明 驾驶行为检测接口,返回驾驶行为信息
函数 int driver_monitor(std::vector &out, const cv::Mat *mat)
参数 说明 必须 类型 示例描述
out 返回的驾驶行为结构体数组信息 std::vector DriverMonitor结构体见后续结构体定义
mat 传入的opencv图片帧 cv::Mat * -
返回字段描述 说明 类型 示例描述
返回值 >=0返回人脸个数,<0时候为错误码 int -

6.17.2 安全带佩戴检测接口

方法名 safety_belt
说明 安全带佩戴检测接口,返回佩戴置信度分值
函数 int safety_belt(std::vector &out, const cv::Mat *mat)
参数 说明 必须 类型 示例描述
out 返回的安全带佩戴结构体数组信息 std::vector SafeBelt结构体见后续结构体定义
mat 传入的opencv图片帧 cv::Mat * -
返回字段描述 说明 类型 示例描述
返回值 >=0返回人脸个数,<0时候为错误码 int -

7 结构体描述

7.1 人脸跟踪信息结构体

结构体名 TrackFaceInfo
说明 人脸跟踪信息结构体
struct TrackFaceInfo {
    long face_id;
    FaceBox box;
    Landmarks facelandmarks; 
    }
参数 类型 说明
face_id long 人脸id
box FaceBox 人脸框结构体
facelandmarks Landmarks 人脸关键点结构体

7.2 人脸框信息结构体

结构体名 FaceBox
说明 人脸框信息结构体
struct FaceBox 
{ 
    int index; 
    float center_x; 
    float center_y; 
    float width; 
    float height; 
    float score;
}
参数 类型 说明
index int 人脸索引值
center_x float 人脸中心点x坐标
center_y float 人脸中心点y坐标
width float 人脸宽度
height float 人脸高度
score float 人脸置信度

7.3 人脸关键点信息结构体

结构体名 Landmarks
说明 人脸关键点信息结构体
struct Landmarks { 
    int index;
    int size;
    float data[144];
    float score; 
}
参数 类型 说明
index int 人脸关键点索引
size int -
data[144] float 人脸关键点数据
score float 人脸关键点置信度

7.4 人脸特征值结构体

结构体名 Feature
说明 人脸特征值结构体
struct Feature { 
    int size; 
    float data[128]; 
} 
参数 类型 说明
size int -
data[128] float[] 128个浮点值数组

7.5 人脸姿态角结构体

结构体名 HeadPose
说明 人脸姿态角结构体
struct HeadPose { 
    float yaw; 
    float roll; 
    float pitch;
} 
参数 类型 说明
yaw float 左右偏转角
roll float 与人脸平行平面内的头部旋转角
pitch float 上下偏转角

7.6 人脸属性信息结构体

结构体名 Attribute
说明 人脸属性信息结构体
struct Attribute { 
    int age; 
    Race race; 
    AttributeEmotionType emotion; 
    Glasses glasses; 
    Gender gender; 
}
参数 类型 说明
age int 年龄
race Race 种族,枚举值:BDFace_RACE_YELLOW=0(黄种人)、BDFace_RACE_WHITE=1(白种人)、BDFace_RACE_BLACK=2(黑种人)、BDFace_RACE_INDIAN=3(印第安人)
emotion AttributeEmotionType 表情,枚举值:BDFACE_ATTRIBUTE_EMOTION_FROWN=0(皱眉)、BDFACE_ATTRIBUTE_EMOTION_SMILE=1(笑)、BDFACE_ATTRIBUTE_EMOTION_CALM=2(平静)
glasses Glasses 戴眼镜状态,枚举值:BDFACE_NO_GLASSES=0(无眼镜)、BDFACE_GLASSES=1(有眼镜)、BDFACE_SUN_GLASSES=2(墨镜)
gender Gender 性别,枚举值:BDFACE_GENDER_FEMILE=0(女性)、BDFACE_GENDER_MALE=1(男性)

7.7 嘴巴闭合结构体

结构体名 MouthClose
说明 嘴巴闭合置信度结构体
struct MouthClose {
    float score; 
} 
参数 类型 说明
score float 置信度分值

7.8 口罩佩戴结构体

结构体名 MouthMask
说明 口罩佩戴置信度结构体
struct MouthMask { 
    float blur_score; 
    float mask_score; 
    float mask_blur_score; 
}
参数 类型 说明
blur_score float 遮挡置信度分值
mask_score float 佩戴口罩置信度分值
mask_blur_score float 口罩遮挡概率

7.9 最优人脸置信度结构体

结构体名 Best
说明 最优人脸置信度结构体
struct Best { 
    float score; 
} 
参数 类型 说明
score float 置信度分值

7.10 人脸模糊度置信度结构体

结构体名 Blur
说明 人脸模糊度置信度结构体
struct Blur { 
    float score; 
}
参数 类型 说明
score float 置信度分值

7.11 人脸光照置信度结构体

结构体名 Illumination
说明 光照置信度结构体
struct Illumination { 
    int score; 
} 
参数 类型 说明
score int 置信度分值

7.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 下巴遮挡置信度

7.13 人眼闭合状态结构体

结构体名 EyeClose
说明 人眼闭合状态结构体
struct EyeClose { 
    float left_eye_close_conf; 
    float right_eye_close_conf; 
} 
参数 类型 说明
left_eye_close_conf float 左眼闭合置信度
right_eye_close_conf float 右眼闭合置信度

7.14 注意力结构体

结构体名 GazeInfo
说明 注意力结构体
struct GazeInfo { 
    Gaze left_eye; 
    Gaze right_eye; 
}
 BDFACE_GAZE_DIRECTION_UP=0(向上看)、
 BDFACE_GAZE_DIRECTION_DOWN=1(向下看)、
 BDFACE_GAZE_DIRECTION_RIGHT=2(向右看)、
 BDFACE_GZE_DIRECTION_LEFT=3(向左看) 
参数 类型 说明
left_eye Gaze 左眼注意力
right_eye Gaze 右眼注意力

7.15 静默活体置信度结构体

结构体名 LivenessScore
说明 活体信度结构体
struct LivenessScore { 
    float score; 
} 
参数 类型 说明
score float 置信度分值

7.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)

7.17 安全带佩戴结构体

结构体名 SafetyBelt
说明 安全带佩戴行为结构体:struct SafetyBelt { float score; }
参数 类型 说明
score float 安全带佩戴的置信度分值(置信度范围0-1)

7.18 人脸表情结构体(7分表情)

结构体名 Emotion
说明 人脸表情结构体
struct Emotion { 
    int expression; 
    float expression_conf; 
    float expression_conf_list[7]; 
}
(expression:情绪;expression_conf:情绪对应的置信度;expression_conf_list[7]:所有情绪的置信度)
参数 类型 说明
expression int 情绪(共7种,0:生气、1:厌恶、2:害怕、3:高兴、4:悲伤、5:惊奇、6:中性)
expression_conf float 情绪对应的置信度
expression_conf_list float 所有情绪的置信度

8 多端特征值对齐

  • 麒麟 ARM 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推荐在麒麟Arm设备上直接编译运行,需安装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 支持ARMV8平台,需根据对应平台运行。

11.7 人脸库参数限制:用户信息user_info支持中文,其他管理参数仅支持英文、数字、下划线组合;工程路径建议避免中文,否则可能影响人脸库创建。

11.8 特征值多端对齐:人脸8.0系列SDK中,安卓和Linux端生活照模式特征值对齐;Linux端需将128个float数据转为二进制保存,即可与安卓512个byte二进制数据对齐;Linux人脸库数据采用BASE64编码保存。

11.9 多线程支持:支持多实例的多线程运行,具体参考multi_thread示例。

11.10 其他开发板支持:推荐RK3288/RK3399,其他ARMV7HF/ARMV8平台开发板也可支持;若OpenCV等第三方库报错,需在对应开发板上编译产出库文件,推荐OpenCV 4.1版本。

11.11 多人脸检测设置:SDK默认检测1个人脸,需修改detect.json配置文件实现多人脸检测。

上一篇
Linux-ARM-SDK
下一篇
统信-ARM-SDK