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

Linux RV1126B-SDK

1 SDK 简介

本 SDK 适应于 Linux RV1126B 平台下的人脸识别系统,为支持 C++语言开发的 SDK, 开发者可在 Linux RV1126B 平台下面进行开发。SDK 采用导出动态库 DLL 的方式提供接 口,SDK 附带一个示例工程 face_offline_sdk,提供了 SDK 的各种能力及调用示例。 SDK 采用 npu 进行推理,速度和性能较传统的 cpu 方式更佳。

1.1 功能架构

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

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

1.2 版本及兼容性

本SDK支持 64 位 Linux arm aarch64 平台的版本。 支持在 x86 环境的 ubuntu 操作系统或 centos 等系统上进行交叉编译,把编译后的可 执行程序拷贝到 RV1126B 板子上进行运行。(其他 Linux arm 系统不保证能支持)。

1.3 交叉编译和运行(也可参考SDK zip包里的编译说明.md)

SDK 支持在 x86 宿主机 ubuntu18.04 及以上或 centos 系列上进行交叉编译。
交叉编译工具链: gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.zip
可去 linaro 官网下载或百度网盘:
链接: https://pan.baidu.com/s/1bRfJhZREl-N3PNIxsjsU0A 提取码: xkuc
下载后按如下步骤操作:
1) 解压到指定路径 (请正确填写 zip 名称)

     - mkdir -p /opt/gcc           #创建文件夹
     - cp gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.zip /opt/gcc       #拷贝zip
     - cd /opt/gcc                 #到gcc路径
     - unzip gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.zip        #解压

2)加入环境变量

    - sudo vim /etc/profile
    export PATH=/opt/gcc/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu
/bin:$PATH #这句加入profile的最后一行
    - source /etc/profile #保存环境变量生效

3)检查工具链是否正常:

  - aarch64-linux-gnu-gcc --version #若看见正确的版本输出,表示工具链部署成功。

4)进行交叉编译: SDK 自带 quick_build.sh 脚本,执行:

  - sh quick_build.sh    #编译SDK
  - sh run.sh            #运行SDK,需要把整个编译后的工程拷贝到开发板上执行脚本

2 SDK 工程结构

6e15e365ca847eb7ce8fa245699d9c15.png

3 授权激活

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

3.1 SDK 自动激活(设备需要能联网)

在 SDK 的目录中有 models 文件夹,里面存放了 2 个文件,license.key 和 license.ini,分别是授权 key 和授权文件,若在百度官网申请了授权系列号 key(16 位),可按 SDK 中的 models 文件夹中 license.key 原格式样子覆盖填写您申请的 key。 在设备能联网的情况下,运行 SDK 会自动授权激活并拉取新的授权文件 license.ini 覆盖SDK中的旧文件。

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

若设备不能连外网、通过授权还有另外一种方法,即通过运行 SDK 的示例代码 face.cpp,可得到设备指纹 device id,获取到设备硬件指纹信息后,通过百度官网填 入指纹信息和申请到的系列号 key,可完成激活并下载获取到 license.ini 文件和 license.key 文件,把这 2 个文件拷贝到 face_offline_sdk 的 models 目录下,重新运 行 SDK 亦可通过授权激活。

4 加载驱动

若运行 SDK 后无法正确运行,报如下错误: b0c04850aa6ab9fa0b300e1d04a979c1.png 则可能是开发板没用加载驱动导致,执行如下命令加载后再运行 SDK 即可。

  - sudo chmod 0777 /dev/rk*    #加载驱动

5 SDK 集成及DEMO 示例工程

5.1 SDK 的集成

  1. 需包含sdk的接口头文件:baidu_face_api.h、struct_info.h(定义sdk的结构体类)。
  2. 动态库文件在lib文件夹下,各动态库文件说明如下:
so 文件名称 so 文件说明 是否可删除
libbaidu_face_api.so 百度人脸库文件
libfaceid.so 百度人脸库文件
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

5.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();
    // 获取指纹设备
    std::string dev_id;
    get_device_id(api,dev_id);
    //初始化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_head_pose 人脸姿态角接口及示例
face_illumination 人脸光照检测接口及示例
face_occlusion 人脸遮挡度检测接口及示例
face_blur 人脸模糊度检测接口及示例
face_crop 人脸扣图接口及示例
face_mouth_mask 是否佩戴口罩检测接口及示例

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

SDK 中的 models 文件夹是模型文件夹,SDK 的所有能力模型文件在这里,切勿删除。 模型文件会在 SDK 初始化时候自动加载。

6.1 模型路径的定制化

SDK 支持模型文件夹 models 的路径自定义,当 SDK 初始化 api->sdk_init(nullptr)传 null 时候,为 SDK 支持模型文件夹路径在默认路径,即 models 在 SDK 现有位置。同时 也支持 models 通过 sdk_init 中传入绝对路径。若把 models 文件夹拷贝到如 /home/face 文件夹下面,则可定义: api->sdk_init(“/home/face”);

