人脸识别离线SDK
Version:facelib 3.1.2.2
接口使用示例demo
https://github.com/Rokid/RokidFaceSDK/tree/master/sample
一. FaceSDK介绍
版本号说明:
前两位3.1表示算法版本号,后两位2.2表示sdk版本号
1.1 概述
RokidFaceSDK提供基础的人脸检测+人脸跟踪+人脸识别,能够高效进行多人识别。本SDK封装底层算法接口,提供:
1.图片人脸检测+图片人脸识别
2.相机预览数据人脸检测,人脸跟踪,人脸识别。
3.人脸数据库增删改查的接口
4.能够获取人脸角度以及人脸质量等信息
5.单帧图片人脸检测,支持bitmap、NV21格式数据人脸检测
二. 集成说明
2.1 添加三方依赖库
在project的build.gradle中添加jcenter依赖
allprojects {
    repositories {
        google()
        jcenter()
    }
}
在app的build.gradle中添加依赖
dependencies {
    implementation 'com.rokid.glass:facelib:3.1.2.2'
}
2.2 需要如下权限
网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
读取外部存储权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE/>
相机权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
三. 接口说明及示例
3.0 人脸识别引擎初始化
在应用的Application的onCreate方法中初始化引擎: 1. 人脸识别引擎初始化
RokidFace.Init(Context context,boolean npuMode);
| 参数 | 含义 | 
|---|---|
| context | 上下文context | 
| npuMode | 是否切换到npu模式(注意:设备必须支持npu才能将该值设为true) | 
3.1 人脸数据库操作
3.1.1 人脸数据库初始化
人脸数据库初始化需要下面几步操作: 1. 创建人脸数据库Helper对象 说明:数据库操作的实体类
FaceDbHelper(Context context)
| 参数 | 含义 | 
|---|---|
| context | 上下文context | 
返回:
FaceDbHelper
2. 创建人脸数据库
void createDb()
示例代码
FaceDbHelper faceDbHelper = new FaceDbHelper(getApplicationContext());
faceDbHelper.createDb();
3.1.2 人脸特征的添加
说明: 添加人脸特征到内存中
String add(Bitmap bm)
| 参数 | 含义 | 
|---|---|
| bm | 传入的图片 | 
返回: 图片人脸特征ID,表示对该图片人脸特征的唯一识别号,在人脸识别时会返回该特征ID;开发者可以以该ID为主键创建人脸信息数据库,当人脸识别返回该ID时,去查询人脸信息。
示例代码:
String featId = faceDbHelper.add(bm);
3.1.3 人脸特征搜索引擎保存到本地
说明:
- 人脸特征搜索引擎文件会储存在/sdcard/facesdk/ 目录下;
- 人脸特征搜索引擎文件为"SearchEngine.bin";
- 使用人脸识别时需将这该文件拷贝至需要的设备中;
- 调用没有参数的接口,默认支持最大数据库人脸数为10000;void save();
//maxSize表示支持最大人脸数
void save(int maxSize);
示例代码:
faceDbHelper.save();
faceDbHelper.save(int maxSize);
3.1.4 清除人脸特征库搜索引擎
faceDbHelper.clearDb();
3.2 人脸检测参数配置
3.2.1 人脸检测配置参数
1. 设置数据源宽高
DFaceConf setSize(int width,int height)
| 参数 | 含义 | 
|---|---|
| width | 输入数据的宽 | 
| height | 输入数据的高 | 
返回:
| 类型 | 含义 | 
|---|---|
| DFaceConf | 动态配置类 | 
2. 设置算法识别区域
DFaceConf setRoi(Rect rect)
| 参数 | 含义 | 
|---|---|
| rect | 输入算法检测区域 | 
返回:
| 类型 | 含义 | 
|---|---|
| DFaceConf | 动态配置类 | 
3. 设置同时识别最大人脸数
DFaceConf setPoolNum(int poolNum)
| 参数 | 含义 | 
|---|---|
| poolNum | 同时识别最大人脸数 | 
返回:
| 类型 | 含义 | 
|---|---|
| DFaceConf | 动态配置类 | 
4. 设置识别的最大的人脸
DFaceConf setMaxSize(float faceMaxSize)
| 参数 | 含义 | 
|---|---|
| faceMaxSize | 识别的最大的人脸size 取值(0f-1f)。例:如果相机分辨率为1280720,那能够识别的最大人脸的像素为width:1280faceMaxSize height:720*faceMaxSize | 
返回:
| 类型 | 含义 | 
|---|---|
| DFaceConf | 动态配置类 | 
5.设置识别的最小的人脸
DFaceConf setMinSize(float faceMinSize)
| 参数 | 含义 | 
|---|---|
| faceMinSize | 识别的最小的人脸size 取值(0f-1f)。例:如果相机分辨率为1280720,那能够识别的最小人脸的像素为width:1280faceMaxSize height:720*faceMaxSize | 
返回:
| 类型 | 含义 | 
|---|---|
| DFaceConf | 动态配置类 | 
6. 设置单次detect的最大人脸数
DFaceConf setDetectMaxFace(int detectMaxFace)
| 参数 | 含义 | 
|---|---|
| detectMaxFace | 单次detect能检测到的最大人脸数 | 
返回:
| 类型 | 含义 | 
|---|---|
| DFaceConf | 动态配置类 | 
7. 设置识别相关配置
SFaceConf setRecog(boolean recog,String dbName)
| 参数 | 含义 | 
|---|---|
| recog | 是否打开人脸识别开关 | 
| dbName | 人脸数据库文件夹路径 | 
返回:
| 类型 | 含义 | 
|---|---|
| SFaceConf | 静态配置类 | 
8. 设置识别阈值
SFaceConf setTargetScore(float targetScore);
| 参数 | 含义 | 
|---|---|
| targetScore | 阈值(取值0-100),小于阈值的识别结果将被过滤 | 
返回:
| 类型 | 含义 | 
|---|---|
| SFaceConf | 静态配置类 | 
9. 设置识别超时
SFaceConf setOutTime(long ms);
| 参数 | 含义 | 
|---|---|
| ms | 超时时间,超过该时间还没有超过阈值的识别结果,则返回超时 | 
返回:
| 类型 | 含义 | 
|---|---|
| SFaceConf | 静态配置类 | 
10. 设置识别间隔
SFaceConf setRecogInterval(long ms);
| 参数 | 含义 | 
|---|---|
| ms | 识别间隔,同一张人脸两次识别的时间间隔 | 
返回:
| 类型 | 含义 | 
|---|---|
| SFaceConf | 静态配置类 | 
示例代码:
DFaceConf conf = new DFaceConf();
conf.setSize(width, height); // 设置数据宽高
conf.setRoi(rect); // 设置检测roi区域
SFaceConf conf = new SFaceConf();
conf.setRecog(true, dbPath); //设置人脸识别搜索引擎的路径
conf.setTargetScore(80);//设置识别阈值
conf.setsetOutTime(2000);//设置超时时间
conf.setRecogInterval(5000);//设置识别间隔
3.3 相机/video人脸检测
3.3.1 人脸sdk创建
1. 动态参数配置
VideoRokidFace create(Context context,DFaceConf dFaceConf)
| 参数 | 含义 | 
|---|---|
| context | 上下文context | 
| dFaceConf | 动态配置类 | 
返回:
VideoRokidFace video人脸识别接口
2. 静态参数配置
sconfig(SFaceConf conf)
| 参数 | 含义 | 
|---|---|
| conf | 静态配置类 | 
示例代码:
VideoRokidFace videoFace = VideoRokidFace.create(context,videoDFaceConf);
videoFace.sconfig(sFaceConf);
3.3.2 设置相机预览数据
说明:将数据传入sdk
void setData(VideoInput videoInput)
| 参数 | 含义 | 
|---|---|
| videoInput | video输入数据类 | 
示例代码:
videoFace.setData(new VideoInput(bytes));
3.3.3 检测数据获取
说明:获取输入的数据
byte[] getBytes()
返回: 相机传入的数据
示例代码:
videoFace.getBytes();
3.3.4 人脸检测+人脸跟踪
说明:检测结果会统一以FaceModel数据结构返回
void startTrack(RokidFaceCallback rokidFaceCallback)
| 参数 | 含义 | 
|---|---|
| rokidFaceCallback | 人脸检测+人脸跟踪+人脸识别的统一回调接口 | 
示例代码:
videoFace.startTrack(new RokidFaceCallback() {
    @Override
    public void onFaceCallback(FaceModel model) {
    }
});
3.3.5 人脸检测的销毁
说明:人脸识别接口的内存回收
videoFace.destroy();
3.4 单张图片的人脸检测
3.4.1 人脸检测创建
说明:创建图片识别接口
IImageRokidFace imageFace = ImageRokidFace.create(context);
| 参数 | 含义 | 
|---|---|
| context | context上下文 | 
返回:
IImageRokidFace 图片识别的接口
示例代码:
IImageRokidFace imageFace = ImageRokidFace.create(context);
3.4.2 人脸检测初始化
说明:图片识别静态配置
IImageRokidFace sconfig(SFaceConf sFaceConf)
| 参数 | 含义 | 
|---|---|
| sFaceConf | 静态配置 | 
返回:
IImageRokidFace 图片识别的接口
示例代码:
// 如果图片检测需要人脸识别,则sconfig
imageFace.sconfig(new SFaceConf().setRecog(true, dbPath));
3.4.3 人脸检测接口
说明:图片识别的功能实现接口
setImageFaceCallback(BitmapInput bitmapInput,ImageFaceCallBack callback)
| 参数 | 含义 | 
|---|---|
| bitmapInput | bitmapInput图片输入的数据结构; | 
| callback | 图片人脸检测+人脸识别的统一回调接口 | 
示例代码:
imageFace.setImageFaceCallback(new BitmapInput(bitmap),
    new ImageRokidFace.ImageFaceCallBack() {
        @Override
        public void onFaceModel(FaceModel model) {
        }});
