OpenPose(人体关键点检测)
一、简介
OpenPose 是由美国卡内基梅隆大学(CMU)机器人学院团队开发的实时多人姿态估计系统,是计算机视觉领域在人体姿态识别方向的重要突破。它能够从单张图片或视频中同时检测多个人体的关键节点(如关节、面部特征点、手部关键点等),并构建出人体的骨骼连接结构,为动作分析、人机交互、虚拟现实等领域提供了强大的技术支持。
工程目录
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.io
sudo systemctl start docker
sudo systemctl enable docker
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp 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.gz tar -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-sdk cp -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.gz tar -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-sdk cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-ffmpeg_${x.y.z}/include soc-sdk cp -rf sophon-mw-soc_${x.y.z}_aarch64/opt/sophon/sophon-opencv_${x.y.z}/lib soc-sdk cp -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_opencv
mkdir 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中,同时会打印预测结果、推理时间等信息。