6.2 SDK 的配置文件

SDK提供配置文件face.ini,通过修改配置文件,可输出文件日志、定制化数据库文件db路径等,可通过#注释字段,具体可参见face.ini示例。当sdk_init传nullptr的时候,face.ini默认在SDK的run.sh同目录夹中;若sdk_init传入了绝对路径,则face.ini文件需要放置在传入的绝对路径上层目录中。

6.2.1 修改配置文件输出日志

人脸库路径db文件夹也可定制化,通过修改face.ini文件实现:

  • 若face.ini定义字段:DbDir = /home/face,则表示人脸库路径会生成在/home/face路径的face文件夹中。
  • 若无需定制,则在face.ini中删除DbDir字段即可,#号为注释或不启用该字段。

6.2.2 修改配置文件变更人脸识别输出结果数量

通常,进行1:N人脸识别的时候,只返回最高分的识别结果。若需要返回更多结果,可通过修改face.ini文件的IdentifyScore字段:

  • 如设为80,则返回识别分值大于80的结果(可能多个)。
  • 若只想返回1个结果,把字段的值设置为101,则返回1个最高分的识别结果。
  • 字段配置如下:
[IdentifyScore]
IdentifyScore = 101

7 功能接口

SDK功能接口的调用可参考各示例cpp文件,接口定义在baidu_face_api.h。SDK实现的主要功能有人脸实时跟踪检测、人脸特征值提取、动作活体、RGB&IR静默活体检测、RGB&DEPTH静默活体检测、人脸注册、人脸更新、组管理、用户管理以及1:1人脸对比、1:N人脸识别、特征值的比对和通过usb或笔记本自带摄像头检测视频帧,返回识别出的人脸信息、人脸属性等,另外支持对人脸检测进行能力加载设置,达到根据设置进行识别的目的。

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

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

7.3 人脸关键点接口

方法名 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 -

7.4 人脸扣图接口

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

7.5 口罩佩戴检测接口

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

7.6 人脸质量

人脸质量判断可由以下几个因素自由组合综合判断,如姿态角、光照、遮挡、模糊以及最佳人脸。人脸质量判断的推荐阈值:人脸检测置信度>0.6、遮挡度>0.8、人脸姿态角<20、人脸模糊度>0.8、人脸光照(亮度) > 0.8。

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

7.6.2 人脸光照检测接口

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

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

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

7.7 特征值及人脸比对(1:1)

人脸比对的原理实际是特征值比对,通过提取图片中的人脸特征值,根据特征值调用compare_feature接口进行比对,推荐比对分值超过80分为同一人,可根据实际检测比对情况动态调整。

人脸1:1比对流程如下,实现如人证比对功能。 (人的照片和实时视频比对,可根 据使用情况选择是否启用质量检测):

7207885445c353506492db8d9737000b.png

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

7.7.2 Pipline 全流程特征值提取接口 (采用该接口提取的特征值更符合质量要求,识别时候更准确)

方法名 pipline_feature
说明 人脸特征值提取,并返回人脸信息(加入了质量判断,静默活体等过滤,并且可以通过参数设定是否需要进行这些过滤)
函数 int pipline_feature(Feature &out_fea, PiplineRes &out_res, const PiplineConf&conf, const cv::Mat *mat)
请求参数 说明 必须 类型 示例描述
out_fea 通过引用返回的人脸特征值结构体数组 Feature 人脸特征值结构体信息
out_res 通过引用返回的全流程Pipline 结构体数据,见后述定义 PiplineRes 全流程结构体信息
conf 全流程配置 PiplineConf 全流程配置,可设定是否进行质量过滤,静默活体过滤等参数
mat 传入的opencv视频帧 Opencv mat 请参考示例
返回信息 说明 类型 示例描述
--- --- --- ---
函数的返回 <=0为未检测到人脸或错误码,>0时候为检测到的人脸数量 int -

7.7.3 特征值比对接口

方法名 compare_feature
说明 人脸特征值比对,返回比对分值
函数 float compare_feature(Feature f1, Feature f2, int type)
请求参数 说明 必须 类型 示例描述
f1 人脸特征值结构体 Feature* 人脸特征值结构体信息(仅支持单个结构体的比对)
f2 人脸特征值结构体 Feature* 人脸特征值结构体信息(仅支持单个结构体的比对)
type 特征值类型(0,1) int 0:生活照,1:近红外特征值,未传默认为0
返回信息 说明 类型 示例描述
函数的返回 特征值比对分值 float -

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

7.8 静默活体

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

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

7.9 人脸库管理

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

7.9.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:失败的原因

7.9.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:失败的原因

7.9.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:失败的原因

7.9.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,请求日志标识

7.9.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,请求日志标识

7.9.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,请求日志标识

