基于BM1684X算力盒子丨OpenPose人体关键点检测部署实战指南

一、简介与实际应用价值

OpenPose是由美国卡内基梅隆大学(CMU)机器人学院团队开发的实时多人姿态估计系统,是计算机视觉领域在人体姿态识别方向的一项重大突破。它能够从单张图片或视频中同时、实时地检测出多个人体的关键节点(包括身体关节、面部特征点、手部关键点等),并精准地构建出人体的骨骼连接结构。

(1)核心应用领域与现实意义

这项技术不仅仅是一个实验室模型,更是一个能够驱动多个行业变革的赋能平台,其实际应用已深入以下领域:

  • 人机交互与智能安防:

    • 智能监控:在银行、商场、养老院等场所,实时监测人员行为,自动识别如跌倒、打架、闯入禁区等异常情况,并发出警报。

    • 新型交互:驱动体感游戏,或作为智能家居的控制方式,实现无需接触的隔空操作。

  • 工业安全与教育:

    • 安全生产:在工厂等环境中,实时检测工人是否遵守安全规范(如是否佩戴安全帽、是否进入危险区域)。

OpenPose 的开源特性,结合其在像 BM1684X 这样的边缘计算设备上的高效运行能力,使得上述这些智能化应用能够以较低的成本在真实世界中快速部署和落地,为各行各业的数字化转型提供了强大的技术基石。

(3)工程目录展示

OPENPOSE
├─cpp
│  ├─dependencies        ##C++例程依赖
│  │  ├─include
│  │  │      bmnn_utils.h
│  │  │      bm_wrapper.hpp
│  │  │      ff_decode.hpp
│  │  │      json.hpp
│  │  │      utils.hpp
│  │  │
│  │  └─src
│  │          ff_decode.cpp
│  │
│  └─openpose_bmcv        ##bmcvC++例程
│          CMakeLists.txt
│          main.cpp
│          openpose.cpp
│          openpose.hpp
│          openpose_bmcv.soc
│          pose_postprocess.cpp
│          pose_postprocess.hpp
│
├─datasets        ##数据集存放
│
├─docs                ##帮助文档
|
├─models        ##1684X模型
│  └─BM1684X
│          pose_body_25_fp32_1b.bmodel
│          pose_coco_fp16_1b.bmodel
│          pose_coco_fp32_1b.bmodel
│          pose_coco_int8_1b.bmodel
│          pose_coco_int8_4b.bmodel
│
├─python        ##python例程
│      openpose_opencv.py
│      requirements.txt
│
├─tools                ##测试和比较工具
│      compare_statis.py
│      eval_coco.py
│
└─tpu_kernel_module                ##C++例程使用TPU加速用到的库
        libbm1684x_kernel_module.so

二、具体运行步骤

(1)python例程

1.1配置python环境

opencv环境(运行openpose_opencv.py环境)

pip3 install -r python/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

1.2推理测试

文件参数说明

openpose_opencv.py参数说明如下:

usage: openpose_opencv.py [--input INPUT] [--bmodel BMODEL] [--dev_id DEV_ID]--input: 测试数据路径,可输入整个图片文件夹的路径或者视频路径;--bmodel: 用于推理的bmodel路径,默认使用stage 0的网络进行推理;--dev_id: 用于推理的tpu设备id。
图片测试

图片测试实例如下,支持对整个图片文件夹进行测试。

python3 python/openpose_opencv.py --input datasets/test --bmodel models/BM1684X/pose_coco_fp32_1b.bmodel --dev_id 0

测试结束后,会将预测的图片保存在results/images下,预测的关键点坐标保存在results/pose_coco_fp32_1b.bmodel_test_opencv_python_result.json下,同时会打印预测结果、推理时间等信息。输出如下:

视频测试

视频测试实例如下,支持对视频流进行测试。

python3 python/openpose_opencv.py --input datasets/dance_1080P.mp4 --bmodel models/BM1684X/pose_coco_fp32_1b.bmodel --dev_id 0

测试结束后,会将预测的结果画在results/dance_1080P.avi中,同时会打印预测结果、推理时间等信息。视频测试等待结果较长,请耐心等待。

(2)C++例程

1.交叉编译环境搭建

1.1编译环境

C++程序要在板端运行,是需要对依赖文件进行编译的。这里我们为了节省边缘设备的压力,选择使用一个X86的linux环境进行交叉编译。

搭建交叉编译环境,这里提供两种方式:

