|
RK3399 PRO快速开发 - 人脸特征点定位
发表于 2019-12-5 20:11:18
浏览:16486
|
回复:8
打印
只看该作者
[复制链接]
楼主
本帖最后由 rany 于 2019-12-5 20:11 编辑
简介
Rock-X SDK 是基于 RK3399Pro/RK1808 平台的一套 AI 组件库。开发者通过 Rock-X SDK提供的 API 接口能够快速构建 AI 应用。
Rock-X下载地址:https://pan.baidu.com/s/1brKNqxBYDmElm-A56DLu4Q 提取码:ji14
Rock-X SDK 主要功能类别 | 功能 | 目标检测 | 人头检测、人车物检测 | 人脸 | 人脸关键点、人脸属性分析、人脸识别 | 车牌 | 车牌检测、车牌识别 | 人体关键点 | 人体骨骼关键点、手指关键点
|
本篇是使用Rock-X SDK进行人脸特征点定位快速开发的过程,使用自定义或其它的模型的请使用rknn-toolkit和rknn-api进行开发(链接: http://wiki.t-firefly.com/zh_CN/3399pro_npu/)。
性能指标
人脸检测性能参数 | 性能指标 | 适应角度 | 平面内人脸左右旋转±45°
侧脸左右偏转±60°
侧脸上偏转 60°
侧脸下偏转 45° | 最大距离 | 11 米(测试摄像头 FOV=60°) | mAP | mAP@IOU0.5=0.857
|
人脸特征点定位
人脸特征点定位会获取人脸的48个关键点。
人脸特征点定位误差计算公式如下:
euclidean(d(j) − g(j)) 表是第 j 个检测点与标注点之间的欧式距离。d 表示左外眼角和右外眼角的欧式距离。
调用过程
相关代码
以下为Android的相关代码,完整代码在/RockX_SDK_V1.1.0_20191115/demo/rk3399pro_android_demo/rockx-android-demo-face_landmark.zip。
此demo功能是从摄像头获取图像数据,检测图像中的人脸和人脸的特征点,然后在预览中画出人脸特征点。
调用Rock-X仅需三步,即可获取图像中的人脸和人脸的特征点。
详细的函数定义和相关数据结构请参考:/RockX_SDK_V1.1.0_20191115/doc/rockx_api_doc/html/index.html
1. 初始化- public void create() {
- mModelPath = installRockxData(mContext);
- mRockXFaceDetectionModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_FACE_DETECTION);
- mRockXFaceLandmarkModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_FACE_LANDMARK_68);
- }
复制代码 以上代码加载了Rock-X的人脸检测和人脸特征点定位模块,native_create_rockx_module()为native函数,实际调用的函数为C++代码Java_com_rockchip_gpadc_demo_rockx_RockX_native_1create_1rockx_1module(), 实现如下:
- JNIEXPORT jlong JNICALL Java_com_rockchip_gpadc_demo_rockx_RockX_native_1create_1rockx_1module
- (JNIEnv *env, jobject obj, jstring modelPath, jint module)
- {
- rockx_ret_t ret;
- rockx_handle_t handle;
- char *model_path = jstringToChar(env, modelPath);
- rockx_config_t rockx_configs;
- memset(&rockx_configs, 0, sizeof(rockx_config_t));
- LOGI("rockx_add_config ROCKX_CONFIG_DATA_PATH=%s\n", model_path);
- rockx_add_config(&rockx_configs, (char *)ROCKX_CONFIG_DATA_PATH, model_path);
- ret = rockx_create(&handle, (rockx_module_t)module, &rockx_configs, sizeof(rockx_config_t));
- if (ret != ROCKX_RET_SUCCESS) {
- LOGI("init rockx module %d error %d\n", module, ret);
- return ret;
- }
- return (jlong)handle;
- }
复制代码 此函数最终调用Rock-X的API rockx_create()完成模块的创建。
2. 检测人脸
初始化模块后,通过摄像头获取数据,将图像数据传入detectFace() java函数获取图像中的人脸,detectFace()调用native函数native_face_detect()实际调用了Java_com_rockchip_gpadc_demo_rockx_RockX_native_1face_1detect()函数,最终通过Roxk-X的API rockx_face_detect()得到图像中的人脸。
Java_com_rockchip_gpadc_demo_rockx_RockX_native_1face_1detect()函数部分代码如下:
- extern "C"
- JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_rockx_RockX_native_1face_1detect
- (JNIEnv *env, jobject obj, jlong handle, jbyteArray inData, jint inWidth, jint inHeight, jint inPixelFmt,
- jobject faceList) {
- jboolean inputCopy = JNI_FALSE;
- jbyte* in_data = env->GetByteArrayElements(inData, &inputCopy);
- // initial rockx_image_t variable
- ... // 省略部分代码
- // detect face
- rockx_ret_t ret = rockx_face_detect((rockx_handle_t)handle, &input_image, &face_array, nullptr);
- ... // 省略部分代码
- return 0;
- }
复制代码 3. 检测人脸关键点
通过人脸检测模块获取图像中的人脸后,将人脸数据传入RockX.FaceLanmark()获取人脸关键点。与人脸检测类似,RockX.FaceLanmark()调用native函数native_face_lanmark()即调用Java_com_rockchip_gpadc_demo_rockx_RockX_native_1face_1lanmark(),最终通过Rock-X API rockx_face_landmark()获取人脸的关键点。
- extern "C"
- JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_rockx_RockX_native_1face_1lanmark
- (JNIEnv *env, jobject obj, jlong handle, jbyteArray inData, jint inWidth, jint inHeight, jint inPixelFmt,
- jint boxLeft, jint boxTop, jint boxRight, jint boxBottom,
- jintArray outLandmark) {
- ... // 省略部分代码
- rockx_ret_t ret = rockx_face_landmark((rockx_handle_t)handle, &input_image, &face_box, &face_landmark);
- ... // 省略部分代码
- return 0;
- }
复制代码
代码测试
|
|