3.4.4 人脸检测销毁
说明: 图片人脸识别接口的回收
imageFace.destroy()
3.5 人脸实体类
3.5.1 人脸数据类
FaceModel {
   int width;
   int height;
   List<FaceDO> faces; //人脸检测数据model,包含FaceDO list
}
FaceDO {
    public RectF faceRectF; // 人脸rect
    public int trackId;  // trackId 人脸trackId,tracking中id不变
    public boolean goodQuality;//人脸质量是否合格
    public boolean goodPose;//人脸角度是否合格
    public boolean goodSharpness;//人脸清晰度是否合格
    public float[] pose; //人脸角度
    public float userInfoScore; //搜索引擎中搜索出的人脸相似度(取值0-100),取值越高表示该人脸与搜索结果的相似度越高
    public float sharpness; //人脸清晰度
    public boolean recogOutTime;//人脸是否超时
    public float faceScore;//该帧rect与人脸的相似度(取值0-100),取值越高表示该帧rect是人脸的概率越高,一般该值大于75,可以认为是人脸。(请与userInfoScore区分)
    public int faceAlignTime;//该人脸做faceAlign算法的次数
    public int faceRecogTime;//该人脸做faceRecog算法的次数
    public String featid;//搜索引擎中查询出来的唯一识别号
    public Bitmap recogBitmap;//算法用于识别的图片
}