[RK3288][Android6.0] face++人脸搜索API测试接口实现流程

Platform: RK3288
OS: Android 6.0
Kernel: 3.10.92

背景:

需求:
在线人脸搜索
评估方案:
face++的在线人脸搜索功能
评估参数

  • 搜索的响应时间
  • 识别的置信度
  • 当样本数量增大后的延迟以及识别率

实现方式:
使用okHttp Post方式和face++ server通信


基本概念:

什么是Face和FaceSet?

Face:在图片中检测到的人脸,系统会为人脸分配唯一标识face_token。在进行人脸比对或者人脸属性/关键点检测时必须指定face_token。
FaceSet:人脸集合,用来存放face_token的数据结构。将人脸存入FaceSet可以进行人脸搜索操作,在指定的人脸集合中寻找与指定人脸可以判断为同一人的人脸。
新的人脸识别API与旧版本相比有哪些提升?

什么是Face存储?

Face存储是一种存储服务,用户提供的图片检测到的人脸可以储存起来,用于人脸分析、人脸比对、人脸搜索等操作。Face存储并不是图片存储,而是人脸的特征信息,所以不会向用户提供人脸图片的下载或者显示。

如何使用Face存储?

如果您使用API将face_token存入FaceSet,系统将为您存储face_token对应的人脸特征信息。如果face_token超过72小时没有存放在任何FaceSet中,则会被系统清除。

最基本搜索人脸流程:

1)调用FaceSet Create API,创建FaceSet(人脸库)
2)调用Detect API,获取人脸的FaceToken
3)调用FaceSet AddFace API,向人脸库中添加人脸数据
4)调用Search API,搜索人脸


实现步骤

官网创建账号

https://console.faceplusplus.com.cn/dashboard

后面的face的操作都是基于这个账号来管理,因为操作face需要对应key和secret.
这两个值会在创建账号之后自动分配。

这里写图片描述

创建人脸库

即创建faceSet,它就像一个放置人脸照片样本的容器一样。
API参考: https://console.faceplusplus.com.cn/documents/4888391

注意事项:

  • api_key和api_secret从上面获取
  • 每post一次会返回一个新的不同的faceset_token
  • 如果post的时候带outer_id参数,那么在下一次create的时候会返回400的http status
    code,意思是已经创建过此faceSet了,不能重复创建

因此创建好一个faceSet后就没必要再调用此接口了。

另外,也可以直接在ubuntu上用命令行的方式测试你的仓库

curl -X POST "https://api-cn.faceplusplus.com/facepp/v3/faceset/create" \
-F "api_key=<api_key>" \
-F "api_secret=<api_secret>" \
-F "outer_id=newfaceset"

例子:
这里写图片描述

添加人脸库:

face++把此功能分成了两步:

  1. 探测人脸。即先把图片传进去,返回一个face_token,存储此图片在faceSet中对应的ID
  2. 利用此face_token再把图片添加进去

探测人脸:

对应API: https://console.faceplusplus.com.cn/documents/4888373

注意事项:
由于这里要上传图片,如果是本地上传方式的话需要使用post multipart/form-data这种表单类型上传。
关于http表单类型可自行作了解。

关键代码部分:

    private void faceDetect(){
        Log.i(TAG, "faceDetect: in...");
        mFeature = TEST_FEATURE_FACE_DETECT;
        File file = new File("/data/test.png");
        RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);
        MultipartBody multipartBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("api_key", API_KEY)
                .addFormDataPart("api_secret", API_SECRET)
                .addFormDataPart("image_file", file.getName(), requestBody)
                .build();

        sendPostWithOkHttp(FACE_DETECT_URL, multipartBody);
        Log.i(TAG, "faceDetect: out ...");
    }

命令行测试方法:

curl -X POST "https://api-cn.faceplusplus.com/facepp/v3/detect"
-F "api_key=<api_key>" \
-F "api_secret=<api_secret>" \
-F "image_file=@image_file.jpg" 

例子:
这里写图片描述

添加人脸:

对应API:https://console.faceplusplus.com.cn/documents/4888389

关键代码:

    private void faceSetAdd(){
        Log.i(TAG, "faceSetAdd: in ...");
        mFeature = TEST_FEATURE_FACESET_ADD;
        for(int i=0;i<mFaceToken.size();i++) {
            Log.i(TAG, "faceSetAdd: mFaceToken:"+mFaceToken.get(i));
            FormBody formBody = new FormBody.Builder()
                    .add("api_key", API_KEY)
                    .add("api_secret", API_SECRET)
                    .add("outer_id", OUTER_ID)
                    .add("face_tokens", mFaceToken.get(i))
                    .build();
            sendPostWithOkHttp(FACE_SET_ADD_URL, formBody);
        }
        Log.i(TAG, "faceSetAdd: out ...");
    }

可以看到这里用到了前面得到的faceset_token以及face_token,后者会添加到前者当中
mFaceToken是一个String类型的ArrayList, 因为一张照片中可能会有几个人,因此一个元素代表一张人脸。
代码中的face_tokens元素也可以做成直接添加多张人脸照片。

命令行测试方法:

curl -X POST "https://api-cn.faceplusplus.com/facepp/v3/faceset/addface" \
-F "api_key=<api_key>" \
-F "api_secret=<api_secret>" \
-F "outer_id=newfaceset" \
-F "face_tokens=c2fc0ad7c8da3af5a34b9c70ff764da0,ad248a809408b6320485ab4de13fe6a9"

可以看到是可以同时添加多个face_token的。

例子:
这里写图片描述

操作完成后可以通过get detail api接口检查

这里写图片描述

人脸搜索

API: https://console.faceplusplus.com.cn/documents/4888381

由于搜索支持上传不同类型image,因此我这边实现了上传face_token和image_file两种方式:

关键代码:

    private void faceSearch(String face_token){
        FormBody formBody = new FormBody.Builder()
                .add("api_key", API_KEY)
                .add("api_secret", API_SECRET)
                .add("face_token", face_token)
                .add("outer_id", OUTER_ID)
                .build();
        sendPostWithOkHttp(FACE_SEARCH_URL, formBody);
    }

    private void faceSearch(File file){
        Log.i(TAG, "faceSearch: in...");
        RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);
        MultipartBody multipartBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("api_key", API_KEY)
                .addFormDataPart("api_secret", API_SECRET)
                .addFormDataPart("image_file", file.getName(), requestBody)
                .addFormDataPart("outer_id", OUTER_ID)
                .build();

        sendPostWithOkHttp(FACE_SEARCH_URL, multipartBody);
        Log.i(TAG, "faceSearch: out ...");
    }

命令行测试:

curl -X POST "https://api-cn.faceplusplus.com/facepp/v3/search" \
-F "api_key=<api_key>" \
-F "api_secret=<api_secret>" \
-F "face_token=c2fc0ad7c8da3af5a34b9c70ff764da0" \
-F "outer_id=facesetid"

例子:
这里写图片描述

置信度返回结果在confidence这个属性中。官方给了个评估方式:
这里写图片描述

完整测试源代码下载链接:
https://download.csdn.net/download/kris_fei/10437959


参考:

okHttp3不同post请求类型的不同编写方式
face++官网API文档

猜你喜欢

转载自blog.csdn.net/kris_fei/article/details/80453912