(1)通过apt安装交叉编译工具链:

如果您的系统和目标SoC平台的libc版本相同(可通过ldd --version命令进行查询),那么您可以使用如下命令安装:

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

卸载方法:

sudo apt remove cpp-*-aarch64-linux-gnu

如果您的环境不满足上述要求,建议使用第(2)种方法。

(2)通过docker搭建交叉编译环境:

可以使用我们提供的docker镜像--stream_dev.tar作为交叉编译环境。

如果是首次使用Docker, 可执行下述命令进行安装和配置(仅首次执行):

sudo apt install docker.iosudo systemctl start dockersudo systemctl enable dockersudo groupadd dockersudo usermod -aG docker $USERnewgrp docker
在下载好的镜像目录中加载镜像
docker load -i stream_dev.tar

可以通过docker images查看加载好的镜像,默认为stream_dev:latest

创建容器

docker run --privileged --name stream_dev -v $PWD:/workspace  -it stream_dev:latest# stream_dev只是举个名字的例子, 请指定成自己想要的容器的名字

容器中的workspace目录会挂载到您运行docker run时所在的宿主机目录,您可以在此容器中编译项目。workspace目录在根目录下,该目录下的改动会映射到本地目录中对应文件的改动。

注意:创建容器时需要到soc-sdk(依赖编译环境)的父目录以及以上目录

1.2打包依赖文件
  • 打包libsophon
  • 对libsophon_soc_x.y.z_aarch64.tar.gz,x.y.z表示版本号,并进行解压。
# 创建依赖文件的根目录mkdir -p soc-sdk# 解压libsophon_soc_x.y.z_aarch64.tar.gztar -zxf libsophon_soc_${x.y.z}_aarch64.tar.gz# 将相关的库目录和头文件目录拷贝到依赖文件根目录下cp -rf libsophon_soc_${x.y.z}_aarch64/opt/sophon/libsophon-${x.y.z}/lib soc-sdkcp -rf libsophon_soc_${x.y.z}_aarch64/opt/sophon/libsophon-${x.y.z}/include soc-sdk
  • 打包sophon-ffmpeg和sophon-opencv
  • 对sophon-mw-soc_x.y.z_aarch64.tar.gz,x.y.z表示版本号,并进行解压。
# 解压sophon-mw-soc_x.y.z_aarch64.tar.gztar -zxf sophon-mw-soc_${x.y.z}_aarch64.tar.gz# 将ffmpeg和opencv的库目录和头文件目录拷贝到soc-sdk目录下cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-ffmpeg_${x.y.z}/lib soc-sdkcp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-ffmpeg_${x.y.z}/include soc-sdkcp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-opencv_${x.y.z}/lib soc-sdkcp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-opencv_${x.y.z}/include soc-sdk
1.3进行交叉编译

交叉编译环境搭建好后,使用交叉编译工具链编译生成可执行文件,OpenPose_opencv和openpose_bmcv编译方法相同,以编译openpose_opencv程序为例:

cd cpp/openpose_opencvmkdir build && cd build#请根据实际情况修改-DSDK的路径,需使用绝对路径。cmake -DTARGET_ARCH=soc -DSDK=/workspace/soc-sdk/ ..make

编译完成后在对应的目录会生成.soc文件,如:cpp/openpose_opencv/openpose_opencv.soc,也提供了该文件,可直接使用。

2.推理测试

需将交叉编译生成的可执行文件及所需的模型、测试数据拷贝到SoC平台(即BM1684X开发板)中测试。

参数说明

可执行程序默认有一套参数,请注意根据实际情况进行传参,openpose_bmcv.soc具体参数说明如下:

Usage: openpose_bmcv.soc [params]        --bmodel (value:../../models/BM1684/pose_coco_fp32_1b.bmodel)                bmodel file path        --dev_id (value:0)                TPU device id        --help (value:true)                print help information.        --input (value:../../datasets/test)                input path, images direction or video file path        --performance_opt (value:no_opt)                performance optimization type, supporting [tpu_kernel_opt, tpu_kernel_half_img_size_opt, cpu_opt, no_opt]
图片测试

图片测试实例如下,支持对整个图片文件夹进行测试。

##先对文件加上可执行权限chmod +x openpose_bmcv.soc./openpose_bmcv.soc --input=../../datasets/test --bmodel=../../models/BM1684X/pose_coco_fp32_1b.bmodel --dev_id=0