7.9.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,人脸首次注册时间

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

7.9.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列表数组

7.9.10 人脸库人脸数量查询

方法名 db_face_count
说明 查询数据库人脸数量(传入组id表示查询该组的人脸数量,null表示查整个库的人脸数量)
函数 int db_face_count(const char* group_id = nullptr)
参数 说明 必须 类型 示例描述
group_id 组id const char* 人脸分组的组id(传null表示查询整个库的数量)
返回示例 说明 类型 示例描述
返回值 >=0(返回的数量) int -

7.9.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列表数组

7.9.12 人脸识别接口

人脸识别(1:N)结果,通过传入人脸特征值或图片进行人脸的1:N识别,即传入的1和人脸库的N进行识别(人脸库自动创建,需要通过user_add等接口把人脸注册入库),人脸识别的返回默认大于80分的识别结果。可通过配置文件face.ini中的字段IdentifyScore的分值控制识别返回的结果,若该字段分值设为101,则默认返回1个识别结果(1:N的识别最高分结果)。

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

7.10 SDK 系统信息接口

7.10.1 获取SDK 版本号接口

方法名 sdk_version
说明 通过引用返回sdk版本号
函数 void sdk_version(std::string& version)
参数 说明 必须 类型 示例描述
version 返回的sdk版本号结果 string 如:6.3.3

7.10.2 获取设备指纹接口

方法名 get_device_id
说明 通过引用返回sdk的设备指纹信息(可用来标识sdk的唯一性)
函数 void get_device_id(std::string& device_id)
参数 说明 必须 类型 示例描述
device_id 返回的sdk设备指纹结果 string 如:0BAF96961A8377AB74797B05F7F2C805

8 结构体描述

8.1 人脸跟踪信息结构体

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

8.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 人脸置信度

8.3 人脸关键点信息结构体

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

8.4 人脸特征值结构体

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

8.5 人脸姿态角结构体

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

8.6 人脸质量信息结构体

结构体名 Quality
说明 人脸姿态角结构体
struct Quality { 
    HeadPose head_pose;
    Occlusion occlusion;
    Illumination illum;
    Blur blur;
    float score; 
} 
参数 类型 说明
head_pose HeadPose 人脸姿态角
occlusion Occlusion 人脸遮挡信息
illum Illumination 人脸光照信息
blur Blur 人脸模糊度信息
score float 人脸质量分值

8.7 Pipline 配置信息

结构体名 PiplineConf
说明 人脸姿态角结构体
struct PiplineConf { 
    bool check_headpose;
    bool check_blur;
    bool check_illum;
    bool check_occlu;
    bool check_liveness; 
} 
参数 类型 说明
check_headpose bool 是否检测人脸姿态角
check_blur bool 是否检测模糊信息
check_illum bool 是否检测光照信息
check_occlu bool 是否检测遮挡信息
check_liveness bool 是否检测静默活体

8.8 Pipline 返回信息

结构体名 PiplineConf
说明 人脸姿态角结构体
struct PiplineRes { 
    FaceBox box;
    Quality quality;
    float rgb_score;
    float nir_score;
} 
参数 类型 说明
box FaceBox 返回的人脸框
quality Quality 返回的人脸质量信息
rgb_score float 返回的可见光静默活体分值
nir_score float 返回的近红外静默活体分值(可见光单目活体时候,该分值忽略)

8.9 口罩佩戴结构体

结构体名 MouthMask
说明 人脸姿态角结构体
struct MouthMask { 
    float mask_score;
} 
参数 类型 说明
mask_score float 返回的佩戴口罩置信度分值

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

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

8.11 人脸光照置信度结构体

结构体名 Illumination
说明 光照置信度结构体
struct Illumination { 
    int score[2]; 
} 
参数 类型 说明
score[0] int 亮度置信度分值
score[1] int 暗度置信度分值

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

8.13 静默活体置信度结构体

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

9 错误码及错误信息

错误码 错误内容 错误描述
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不存在

10 常见问题

10.1 工程运行异常时,可在face.ini中设置LogType=1,开启SDK日志模式,通过输出的错误码日志定位问题。

10.2 模型文件可定制化:在main方法入口的sdk_init中传入模型文件夹绝对路径;不定制则传入NULL,默认使用SDK的models文件夹。

10.3 激活文件不可跨设备使用:离线SDK与设备绑定,每个设备对应唯一key和license文件;同一设备下可将Release目录的license.ini和license.key拷贝到其他SDK使用。

10.4 仅支持RELEASE模式,不支持DEBUG模式。

10.5 SDK 支持 rv1126b 开发板,请根据对应平台运行。

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

10.7 特征值多端是否对齐?该 SDK 为专版 SDK,只对应这个版本的特征值。

10.8 SDK 是否支持多线程运行?SDK 采用 npu 推理,不支持多线程运行。

上一篇
open-鸿蒙SDK
下一篇
历史版本