RK3399 PRO快速开发 - 人体骨骼点关键点
本帖最后由 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. 初始化
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层会在预览中画出关键点和连接相关的点。
代码测试
本帖最后由 yuanwanghi 于 2019-12-19 17:04 编辑
樓主你好,
Rock-X下载地址:https://pan.baidu.com/s/1brKNqxBYDmElm-A56DLu4Q 提取码:ji14
目前失效了,我改到這邊下載 http://t.rock-chips.com/forum.php?mod=viewthread&tid=504
那我將該專案運行在 AIO-3399 Pro JD4時,會發生馬上就消失的狀況
截了部分log 如下:
2019-12-19 16:47:56.432 18621-18677/com.rockchip.gpadc.rockx.pose_demo E/RKNNAPI: rknn_init,msg_load_ack fail, ack = 1, expect 0!
2019-12-19 16:47:56.433 18621-18677/com.rockchip.gpadc.rockx.pose_demo E/rockx: rknn_init fail! ret=-6
2019-12-19 16:47:56.433 18621-18677/com.rockchip.gpadc.rockx.pose_demo E/rockx: init module(6) error -1
2019-12-19 16:47:56.434 18621-18677/com.rockchip.gpadc.rockx.pose_demo I/rknn4j: before rockx_pose_body
2019-12-19 16:47:56.448 18621-18677/com.rockchip.gpadc.rockx.pose_demo A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 18677 (Thread-2), pid 18621 (rockx.pose_demo)
想請問是不是那裏有問題,謝謝
yuanwanghi 发表于 2019-12-19 11:44
樓主你好,
Rock-X下载地址:https://pan.baidu.com/s/1brKNqxBYDmElm-A56DLu4Q 提取码:ji14
链接没有失效的。
在adb shell中执行lsusb看看npu设备存不存在?试试最新的固件看看? 謝謝樓主
原來是我這邊無法下載,已經已經將固件重刷也升級了RKNN,目前測試成功了
如果有其他使用者要測試這個的話,記得更新一下NDK的路徑,應該就能順利發佈了。
謝謝 https://pan.baidu.com/s/1brKNqxBYDmElm-A56DLu4Q
此链接分享内容可能因为涉及侵权、色情、反动、低俗等信息,无法访问! 谢谢分享 rk3399 pro 卡在init 函数 谢谢分享{:4_107:} 谢谢分享
页:
[1]