文档管理中心

如何判断skeletonDetection(骨骼点检测)能否使用设备的NPU运行

问题现象

某些设备没有NPU导致骨骼点检测运行较慢。如何提前判断骨骼点检测能否使用设备的NPU运行?

背景知识

  • 骨骼点检测:人体骨骼关键点检测,主要检测人体的一些关键点,通过关键点描述人体骨骼信息。具体应用主要集中在智能视频监控,病人监护系统,人机交互,虚拟现实,人体动画,智能家居,智能安防,运动员辅助训练等等。
  • CANN Kit简介:CANN(Compute Architecture for Neural Networks)是华为面向AI推出的端云一致的异构计算架构。CANN Kit通过协同调度设备的NPU(神经网络处理单元)、CPU等硬件资源,实现高效的设备端智能计算性能优化。

解决方案

  • 当设备没有NPU时,骨骼点检测会使用CPU进行推理,导致时间较长。CPU推理导致时间延长属于正常现象。
  • 若希望提前判断skeletonDetection(骨骼点检测)API能否使用设备的NPU运行,进而再根据结果做下一步处理,可以使用CANN Kit的HMS_HiAI_GetVersion()方法进行判断:

    通过返回模板hiaiversion A1A2A3.X1X2X3.Y1Y2Y3.Z1Z2Z3指定X1是否为0来区分是否支持NPU。若X1为0,则表示不支持NPU;若X1为非0,则表示支持NPU。

步骤如下:

  1. 创建项目。
  2. 配置项目NAPI:
    • 引入CANNKit/hiai_helper.h头文件,实现判断设备NPU的方法IsNpuDevice。工程目录“\entry\src\main\cpp\napi_init.cpp”文件示例参考如下:
      收起
      自动换行
      深色代码主题
      复制
      1. /*
      2. * Copyright (c) Huawei Technologies Co., Ltd. 2026. All rights reserved.
      3. */
      4. #include "napi/native_api.h"
      5. #include <hilog/log.h>
      6. #include <cstring>
      7. #include "CANNKit/hiai_helper.h"
      8. static napi_value IsNpuDevice(napi_env env, napi_callback_info info)
      9. {
      10. const char *hiaiVersion = HMS_HiAI_GetVersion();
      11. napi_value result;
      12. napi_get_boolean(env, true, &result);
      13. if (hiaiVersion == nullptr || strlen(hiaiVersion) != 15) { /* 15: hiaiVersion返回的字符串长度 */
      14. OH_LOG_ERROR(LOG_APP, "HiAI version is null or not supported");
      15. napi_get_boolean(env, false, &result);
      16. } else if (hiaiVersion[4] == '0') { /* 返回的hiaiVersion字符串A1A2A3.X1X2X3.Y1Y2Y3.Z1Z2Z3中X1为0表示不支持NPU */
      17. OH_LOG_INFO(LOG_APP, "NPU is not supported");
      18. napi_get_boolean(env, false, &result);
      19. }
      20. return result;
      21. }
      22. EXTERN_C_START
      23. static napi_value Init(napi_env env, napi_value exports)
      24. {
      25. napi_property_descriptor desc[] = {
      26. {"isNpuDevice", nullptr, IsNpuDevice, nullptr, nullptr, nullptr, napi_default, nullptr}};
      27. napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
      28. return exports;
      29. }
      30. EXTERN_C_END
      31. static napi_module demoModule = {
      32. .nm_version = 1,
      33. .nm_flags = 0,
      34. .nm_filename = nullptr,
      35. .nm_register_func = Init,
      36. .nm_modname = "entry",
      37. .nm_priv = ((void *)0),
      38. .reserved = {0},
      39. };
      40. extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
    • 编写CMakeLists.txt。工程目录“\entry\src\main\cpp\CMakeLists.txt”文件示例参考如下:
      收起
      自动换行
      深色代码主题
      复制
      1. # the minimum version of CMake.
      2. cmake_minimum_required(VERSION 3.5.0)
      3. project(SkeletonDetectionNpuDemo)
      4. set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
      5. include_directories(${NATIVERENDER_ROOT_PATH}
      6. ${NATIVERENDER_ROOT_PATH}/include)
      7. include_directories(${HMOS_SDK_NATIVE}/sysroot/usr/lib)
      8. FIND_LIBRARY(cann_lib hiai_foundation)
      9. add_library(entry SHARED napi_init.cpp)
      10. target_link_libraries(entry PUBLIC libace_napi.z.so
      11. libhilog_ndk.z.so
      12. librawfile.z.so
      13. ${cann_lib}
      14. )
    • 导出cpp接口。工程目录“\entry\src\main\cpp\types\libentry\Index.d.ts”文件示例参考如下:
      收起
      自动换行
      深色代码主题
      复制
      1. export const isNpuDevice : () => boolean;
  3. 在ArkTS中调用判断是否支持NPU的接口。

    工程目录“\entry\src\main\ets\pages\Index.ets”文件示例参考如下:

    收起
    自动换行
    深色代码主题
    复制
    1. import { hilog } from '@kit.PerformanceAnalysisKit';
    2. import testNapi from 'libentry.so';
    3. const DOMAIN = 0x0000;
    4. @Entry
    5. @Component
    6. struct Index {
    7. @State text: string = '请检查';
    8. private isNpuDevice: boolean = false;
    9. build() {
    10. Row() {
    11. Column() {
    12. Button('请点击检查是否支持NPU')
    13. .onClick(() => {
    14. this.isNpuDevice = testNapi.isNpuDevice(); // 调用接口检查是否支持NPU
    15. hilog.info(DOMAIN, 'testTag', 'If support NPU: %{public}s', this.isNpuDevice);
    16. this.text = this.isNpuDevice ? '支持' : '不支持';
    17. })
    18. .margin(20)
    19. Text(this.text)
    20. }
    21. .width('100%')
    22. }
    23. .height('100%')
    24. }
    25. }