Firefly开源社区

打印 上一主题 下一主题

RK3399 PRO快速开发 - 人体骨骼点关键点

572

积分

1

威望

0

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
572

RK3399 PRO快速开发 - 人体骨骼点关键点

发表于 2019-12-5 20:12:49      浏览:14606 | 回复: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_VAL2017mAP@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. 初始化
  1. public void create() {
  2.     mModelPath = installRockxData(mContext);
  3.     mRockXPoseBodyModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_POSE_BODY);
  4. }
复制代码
程序通过调用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()的实现如下:
  1. extern "C"
  2. JNIEXPORT void Java_com_rockchip_gpadc_demo_rockx_RockX_native_1set_1callback
  3.     (JNIEnv *env, jobject obj, jobject resultCallback) {
  4.     env->GetJavaVM(&g_vm);
  5.     g_result_callback_obj = env->NewGlobalRef(resultCallback);

  6.     get_global_class_loader(env);
  7. }
复制代码
回调实例被保存在g_result_callback_obj全局变量中,在callback_f()函数中被使用。
3. 检测人体骨骼关键点
进行人体骨骼关键点检测程序调用的是RockX.getBodyKeyPoints()方法,此方法只是调用native函数RockX.native_pose_body()。native_pose_body()部分实现如下:
  1. extern "C"
  2. JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_rockx_RockX_native_1pose_1body
  3.     (JNIEnv *env, jobject obj, jlong handle, jbyteArray inData, jint inWidth, jint inHeight, jint inPixelFmt) {

  4.     jboolean inputCopy = JNI_FALSE;
  5.     jbyte* in_data = env->GetByteArrayElements(inData, &inputCopy);

  6.     // init rockx_image_t
  7.     ... //省略部分代码

  8.     // body pose
  9.     LOGI("before rockx_pose_body");
  10.     rockx_ret_t ret = rockx_pose_body((rockx_handle_t)handle, &input_image, nullptr, callback_f);
  11.     ... //省略部分代码

  12.     return 0;
  13. }
复制代码
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层会在预览中画出关键点和连接相关的点。

代码测试






回复

使用道具 举报

572

积分

1

威望

0

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
572
发表于 2019-12-20 15:53:42      沙发
yuanwanghi 发表于 2019-12-19 11:44
樓主你好,

Rock-X下载地址:https://pan.baidu.com/s/1brKNqxBYDmElm-A56DLu4Q 提取码:ji14  

链接没有失效的。

在adb shell中执行lsusb看看npu设备存不存在?试试最新的固件看看?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表