仅在BM1684X上,若需要使用tpu_kernel后处理来加速,则可以使用以下命令。

./openpose_bmcv.soc --input=../../datasets/test --bmodel=../../models/BM1684X/pose_coco_fp32_1b.bmodel --dev_id=0 --performance_opt=tpu_kernel_opt

进一步,若在后处理中仅仅放大输出特征图到原图一半,精度轻微下降的同时性能能够大幅提高,使用以下命令。

./openpose_bmcv.soc --input=../../datasets/test --bmodel=../../models/BM1684X/pose_coco_fp32_1b.bmodel --dev_id=0 --performance_opt=tpu_kernel_half_img_size_opt

若需要使用针对算法的后处理性能优化来加速,同时伴随精度轻微下降,可以使用以下命令。

./openpose_bmcv.soc --input=../../datasets/test --bmodel=../../models/BM1684X/pose_coco_fp32_1b.bmodel --dev_id=0 --performance_opt=cpu_opt

测试结束后,会将预测的图片保存在results/images下,预测的关键点坐标保存在results/pose_coco_fp32_1b.bmodel.bmodel_test_bmcv_cpp_result.json下,同时会打印预测结果、推理时间等信息。

视频测试

视频测试实例如下,支持对视频流进行测试。在BM1684X上,后处理加速命令与图片测试中类似,若使用算法后处理加速也与图片测试中类似。

./openpose_bmcv.soc --input=../../datasets/dance_1080P.mp4 --bmodel=../../models/BM1684X/pose_coco_fp32_1b.bmodel --dev_id=0

测试结束后,会将预测结果画在图片上并保存在results/images中,同时会打印预测结果、推理时间等信息。

### 如何在BM1684X上部署模型 #### 部署前准备 为了成功在BM1684X芯片上运行模型,需先确认目标硬件支持的模型格式以及工具链版本。通常情况下,BM系列设备使用的模型文件为`.bmodel`格式,可以通过特定编译器转换得到。例如,在命令行中可以使用如下指令来验证模型兼容性并加载到BM1684X设备上: ```bash bmrt_test --bmodel falsr_a_fp32.bmodel ``` 此操作能够帮助开发者初步判断模型是否适配当前硬件环境[^1]。 #### 工具链与资源获取 对于希望快速入门BM1684X开发流程的新手而言,可以从开源项目库寻找相关资料作为参考依据之一。比如GitHub上的某个仓库提供了详细的Paddle框架转BM模型的方法论指导,具体地址可访问以下链接进一步学习[^2]: https://github.com/AnBaolei1984/Paddle2BMmodel 上述资源不仅涵盖了理论知识讲解还附带实际案例演示,非常适合初学者深入理解整个迁移过程中的关键技术要点及其实践技巧。 #### 特殊情况处理——不被支持的操作符替代方案 当发现现有网络结构里存在某些未被BM平台直接支持的操作时,则需要采取一定措施加以解决。一种常见做法就是寻找功能相似却已被良好集成进系统的其他组件来进行替换;然而需要注意的是这种改变可能会对最终输出效果造成一定程度的影响 。因此如果单纯依靠简单置换无法满足业务场景下的精确度要求的话 ,那么就需要探索更复杂的解决方案 —— 自定义OP实现路径 。关于这部分内容的具体实施细节可以在官方文档或者社区讨论区找到更多有用的信息 来辅助完成定制化需求 的落地工作 [^3]. #### 经验分享:以Kokoro-82M为例探讨TTS类应用移植可行性分析 除了图像识别等领域外 ,语音合成也是近年来备受关注的一个方向 .针对此类任务向嵌入式端口转移过程中可能遭遇的各种挑战进行了全面剖析之后得出结论 :只要按照既定规范执行每一步骤 并妥善处置好可能出现的问题 (如token长度限制等),就能顺利达成预期成果 [^4]. 下面列举几个关键环节供读者借鉴 : 1. **基础环境搭建**: 确保所有必要的软件包均已正确安装到位 ; 2. **依赖关系管理**: 对第三方插件进行单独配置以免干扰主线程正常运转; 3. **脚本调试优化**: 结合实际情况调整参数设置直至达到理想状态为止. #### 总结陈词 综上所述,虽然将复杂AI法迁移到专用加速卡上面并非易事,但只要遵循科学合理的规划思路再加上持续不断的努付出,就一定能克服重重困难取得圆满成功!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值