|
RK3399 PRO快速开发 - 人体骨骼点关键点
发表于 2019-12-5 20:12:49
浏览:18851
|
回复:8
打印
只看该作者
[复制链接]
楼主
本帖最后由 rany 于 2019-12-5 20:12 编辑
简介
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/)。
性能指标
人体骨骼点关键点数据集 | 性能指标 | MSCOCO_VAL2017 | mAP@OKS0.5=0.623
|
注:
1. mAP@OKS0.5=0.623 表示 OKS=0.5 时对应的 mAP=0.623。
2. MSCOCO val2017是COCO 2017 Keypoint Detection Task的验证集, 共5000张, 其中2000多张有关键点。
调用过程
相关代码
以下为Android的相关代码,完整代码在/RockX_SDK_V1.1.0_20191115/demo/rk3399pro_android_demo/rockx-android-demo-pose_body.zip。
此demo功能是从摄像头获取图像数据,检测图像中的人体骨骼点关键点,然后在预览中画出关键点,并连接相关点。
demo的代码很多都是处理java和C++间的数据交换问题,实际调用的Rock-x的API很少。
详细的函数定义和相关数据结构请参考:/RockX_SDK_V1.1.0_20191115/doc/rockx_api_doc/html/index.html
1. 初始化
- public void create() {
- mModelPath = installRockxData(mContext);
- mRockXPoseBodyModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_POSE_BODY);
- }
复制代码 程序通过调用RockX.create()创建Rock-X对应的人体骨骼点关键点模块,RockX.native_create_rockx_module()为native函数,实际调用的是C++层的Java_com_rockchip_gpadc_demo_rockx_RockX_native_1create_1rockx_1module(),最后通过Rock-X的API rockx_create()创建对应的模块返回rockx_handle_t指针。
2. 设置回调
初始化后,进行人体骨骼关键点检测前,程序通过RockX.setPoseResultCallback()设置检测结果回调。RockX.setPoseResultCallBack()会调用native函数RockX.native_set_callback()将回调实例传入jni层。RockX.native_set_callback()的实现如下:
- extern "C"
- JNIEXPORT void Java_com_rockchip_gpadc_demo_rockx_RockX_native_1set_1callback
- (JNIEnv *env, jobject obj, jobject resultCallback) {
- env->GetJavaVM(&g_vm);
- g_result_callback_obj = env->NewGlobalRef(resultCallback);
- get_global_class_loader(env);
- }
复制代码 回调实例被保存在g_result_callback_obj全局变量中,在callback_f()函数中被使用。
3. 检测人体骨骼关键点
进行人体骨骼关键点检测程序调用的是RockX.getBodyKeyPoints()方法,此方法只是调用native函数RockX.native_pose_body()。native_pose_body()部分实现如下:
- extern "C"
- JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_rockx_RockX_native_1pose_1body
- (JNIEnv *env, jobject obj, jlong handle, jbyteArray inData, jint inWidth, jint inHeight, jint inPixelFmt) {
- jboolean inputCopy = JNI_FALSE;
- jbyte* in_data = env->GetByteArrayElements(inData, &inputCopy);
- // init rockx_image_t
- ... //省略部分代码
- // body pose
- LOGI("before rockx_pose_body");
- rockx_ret_t ret = rockx_pose_body((rockx_handle_t)handle, &input_image, nullptr, callback_f);
- ... //省略部分代码
- return 0;
- }
复制代码 Java_com_rockchip_gpadc_demo_rockx_RockX_native_1pose_1body()中rockx_pose_body()为Rock-X的API,即实际的检测函数,其参数handle是初始化时返回的rockx_handle_t指针,callback_f是结果回调函数会使用g_result_callback_obj调用java层的函数返回结果给java层。
最后java层会在预览中画出关键点和连接相关的点。
代码测试
|
|